Submitted URL: http://golem.de/
Effective URL: https://www.golem.de/
Submission: On October 02 via manual

Summary

This website contacted 56 IPs in 10 countries across 40 domains to perform 243 HTTP transactions. The main IP is 77.247.84.129, 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
1 77 77.247.84.129 25291 (SYSELEVEN...)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
7 2a00:13c8:f5:... 25291 (SYSELEVEN...)
7 2a00:13c8:f5:... 25291 (SYSELEVEN...)
2 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 91.215.103.64 43407 (INFONLINE-AS)
29 172.217.16.194 15169 (GOOGLE)
1 13.224.196.107 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:200... 16509 (AMAZON-02)
12 2a00:1450:400... 15169 (GOOGLE)
10 136.243.3.206 24940 (HETZNER-AS)
3 7 2.18.234.72 16625 (AKAMAI-AS)
3 2a00:1450:400... 15169 (GOOGLE)
1 185.64.189.112 62713 (AS-PUBMATIC)
3 185.33.223.202 29990 (ASN-APPNEXUS)
4 69.173.144.143 26667 (RUBICONPR...)
4 185.86.137.17 201081 (SMARTADSE...)
1 3 34.95.120.147 15169 (GOOGLE)
2 104.16.68.69 13335 (CLOUDFLAR...)
1 37.157.2.235 198622 (ADFORM)
1 2 91.215.103.65 43407 (INFONLINE-AS)
1 116.202.11.242 24940 (HETZNER-AS)
1 2a00:1450:400... 15169 (GOOGLE)
3 148.251.131.173 24940 (HETZNER-AS)
1 2600:9000:21f... 16509 (AMAZON-02)
1 77.247.84.149 25291 (SYSELEVEN...)
6 2a00:1450:400... 15169 (GOOGLE)
2 151.101.13.194 54113 (FASTLY)
1 3 2a00:1450:400... 15169 (GOOGLE)
1 3 89.163.159.106 24961 (MYLOC-AS)
3 148.251.69.233 24940 (HETZNER-AS)
2 2 54.154.79.134 16509 (AMAZON-02)
1 1 136.243.12.39 24940 (HETZNER-AS)
2 2 37.157.2.237 198622 (ADFORM)
6 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
2 52.216.19.35 16509 (AMAZON-02)
1 35.157.22.81 16509 (AMAZON-02)
2 2 216.58.205.226 15169 (GOOGLE)
1 2.16.122.151 20940 (AKAMAI-ASN1)
3 13.224.196.127 16509 (AMAZON-02)
1 2606:4700:20:... 13335 (CLOUDFLAR...)
6 188.40.115.112 24940 (HETZNER-AS)
2 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
4 136.243.94.77 24940 (HETZNER-AS)
1 62.168.44.119 5588 (GTSCE GTS...)
4 63.32.86.220 16509 (AMAZON-02)
1 35.186.238.175 15169 (GOOGLE)
2 151.101.113.108 54113 (FASTLY)
1 2.18.233.180 16625 (AKAMAI-AS)
1 104.109.78.125 20940 (AKAMAI-ASN1)
1 13.225.78.6 16509 (AMAZON-02)
1 85.114.144.106 24961 (MYLOC-AS)
1 2600:9000:20e... 16509 (AMAZON-02)
1 34.250.43.132 16509 (AMAZON-02)
1 34.248.95.73 16509 (AMAZON-02)
243 56
Apex Domain
Subdomains
Transfer
98 golem.de
golem.de
www.golem.de
cpxl.golem.de
video.golem.de
ads.golem.de
cpx.golem.de
ssl.1.damoh.golem.de
2 MB
38 doubleclick.net
securepubads.g.doubleclick.net
googleads.g.doubleclick.net
stats.g.doubleclick.net
cm.g.doubleclick.net
587 KB
10 meetrics.net
lb18.s400.meetrics.net
3 KB
9 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
206 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 googletagservices.com
www.googletagservices.com
174 KB
6 adscale.de
ih.adscale.de
js.adscale.de
8 KB
6 google.com
adservice.google.com
1 KB
5 rubiconproject.com
fastlane.rubiconproject.com
eus.rubiconproject.com
6 KB
5 adnxs.com
ib.adnxs.com
acdn.adnxs.com
4 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 smartadserver.com
prg.smartadserver.com
2 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
868 B
3 openx.net
yieldlove-d.openx.net
eu-u.openx.net
11 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 googleapis.com
imasdk.googleapis.com
92 KB
2 amazonaws.com
s3.amazonaws.com
1 KB
2 adsrvr.org
match.adsrvr.org
904 B
2 fastly.net
confiant-integrations.global.ssl.fastly.net
21 KB
2 agkn.com
js.agkn.com
d.agkn.com
3 KB
2 districtm.io
dmx.districtm.io
cdn.districtm.io
397 B
2 pubmatic.com
hbopenbid.pubmatic.com
ads.pubmatic.com
114 B
2 userreport.com
nugmw.userreport.com
sak.userreport.com
20 KB
1 emetriq.de
cdn.emetriq.de
2 KB
1 mookie1.com
de-gmtdmp.mookie1.com
495 B
1 ibillboard.com
bbcdn-bbnaut.ibillboard.com
1014 B
1 2mdn.net
s0.2mdn.net
11 KB
1 radiantmediatechs.com
cdn.radiantmediatechs.com
3 KB
1 yieldlab.net
ad.yieldlab.net
495 B
1 googletagmanager.com
www.googletagmanager.com
27 KB
1 nuggad.net
si.nuggad.net
538 B
1 mxcdn.net
s400.mxcdn.net
48 KB
1 yieldlove.com
cdn-a.yieldlove.com
84 KB
1 stroeerdigitalgroup.de
cdn.stroeerdigitalgroup.de
61 KB
243 40
Domain Requested by
76 www.golem.de www.golem.de
cdn.stroeerdigitalgroup.de
pagead2.googlesyndication.com
29 securepubads.g.doubleclick.net cdn.stroeerdigitalgroup.de
securepubads.g.doubleclick.net
www.golem.de
10 lb18.s400.meetrics.net www.golem.de
8 tracking.m6r.eu 3 redirects www.golem.de
cdn.m6r.eu
7 video.golem.de www.golem.de
text
7 cpxl.golem.de www.golem.de
6 tt.onthe.io cdn.onthe.io
6 www.googletagservices.com pagead2.googlesyndication.com
securepubads.g.doubleclick.net
6 googleads.g.doubleclick.net pagead2.googlesyndication.com
6 tpc.googlesyndication.com securepubads.g.doubleclick.net
6 adservice.google.com securepubads.g.doubleclick.net
5 ih.adscale.de 3 redirects www.golem.de
js.adscale.de
4 ssl.1.damoh.golem.de text
4 prg.smartadserver.com cdn-a.yieldlove.com
4 fastlane.rubiconproject.com cdn-a.yieldlove.com
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 ib.adnxs.com cdn-a.yieldlove.com
www.golem.de
3 pagead2.googlesyndication.com www.golem.de
pagead2.googlesyndication.com
2 uss.xplosion.de www.golem.de
2 eu-u.openx.net 1 redirects cdn-a.yieldlove.com
2 acdn.adnxs.com cdn-a.yieldlove.com
2 ups.xplosion.de confiant-integrations.global.ssl.fastly.net
cdn.emetriq.de
2 imasdk.googleapis.com confiant-integrations.global.ssl.fastly.net
2 cm.g.doubleclick.net 2 redirects
2 s3.amazonaws.com www.golem.de
text
2 c1.adform.net 2 redirects
2 match.adsrvr.org 2 redirects
2 dmp.theadex.com lib.selfcampaign.com
confiant-integrations.global.ssl.fastly.net
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
1 adstax-match.adrtx.net confiant-integrations.global.ssl.fastly.net
1 xpl.theadex.com 1 redirects
1 cdn.adrtx.net www.golem.de
1 cdn.emetriq.de ups.xplosion.de
1 api.theadex.com bbcdn-bbnaut.ibillboard.com
1 sak.userreport.com nugmw.userreport.com
1 eus.rubiconproject.com cdn-a.yieldlove.com
1 ads.pubmatic.com cdn-a.yieldlove.com
1 cdn.districtm.io cdn-a.yieldlove.com
1 de-gmtdmp.mookie1.com
1 bbcdn-bbnaut.ibillboard.com confiant-integrations.global.ssl.fastly.net
1 js.adscale.de confiant-integrations.global.ssl.fastly.net
1 s0.2mdn.net imasdk.googleapis.com
1 cdn.radiantmediatechs.com www.golem.de
1 ad.yieldlab.net 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 adx.adform.net cdn-a.yieldlove.com
1 dmx.districtm.io cdn-a.yieldlove.com
1 yieldlove-d.openx.net cdn-a.yieldlove.com
1 hbopenbid.pubmatic.com cdn-a.yieldlove.com
1 cdn.m6r.eu cdn.stroeerdigitalgroup.de
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
1 golem.de 1 redirects
243 69
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
*.ioam.de
COMODO RSA Organization Validation Secure Server CA
2017-12-22 -
2020-12-21
3 years crt.sh
*.g.doubleclick.net
GTS CA 1O1
2019-09-17 -
2019-12-10
3 months crt.sh
cdn-a.yieldlove.com
Amazon
2018-10-11 -
2019-11-11
a year crt.sh
*.mxcdn.net
DigiCert SHA2 Secure Server CA
2018-09-27 -
2019-11-26
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-09-17 -
2019-12-10
3 months crt.sh

COMODO RSA Domain Validation Secure Server CA
2016-12-08 -
2019-12-08
3 years crt.sh
*.pubmatic.com
Sectigo RSA Organization Validation Secure Server CA
2019-02-22 -
2021-02-21
2 years crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
*.rubiconproject.com
DigiCert SHA2 Secure Server CA
2019-01-10 -
2021-01-14
2 years crt.sh
*.smartadserver.com
Thawte RSA CA 2018
2018-09-07 -
2020-02-17
a year crt.sh
*.openx.net
GeoTrust RSA CA 2018
2018-01-04 -
2020-07-09
3 years crt.sh
districtm.io
CloudFlare Inc ECC CA-2
2019-03-26 -
2020-03-26
a year crt.sh
track.adform.net
DigiCert SHA2 Secure Server CA
2019-09-16 -
2021-09-20
2 years crt.sh
*.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-09-05 -
2019-11-28
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-09-05 -
2019-11-28
3 months crt.sh
*.freetls.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-01-02 -
2020-01-03
a year crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2018-02-16 -
2019-10-19
2 years crt.sh
s3.amazonaws.com
DigiCert Baltimore CA-2 G2
2019-09-06 -
2020-12-02
a year crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2018-12-12 -
2020-03-12
a year 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
*.googleapis.com
GTS CA 1O1
2019-09-17 -
2019-12-10
3 months crt.sh
*.doubleclick.net
GTS CA 1O1
2019-09-05 -
2019-11-28
3 months crt.sh
ssl.1.damoh.golem.de
Let's Encrypt Authority X3
2019-09-04 -
2019-12-03
3 months crt.sh
*.ibillboard.com
Thawte RSA CA 2018
2018-05-21 -
2020-06-21
2 years crt.sh
*.xplosion.de
Thawte RSA CA 2018
2018-12-10 -
2020-02-08
a year crt.sh
*.mookie1.com
DigiCert SHA2 Secure Server CA
2019-02-07 -
2020-03-22
a year crt.sh
cdn.adnxs.com
GlobalSign CloudSSL CA - SHA256 - G3
2019-05-16 -
2020-05-16
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 26 frames:

Primary Page: https://www.golem.de/
Frame ID: 5FE6193696750D0B410EE1BC111DCB03
Requests: 193 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20190926/r20190131/show_ads_impl.js
Frame ID: 5063A17A4F58A4C4F57D66757C56A8C2
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/html/r20190926/r20190131/zrt_lookup.html
Frame ID: 0B36EBE46121533E523FEB8D08A96237
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: 1B217CB16BB23B81B6119CAF2872810A
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=6643888890&adk=3280156863&adf=2993371392&w=520&lmt=1570009058&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1570009058262&bpp=8&bdt=492&fdt=109&idt=109&shv=r20190926&cbv=r20190131&saldr=aa&abxe=1&correlator=478404360269&frm=20&pv=2&ga_vid=1942422950.1570009058&ga_sid=1570009058&ga_hid=650167333&ga_fc=0&iag=0&icsg=775052786155264&dssz=53&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=3865&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199336%2C21062421%2C21062453%2C21062832%2C21064549%2C21064592%2C21064653&oid=3&pvsid=1726548844389678&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=8&uci=8.ymtz52jq6xgd&fsb=1&xpc=WgE67jD2h7&p=https%3A//www.golem.de&dtd=121
Frame ID: 212F34C26C6D3052188E2FC4BDA4D69D
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=9597355291&adk=1011330417&adf=3103571475&w=520&lmt=1570009058&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1570009058270&bpp=5&bdt=500&fdt=141&idt=141&shv=r20190926&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120&correlator=478404360269&frm=20&pv=1&ga_vid=1942422950.1570009058&ga_sid=1570009058&ga_hid=650167333&ga_fc=0&iag=0&icsg=775052786155264&dssz=54&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=4542&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199336%2C21062421%2C21062453%2C21062832%2C21064549%2C21064592%2C21064653&oid=3&pvsid=1726548844389678&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=9&uci=9.599pl94kuefg&fsb=1&xpc=PNNSTWrzmh&p=https%3A//www.golem.de&dtd=144
Frame ID: 1E714C42BFADFAEF06D8BD93762C3377
Requests: 1 HTTP requests in this frame

Frame: https://d.agkn.com/iframe/8613/?che=320558468&gdpr=1&gdpr_consent=&url=https%3A%2F%2Fwww.golem.de%2F&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: 826D3147F08F7AF3A03A5B147174748A
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=2074088491&adk=3577236908&adf=700606410&w=520&lmt=1570009058&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1570009058275&bpp=4&bdt=505&fdt=159&idt=159&shv=r20190926&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=478404360269&frm=20&pv=1&ga_vid=1942422950.1570009058&ga_sid=1570009058&ga_hid=650167333&ga_fc=0&iag=0&icsg=775052786155264&dssz=55&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5218&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199336%2C21062421%2C21062453%2C21062832%2C21064549%2C21064592%2C21064653&oid=3&pvsid=1726548844389678&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=10&uci=a.1wabyw80hdaf&fsb=1&xpc=jePeYAG6M5&p=https%3A//www.golem.de&dtd=162
Frame ID: 5D11E718F85A39E451490D00C499DF2A
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=5027554897&adk=765296070&adf=3981714442&w=520&lmt=1570009058&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1570009058279&bpp=3&bdt=509&fdt=165&idt=165&shv=r20190926&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120%2C520x120&correlator=478404360269&frm=20&pv=1&ga_vid=1942422950.1570009058&ga_sid=1570009058&ga_hid=650167333&ga_fc=0&iag=0&icsg=775052786155264&dssz=55&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5907&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199336%2C21062421%2C21062453%2C21062832%2C21064549%2C21064592%2C21064653&oid=3&pvsid=1726548844389678&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=11&uci=b.6548rrmvrqbf&fsb=1&xpc=xWkuHfZMnt&p=https%3A//www.golem.de&dtd=167
Frame ID: 7F50043A26E8A1D5E95125B891C67A05
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=1570009058&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=1570009058282&bpp=3&bdt=512&fdt=172&idt=172&shv=r20190926&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120%2C520x120%2C520x120&nras=1&correlator=478404360269&frm=20&pv=1&ga_vid=1942422950.1570009058&ga_sid=1570009058&ga_hid=650167333&ga_fc=0&iag=0&icsg=775052786155264&dssz=55&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199336%2C21062421%2C21062453%2C21062832%2C21064549%2C21064592%2C21064653&oid=3&pvsid=1726548844389678&rx=0&eae=2&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=11&uci=b.ajmrwjr68qc6&fsb=1&dtd=179
Frame ID: 001EC6A4B17DDD3817FE183C99609204
Requests: 1 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvHHcnLrQzfVaGnYNMojOiq0MRu20zxTCalF6biNW481M6DIK_XEBvPQ-DLDjHaYA6tOPQzJ4XGiXPF_bDv7Iz7Jb83seTQgIi0q2rCdzdAHFAS1FQd0EHnGWc_jbLbkrnREOX8mkaStYAAhbQ5D8IQRfYJOQ_XqT1RU0ZKkVW4ozbg1C1W1fdvn97zkZ9OJ45mFP_DYOqJz-2-zSX5GZuR2ozyjSCyS3vXGuJlwJNBFSsjD2TZIyRDn-rpWgL4NahUqXeet-68O_c_J6FW9A&sai=AMfl-YQ7Au7sSbHitH_pGUgJiBL6erJFlmr87rZcQh5Et_G5g0QZlU0fn3-V089hwbyqXfAZcMS9cYEBJyIoy8pea5Z9QYS5X4-MoT_MmMQR&sig=Cg0ArKJSzH-WJaINxkhcEAE&urlfix=1&adurl=
Frame ID: 2386480D02016B5469E52C525B4AF963
Requests: 9 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuwuikmGKgbeoLDB5LIcoC4a33RiHH945Z0Z1J4XbkjQZ4sfMy2H_4T5B4v60pKVgk4TTs3FN0Fi4R1h2TzAzcH6mGcQ8IWAOfbFR98oFsWbwquYOMxtyzm4eGvEbTmmO2g52MdcPYqtQkvAEOBSEF5EGSNcEf_nP92yBroB0qgFzuFQ-JAYOvrwvuU_4XGqJLanHT_D-t0vbdHodTOynfiTYmmT_g-FqDunOyi6bN7biEswepyL4cJIRMxp4uVgR21ZVxrvKJl6ZCBXd_hxQ&sai=AMfl-YRLCxuY56BSI3ZVl0k7lMXhGnDUjSHN2cKNdEUagVXJ8WPvAqhZv3_IZWFv_2ycox_3bZOa1jPN19S529B3XUVVxpVwZ3jR-cpBo9fq&sig=Cg0ArKJSzJ_v6FyZ6R0LEAE&urlfix=1&adurl=
Frame ID: 52061921A0B987D0FB6A280BA95D7378
Requests: 9 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssSR8ZK1OX0AyIbhF9oKpWkIymvdJWk8X6fv3deyncSWphVTCx53H3RDbT9sYxbD3wsNSVvAPS3d65bqjJElL649BFB9blaACQINqtHWU4GTBBg7oI1yXEcI0rWFIY1xKjSnzDQGz1kpdMabdMRJHNuZ1IWGSxmjrcPuZu2SKF8mV5LrfF9RbYfzHCz9Wph9RxjBte1DYJQv69V9tlRux-I8U-ZNLrI68pgXsVt-4ihatH0CM0oHvoqBIbABAlL6sGP1b22xazAFRkgTbb3_w&sai=AMfl-YSOVqTRu1HYVWbGgN7opesRN9MwV_yOTGMUs8pcJzQn9hP8d0LCwkwMGwq2yc2xBtsZRmD-5kPk7EtmgSvSaWrO8aOS9kv_-IG7YxtI&sig=Cg0ArKJSzG3yKa1OjtnGEAE&urlfix=1&adurl=
Frame ID: FCC533301F33389B5FF734BC3E80DDB9
Requests: 9 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsv_5E-Is0d1Kc_Mot29efVqrL6Gb1sQiOg02L9D-Qp_fg3818vgedk27af5IezhfyqYtE7wFJx23QYa63BprVmiLED8a-4VDrM5FSqg0hiKCAEhMv3tmlngmxiUhaKXDo6NuzvHABr3wO5G8U-5tAhhdwUF_vLcuuXYsIEV1sDJCE5YwETL-e47PibVOycKV4JxXvLxWHkLGpoWJOuH_uZYgn6DJnc0tHhhAAixxTEUpq_yJE2VhBEojUufeCGNGNAgoN8-oGWAT5mfIqVSKA&sai=AMfl-YR9jDWIuDMRjMJls3zIiH8aF1g08RyVpMWv58FVN0GPRs7XRwGAlg9OXmQhw7Oqusz29sFvXsssWAKUAYHVMO2gJ_HrcBzWmWDokadF&sig=Cg0ArKJSzC8p0c3ribVCEAE&urlfix=1&adurl=
Frame ID: 7C869B15E37A1A5072F490462256DB8F
Requests: 9 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvQ24CUPgUg21rZbWaQd3d2VZWY6XVfsY_D-R4lOmL46Ob52ZxVZ-PJsTXjYS09Qzz_3txBW_YvkkMZxWL3nOn_VQDqe7AR0gJl66o3GrjSnuJwRHdtqy-ktf4SQw9zzdUEV0A-FzJsCtl2q5-sKYEdXw788pGnWuCDFTWhKluIc2xM1adxldP7E60vYo9TV5C6EHbeDaRsQC3elBIeva1KUjkpVz1qzdRumrKwns7mXIGosOt7UW-AnAFrK908p9XD7FHTT_dXUK1AW9YY1g&sai=AMfl-YTRdPCwuAczEgBOZkXiHd7Ggwrf_YQ8DjOwolO7yyWOWNM2m8jglWK8fi5F9iu70t1l1CaUjSlFyqg4RGq7-Jv07Guuo4e06pvFDyKJ&sig=Cg0ArKJSzLTua10WI_lWEAE&urlfix=1&adurl=
Frame ID: 8F93613D7D82331A6057A3973CDEAF55
Requests: 9 HTTP requests in this frame

Frame: https://imasdk.googleapis.com/js/core/bridge3.337.0_de.html
Frame ID: 1458298D84AC61EE2AB600A29A282409
Requests: 1 HTTP requests in this frame

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

Frame: https://ih.adscale.de/map?ssl=1&format=video&nut&uu=095ea5a9c1bd4879bac6bce4c5d151bc
Frame ID: 0B5E48259E11C87C3424BEF52159F824
Requests: 1 HTTP requests in this frame

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

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

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

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

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

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

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

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

Screenshot


Page URL History Show full URLs

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

Detected technologies

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

Page Statistics

243
Requests

100 %
HTTPS

30 %
IPv6

40
Domains

69
Subdomains

56
IPs

10
Countries

3503 kB
Transfer

7100 kB
Size

5
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://www.golem.de/ Page URL

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 24
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 25
  • 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/0d0b6070-e21a-43f6-9151-5f6ee2a7f554/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
Request Chain 59
  • 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=000f&i2=000fd2984b9f7062f5d946fe1&ep=1596286303&vr=415&id=sxnjyl&i3=000fd2984b9f7062f5d946fe1%3A1596965858111%3A1570009058111%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1570009058111&n1=2&dntt=0&lt=1570009058112&ev=&cs=358cf3&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=000f&i2=000fd2984b9f7062f5d946fe1&ep=1596286303&vr=415&id=sxnjyl&i3=000fd2984b9f7062f5d946fe1%3A1596965858111%3A1570009058111%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1570009058111&n1=2&dntt=0&lt=1570009058112&ev=&cs=358cf3&mo=1&sr=71
Request Chain 131
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=5aed26db1c42890b356af7737d8f6ae2 HTTP 302
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=5aed26db1c42890b356af7737d8f6ae2 HTTP 302
  • https://track.selfcampaign.com/map_td/?tdid=fc32afaf-8824-4652-88e7-54b2ca05ac5a HTTP 302
  • https://track2.selfcampaign.com/map_td/?tdid=fc32afaf-8824-4652-88e7-54b2ca05ac5a
Request Chain 132
  • 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=6357730966244142086&source=adform
Request Chain 137
  • https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=650167333&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=68231353&gjid=120918923&cid=1942422950.1570009058&tid=UA-518800-2&_gid=1280837939.1570009058&_r=1&gtm=2ou9p0&z=1152963680 HTTP 302
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=1942422950.1570009058&jid=68231353&_gid=1280837939.1570009058&gjid=120918923&_v=j79&z=1152963680
Request Chain 147
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=03412b7eabb5c32092d8052409111d9c&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D03412b7eabb5c32092d8052409111d9c%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__ HTTP 302
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=03412b7eabb5c32092d8052409111d9c&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D03412b7eabb5c32092d8052409111d9c%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__&nut&uu=29faf34a04d44eb9adec1791f0b6737c HTTP 307
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=03412b7eabb5c32092d8052409111d9c&userId=adscale-user:29faf34a04d44eb9adec1791f0b6737c
Request Chain 148
  • https://tracking.m6r.eu/sync/appnexusRedirect HTTP 302
  • https://ib.adnxs.com/setuid?entity=197&code=03412b7eabb5c32092d8052409111d9c
Request Chain 149
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=A0Erfqu1wyCS2AUkCREdnA HTTP 302
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=A0Erfqu1wyCS2AUkCREdnA&google_tc= HTTP 302
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Request Chain 150
  • https://tracking.m6r.eu/sync/yieldlabRedirect HTTP 302
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=03412b7eabb5c32092d8052409111d9c
Request Chain 240
  • https://ih.adscale.de/map?ssl=1&format=video HTTP 302
  • https://ih.adscale.de/map?ssl=1&format=video&nut&uu=095ea5a9c1bd4879bac6bce4c5d151bc
Request Chain 245
  • https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1 HTTP 302
  • https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
Request Chain 252
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFBifAESfCBD7-WDUkWsfABifABSfABSfABiUABifABfrr&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=4205533364296263327

243 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request Cookie set /
www.golem.de/
Redirect Chain
  • http://golem.de/
  • https://www.golem.de/
185 KB
42 KB
Document
General
Full URL
https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
86b3bb9fb0f4f3fbd0a0ca1a7399f99450f1509a39e71d57c21badde01212806
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/74.0.3729.169 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
none
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Server
nginx
Date
Wed, 02 Oct 2019 09:37:37 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_74; expires=Wed, 02-Oct-2019 21:37:37 GMT; Max-Age=43200; path=/; domain=.golem.de
Strict-Transport-Security
max-age=15724800; includeSubDomains; preload
ETag
"PEAR-Cache-d2420cee3c0ee0a40d524d24a618ce20"
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
77.247.84.129 , 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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 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
Sat, 02 Nov 2019 09:37:37 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
de723e7804743d889ca188d45f8069a541f8cd2f9554fb485bb1956f20a2ba5c

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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:37 GMT
content-encoding
gzip
vary
Accept-Encoding
x-amz-request-id
B2B92C2E4CB652A5
status
200
content-length
61600
x-amz-id-2
/zRy12bBrHp+vli06/NGPqjeQz8zUclbiGKK3z1PhCAyd+IIZt838PNqICqEsqHArWp5AXOn8VM=
last-modified
Wed, 02 Oct 2019 09:04:39 GMT
server
KONICHIWA/1.0
etag
"c87dc35aec73bdffc0559b1470aebcb6"
access-control-max-age
86400
access-control-allow-methods
GET,HEAD
content-type
application/javascript
access-control-allow-origin
*
cache-control
max-age=866
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
77.247.84.129 , 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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 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
Sat, 02 Nov 2019 09:37:37 GMT
144206-210440-210438_rc.jpg
www.golem.de/1910/
17 KB
17 KB
Image
General
Full URL
https://www.golem.de/1910/144206-210440-210438_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
310e88d0c1dfd7a67d3e3aa187c537b40eaf528afb83a41887214cfd60baba53

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 GMT
Last-Modified
Tue, 01 Oct 2019 17:08:04 GMT
Server
nginx
ETag
"5d9387f4-42df"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
17119
Expires
Sat, 02 Nov 2019 09:37:37 GMT
144216-210502-210499_rc.jpg
www.golem.de/1910/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1910/144216-210502-210499_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e11d3d254e8daa4bbb3a5f48a981ea22672adefbaeb51d4efab17c84f63768bb

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 GMT
Last-Modified
Wed, 02 Oct 2019 09:20:04 GMT
Server
nginx
ETag
"5d946bc4-1b76"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7030
Expires
Sat, 02 Nov 2019 09:37:37 GMT
144212-210483-210482_rc.jpg
www.golem.de/1910/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1910/144212-210483-210482_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ba800097d4ef40c438b23dfa6f11d6087d51770500ac19dd9aae141a47322afc

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 GMT
Last-Modified
Wed, 02 Oct 2019 08:56:04 GMT
Server
nginx
ETag
"5d946624-1f88"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8072
Expires
Sat, 02 Nov 2019 09:37:37 GMT
144211-210466-210465_rc.jpg
www.golem.de/1910/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1910/144211-210466-210465_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
0dc4b8e0fa0f750e5be2b0ef1d653a23989d4e1fe94c2ed18315c3b6a43e4d47

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 GMT
Last-Modified
Wed, 02 Oct 2019 07:21:03 GMT
Server
nginx
ETag
"5d944fdf-15fc"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5628
Expires
Sat, 02 Nov 2019 09:37:37 GMT
144214-210498-210495_rc.jpg
www.golem.de/1910/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1910/144214-210498-210495_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
65c6f88aa10cd74354e6f432a1f5456078386f9286af325915bd211cae46a0b8

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 GMT
Last-Modified
Wed, 02 Oct 2019 08:41:03 GMT
Server
nginx
ETag
"5d94629f-2491"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9361
Expires
Sat, 02 Nov 2019 09:37:37 GMT
144169-210329-210325_rc.jpg
www.golem.de/1910/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1910/144169-210329-210325_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
4c13cd1db06412f5231a3e080e44c24a42f7212b5956b84757fed19eae97a135

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 GMT
Last-Modified
Wed, 02 Oct 2019 07:08:04 GMT
Server
nginx
ETag
"5d944cd4-1fc6"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8134
Expires
Sat, 02 Nov 2019 09:37:37 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=1570007342&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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 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
atlas-hat-neue-parkour-faehigkeiten.jpg
video.golem.de/teaser/1/1/23577/thumb-high-1000/
110 KB
110 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23577/thumb-high-1000/atlas-hat-neue-parkour-faehigkeiten.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
1184e228902329f425f2ffc6f096006080e82a4fbdee4ee28e0d561ccfe4c88a

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 GMT
Last-Modified
Sat, 28 Sep 2019 05:43:37 GMT
Server
nginx
ETag
"5d8ef309-1b818"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
112664
Expires
Sat, 02 Nov 2019 09:37:37 GMT
the-war-of-the-worlds-trailer-(bbc).jpg
video.golem.de/teaser/1/1/23584/thumb-high-1000/
49 KB
50 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23584/thumb-high-1000/the-war-of-the-worlds-trailer-(bbc).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
0119b60e611490f51be9a80060f31f566b232d3026766fd724aa8a41e810a8dd

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 GMT
Last-Modified
Tue, 01 Oct 2019 05:59:42 GMT
Server
nginx
ETag
"5d92eb4e-c525"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
50469
Expires
Sat, 02 Nov 2019 09:37:37 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=1570008242&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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 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
144115-209988-209985_rc.jpg
www.golem.de/1909/
180 KB
180 KB
Image
General
Full URL
https://www.golem.de/1909/144115-209988-209985_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f94af7643f6c8fa09669a5af1f32f53890a3a43365aa11bd1edb193e0b287245

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 GMT
Last-Modified
Fri, 27 Sep 2019 10:09:04 GMT
Server
nginx
ETag
"5d8ddfc0-2cfb7"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
184247
Expires
Sat, 02 Nov 2019 09:37:37 GMT
144083-209933-209930_rc.jpg
www.golem.de/1909/
37 KB
37 KB
Image
General
Full URL
https://www.golem.de/1909/144083-209933-209930_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8a8fb0aaabb05f148c7415ef60f9a8f0dba05f7c982e070a6bb1aa2d68637867

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 GMT
Last-Modified
Fri, 27 Sep 2019 05:22:04 GMT
Server
nginx
ETag
"5d8d9c7c-922b"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
37419
Expires
Sat, 02 Nov 2019 09:37:37 GMT
190923-golem_Seminar_Zeitmanagment_h.jpg
www.golem.de/_img/
295 KB
295 KB
Image
General
Full URL
https://www.golem.de/_img/190923-golem_Seminar_Zeitmanagment_h.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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1154351398f442cae61c3f7a25a0816b6fbc252ce3d6cd93ef9e1a95531c977f

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 GMT
Last-Modified
Mon, 23 Sep 2019 19:57:57 GMT
Server
nginx
ETag
"5d8923c5-49baf"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
301999
Expires
Sat, 02 Nov 2019 09:37:37 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
77.247.84.129 , 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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 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
Sat, 02 Nov 2019 09:37:37 GMT
longread-swiper_131-min.js
www.golem.de/staticrl/scripts/
2 KB
1 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/longread-swiper_131-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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e67f4cd7737c2d4e0be98f3d2cd70c6536f919c5588d409c66bd0df40b66e20d

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 GMT
Content-Encoding
gzip
Last-Modified
Thu, 15 Aug 2019 15:11:10 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
Sat, 02 Nov 2019 09:37:37 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
77.247.84.129 , 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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:37 GMT
Content-Encoding
gzip
Last-Modified
Wed, 02 Oct 2019 09:37:37 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
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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 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
Sat, 02 Nov 2019 09:37:38 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.103.64 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script3.ioam.de
Software
nginx / BLACKBIRD-SRC v0.10 000f
Resource Hash
d673a9b9fc774bd59042de80e4853e402fad483a9aeecdaa6235a6e81dd75126

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 GMT
Content-Encoding
gzip
Last-Modified
Wed, 02 Oct 2019 09:37:37 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.10 000f
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
Wed, 02 Oct 2019 11:37:37 GMT
gpt.js
securepubads.g.doubleclick.net/tag/js/
44 KB
14 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/tag/js/gpt.js
Requested by
Host: 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.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
b4bf79342e85a164d569480f7200e333c3a90e399f00f22b0f91df9728d86808
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"296 / 321 of 1000 / last-modified: 1569872919"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14268
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:37 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
274 KB
84 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.107 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-107.fra2.r.cloudfront.net
Software
/ Express
Resource Hash
65751a8f886fc5b637061a55efd0b245dd9c1080d82308f7b36cf0635da9e1da

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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 07:14:24 GMT
content-encoding
gzip
age
6679
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
deSC41V-7xwQ4A9ZzqhMX2Ofi20H5zP1SB2Rs5ST6VjidKop26U6Nw==
via
1.1 8002c303d4f2295f77566a349deba122.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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 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
Wed, 02 Oct 2019 11:37:37 GMT
dmp
tracking.m6r.eu/sync/
Redirect Chain
  • https://tracking.m6r.eu/sync/dmp
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
97 B
600 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.3, , AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
8312031e6ca02a1188d9ee23e0e9aaa6b5aec550886cee72e6d30de206104f40

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 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
108

Redirect headers

Date
Wed, 02 Oct 2019 09:37:37 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/0d0b6070-e21a-43f6-9151-5f6ee2a7f554/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/0d0b6070-e21a-43f6-9151-5f6ee2a7f554/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/0d0b6070-e21a-43f6-9151-5f6ee2a7f554/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:200c:be00:1f:a1b:34c0:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
bfbbceab1e33b2fdaf5e3714ce2858b90f8b6ca1f2dea87bfa4df6bb7bb92445

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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:37 GMT
via
1.1 a2289d8b15b881db1c42086062568883.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA2
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
1833
x-amz-cf-id
nN6v8FbmhydXh9aBGGuYtJgD7XA469-EWpxDD-wljsWpl53kfIhO4g==

Redirect headers

date
Wed, 02 Oct 2019 09:37:37 GMT
via
1.1 286eb4b50e0acf373dd03645aee00b7f.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/0d0b6070-e21a-43f6-9151-5f6ee2a7f554/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
sDH_qMIn1gRoIuJKK_EZrg4EO-U6DixVR_hk7lgBztIYEI_qB3zrEA==
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: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , 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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 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
Sat, 02 Nov 2019 09:37:37 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: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , 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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 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
Sat, 02 Nov 2019 09:37:37 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: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , 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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 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
Sat, 02 Nov 2019 09:37:37 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/74.0.3729.169 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/74.0.3729.169 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: 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
77.247.84.129 , 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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 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
Sat, 02 Nov 2019 09:37:37 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/74.0.3729.169 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/74.0.3729.169 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/74.0.3729.169 Safari/537.36

Response headers

Content-Type
image/svg+xml
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: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , 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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:37 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
Sat, 02 Nov 2019 09:37:37 GMT
integrator.js
adservice.google.com/adsid/
109 B
323 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:816::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/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
104
x-xss-protection
0
pubads_impl_2019092602.js
securepubads.g.doubleclick.net/gpt/
158 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019092602.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.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
35aefd2d1de0b25d9a5640cf3129dfc507a3c417a7da34f4bb6f9b4a79e19484
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 26 Sep 2019 18:43:36 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
59149
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
submit
lb18.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb18.s400.meetrics.net/bb-mx/submit?/N/UyBIAAA0whFo0F0wFz6BvvA33F3uBnvFslFtuBklFvBEfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSDzCPAAAAAAAAAOAAAAGBAAAAAAZwSDzCBRksFAQtjFliFrSA
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.3.206 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h213.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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:38 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Wed, 02 Oct 2019 09:37:37 GMT
data
lb18.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb18.s400.meetrics.net/data?/N/UyCJAAATkzFARksFAQtjFAsJNSA
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.3.206 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h213.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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:38 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 02-Oct-19 09:37:37 GMT
nuggad
ih.adscale.de/
49 B
487 B
Image
General
Full URL
https://ih.adscale.de/nuggad?/nvars/d3=5&d1=1&d10=5&d9=2&d4=2&d7=1&d2=6&d11=0&d12=3&d8=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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:38 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
Wed, 02 Oct 2019 09:37:38 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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Content-Encoding
gzip
Last-Modified
Mon, 16 Sep 2019 12:52:15 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
Thu, 03 Oct 2019 09:37:38 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
103 KB
36 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
7bc34320273bffb9ea03d5498a5012ffa3d0f48632bfd122f04f0c77525ded82
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
36563
x-xss-protection
0
server
cafe
etag
4812918746124118445
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Wed, 02 Oct 2019 09:37:38 GMT
golem_csi-121-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-121-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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b027fc110a1c4310d433d4be3ffa26b70886ed33a1ec1a2b8270588519507f00

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 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
Sat, 02 Nov 2019 09:37:38 GMT
translator
hbopenbid.pubmatic.com/
0
114 B
XHR
General
Full URL
https://hbopenbid.pubmatic.com/translator?source=prebid-client
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
185.64.189.112 , United Kingdom, ASN62713 (AS-PUBMATIC - PubMatic, Inc., US),
Reverse DNS
Software
/
Resource Hash
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/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

status
204
date
Wed, 02 Oct 2019 09:37:38 GMT
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
access-control-allow-origin
https://www.golem.de
prebid
ib.adnxs.com/ut/v3/
1 KB
2 KB
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.202 , Netherlands, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
318.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
bc5ed781667d750725b240ccff97aab2af11e84eae37d12d4ee8a919521ea3fb
Security Headers
Name Value
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/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Date
Wed, 02 Oct 2019 09:37:40 GMT
Content-Encoding
gzip
Transfer-Encoding
chunked
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Connection
keep-alive
X-Proxy-Origin
89.38.96.188; 89.38.96.188; 318.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.222.235:80
X-XSS-Protection
0
Pragma
no-cache
AN-X-Request-Uuid
aacc1523-435e-40aa-b21e-6e3bf6a8eb06
Server
nginx/1.13.4
Vary
Accept-Encoding
Content-Type
application/json; charset=utf-8
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Expires
Sat, 15 Nov 2008 16:00:00 GMT
fastlane.json
fastlane.rubiconproject.com/a/api/
241 B
2 KB
XHR
General
Full URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=241806&zone_id=1349738&size_id=15&p_pos=unknown&rf=https%3A%2F%2Fwww.golem.de%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=09315943-4f9f-429b-904a-0ea1907cb9e9&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.5293097288122683
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, RSA, AES_128_GCM
Server
69.173.144.143 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
b32a93743bd4cf9e4a73a2a07e31713f6ad8a0d4ecb2127bffc2e2e8fb665815

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/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:38 GMT
Server
RAS 2.4
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=114
Content-Length
241
Expires
Wed, 17 Sep 1975 21:32:10 GMT
fastlane.json
fastlane.rubiconproject.com/a/api/
241 B
2 KB
XHR
General
Full URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=241806&zone_id=1218740&size_id=9&alt_size_ids=8%2C10%2C126&p_pos=unknown&rf=https%3A%2F%2Fwww.golem.de%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=ddc0dcd3-4940-4ff4-a6a1-8dc892478a82&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.9949855853959095
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, RSA, AES_128_GCM
Server
69.173.144.143 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
9503413988272f0430317a02da3f0a5e6ce25f8a0391a876c918123f6bdd3a9a

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/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:38 GMT
Server
RAS 2.4
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=456
Content-Length
241
Expires
Wed, 17 Sep 1975 21:32:10 GMT
fastlane.json
fastlane.rubiconproject.com/a/api/
241 B
2 KB
XHR
General
Full URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=241806&zone_id=1349732&size_id=15&alt_size_ids=10&p_pos=unknown&rf=https%3A%2F%2Fwww.golem.de%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=c5e3ad8e-9903-4853-ac73-bccc02cb25a2&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.2465751497803097
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, RSA, AES_128_GCM
Server
69.173.144.143 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
7096017d5ebff5c81d45fb7c1fd18e10eb13be4af1da737d0b6bfd93b1e35546

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/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:38 GMT
Server
RAS 2.4
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=410
Content-Length
241
Expires
Wed, 17 Sep 1975 21:32:10 GMT
fastlane.json
fastlane.rubiconproject.com/a/api/
241 B
2 KB
XHR
General
Full URL
https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=241806&zone_id=1349674&size_id=2&alt_size_ids=55%2C57%2C125&p_pos=unknown&rf=https%3A%2F%2Fwww.golem.de%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=160bb2b3-a3a5-4d06-bf1c-7ff7334abcb7&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.6974756061778082
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, RSA, AES_128_GCM
Server
69.173.144.143 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
17e9a34c14b7a3289f64bb425e3ac33092c3a7748eaeb96311f78b5296a92ef7

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/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:38 GMT
Server
RAS 2.4
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store, max-age=0, must-revalidate
Access-Control-Allow-Credentials
true
Connection
Keep-Alive
Content-Type
application/json
Keep-Alive
timeout=5, max=336
Content-Length
241
Expires
Wed, 17 Sep 1975 21:32:10 GMT
v1
prg.smartadserver.com/prebid/
0
319 B
XHR
General
Full URL
https://prg.smartadserver.com/prebid/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
185.86.137.17 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
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/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:37 GMT
P3P
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Content-Type
application/json
Content-Length
0
Expires
-1
v1
prg.smartadserver.com/prebid/
0
319 B
XHR
General
Full URL
https://prg.smartadserver.com/prebid/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
185.86.137.17 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
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/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:37 GMT
P3P
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Content-Type
application/json
Content-Length
0
Expires
-1
v1
prg.smartadserver.com/prebid/
0
1 KB
XHR
General
Full URL
https://prg.smartadserver.com/prebid/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
185.86.137.17 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
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/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:37 GMT
X-SMRT-D
3%3b19%3b124
P3P
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Content-Type
application/json
Content-Length
0
Expires
-1
v1
prg.smartadserver.com/prebid/
0
319 B
XHR
General
Full URL
https://prg.smartadserver.com/prebid/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
185.86.137.17 , France, ASN201081 (SMARTADSERVER, FR),
Reverse DNS
Software
/
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/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:37 GMT
P3P
CP="BUS CUR CONo FIN IVDo ONL OUR PHY SAMo TELo"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Content-Type
application/json
Content-Length
0
Expires
-1
prebid
ib.adnxs.com/ut/v3/
496 B
1 KB
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.202 , Netherlands, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
318.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
51649bd46e22a115366ce41685d7d0d0ad1c276d29246611f89dbe2fef230599
Security Headers
Name Value
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/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:40 GMT
X-Proxy-Origin
89.38.96.188; 89.38.96.188; 318.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.79:80
AN-X-Request-Uuid
ce1fc128-414c-4f74-8b30-9d8d4e90396c
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
496
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
arj
yieldlove-d.openx.net/w/1.0/
11 KB
11 KB
XHR
General
Full URL
https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.golem.de%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=-120&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=09315943-4f9f-429b-904a-0ea1907cb9e9%2Cddc0dcd3-4940-4ff4-a6a1-8dc892478a82%2Cc5e3ad8e-9903-4853-ac73-bccc02cb25a2%2C160bb2b3-a3a5-4d06-bf1c-7ff7334abcb7%2Cb89d3b43-277f-4495-8ab7-d3d5d091265f&nocache=1570009058079&aus=300x250%7C300x600%2C160x600%2C120x600%2C200x600%2C301x601%7C300x600%2C300x250%7C970x250%2C970x90%2C800x250%2C728x90%7C970x250%2C970x90%2C800x250%2C728x90&divIds=rectangle2%2Csky%2Crectangle%2Cbanner%2Cbillboard2&auid=540523394%2C540523392%2C540523393%2C540523387%2C540651907&
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
34.95.120.147 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
147.120.95.34.bc.googleusercontent.com
Software
OXGW/16.163.0 /
Resource Hash
3e84742ca9633f23c8d106e006bc4f5dbee50a88318b4243533a8c188fa2fe57

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/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

pragma
no-cache
date
Wed, 02 Oct 2019 09:37:38 GMT
via
1.1 google
server
OXGW/16.163.0
status
200
vary
Accept
p3p
CP="CUR ADM OUR NOR STA NID"
access-control-allow-origin
https://www.golem.de
cache-control
private, max-age=0, no-cache
access-control-allow-credentials
true
content-type
application/json
alt-svc
clear
content-length
10778
expires
Mon, 26 Jul 1997 05:00:00 GMT
v1
dmx.districtm.io/b/
0
397 B
XHR
General
Full URL
https://dmx.districtm.io/b/v1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
104.16.68.69 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains; preload

Request headers

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

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
server
cloudflare
status
204
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
origin
access-control-allow-methods
OPTIONS, POST
access-control-allow-origin
https://www.golem.de
access-control-allow-credentials
true
strict-transport-security
max-age=31536000; includeSubDomains; preload
cf-ray
51f5b2e66916bf73-AMS
access-control-allow-headers
origin, content-type
/
adx.adform.net/adx/
10 B
407 B
XHR
General
Full URL
https://adx.adform.net/adx/?rp=4&bWlkPTcxNDQ0MyZ0cmFuc2FjdGlvbklkPWRkYzBkY2QzLTQ5NDAtNGZmNC1hNmExLThkYzg5MjQ3OGE4Mg%3D%3D&bWlkPTcxNDQ0NCZ0cmFuc2FjdGlvbklkPTE2MGJiMmIzLWEzYTUtNGQwNi1iZjFjLTdmZjczMzRhYmNiNw%3D%3D&pt=gross&stid=b89fbca0-b05b-47cb-a26b-854f4a0a973c&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.2.235 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
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/74.0.3729.169 Safari/537.36
Content-Type
text/plain

Response headers

pragma
no-cache
date
Wed, 02 Oct 2019 09:37:38 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
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=3643370963282444&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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 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
Sat, 02 Nov 2019 09:37:38 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=000f&i2=000fd2984b9f7062f5d946fe1&ep=1596286303&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=000f&i2=000fd2984b9f7062f5d946fe1&ep=1596286303&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=000f&i2=000fd2984b9f7062f5d946fe1&ep=1596286303&vr=415&id=sxnjyl&i3=000fd2984b9f7062f5d946fe1%3A1596965858111%3A1570009058111%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1570009058111&n1=2&dntt=0&lt=1570009058112&ev=&cs=358cf3&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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 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
Wed, 02 Oct 2019 09:37:38 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
Wed, 02 Oct 2019 09:37:38 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=000f&i2=000fd2984b9f7062f5d946fe1&ep=1596286303&vr=415&id=sxnjyl&i3=000fd2984b9f7062f5d946fe1%3A1596965858111%3A1570009058111%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1570009058111&n1=2&dntt=0&lt=1570009058112&ev=&cs=358cf3&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
Tue, 02 Oct 2018 09:37:38 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
116.202.11.242 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.242.11.202.116.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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 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
Sat, 28 Sep 2019 10:42:55 GMT
js
www.googletagmanager.com/gtag/
69 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:81a::2008 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
a2a299e787c5e2eae436a7bca674151478821c9dd819d07d637c7abbb6c8df62
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
br
last-modified
Wed, 02 Oct 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-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
27195
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 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
9061640c00ecd839dc1d1b654386cddad6052129bcda9d887b57487f8134e3f5
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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:38 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
c311b3fc-db29-4f75-868b-84798f79db31
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.022080
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:21f3:5000:15:efbc:e300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
bd30ffd9618eaa423abb4c900f4af01cac18be85d75265ba08d87d5230bf85b8

Request headers

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

Response headers

date
Fri, 12 Jul 2019 20:30:19 GMT
via
1.1 c7015d60d4f8f2170aaaa75e69e40618.cloudfront.net (CloudFront)
last-modified
Thu, 11 Jul 2019 15:46:11 GMT
server
AmazonS3
age
47182
etag
"a5442c681a576408c25edbf365995343"
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
x-amz-cf-pop
FRA2-C2
accept-ranges
bytes
content-length
3167
x-amz-cf-id
lMmYZFNcahaGZTsAJxjkmE4WE7JGI0p5TGmLctuBH59yGmaU4sHApA==
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
77.247.84.129 , 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/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors

Response headers

Date
Wed, 02 Oct 2019 09:37:38 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
Sat, 02 Nov 2019 09:37:38 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
77.247.84.129 , 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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 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
Sat, 02 Nov 2019 09:37:38 GMT
call-of-duty-mobile-trailer-(launch).jpg
video.golem.de/teaser/1/1/23589/thumb-high-1000/
56 KB
56 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23589/thumb-high-1000/call-of-duty-mobile-trailer-(launch).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
4931c1448e1ff3d932016d61343723b80faa393a4ad446fcbc781b350ac428a4

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Wed, 02 Oct 2019 06:49:12 GMT
Server
nginx
ETag
"5d944868-df79"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
57209
Expires
Sat, 02 Nov 2019 09:37:38 GMT
2019-09-26(17).jpg
video.golem.de/teaser/1/1/23567/thumb-high-1000/
94 KB
94 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23567/thumb-high-1000/2019-09-26(17).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
cac5284f8f3259036443b495e8c2d0adbb0be77052811f38ce871befe9ec9f2d

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Thu, 26 Sep 2019 16:22:54 GMT
Server
nginx
ETag
"5d8ce5de-1777e"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
96126
Expires
Sat, 02 Nov 2019 09:37:38 GMT
nissan-stellt-elektrisches-luxus-stadtauto-imk-vor-(herstellervideo).jpg
video.golem.de/teaser/1/1/23591/thumb-high-1000/
121 KB
121 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/23591/thumb-high-1000/nissan-stellt-elektrisches-luxus-stadtauto-imk-vor-(herstellervideo).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
07dc0032af03aa70d823ae29a890bed8b28b51ee10d86ee2db336c64321dcbac

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Wed, 02 Oct 2019 06:39:22 GMT
Server
nginx
ETag
"5d94461a-1e36e"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
123758
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144208-210451-210450_rc.jpg
www.golem.de/1910/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1910/144208-210451-210450_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
4b90ba75e355a3807ea14598c40c071a435184fa4ba8bb8326a8dff647d12155

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Wed, 02 Oct 2019 05:29:03 GMT
Server
nginx
ETag
"5d94359f-15e8"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5608
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144215-210494-210491_rc.jpg
www.golem.de/1910/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1910/144215-210494-210491_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
4402acdfead5b00daf6e5ab75a8f93999f696c4098847c63493f41a8019bdf4f

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Wed, 02 Oct 2019 08:24:03 GMT
Server
nginx
ETag
"5d945ea3-1b3d"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6973
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144185-210317-210314_rc.jpg
www.golem.de/1910/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1910/144185-210317-210314_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e92385f4191769df73ce7639b2cc0988ce3d8b2c9e7ad59852b61fd3a49bd9b8

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Tue, 01 Oct 2019 07:04:03 GMT
Server
nginx
ETag
"5d92fa63-1c19"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7193
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144213-210487-210484_rc.jpg
www.golem.de/1910/
5 KB
5 KB
Image
General
Full URL
https://www.golem.de/1910/144213-210487-210484_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d30e84d1c8698d1b922c5e0fefe8c693766945b13505d6c9693048340f198e65

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Wed, 02 Oct 2019 08:12:04 GMT
Server
nginx
ETag
"5d945bd4-1326"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4902
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144210-210459-210456_rc.jpg
www.golem.de/1910/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1910/144210-210459-210456_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f33117eacda2949088a603d0f749027c248306843cfee539d101afca48d52bea

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Wed, 02 Oct 2019 06:00:03 GMT
Server
nginx
ETag
"5d943ce3-15d8"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5592
Expires
Sat, 02 Nov 2019 09:37:38 GMT
143433-209337-209334_rc.jpg
www.golem.de/1909/
52 KB
52 KB
Image
General
Full URL
https://www.golem.de/1909/143433-209337-209334_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d90eedc7423fdd9d51939b844afaf730a5378b8ea2de16738277530588925476

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Thu, 26 Sep 2019 10:10:04 GMT
Server
nginx
ETag
"5d8c8e7c-cf81"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
53121
Expires
Sat, 02 Nov 2019 09:37:38 GMT
137852-179827-179824_rc.jpg
www.golem.de/1811/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1811/137852-179827-179824_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5b195cb6c314aa8743f79114592a4a2a8486bc5a14de79a6f86ec3cd4ddaaf10

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Thu, 22 Nov 2018 06:33:04 GMT
Server
nginx
ETag
"5bf64da0-207e"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8318
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144153-210284-210283_rc.jpg
www.golem.de/1910/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1910/144153-210284-210283_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5a8fc6277f1a4f5ba27aca1d6cea5a3174a3b13fc6851e45e621f131caa4bb3a

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Tue, 01 Oct 2019 10:02:05 GMT
Server
nginx
ETag
"5d93241d-184d"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6221
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144209-210455-210452_rc.jpg
www.golem.de/1910/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1910/144209-210455-210452_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
eaa1d30bc491154291ffefb0f40b88f6ab43c88b5d04bee77b9b88dddb65bfb1

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Wed, 02 Oct 2019 05:42:03 GMT
Server
nginx
ETag
"5d9438ab-1e0b"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7691
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144187-210338-210335_rc.jpg
www.golem.de/1910/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1910/144187-210338-210335_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d3e0592d7db4d49071247648315c9f543e447bdf78c3c1494272a7d4ef7f2463

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Tue, 01 Oct 2019 09:12:04 GMT
Server
nginx
ETag
"5d931864-1717"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5911
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144184-210319-210318_rc.jpg
www.golem.de/1910/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1910/144184-210319-210318_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f20d865511fa3bf25f2e84d5d3541c3396d3d68e935d84f6d8836f1cfd52dde6

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Tue, 01 Oct 2019 05:59:03 GMT
Server
nginx
ETag
"5d92eb27-260a"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9738
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144207-210445-210442_rc.jpg
www.golem.de/1910/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1910/144207-210445-210442_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a7ae89dbe679b66dfbb4e9e7e1beedecf56651a85b16d41a6057d75a66d8cebc

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Wed, 02 Oct 2019 05:15:04 GMT
Server
nginx
ETag
"5d943258-236e"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9070
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144174-210261-210258_rc.jpg
www.golem.de/1909/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1909/144174-210261-210258_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
037bc858629fd4eda5e560ef9513c93d25f1313a276abe64cfd97fa8023c6de5

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Mon, 30 Sep 2019 14:42:04 GMT
Server
nginx
ETag
"5d92143c-18b2"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6322
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144205-210437-210434_rc.jpg
www.golem.de/1910/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1910/144205-210437-210434_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
eec0354b7a773da37969688d3bbfeec7eb326e960fbad3465bd6b4bde920418d

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Tue, 01 Oct 2019 15:22:04 GMT
Server
nginx
ETag
"5d936f1c-22d7"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8919
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144203-210428-210425_rc.jpg
www.golem.de/1910/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1910/144203-210428-210425_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a60c1df6de6828e4fbe50cafee5273d75f9feb0e401e2ec50bbf3633f3194296

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Tue, 01 Oct 2019 13:32:03 GMT
Server
nginx
ETag
"5d935553-153f"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5439
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144204-210424-210421_rc.jpg
www.golem.de/1910/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1910/144204-210424-210421_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
418544f013a78f89776b5560b6e0892106fceabd2870b35a73ae94c99ec095d4

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Tue, 01 Oct 2019 13:17:04 GMT
Server
nginx
ETag
"5d9351d0-1a95"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6805
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144138-210096-210093_rc.jpg
www.golem.de/1910/
5 KB
5 KB
Image
General
Full URL
https://www.golem.de/1910/144138-210096-210093_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a5011ca06b3a6e348d7c1e2a967f256c796c94aa67fb377ed3751d7e85ca2e3d

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Tue, 01 Oct 2019 13:00:04 GMT
Server
nginx
ETag
"5d934dd4-1356"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4950
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144202-210420-210417_rc.jpg
www.golem.de/1910/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1910/144202-210420-210417_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
df949c5e7d734723d51e393307de9cf5a9d835b0d778682839486cece7aef9bf

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Tue, 01 Oct 2019 12:50:03 GMT
Server
nginx
ETag
"5d934b7b-16c9"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5833
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144200-210409-210405_rc.jpg
www.golem.de/1910/
7 KB
8 KB
Image
General
Full URL
https://www.golem.de/1910/144200-210409-210405_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9e4606cc9cfa6753ac01ec3c6ee7abcde1dafc1fcadaa0678a66854aa1836ec7

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Tue, 01 Oct 2019 12:26:03 GMT
Server
nginx
ETag
"5d9345db-1cf6"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7414
Expires
Sat, 02 Nov 2019 09:37:38 GMT
143458-206816-206813_rc.jpg
www.golem.de/1909/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1909/143458-206816-206813_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1758d5ad477dde11feff235ee6323928855c5172f138a54df819740c106de5f7

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Mon, 30 Sep 2019 10:00:04 GMT
Server
nginx
ETag
"5d91d224-1754"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5972
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144201-210404-210401_rc.jpg
www.golem.de/1910/
5 KB
5 KB
Image
General
Full URL
https://www.golem.de/1910/144201-210404-210401_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
24ba18db24e5df3102ba712c3d6238822be2f422789331a9e6f42a6e2d61d269

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Tue, 01 Oct 2019 12:11:03 GMT
Server
nginx
ETag
"5d934257-1413"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5139
Expires
Sat, 02 Nov 2019 09:37:38 GMT
143447-209773-209770_rc.jpg
www.golem.de/1909/
11 KB
11 KB
Image
General
Full URL
https://www.golem.de/1909/143447-209773-209770_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e030f4eeaf866259d00c936538cc30ca1476d3c35a8a9d24c5925b7a4f20ed15

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Mon, 30 Sep 2019 07:00:03 GMT
Server
nginx
ETag
"5d91a7f3-2c40"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
11328
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144196-210392-210387_rc.jpg
www.golem.de/1910/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1910/144196-210392-210387_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b3c8f5cb7988b744a924e7e3b94e77b25277d66b765409aec0fff0d3b54aaaa5

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Tue, 01 Oct 2019 11:46:04 GMT
Server
nginx
ETag
"5d933c7c-161c"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5660
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144156-210304-210303_rc.jpg
www.golem.de/1910/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1910/144156-210304-210303_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9c2e7b28e4212473abe31aa3ad9c470d3de935308118344afe98592df47c2504

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Tue, 01 Oct 2019 07:07:05 GMT
Server
nginx
ETag
"5d92fb19-15a9"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5545
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144194-210391-210390_rc.jpg
www.golem.de/1910/
4 KB
4 KB
Image
General
Full URL
https://www.golem.de/1910/144194-210391-210390_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a6362c906f2ad34ad3fd112982c9c1d343d1a7f2be4ba0316ed3cbef9e4c6a92

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Tue, 01 Oct 2019 11:31:03 GMT
Server
nginx
ETag
"5d9338f7-1065"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4197
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144191-210354-210349_rc.jpg
www.golem.de/1910/
5 KB
5 KB
Image
General
Full URL
https://www.golem.de/1910/144191-210354-210349_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
80e20698a9b4720d654427d4fe918306510be65c030d9812eeff65a850eaff00

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Tue, 01 Oct 2019 10:30:04 GMT
Server
nginx
ETag
"5d932aac-1221"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4641
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144190-210358-210355_rc.jpg
www.golem.de/1910/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1910/144190-210358-210355_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5d2d6cdc6bb2e9a3e32364d21cc3397f25407a66f7e940b53a42f8a1de6a6a28

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Tue, 01 Oct 2019 09:55:03 GMT
Server
nginx
ETag
"5d932277-1fe0"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8160
Expires
Sat, 02 Nov 2019 09:37:38 GMT
144145-210124-210121_rc.jpg
www.golem.de/1909/
9 KB
10 KB
Image
General
Full URL
https://www.golem.de/1909/144145-210124-210121_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8dddcfd8e72835e894bdf5f1a6834228e9d839d138e4879d176ffff87568181c

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Sat, 28 Sep 2019 19:01:04 GMT
Server
nginx
ETag
"5d8fadf0-2583"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9603
Expires
Sat, 02 Nov 2019 09:37:38 GMT
sp_144039-205483-205481_rc.jpg
www.golem.de/1909/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/1909/sp_144039-205483-205481_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
51f85281f32afbfbb77ddd51c2ce831c30479260b6ac45e53581d99a26e6bf2e

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/74.0.3729.169 Safari/537.36

Response headers

X-Cnection
close
Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Fri, 27 Sep 2019 07:00:05 GMT
Server
nginx
ETag
"5d8db375-571f"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Accept-Ranges
bytes
Content-Length
22303
Expires
Sat, 02 Nov 2019 09:37:38 GMT
sp_144127-210051-210049_rc.jpg
www.golem.de/1909/
31 KB
31 KB
Image
General
Full URL
https://www.golem.de/1909/sp_144127-210051-210049_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
81d8bf43f33319f1a26707d0c0f426dfd6bc37c00020ae53e399a9bff42e99db

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Fri, 27 Sep 2019 11:30:04 GMT
Server
nginx
ETag
"5d8df2bc-7a5d"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
31325
Expires
Sat, 02 Nov 2019 09:37:38 GMT
sp_144112-209978-209976_rc.jpg
www.golem.de/1909/
23 KB
23 KB
Image
General
Full URL
https://www.golem.de/1909/sp_144112-209978-209976_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d50f3c8d580746c1d1a272723609f4e5387269828e5c657630df7feeadc2ffa6

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Thu, 26 Sep 2019 12:00:04 GMT
Server
nginx
ETag
"5d8ca844-5b1d"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
23325
Expires
Sat, 02 Nov 2019 09:37:38 GMT
sp_144090-209943-209941_rc.jpg
www.golem.de/1909/
20 KB
20 KB
Image
General
Full URL
https://www.golem.de/1909/sp_144090-209943-209941_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ce00a8bcf5e6b3267b9e3992831b43c130e28d205c763eec079075ca1055c08f

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Thu, 26 Sep 2019 08:53:04 GMT
Server
nginx
ETag
"5d8c7c70-4f5f"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
20319
Expires
Sat, 02 Nov 2019 09:37:38 GMT
sp_144099-209902-209900_rc.jpg
www.golem.de/1909/
14 KB
15 KB
Image
General
Full URL
https://www.golem.de/1909/sp_144099-209902-209900_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
63b5b4b7f178fd67e030680bc1d18a35984a4ae8422581e82308c9cb1d18fc56

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Thu, 26 Sep 2019 07:01:05 GMT
Server
nginx
ETag
"5d8c6231-38d4"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
14548
Expires
Sat, 02 Nov 2019 09:37:38 GMT
sp_144068-210065-210063_rc.jpg
www.golem.de/1909/
19 KB
19 KB
Image
General
Full URL
https://www.golem.de/1909/sp_144068-210065-210063_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
37471fa2b8b21ce6606f6b9f06e4eda8970d12594fa57f3d74fd906754695ff5

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Fri, 27 Sep 2019 08:39:05 GMT
Server
nginx
ETag
"5d8dcaa9-4c41"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
19521
Expires
Sat, 02 Nov 2019 09:37:38 GMT
sp_144082-209824-209822_rc.jpg
www.golem.de/1909/
17 KB
18 KB
Image
General
Full URL
https://www.golem.de/1909/sp_144082-209824-209822_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d7f5b039e95559581c5c6ecedaebe5f02c0851d7f8f8f313ba1e7dea8605103a

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Thu, 26 Sep 2019 15:00:05 GMT
Server
nginx
ETag
"5d8cd275-4518"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
17688
Expires
Sat, 02 Nov 2019 09:37:38 GMT
sp_143888-208880-208878_rc.jpg
www.golem.de/1909/
22 KB
23 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143888-208880-208878_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
232180bb028ce94f6d77bd46782c2d305746ae99cbe7adbe884e94076d91107b

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Tue, 24 Sep 2019 07:20:05 GMT
Server
nginx
ETag
"5d89c3a5-59e9"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
23017
Expires
Sat, 02 Nov 2019 09:37:38 GMT
sp_144026-209578-209576_rc.jpg
www.golem.de/1909/
20 KB
20 KB
Image
General
Full URL
https://www.golem.de/1909/sp_144026-209578-209576_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9c5b8010b9f862f91cc14b5082dd85d3907a0d179a89a4c2ab8b3273a8b836c2

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Tue, 24 Sep 2019 09:58:05 GMT
Server
nginx
ETag
"5d89e8ad-4fe7"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
20455
Expires
Sat, 02 Nov 2019 09:37:38 GMT
sp_143339-206175-206173_rc.jpg
www.golem.de/1909/
16 KB
16 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143339-206175-206173_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
c3688c4f3558318584c10d651297832000a94af276da9288d74045a69a85c17f

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Fri, 20 Sep 2019 12:49:05 GMT
Server
nginx
ETag
"5d84cac1-3e08"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
15880
Expires
Sat, 02 Nov 2019 09:37:38 GMT
sp_143931-209149-209147_rc.jpg
www.golem.de/1909/
28 KB
29 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143931-209149-209147_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
0cf30fef0fab894e55602dccf3099fa7c19b13a6f97e84d4d498a532b5a6c725

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Thu, 19 Sep 2019 07:26:04 GMT
Server
nginx
ETag
"5d832d8c-7185"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
29061
Expires
Sat, 02 Nov 2019 09:37:38 GMT
sp_143856-208699-208697_rc.jpg
www.golem.de/1909/
29 KB
29 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143856-208699-208697_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1a2d672618e60c667ce620319f392ae45207f2c77c60299ffb5290210b150c53

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Thu, 19 Sep 2019 14:09:05 GMT
Server
nginx
ETag
"5d838c01-7233"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
29235
Expires
Sat, 02 Nov 2019 09:37:38 GMT
sp_143883-209167-209165_rc.jpg
www.golem.de/1909/
21 KB
22 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143883-209167-209165_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ab50a271594ffad54cda02ba744a01d5ba587b6ec47986ac6fab5270b4b11fec

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Thu, 19 Sep 2019 10:03:05 GMT
Server
nginx
ETag
"5d835259-55ab"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
21931
Expires
Sat, 02 Nov 2019 09:37:38 GMT
sp_143693-209143-209141_rc.jpg
www.golem.de/1909/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143693-209143-209141_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
168a22846aba37d45ba1c76c155db3ccc9ee0e544438182876f8f860f72c043b

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Fri, 20 Sep 2019 06:43:05 GMT
Server
nginx
ETag
"5d8474f9-56be"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22206
Expires
Sat, 02 Nov 2019 09:37:38 GMT
sp_143579-207305-207303_rc.jpg
www.golem.de/1909/
20 KB
20 KB
Image
General
Full URL
https://www.golem.de/1909/sp_143579-207305-207303_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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3d0e20e960d26b6b610d648198b6b410c230d5f3e59fc32cb0464e69592deb5c

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Tue, 17 Sep 2019 10:00:05 GMT
Server
nginx
ETag
"5d80aea5-50a6"
Content-Type
image/jpeg
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
20646
Expires
Sat, 02 Nov 2019 09:37:38 GMT
cpx.php
cpx.golem.de/
42 B
420 B
Image
General
Full URL
https://cpx.golem.de/cpx.php?class=0&ts=1570009058&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
77.247.84.149 , 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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:38 GMT
Last-Modified
Wed, 02 Oct 2019 09:37:38 GMT
Server
Apache
P3P
CP="NOI NID ADMa OUR IND UNI COM NAV"
Cache-Control
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection
close
Content-Type
image/gif
Content-Length
42
Expires
Sat, 10 Oct 2000 03:33:33 GMT
ads
securepubads.g.doubleclick.net/gampad/
62 KB
8 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1726548844389678&correlator=1546648980776122&output=ldjh&impl=fifs&adsid=NT&eid=21062421%2C21062453%2C21062832%2C21064549%2C21064592&vrg=2019092602&guci=2.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191002&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%2C0%2F1%2F2&prev_iu_szs=10x40%7C10x30%7C10x20%7C500x600%7C770x200%7C120x600%7C160x600%7C200x600%7C300x600%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%2C800x450%7C580x500%7C580x360%7C42x31%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%3Dfalse%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%3Dfalse%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%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2CvideoTakeover%7Cas%3Drectangle%26adslot%3Drectangle%26pc%3D1%26yieldlove_reload%3Dpid%253A17299.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%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%3Dfalse%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%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt%7Cas%3Drectangle2%26adslot%3Drectangle2%26pc%3D1%26yieldlove_reload%3Dpid%253A17300.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%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%3D03412b7eabb5c32092d8052409111d9c%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-0%252Cn121-2%252Cn126-1%252Cn69-0%252Cn75-0%252Cn91-0%252Cn62-1%252Cn116-0%252Cn158-1%252Cn104-0%252Cn139-1%252Cn128-2%252Cn5-5%252Cn109-0%252Cn105-0%252Cn159-0%252Cn114-0%252Cn20-1%252Cn80-1%252Cn117-2%252Cn58-1%252Cn123-2%252Cn90-1%252Cn76-1%252Cn66-1%252Cn101-1%252Cn77-0%252Cn60-1%252Cn64-0%252Cn111-0%252Cn136-0%252Cn103-0%252Cn17-1%252Cn137-0%252Cn161-1%252Cn86-0%252Cn147-4%252Cn3-1%252Cn83-0%252Cn8-5%252Cn107-0%252Cn57-1%252Cn99-1%252Cn120-2%252Cn118-6%252Cn153-1%252Cn82-1%252Cn33-1%252Cn39-1%252Cn156-1%252Cn124-1%252Cn138-0%252Cn140-0%252Cn141-0%252Cn157-1%252Cn43-1%252Cn142-0%252Cn7-2%252Cn110-0%252Cn87-0%252Cn12-2%252Cn102-0%252Cn92-1%252Cn122-1%252Cn11-1%252Cn46-1%252Cn79-1%252Cn93-3%252Cn148-0%252Cn42-1%252Cn2-6%252Cn67-0%252Cn115-1%252Cn89-2%252Cn154-1%252Cn84-0%252Cn108-0%252Cn54-0%252Cn18-1%252Cn88-1%252Cn160-1%252Cn78-1%252Cn44-1%252Cn106-1%252Cn52-2%252Cn119-5%252Cn81-1%252Cn125-1%252Cn149-0%252Cn85-0%252Cn9-0%252Cn10-3%252Cn21-1%252Cn15-2%252Cn155-1%252Cn6-2%252Cn63-0%252Cn94-2%252Cn23-1%26keywords%3Dhomepage%252Ctsilkcalb%252Cnews%252Cweb%252Cinternet%252Cheadlines%252Cnewsletter%252Ctechnology%252Ccomputer%252Cinformation%252Cpc%26mbrStatus%3Dcalled-idfound&cookie_enabled=1&bc=31&abxe=1&lmt=1570009058&dt=1570009058180&dlt=1570009057770&idt=382&frm=20&biw=1585&bih=1200&oid=3&adxs=1378%2C783%2C1138%2C783%2C393%2C1138&adys=0%2C130%2C748%2C1309%2C2784%2C4326&adks=3761801772%2C2546325955%2C2740773112%2C366944190%2C3564596220%2C2251274322&ucis=1%7C2%7C3%7C4%7C5%7C6&ifi=1&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=48&icsg=13256427048896&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=160x40%7C1000x10%7C300x20%7C1000x10%7C1000x450%7C300x12&msz=160x40%7C1000x10%7C300x20%7C1000x10%7C1000x450%7C300x10&ga_vid=1942422950.1570009058&ga_sid=1570009058&ga_hid=650167333&fws=0%2C0%2C0%2C0%2C0%2C0&ohw=0%2C0%2C0%2C0%2C0%2C0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019092602.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
cafe /
Resource Hash
54330a34b484ec175b5a61bb50ee87603d34a83030c6c6729c501930c21caa63
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2,-2,-2,-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-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
8093
x-xss-protection
0
google-lineitem-id
4889676871,4889797896,4889680744,4980490284,-2,4889801247
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138267872638,138267578040,138267872656,138263655552,-2,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
pubads_impl_rendering_2019092602.js
securepubads.g.doubleclick.net/gpt/
63 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019092602.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019092602.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
35c073a53df4dd054afab9758b90a88846802754ff15fc3b31cc9af133c8a401
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 26 Sep 2019 18:43:36 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24721
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019092602.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/74.0.3729.169 Safari/537.36

Response headers

show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20190926/r20190131/
231 KB
85 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20190926/r20190131/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
c8615d41121675d739ad8a05627ccfd2c6b99c576521ff17a2313f79a37fa6cc
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
86819
x-xss-protection
0
server
cafe
etag
6415741152906011923
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Wed, 02 Oct 2019 09:37:38 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20190926/r20190131/ Frame 5063
231 KB
85 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20190926/r20190131/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81e::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
c8615d41121675d739ad8a05627ccfd2c6b99c576521ff17a2313f79a37fa6cc
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
86819
x-xss-protection
0
server
cafe
etag
6415741152906011923
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Wed, 02 Oct 2019 09:37:38 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20190926/r20190131/ Frame 0B36
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20190926/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:816::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/r20190926/r20190131/zrt_lookup.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.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/74.0.3729.169 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
Thu, 26 Sep 2019 16:33:54 GMT
expires
Thu, 10 Oct 2019 16:33:54 GMT
content-type
text/html; charset=UTF-8
etag
2385566188703980536
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
7388
x-xss-protection
0
cache-control
public, max-age=1209600
age
493424
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
sp_1Gq81-386758_rc.jpg
www.golem.de/6884/
68 B
463 B
Image
General
Full URL
https://www.golem.de/6884/sp_1Gq81-386758_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
77.247.84.129 , 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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:38 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/
47 KB
11 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
3861f11012d2bf6851a66a931e2b1959cce703983c416577cdb33f90fc7775e7

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Content-Encoding
gzip
Age
3257
X-Cache
HIT
Connection
keep-alive
Content-Length
10143
x-amz-id-2
VOLGELY1Hig4muJmOsdcNg+iAJJLpsrZalSQyqVOgPeG4vNgymV4FBnR4yKo+g++KlPcMI0aocM=
X-Served-By
cache-fra19171-FRA
Last-Modified
Wed, 02 Oct 2019 08:42:21 GMT
Server
AmazonS3
X-Timer
S1570009058.367707,VS0,VE0
ETag
"5f694197cd274b4589dcad1ceb36c8ad"
x-amz-request-id
EF6B14044CD65D89
Via
1.1 varnish
Cache-Control
public, max-age=900, stale-while-revalidate=3600
Accept-Ranges
bytes
Content-Type
text/javascript
X-Cache-Hits
193
rmpslider-rl_131-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_131-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
77.247.84.129 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
7346058873c7f718c1eb7091602686e344d27802c07b55e700bf7aa27169d698

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/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Content-Encoding
gzip
Last-Modified
Thu, 15 Aug 2019 15:11:27 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
Sat, 02 Nov 2019 09:37:38 GMT
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/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Wed, 02 Oct 2019 09:37:38 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/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Wed, 02 Oct 2019 09:37:38 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/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Wed, 02 Oct 2019 09:37:38 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/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Wed, 02 Oct 2019 09:37:38 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"
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/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Wed, 02 Oct 2019 09:37:38 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
793
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:815::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/74.0.3729.169 Safari/537.36

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 19 Aug 2019 17:22:41 GMT
server
Golfe2
age
5252
date
Wed, 02 Oct 2019 08:10:06 GMT
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=7200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
17803
expires
Wed, 02 Oct 2019 10:10:06 GMT
Cookie set frame
delivery.selfcampaign.com/tag/146005/ Frame 1B21
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/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Cookie
_auid=5aed26db1c42890b356af7737d8f6ae2
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

Server
nginx/1.14.0 (Ubuntu)
Date
Wed, 02 Oct 2019 09:37:41 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=a49e47efc853fa44d585f5d7f2eb5a9b; path=/; HttpOnly
X-Request-Id
39251816-654a-445f-8a34-d76c40759c25
X-Runtime
0.010896
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.106 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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 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
Wed, 02 Oct 2019 09:42:38 GMT
/
track2.selfcampaign.com/tag/
43 B
501 B
Image
General
Full URL
https://track2.selfcampaign.com/tag/?request_id=c311b3fc-db29-4f75-868b-84798f79db31&_auid=5aed26db1c42890b356af7737d8f6ae2&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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:38 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=5aed26db1c42890b356af7737d8f6ae2
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=5aed26db1c42890b356af7737d8f6ae2
  • https://track.selfcampaign.com/map_td/?tdid=fc32afaf-8824-4652-88e7-54b2ca05ac5a
  • https://track2.selfcampaign.com/map_td/?tdid=fc32afaf-8824-4652-88e7-54b2ca05ac5a
43 B
488 B
Image
General
Full URL
https://track2.selfcampaign.com/map_td/?tdid=fc32afaf-8824-4652-88e7-54b2ca05ac5a
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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:40 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=fc32afaf-8824-4652-88e7-54b2ca05ac5a
Date
Wed, 02 Oct 2019 09:37:40 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=6357730966244142086&source=adform
43 B
488 B
Image
General
Full URL
https://track2.selfcampaign.com/map_td/?tdid=6357730966244142086&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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:39 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
Wed, 02 Oct 2019 09:37:39 GMT
server
nginx
status
302
location
https://track2.selfcampaign.com/map_td/?tdid=6357730966244142086&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=1570009058
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/74.0.3729.169 Safari/537.36

Response headers

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&n126=1&n69=0&n75=0&n91=0&n62=1&n116=0&n158=1&n104=0&n139=1&n128=2&n5=5&n109=0&n105=0&n159=0&n114=0&n20=1&n80=1&n117=2&n58=1&n123=2&n90=1&n76=1&n66=1&n101=1&n77=0&n60=1&n64=0&n111=0&n136=0&n103=0&n17=1&n137=0&n161=1&n86=0&n147=4&n3=1&n83=0&n8=5&n107=0&n57=1&n99=1&n120=2&n118=6&n153=1&n82=1&n33=1&n39=1&n156=1&n124=1&n138=0&n140=0&n141=0&n157=1&n43=1&n142=0&n7=2&n110=0&n87=0&n12=2&n102=0&n92=1&n122=1&n11=1&n46=1&n79=1&n93=3&n148=0&n42=1&n2=6&n67=0&n115=1&n89=2&n154=1&n84=0&n108=0&n54=0&n18=1&n88=1&n160=1&n78=1&n44=1&n106=1&n52=2&n119=5&n81=1&n125=1&n149=0&n85=0&n9=0&n10=3&n21=1&n15=2&n155=1&n6=2&n63=0&n94=2&n23=1
Requested by
Host: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
80b6a4aec4050abca9c1bf05b6ae1730ccdddbcde4ddb48a720c5837bcbce81f

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 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
1515
ads
googleads.g.doubleclick.net/pagead/ Frame 212F
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=6643888890&adk=3280156863&adf=2993371392&w=520&lmt=1570009058&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1570009058262&bpp=8&bdt=492&fdt=109&idt=109&shv=r20190926&cbv=r20190131&saldr=aa&abxe=1&correlator=478404360269&frm=20&pv=2&ga_vid=1942422950.1570009058&ga_sid=1570009058&ga_hid=650167333&ga_fc=0&iag=0&icsg=775052786155264&dssz=53&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=3865&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199336%2C21062421%2C21062453%2C21062832%2C21064549%2C21064592%2C21064653&oid=3&pvsid=1726548844389678&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=8&uci=8.ymtz52jq6xgd&fsb=1&xpc=WgE67jD2h7&p=https%3A//www.golem.de&dtd=121
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190926/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:816::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=120&slotname=6643888890&adk=3280156863&adf=2993371392&w=520&lmt=1570009058&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1570009058262&bpp=8&bdt=492&fdt=109&idt=109&shv=r20190926&cbv=r20190131&saldr=aa&abxe=1&correlator=478404360269&frm=20&pv=2&ga_vid=1942422950.1570009058&ga_sid=1570009058&ga_hid=650167333&ga_fc=0&iag=0&icsg=775052786155264&dssz=53&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=3865&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199336%2C21062421%2C21062453%2C21062832%2C21064549%2C21064592%2C21064653&oid=3&pvsid=1726548844389678&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=8&uci=8.ymtz52jq6xgd&fsb=1&xpc=WgE67jD2h7&p=https%3A//www.golem.de&dtd=121
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.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/74.0.3729.169 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
Wed, 02 Oct 2019 09:37:38 GMT
server
cafe
content-length
20446
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Wed, 02-Oct-2019 09:52:38 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
expires
Wed, 02 Oct 2019 09:37:38 GMT
cache-control
private
osd.js
www.googletagservices.com/activeview/js/current/
77 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190926/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
a7708a738c64bd02df7ae231ab503159ab3336fa03de1853675631309ec07ada
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569842443931303"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29108
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
collect
stats.g.doubleclick.net/r/
Redirect Chain
  • https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=650167333&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=1942422950.1570009058&jid=68231353&_gid=1280837939.1570009058&gjid=120918923&_v=j79&z=1152963680
35 B
136 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=1942422950.1570009058&jid=68231353&_gid=1280837939.1570009058&gjid=120918923&_v=j79&z=1152963680
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:400c:c04::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/74.0.3729.169 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
Wed, 02 Oct 2019 09:37:38 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-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
Wed, 02 Oct 2019 09:37:38 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=1942422950.1570009058&jid=68231353&_gid=1280837939.1570009058&gjid=120918923&_v=j79&z=1152963680
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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
415
expires
Fri, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
100 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=650167333&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=560&_u=IAhAAUAB~&jid=&gjid=&cid=1942422950.1570009058&tid=UA-518800-2&_gid=1280837939.1570009058&gtm=2ou9p0&z=1608773923
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:815::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/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Thu, 22 Aug 2019 08:49:32 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
3545286
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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 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.19.35 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:40 GMT
Last-Modified
Wed, 02 Oct 2019 04:06:44 GMT
Server
AmazonS3
x-amz-request-id
6222766B7C140D69
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
+bdmS/o60yfstPgZqcHTQaIQVsLoakPlHyRJvMewEVFbaQ7X5s9JfSefk/YbJo+JQTfybQVTN5o=
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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 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
77.247.84.129 , 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/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
cors

Response headers

Date
Wed, 02 Oct 2019 09:37:38 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
Sat, 02 Nov 2019 09:37:38 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 1E71
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=9597355291&adk=1011330417&adf=3103571475&w=520&lmt=1570009058&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1570009058270&bpp=5&bdt=500&fdt=141&idt=141&shv=r20190926&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120&correlator=478404360269&frm=20&pv=1&ga_vid=1942422950.1570009058&ga_sid=1570009058&ga_hid=650167333&ga_fc=0&iag=0&icsg=775052786155264&dssz=54&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=4542&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199336%2C21062421%2C21062453%2C21062832%2C21064549%2C21064592%2C21064653&oid=3&pvsid=1726548844389678&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=9&uci=9.599pl94kuefg&fsb=1&xpc=PNNSTWrzmh&p=https%3A//www.golem.de&dtd=144
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190926/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:816::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=120&slotname=9597355291&adk=1011330417&adf=3103571475&w=520&lmt=1570009058&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1570009058270&bpp=5&bdt=500&fdt=141&idt=141&shv=r20190926&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120&correlator=478404360269&frm=20&pv=1&ga_vid=1942422950.1570009058&ga_sid=1570009058&ga_hid=650167333&ga_fc=0&iag=0&icsg=775052786155264&dssz=54&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=4542&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199336%2C21062421%2C21062453%2C21062832%2C21064549%2C21064592%2C21064653&oid=3&pvsid=1726548844389678&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=9&uci=9.599pl94kuefg&fsb=1&xpc=PNNSTWrzmh&p=https%3A//www.golem.de&dtd=144
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.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/74.0.3729.169 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
Wed, 02 Oct 2019 09:37:38 GMT
server
cafe
content-length
20170
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Wed, 02-Oct-2019 09:52:38 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
expires
Wed, 02 Oct 2019 09:37:38 GMT
cache-control
private
wrap.js
confiant-integrations.global.ssl.fastly.net/prebid/201909301246/
26 KB
10 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/prebid/201909301246/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
ec47e3dd49c92bd6acbb0f55a6340af287144de5cd50ef8e8423acf23e75099d

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 GMT
Content-Encoding
gzip
Age
484
X-Cache
HIT
Connection
keep-alive
Content-Length
10115
x-amz-id-2
WEnYr8KpSqLHfxDsCu8ZsAEpnHqKKDbYzyzmx9qfVTF6gI9eULXfug06keVGh3oWq4bffiVYQlw=
X-Served-By
cache-fra19171-FRA
Last-Modified
Mon, 30 Sep 2019 18:39:06 GMT
Server
AmazonS3
X-Timer
S1570009058.475580,VS0,VE0
ETag
"362a2a363551dad457f55624ffc3c798"
x-amz-request-id
450DAE466940BC82
Via
1.1 varnish
Cache-Control
public, max-age=31536000
Accept-Ranges
bytes
Content-Type
application/javascript; charset=utf-8
X-Cache-Hits
828
Cookie set /
d.agkn.com/iframe/8613/ Frame 826D
0
0
Document
General
Full URL
https://d.agkn.com/iframe/8613/?che=320558468&gdpr=1&gdpr_consent=&url=https%3A%2F%2Fwww.golem.de%2F&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
35.157.22.81 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-157-22-81.eu-central-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

Host
d.agkn.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.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/74.0.3729.169 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
Wed, 02 Oct 2019 09:37:37 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%3AJQZ4nEi0YPcNrWtSmBSi8hpxb2zkdV0Z;Max-Age=31536000;domain=agkn.com;path=/ u=C|0AEAlJyxiJScsYgAAAAAAAg1RAQCADVIBAIA;Max-Age=31536000;domain=agkn.com;path=/
Content-Length
482
Connection
keep-alive
ads
googleads.g.doubleclick.net/pagead/ Frame 5D11
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=2074088491&adk=3577236908&adf=700606410&w=520&lmt=1570009058&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1570009058275&bpp=4&bdt=505&fdt=159&idt=159&shv=r20190926&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=478404360269&frm=20&pv=1&ga_vid=1942422950.1570009058&ga_sid=1570009058&ga_hid=650167333&ga_fc=0&iag=0&icsg=775052786155264&dssz=55&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5218&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199336%2C21062421%2C21062453%2C21062832%2C21064549%2C21064592%2C21064653&oid=3&pvsid=1726548844389678&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=10&uci=a.1wabyw80hdaf&fsb=1&xpc=jePeYAG6M5&p=https%3A//www.golem.de&dtd=162
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190926/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:816::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=120&slotname=2074088491&adk=3577236908&adf=700606410&w=520&lmt=1570009058&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1570009058275&bpp=4&bdt=505&fdt=159&idt=159&shv=r20190926&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=478404360269&frm=20&pv=1&ga_vid=1942422950.1570009058&ga_sid=1570009058&ga_hid=650167333&ga_fc=0&iag=0&icsg=775052786155264&dssz=55&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5218&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199336%2C21062421%2C21062453%2C21062832%2C21064549%2C21064592%2C21064653&oid=3&pvsid=1726548844389678&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=10&uci=a.1wabyw80hdaf&fsb=1&xpc=jePeYAG6M5&p=https%3A//www.golem.de&dtd=162
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.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/74.0.3729.169 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
Wed, 02 Oct 2019 09:37:38 GMT
server
cafe
content-length
199
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Wed, 02-Oct-2019 09:52:38 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
expires
Wed, 02 Oct 2019 09:37:38 GMT
cache-control
private
ads
googleads.g.doubleclick.net/pagead/ Frame 7F50
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=5027554897&adk=765296070&adf=3981714442&w=520&lmt=1570009058&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1570009058279&bpp=3&bdt=509&fdt=165&idt=165&shv=r20190926&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120%2C520x120&correlator=478404360269&frm=20&pv=1&ga_vid=1942422950.1570009058&ga_sid=1570009058&ga_hid=650167333&ga_fc=0&iag=0&icsg=775052786155264&dssz=55&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5907&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199336%2C21062421%2C21062453%2C21062832%2C21064549%2C21064592%2C21064653&oid=3&pvsid=1726548844389678&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=11&uci=b.6548rrmvrqbf&fsb=1&xpc=xWkuHfZMnt&p=https%3A//www.golem.de&dtd=167
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190926/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:816::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=120&slotname=5027554897&adk=765296070&adf=3981714442&w=520&lmt=1570009058&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1570009058279&bpp=3&bdt=509&fdt=165&idt=165&shv=r20190926&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120%2C520x120&correlator=478404360269&frm=20&pv=1&ga_vid=1942422950.1570009058&ga_sid=1570009058&ga_hid=650167333&ga_fc=0&iag=0&icsg=775052786155264&dssz=55&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5907&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199336%2C21062421%2C21062453%2C21062832%2C21064549%2C21064592%2C21064653&oid=3&pvsid=1726548844389678&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=11&uci=b.6548rrmvrqbf&fsb=1&xpc=xWkuHfZMnt&p=https%3A//www.golem.de&dtd=167
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.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/74.0.3729.169 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
Wed, 02 Oct 2019 09:37:38 GMT
server
cafe
content-length
24225
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Wed, 02-Oct-2019 09:52:38 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
expires
Wed, 02 Oct 2019 09:37:38 GMT
cache-control
private
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=03412b7eabb5c32092d8052409111d9c&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D03412b7eabb5c32092d8052409111d9c%2...
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=03412b7eabb5c32092d8052409111d9c&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D03412b7eabb5c32092d8052409111d9c%2...
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=03412b7eabb5c32092d8052409111d9c&userId=adscale-user:29faf34a04d44eb9adec1791f0b6737c
44 B
528 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=03412b7eabb5c32092d8052409111d9c&userId=adscale-user:29faf34a04d44eb9adec1791f0b6737c
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:39 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
Wed, 02 Oct 2019 09:37:38 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Location
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=03412b7eabb5c32092d8052409111d9c&userId=adscale-user:29faf34a04d44eb9adec1791f0b6737c
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
0
Expires
Wed, 02 Oct 2019 09:37:38 GMT
setuid
ib.adnxs.com/
Redirect Chain
  • https://tracking.m6r.eu/sync/appnexusRedirect
  • https://ib.adnxs.com/setuid?entity=197&code=03412b7eabb5c32092d8052409111d9c
43 B
1005 B
Image
General
Full URL
https://ib.adnxs.com/setuid?entity=197&code=03412b7eabb5c32092d8052409111d9c
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.202 , Netherlands, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
318.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:40 GMT
X-Proxy-Origin
89.38.96.188; 89.38.96.188; 318.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.101:80
AN-X-Request-Uuid
7ef894de-5588-4b6d-9c84-af81f5ef5ffc
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
image/gif
Content-Length
43
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT

Redirect headers

Location
https://ib.adnxs.com/setuid?entity=197&code=03412b7eabb5c32092d8052409111d9c
Date
Wed, 02 Oct 2019 09:37:38 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=A0Erfqu1wyCS2AUkCREdnA
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=A0Erfqu1wyCS2AUkCREdnA&google_tc=
  • 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.3, , AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:39 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
Wed, 02 Oct 2019 09:37:38 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-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=03412b7eabb5c32092d8052409111d9c
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=36356&ext_id=03412b7eabb5c32092d8052409111d9c
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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:38 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
Tue, 01 Oct 2019 09:37:38 GMT

Redirect headers

Location
https://ad.yieldlab.net/m?dt_id=36356&ext_id=03412b7eabb5c32092d8052409111d9c
Date
Wed, 02 Oct 2019 09:37:38 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"
ads
googleads.g.doubleclick.net/pagead/ Frame 001E
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&adk=1812271804&adf=3025194257&lmt=1570009058&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=1570009058282&bpp=3&bdt=512&fdt=172&idt=172&shv=r20190926&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120%2C520x120%2C520x120&nras=1&correlator=478404360269&frm=20&pv=1&ga_vid=1942422950.1570009058&ga_sid=1570009058&ga_hid=650167333&ga_fc=0&iag=0&icsg=775052786155264&dssz=55&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199336%2C21062421%2C21062453%2C21062832%2C21064549%2C21064592%2C21064653&oid=3&pvsid=1726548844389678&rx=0&eae=2&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=11&uci=b.ajmrwjr68qc6&fsb=1&dtd=179
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190926/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:816::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=1570009058&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=1570009058282&bpp=3&bdt=512&fdt=172&idt=172&shv=r20190926&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120%2C520x120%2C520x120&nras=1&correlator=478404360269&frm=20&pv=1&ga_vid=1942422950.1570009058&ga_sid=1570009058&ga_hid=650167333&ga_fc=0&iag=0&icsg=775052786155264&dssz=55&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199336%2C21062421%2C21062453%2C21062832%2C21064549%2C21064592%2C21064653&oid=3&pvsid=1726548844389678&rx=0&eae=2&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=11&uci=b.ajmrwjr68qc6&fsb=1&dtd=179
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.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/74.0.3729.169 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
Wed, 02 Oct 2019 09:37:38 GMT
server
cafe
content-length
0
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Wed, 02-Oct-2019 09:52:38 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
expires
Wed, 02 Oct 2019 09:37:38 GMT
cache-control
private
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.127 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-127.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:36:43 GMT
Via
1.1 37c215a6cf8b04439db2f97a633421e6.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
56
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
2cR_AAtD4eQP8vFNASDgm2e0Uv3up_2E96KnHFiG42x6W8wBfnLjYA==
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=436113
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:3cd , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
5ff1ec1da0cd687f57271ea40875d07569d26a2c919d95310355a10cc464431e
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
br
x-content-type-options
nosniff
cf-cache-status
HIT
age
2255
cf-ray
51f5b2e81b7dcbb0-VIE
status
200
last-modified
Mon, 23 Sep 2019 16:25:34 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
Wed, 02 Oct 2019 10:37:38 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
77.247.84.129 , 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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 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
Sat, 02 Nov 2019 09:37:38 GMT
/
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%2F74.0.3729.169%20Safari%2F537.36,device:desktop,browser_version:Other%2074,browser:Other,depth:1,user_type:new,user_id:b7a5f3970.f344f0d5a_1570009058528,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1570009058530
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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:39 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=2&holding=108810e7aaccba71ff5759d480adc9d0&hash_user=b7a5f3970.f344f0d5a_1570009058528&1570009058531
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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:41 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%2F74.0.3729.169%20Safari%2F537.36,device:desktop,browser_version:Other%2074,browser:Other,depth:1,user_type:new,user_id:b7a5f3970.f344f0d5a_1570009058528,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&__io=b7a5f3970.f344f0d5a_1570009058528&1570009058533
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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:39 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%2F74.0.3729.169%20Safari%2F537.36,device:desktop,browser_version:Other%2074,browser:Other,depth:1,user_type:new,user_id:b7a5f3970.f344f0d5a_1570009058528,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1570009058534
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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:39 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
view
securepubads.g.doubleclick.net/pcs/ Frame 2386
0
273 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvHHcnLrQzfVaGnYNMojOiq0MRu20zxTCalF6biNW481M6DIK_XEBvPQ-DLDjHaYA6tOPQzJ4XGiXPF_bDv7Iz7Jb83seTQgIi0q2rCdzdAHFAS1FQd0EHnGWc_jbLbkrnREOX8mkaStYAAhbQ5D8IQRfYJOQ_XqT1RU0ZKkVW4ozbg1C1W1fdvn97zkZ9OJ45mFP_DYOqJz-2-zSX5GZuR2ozyjSCyS3vXGuJlwJNBFSsjD2TZIyRDn-rpWgL4NahUqXeet-68O_c_J6FW9A&sai=AMfl-YQ7Au7sSbHitH_pGUgJiBL6erJFlmr87rZcQh5Et_G5g0QZlU0fn3-V089hwbyqXfAZcMS9cYEBJyIoy8pea5Z9QYS5X4-MoT_MmMQR&sig=Cg0ArKJSzH-WJaINxkhcEAE&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.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-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/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Wed, 02 Oct 2019 09:37:38 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
gpt.js
securepubads.g.doubleclick.net/tag/js/ Frame 2386
44 KB
14 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_2019092602.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
b4bf79342e85a164d569480f7200e333c3a90e399f00f22b0f91df9728d86808
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"296 / 373 of 1000 / last-modified: 1569872919"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14268
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 2386
78 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019092602.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
5f224a13a15499778526423761125cbae8b8063bf0f90a46862671e17ccc9e7b
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569842443931303"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29671
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 5206
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuwuikmGKgbeoLDB5LIcoC4a33RiHH945Z0Z1J4XbkjQZ4sfMy2H_4T5B4v60pKVgk4TTs3FN0Fi4R1h2TzAzcH6mGcQ8IWAOfbFR98oFsWbwquYOMxtyzm4eGvEbTmmO2g52MdcPYqtQkvAEOBSEF5EGSNcEf_nP92yBroB0qgFzuFQ-JAYOvrwvuU_4XGqJLanHT_D-t0vbdHodTOynfiTYmmT_g-FqDunOyi6bN7biEswepyL4cJIRMxp4uVgR21ZVxrvKJl6ZCBXd_hxQ&sai=AMfl-YRLCxuY56BSI3ZVl0k7lMXhGnDUjSHN2cKNdEUagVXJ8WPvAqhZv3_IZWFv_2ycox_3bZOa1jPN19S529B3XUVVxpVwZ3jR-cpBo9fq&sig=Cg0ArKJSzJ_v6FyZ6R0LEAE&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.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-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/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Wed, 02 Oct 2019 09:37:38 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
gpt.js
securepubads.g.doubleclick.net/tag/js/ Frame 5206
44 KB
14 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_2019092602.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
5ca6483fac9f86f9eeed1e4b81573adcd9cda802fcb3c25a65af63454a7079a7
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"296 / 411 of 1000 / last-modified: 1569872947"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14275
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 5206
78 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019092602.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
5f224a13a15499778526423761125cbae8b8063bf0f90a46862671e17ccc9e7b
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569842443931303"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29671
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame FCC5
0
48 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssSR8ZK1OX0AyIbhF9oKpWkIymvdJWk8X6fv3deyncSWphVTCx53H3RDbT9sYxbD3wsNSVvAPS3d65bqjJElL649BFB9blaACQINqtHWU4GTBBg7oI1yXEcI0rWFIY1xKjSnzDQGz1kpdMabdMRJHNuZ1IWGSxmjrcPuZu2SKF8mV5LrfF9RbYfzHCz9Wph9RxjBte1DYJQv69V9tlRux-I8U-ZNLrI68pgXsVt-4ihatH0CM0oHvoqBIbABAlL6sGP1b22xazAFRkgTbb3_w&sai=AMfl-YSOVqTRu1HYVWbGgN7opesRN9MwV_yOTGMUs8pcJzQn9hP8d0LCwkwMGwq2yc2xBtsZRmD-5kPk7EtmgSvSaWrO8aOS9kv_-IG7YxtI&sig=Cg0ArKJSzG3yKa1OjtnGEAE&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.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-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/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Wed, 02 Oct 2019 09:37:38 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
gpt.js
securepubads.g.doubleclick.net/tag/js/ Frame FCC5
44 KB
14 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_2019092602.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
5ca6483fac9f86f9eeed1e4b81573adcd9cda802fcb3c25a65af63454a7079a7
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"296 / 427 of 1000 / last-modified: 1569872947"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14275
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame FCC5
78 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019092602.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
5f224a13a15499778526423761125cbae8b8063bf0f90a46862671e17ccc9e7b
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569842443931303"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29671
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 7C86
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsv_5E-Is0d1Kc_Mot29efVqrL6Gb1sQiOg02L9D-Qp_fg3818vgedk27af5IezhfyqYtE7wFJx23QYa63BprVmiLED8a-4VDrM5FSqg0hiKCAEhMv3tmlngmxiUhaKXDo6NuzvHABr3wO5G8U-5tAhhdwUF_vLcuuXYsIEV1sDJCE5YwETL-e47PibVOycKV4JxXvLxWHkLGpoWJOuH_uZYgn6DJnc0tHhhAAixxTEUpq_yJE2VhBEojUufeCGNGNAgoN8-oGWAT5mfIqVSKA&sai=AMfl-YR9jDWIuDMRjMJls3zIiH8aF1g08RyVpMWv58FVN0GPRs7XRwGAlg9OXmQhw7Oqusz29sFvXsssWAKUAYHVMO2gJ_HrcBzWmWDokadF&sig=Cg0ArKJSzC8p0c3ribVCEAE&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.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-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/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Wed, 02 Oct 2019 09:37:38 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
gpt.js
securepubads.g.doubleclick.net/tag/js/ Frame 7C86
44 KB
14 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_2019092602.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
b4bf79342e85a164d569480f7200e333c3a90e399f00f22b0f91df9728d86808
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"296 / 905 of 1000 / last-modified: 1569872919"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14268
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 7C86
78 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019092602.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
5f224a13a15499778526423761125cbae8b8063bf0f90a46862671e17ccc9e7b
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569842443931303"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29671
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 8F93
0
57 B
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvQ24CUPgUg21rZbWaQd3d2VZWY6XVfsY_D-R4lOmL46Ob52ZxVZ-PJsTXjYS09Qzz_3txBW_YvkkMZxWL3nOn_VQDqe7AR0gJl66o3GrjSnuJwRHdtqy-ktf4SQw9zzdUEV0A-FzJsCtl2q5-sKYEdXw788pGnWuCDFTWhKluIc2xM1adxldP7E60vYo9TV5C6EHbeDaRsQC3elBIeva1KUjkpVz1qzdRumrKwns7mXIGosOt7UW-AnAFrK908p9XD7FHTT_dXUK1AW9YY1g&sai=AMfl-YTRdPCwuAczEgBOZkXiHd7Ggwrf_YQ8DjOwolO7yyWOWNM2m8jglWK8fi5F9iu70t1l1CaUjSlFyqg4RGq7-Jv07Guuo4e06pvFDyKJ&sig=Cg0ArKJSzLTua10WI_lWEAE&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.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-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/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Wed, 02 Oct 2019 09:37:38 GMT
x-content-type-options
nosniff
server
cafe
status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
access-control-allow-origin
*
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
gpt.js
securepubads.g.doubleclick.net/tag/js/ Frame 8F93
44 KB
14 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_2019092602.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
5ca6483fac9f86f9eeed1e4b81573adcd9cda802fcb3c25a65af63454a7079a7
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"296 / 479 of 1000 / last-modified: 1569872947"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
14275
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 8F93
78 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019092602.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
5f224a13a15499778526423761125cbae8b8063bf0f90a46862671e17ccc9e7b
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1569842443931303"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29671
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
sp_1Gq81-144646_rc.jpg
www.golem.de/1555/ad-time/
68 B
463 B
Image
General
Full URL
https://www.golem.de/1555/ad-time/sp_1Gq81-144646_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
77.247.84.129 , 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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:38 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_1Gq81-268024_rc.jpg
www.golem.de/9632/ad-time/
68 B
463 B
Image
General
Full URL
https://www.golem.de/9632/ad-time/sp_1Gq81-268024_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
77.247.84.129 , 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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:38 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
ima3.js
imasdk.googleapis.com/js/sdkloader/
270 KB
92 KB
Script
General
Full URL
https://imasdk.googleapis.com/js/sdkloader/ima3.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909301246/wrap.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
2c8f3327989047e73c12f24699abdccfed0536769fffaae1ab0662cc2699ac1f
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
93892
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 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/74.0.3729.169 Safari/537.36

Response headers

Content-Type
image/png
hd-main.js
hgc-cf-cache-1.svonm.com/
206 KB
60 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=ZOqjQMrJZZ
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.127 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-127.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
b20b3ce6703fe8eb65d771633a82baf895a1ec3557f8a6d98fa3d82e2e13894a

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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:25 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
14
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Tue, 01 Oct 2019 11:47:11 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 37c215a6cf8b04439db2f97a633421e6.cloudfront.net (CloudFront)
Cache-Control
no-cache
X-Amz-Cf-Pop
FRA2-C1
X-Amz-Cf-Id
-62Vyx6s73NXtp3StNROMPb8_p-qc2A2F9LZSsyBVJoPeSQ0rClSUg==
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/74.0.3729.169 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/74.0.3729.169 Safari/537.36

Response headers

Content-Type
image/png
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
77.247.84.129 , 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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 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
Sat, 02 Nov 2019 09:37:38 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
77.247.84.129 , 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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 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
Sat, 02 Nov 2019 09:37:38 GMT
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
77.247.84.129 , 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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 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
Sat, 02 Nov 2019 09:37:38 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: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190926/r20190131/show_ads_impl.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 , 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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:38 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
Sat, 02 Nov 2019 09:37:38 GMT
pubads_impl_2019092602.js
securepubads.g.doubleclick.net/gpt/ Frame 2386
158 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019092602.js?21064578
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
35aefd2d1de0b25d9a5640cf3129dfc507a3c417a7da34f4bb6f9b4a79e19484
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 26 Sep 2019 18:43:36 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
59149
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
integrator.sync.js
adservice.google.com/adsid/ Frame 2386
113 B
178 B
Script
General
Full URL
https://adservice.google.com/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:816::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/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
108
x-xss-protection
0
pubads_impl_2019093001.js
securepubads.g.doubleclick.net/gpt/ Frame 5206
157 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019093001.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.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
7c5e8ae97d184389610b4deeab367ea2bcbe2108fd50b622546240eadc847a89
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 30 Sep 2019 13:06:17 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
58932
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
integrator.sync.js
adservice.google.com/adsid/ Frame 5206
113 B
175 B
Script
General
Full URL
https://adservice.google.com/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:816::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/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
108
x-xss-protection
0
pubads_impl_2019093001.js
securepubads.g.doubleclick.net/gpt/ Frame FCC5
157 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019093001.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.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
7c5e8ae97d184389610b4deeab367ea2bcbe2108fd50b622546240eadc847a89
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 30 Sep 2019 13:06:17 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
58932
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
integrator.sync.js
adservice.google.com/adsid/ Frame FCC5
113 B
175 B
Script
General
Full URL
https://adservice.google.com/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:816::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/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
108
x-xss-protection
0
pubads_impl_2019092602.js
securepubads.g.doubleclick.net/gpt/ Frame 7C86
158 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019092602.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.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
35aefd2d1de0b25d9a5640cf3129dfc507a3c417a7da34f4bb6f9b4a79e19484
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 26 Sep 2019 18:43:36 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
59149
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
integrator.sync.js
adservice.google.com/adsid/ Frame 7C86
113 B
175 B
Script
General
Full URL
https://adservice.google.com/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:816::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/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
108
x-xss-protection
0
pubads_impl_2019093001.js
securepubads.g.doubleclick.net/gpt/ Frame 8F93
157 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019093001.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.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
7c5e8ae97d184389610b4deeab367ea2bcbe2108fd50b622546240eadc847a89
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 30 Sep 2019 13:06:17 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
58932
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
integrator.sync.js
adservice.google.com/adsid/ Frame 8F93
113 B
175 B
Script
General
Full URL
https://adservice.google.com/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:816::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/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
108
x-xss-protection
0
bridge3.337.0_de.html
imasdk.googleapis.com/js/core/ Frame 1458
0
0
Document
General
Full URL
https://imasdk.googleapis.com/js/core/bridge3.337.0_de.html
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909301246/wrap.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:817::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
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.337.0_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/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.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/74.0.3729.169 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
192516
date
Mon, 30 Sep 2019 21:23:47 GMT
expires
Tue, 29 Sep 2020 21:23:47 GMT
last-modified
Mon, 30 Sep 2019 21:18:47 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
130431
alt-svc
quic=":443"; ma=2592000; v="46,43",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:81f::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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 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-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
10523
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
truncated
/
206 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
b20b3ce6703fe8eb65d771633a82baf895a1ec3557f8a6d98fa3d82e2e13894a

Request headers

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

Response headers

Content-Type
text/javascript
ads
securepubads.g.doubleclick.net/gampad/ Frame 2386
300 B
199 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1227496779473428&correlator=1547589320336447&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&eid=21064578%2C21062420%2C21064569%2C21064580&vrg=2019092602&guci=2.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191002&iu=%2F53015287%2Fgolem.de_d_300x600_1_dc&sz=10x40%7C10x30%7C10x20%7C500x600%7C770x200%7C120x600%7C160x600%7C200x600%7C300x600&scp=adslot%3Dsky%26src%3Dsdg%26yieldlove_pid%3D17298%26yieldlove_targeting%3D%257B%2522adset%2522%253A%255B%2522brsl%2522%255D%252C%2522adslot%2522%253A%255B%2522sky%2522%255D%252C%2522af%2522%253A%255B%2522f1x4%2522%252C%2522f1x3%2522%252C%2522f1x2%2522%252C%2522ds%2522%252C%2522sky%2522%252C%2522hpad%2522%252C%2522band%2522%255D%252C%2522as%2522%253A%255B%2522sky%2522%255D%252C%2522hb_unit%2522%253A%255B%2522sky%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%252203412b7eabb5c32092d8052409111d9c%2522%255D%252C%2522mbrseg%2522%253A%255B%2522ff6482ed%2522%252C%2522b3838f1f%2522%252C%252278315b65%2522%255D%252C%2522mbrstatus%2522%253A%255B%2522called-idfound%2522%255D%252C%2522nuggad%2522%253A%255B%2522n127-0%2522%252C%2522n121-2%2522%252C%2522n126-1%2522%252C%2522n69-0%2522%252C%2522n75-0%2522%252C%2522n91-0%2522%252C%2522n62-1%2522%252C%2522n116-0%2522%252C%2522n158-1%2522%252C%2522n104-0%2522%252C%2522n139-1%2522%252C%2522n128-2%2522%252C%2522n5-5%2522%252C%2522n109-0%2522%252C%2522n105-0%2522%252C%2522n159-0%2522%252C%2522n114-0%2522%252C%2522n20-1%2522%252C%2522n80-1%2522%252C%2522n117-2%2522%252C%2522n58-1%2522%252C%2522n123-2%2522%252C%2522n90-1%2522%252C%2522n76-1%2522%252C%2522n66-1%2522%252C%2522n101-1%2522%252C%2522n77-0%2522%252C%2522n60-1%2522%252C%2522n64-0%2522%252C%2522n111-0%2522%252C%2522n136-0%2522%252C%2522n103-0%2522%252C%2522n17-1%2522%252C%2522n137-0%2522%252C%2522n161-1%2522%252C%2522n86-0%2522%252C%2522n147-4%2522%252C%2522n3-1%2522%252C%2522n83-0%2522%252C%2522n8-5%2522%252C%2522n107-0%2522%252C%2522n57-1%2522%252C%2522n99-1%2522%252C%2522n120-2%2522%252C%2522n118-6%2522%252C%2522n153-1%2522%252C%2522n82-1%2522%252C%2522n33-1%2522%252C%2522n39-1%2522%252C%2522n156-1%2522%252C%2522n124-1%2522%252C%2522n138-0%2522%252C%2522n140-0%2522%252C%2522n141-0%2522%252C%2522n157-1%2522%252C%2522n43-1%2522%252C%2522n142-0%2522%252C%2522n7-2%2522%252C%2522n110-0%2522%252C%2522n87-0%2522%252C%2522n12-2%2522%252C%2522n102-0%2522%252C%2522n92-1%2522%252C%2522n122-1%2522%252C%2522n11-1%2522%252C%2522n46-1%2522%252C%2522n79-1%2522%252C%2522n93-3%2522%252C%2522n148-0%2522%252C%2522n42-1%2522%252C%2522n2-6%2522%252C%2522n67-0%2522%252C%2522n115-1%2522%252C%2522n89-2%2522%252C%2522n154-1%2522%252C%2522n84-0%2522%252C%2522n108-0%2522%252C%2522n54-0%2522%252C%2522n18-1%2522%252C%2522n88-1%2522%252C%2522n160-1%2522%252C%2522n78-1%2522%252C%2522n44-1%2522%252C%2522n106-1%2522%252C%2522n52-2%2522%252C%2522n119-5%2522%252C%2522n81-1%2522%252C%2522n125-1%2522%252C%2522n149-0%2522%252C%2522n85-0%2522%252C%2522n9-0%2522%252C%2522n10-3%2522%252C%2522n21-1%2522%252C%2522n15-2%2522%252C%2522n155-1%2522%252C%2522n6-2%2522%252C%2522n63-0%2522%252C%2522n94-2%2522%252C%2522n23-1%2522%255D%252C%2522pc%2522%253A%255B%25221%2522%255D%252C%2522rfree%2522%253A%255B%2522200-299%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%253A17298.sb%253Af%2522%255D%252C%2522yieldlove_pid%2522%253A%255B%252217298%2522%255D%252C%2522yieldlove_reload%2522%253A%255B%2522pid%253A17298.reload%253Afalse%2522%255D%252C%2522yieldlove_reloaded%2522%253A%255B%2522false%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%253A17298.default%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3D253f8598ead74ffd%3AT%3D1570009058%3AS%3DALNI_MaVr2M898oUraOrZtdXHJBYzD5WRg&cdm=www.golem.de&bc=31&abxe=1&lmt=1570009058&dt=1570009058923&dlt=1570009058596&idt=315&ea=0&frm=23&biw=1585&bih=1185&isw=300&ish=600&oid=3&adx=1303&ady=10&adk=4101890386&uci=f4a1fisnf34a&ifi=1&ifk=475314647&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.golem.de%2F&top=www.golem.de&dssz=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x40&msz=300x40&ga_vid=1942422950.1570009058&ga_sid=1570009059&ga_hid=2112371447&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019092602.js?21064578
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
cafe /
Resource Hash
a0573cf5187027bf17ce5838a0dfea7706bfcc43b91b5c806a24256788ab25d7
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:39 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
125
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_2019092602.js
securepubads.g.doubleclick.net/gpt/ Frame 2386
63 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019092602.js?21064578
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019092602.js?21064578
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
35c073a53df4dd054afab9758b90a88846802754ff15fc3b31cc9af133c8a401
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/74.0.3729.169 Safari/537.36

Response headers

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

Request headers

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

Response headers

ads
securepubads.g.doubleclick.net/gampad/ Frame 5206
300 B
203 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2038454834287693&correlator=2667578628628617&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&eid=21064699&vrg=2019093001&guci=2.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191002&iu=%2F53015287%2Fgolem.de_d_970x250_1_dc&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C1000x150%7C728x90%7C728x180%7C31x31&scp=adslot%3Dbanner%26src%3Dsdg%26yieldlove_pid%3D17295%26yieldlove_targeting%3D%257B%2522adset%2522%253A%255B%2522brsl%2522%255D%252C%2522adslot%2522%253A%255B%2522banner%2522%255D%252C%2522af%2522%253A%255B%2522f2x1%2522%252C%2522f3x1%2522%252C%2522f4x1%2522%252C%2522f8x1%2522%252C%2522wp%2522%252C%2522firepl%2522%252C%2522bb%2522%252C%2522vidwa%2522%252C%2522brabo%2522%252C%2522fufrad%2522%252C%2522floor%2522%252C%2522videoTakeover%2522%255D%252C%2522as%2522%253A%255B%2522banner%2522%255D%252C%2522hb_unit%2522%253A%255B%2522banner%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%252203412b7eabb5c32092d8052409111d9c%2522%255D%252C%2522mbrseg%2522%253A%255B%2522ff6482ed%2522%252C%2522b3838f1f%2522%252C%252278315b65%2522%255D%252C%2522mbrstatus%2522%253A%255B%2522called-idfound%2522%255D%252C%2522nuggad%2522%253A%255B%2522n127-0%2522%252C%2522n121-2%2522%252C%2522n126-1%2522%252C%2522n69-0%2522%252C%2522n75-0%2522%252C%2522n91-0%2522%252C%2522n62-1%2522%252C%2522n116-0%2522%252C%2522n158-1%2522%252C%2522n104-0%2522%252C%2522n139-1%2522%252C%2522n128-2%2522%252C%2522n5-5%2522%252C%2522n109-0%2522%252C%2522n105-0%2522%252C%2522n159-0%2522%252C%2522n114-0%2522%252C%2522n20-1%2522%252C%2522n80-1%2522%252C%2522n117-2%2522%252C%2522n58-1%2522%252C%2522n123-2%2522%252C%2522n90-1%2522%252C%2522n76-1%2522%252C%2522n66-1%2522%252C%2522n101-1%2522%252C%2522n77-0%2522%252C%2522n60-1%2522%252C%2522n64-0%2522%252C%2522n111-0%2522%252C%2522n136-0%2522%252C%2522n103-0%2522%252C%2522n17-1%2522%252C%2522n137-0%2522%252C%2522n161-1%2522%252C%2522n86-0%2522%252C%2522n147-4%2522%252C%2522n3-1%2522%252C%2522n83-0%2522%252C%2522n8-5%2522%252C%2522n107-0%2522%252C%2522n57-1%2522%252C%2522n99-1%2522%252C%2522n120-2%2522%252C%2522n118-6%2522%252C%2522n153-1%2522%252C%2522n82-1%2522%252C%2522n33-1%2522%252C%2522n39-1%2522%252C%2522n156-1%2522%252C%2522n124-1%2522%252C%2522n138-0%2522%252C%2522n140-0%2522%252C%2522n141-0%2522%252C%2522n157-1%2522%252C%2522n43-1%2522%252C%2522n142-0%2522%252C%2522n7-2%2522%252C%2522n110-0%2522%252C%2522n87-0%2522%252C%2522n12-2%2522%252C%2522n102-0%2522%252C%2522n92-1%2522%252C%2522n122-1%2522%252C%2522n11-1%2522%252C%2522n46-1%2522%252C%2522n79-1%2522%252C%2522n93-3%2522%252C%2522n148-0%2522%252C%2522n42-1%2522%252C%2522n2-6%2522%252C%2522n67-0%2522%252C%2522n115-1%2522%252C%2522n89-2%2522%252C%2522n154-1%2522%252C%2522n84-0%2522%252C%2522n108-0%2522%252C%2522n54-0%2522%252C%2522n18-1%2522%252C%2522n88-1%2522%252C%2522n160-1%2522%252C%2522n78-1%2522%252C%2522n44-1%2522%252C%2522n106-1%2522%252C%2522n52-2%2522%252C%2522n119-5%2522%252C%2522n81-1%2522%252C%2522n125-1%2522%252C%2522n149-0%2522%252C%2522n85-0%2522%252C%2522n9-0%2522%252C%2522n10-3%2522%252C%2522n21-1%2522%252C%2522n15-2%2522%252C%2522n155-1%2522%252C%2522n6-2%2522%252C%2522n63-0%2522%252C%2522n94-2%2522%252C%2522n23-1%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%253A17295.sb%253Af%2522%255D%252C%2522yieldlove_pid%2522%253A%255B%252217295%2522%255D%252C%2522yieldlove_reload%2522%253A%255B%2522pid%253A17295.reload%253Afalse%2522%255D%252C%2522yieldlove_reloaded%2522%253A%255B%2522false%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%253A17295.default%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3D253f8598ead74ffd%3AT%3D1570009058%3AS%3DALNI_MaVr2M898oUraOrZtdXHJBYzD5WRg&cdm=www.golem.de&bc=31&abxe=1&lmt=1570009058&dt=1570009058942&dlt=1570009058632&idt=299&ea=0&frm=23&biw=1585&bih=1185&isw=970&ish=250&oid=3&adx=308&ady=140&adk=396647303&uci=bxdhiwx969ty&ifi=1&ifk=4195011632&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.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=1942422950.1570009058&ga_sid=1570009059&ga_hid=881079823&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019093001.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
cafe /
Resource Hash
07e29959b703a18e0fa84d4c2beb8e0edd12df42717ce9cd5a360c2e6b641234
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:39 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
126
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_2019093001.js
securepubads.g.doubleclick.net/gpt/ Frame 5206
63 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019093001.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019093001.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
25ee8438325f726833afbcc7f75f152d9640156bda461c1b4636275af51c5dbe
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 30 Sep 2019 13:06:17 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24646
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame 5206
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019093001.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/74.0.3729.169 Safari/537.36

Response headers

ads
securepubads.g.doubleclick.net/gampad/ Frame FCC5
306 B
211 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3291667511535326&correlator=3180509890277364&output=ldjh&impl=fif&eid=21064699%2C21062452%2C21064592&vrg=2019093001&guci=2.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191002&iu=%2F53015287%2Fgolem.de_d_300x600_2_dc&sz=10x20%7C10x10%7C300x250%7C300x601%7C300x125%7C34x31&scp=adslot%3Drectangle%26src%3Dsdg%26yieldlove_pid%3D17299%26yieldlove_targeting%3D%257B%2522adset%2522%253A%255B%2522brsl%2522%255D%252C%2522adslot%2522%253A%255B%2522rectangle%2522%255D%252C%2522af%2522%253A%255B%2522f1x2%2522%252C%2522f1x1%2522%252C%2522mrec%2522%255D%252C%2522as%2522%253A%255B%2522rectangle%2522%255D%252C%2522hb_unit%2522%253A%255B%2522rectangle%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%252203412b7eabb5c32092d8052409111d9c%2522%255D%252C%2522mbrseg%2522%253A%255B%2522ff6482ed%2522%252C%2522b3838f1f%2522%252C%252278315b65%2522%255D%252C%2522mbrstatus%2522%253A%255B%2522called-idfound%2522%255D%252C%2522nuggad%2522%253A%255B%2522n127-0%2522%252C%2522n121-2%2522%252C%2522n126-1%2522%252C%2522n69-0%2522%252C%2522n75-0%2522%252C%2522n91-0%2522%252C%2522n62-1%2522%252C%2522n116-0%2522%252C%2522n158-1%2522%252C%2522n104-0%2522%252C%2522n139-1%2522%252C%2522n128-2%2522%252C%2522n5-5%2522%252C%2522n109-0%2522%252C%2522n105-0%2522%252C%2522n159-0%2522%252C%2522n114-0%2522%252C%2522n20-1%2522%252C%2522n80-1%2522%252C%2522n117-2%2522%252C%2522n58-1%2522%252C%2522n123-2%2522%252C%2522n90-1%2522%252C%2522n76-1%2522%252C%2522n66-1%2522%252C%2522n101-1%2522%252C%2522n77-0%2522%252C%2522n60-1%2522%252C%2522n64-0%2522%252C%2522n111-0%2522%252C%2522n136-0%2522%252C%2522n103-0%2522%252C%2522n17-1%2522%252C%2522n137-0%2522%252C%2522n161-1%2522%252C%2522n86-0%2522%252C%2522n147-4%2522%252C%2522n3-1%2522%252C%2522n83-0%2522%252C%2522n8-5%2522%252C%2522n107-0%2522%252C%2522n57-1%2522%252C%2522n99-1%2522%252C%2522n120-2%2522%252C%2522n118-6%2522%252C%2522n153-1%2522%252C%2522n82-1%2522%252C%2522n33-1%2522%252C%2522n39-1%2522%252C%2522n156-1%2522%252C%2522n124-1%2522%252C%2522n138-0%2522%252C%2522n140-0%2522%252C%2522n141-0%2522%252C%2522n157-1%2522%252C%2522n43-1%2522%252C%2522n142-0%2522%252C%2522n7-2%2522%252C%2522n110-0%2522%252C%2522n87-0%2522%252C%2522n12-2%2522%252C%2522n102-0%2522%252C%2522n92-1%2522%252C%2522n122-1%2522%252C%2522n11-1%2522%252C%2522n46-1%2522%252C%2522n79-1%2522%252C%2522n93-3%2522%252C%2522n148-0%2522%252C%2522n42-1%2522%252C%2522n2-6%2522%252C%2522n67-0%2522%252C%2522n115-1%2522%252C%2522n89-2%2522%252C%2522n154-1%2522%252C%2522n84-0%2522%252C%2522n108-0%2522%252C%2522n54-0%2522%252C%2522n18-1%2522%252C%2522n88-1%2522%252C%2522n160-1%2522%252C%2522n78-1%2522%252C%2522n44-1%2522%252C%2522n106-1%2522%252C%2522n52-2%2522%252C%2522n119-5%2522%252C%2522n81-1%2522%252C%2522n125-1%2522%252C%2522n149-0%2522%252C%2522n85-0%2522%252C%2522n9-0%2522%252C%2522n10-3%2522%252C%2522n21-1%2522%252C%2522n15-2%2522%252C%2522n155-1%2522%252C%2522n6-2%2522%252C%2522n63-0%2522%252C%2522n94-2%2522%252C%2522n23-1%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%253A17299.sb%253Af%2522%255D%252C%2522yieldlove_pid%2522%253A%255B%252217299%2522%255D%252C%2522yieldlove_reload%2522%253A%255B%2522pid%253A17299.reload%253Afalse%2522%255D%252C%2522yieldlove_reloaded%2522%253A%255B%2522false%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%253A17299.default%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3D253f8598ead74ffd%3AT%3D1570009058%3AS%3DALNI_MaVr2M898oUraOrZtdXHJBYzD5WRg&cdm=www.golem.de&bc=31&abxe=1&lmt=1570009058&dt=1570009058955&dlt=1570009058637&idt=313&frm=23&biw=1585&bih=1185&isw=300&ish=601&oid=3&adx=993&ady=1008&adk=2838689593&uci=60k7khbxvdcm&ifi=1&ifk=3291234646&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.golem.de%2F&top=www.golem.de&dssz=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x20&msz=300x20&ga_vid=1942422950.1570009058&ga_sid=1570009059&ga_hid=1381283307&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019093001.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
cafe /
Resource Hash
9874788ff947640469addd4ce1512011c6595d2a0d11ffbd20f29aa2f5b0425c
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:39 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
133
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_2019093001.js
securepubads.g.doubleclick.net/gpt/ Frame FCC5
63 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019093001.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019093001.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
25ee8438325f726833afbcc7f75f152d9640156bda461c1b4636275af51c5dbe
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 30 Sep 2019 13:06:17 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24646
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame FCC5
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019093001.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/74.0.3729.169 Safari/537.36

Response headers

ads
securepubads.g.doubleclick.net/gampad/ Frame 8F93
300 B
214 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4240008344419471&correlator=3486382029952211&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&eid=21064699%2C21063637%2C21064550%2C21064568&vrg=2019093001&guci=2.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191002&iu=%2F53015287%2Fgolem.de_d_300x250_2_dc&sz=10x10%7C301x250%7C300x126%7C34x32&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%252203412b7eabb5c32092d8052409111d9c%2522%255D%252C%2522mbrseg%2522%253A%255B%2522ff6482ed%2522%252C%2522b3838f1f%2522%252C%252278315b65%2522%255D%252C%2522mbrstatus%2522%253A%255B%2522called-idfound%2522%255D%252C%2522nuggad%2522%253A%255B%2522n127-0%2522%252C%2522n121-2%2522%252C%2522n126-1%2522%252C%2522n69-0%2522%252C%2522n75-0%2522%252C%2522n91-0%2522%252C%2522n62-1%2522%252C%2522n116-0%2522%252C%2522n158-1%2522%252C%2522n104-0%2522%252C%2522n139-1%2522%252C%2522n128-2%2522%252C%2522n5-5%2522%252C%2522n109-0%2522%252C%2522n105-0%2522%252C%2522n159-0%2522%252C%2522n114-0%2522%252C%2522n20-1%2522%252C%2522n80-1%2522%252C%2522n117-2%2522%252C%2522n58-1%2522%252C%2522n123-2%2522%252C%2522n90-1%2522%252C%2522n76-1%2522%252C%2522n66-1%2522%252C%2522n101-1%2522%252C%2522n77-0%2522%252C%2522n60-1%2522%252C%2522n64-0%2522%252C%2522n111-0%2522%252C%2522n136-0%2522%252C%2522n103-0%2522%252C%2522n17-1%2522%252C%2522n137-0%2522%252C%2522n161-1%2522%252C%2522n86-0%2522%252C%2522n147-4%2522%252C%2522n3-1%2522%252C%2522n83-0%2522%252C%2522n8-5%2522%252C%2522n107-0%2522%252C%2522n57-1%2522%252C%2522n99-1%2522%252C%2522n120-2%2522%252C%2522n118-6%2522%252C%2522n153-1%2522%252C%2522n82-1%2522%252C%2522n33-1%2522%252C%2522n39-1%2522%252C%2522n156-1%2522%252C%2522n124-1%2522%252C%2522n138-0%2522%252C%2522n140-0%2522%252C%2522n141-0%2522%252C%2522n157-1%2522%252C%2522n43-1%2522%252C%2522n142-0%2522%252C%2522n7-2%2522%252C%2522n110-0%2522%252C%2522n87-0%2522%252C%2522n12-2%2522%252C%2522n102-0%2522%252C%2522n92-1%2522%252C%2522n122-1%2522%252C%2522n11-1%2522%252C%2522n46-1%2522%252C%2522n79-1%2522%252C%2522n93-3%2522%252C%2522n148-0%2522%252C%2522n42-1%2522%252C%2522n2-6%2522%252C%2522n67-0%2522%252C%2522n115-1%2522%252C%2522n89-2%2522%252C%2522n154-1%2522%252C%2522n84-0%2522%252C%2522n108-0%2522%252C%2522n54-0%2522%252C%2522n18-1%2522%252C%2522n88-1%2522%252C%2522n160-1%2522%252C%2522n78-1%2522%252C%2522n44-1%2522%252C%2522n106-1%2522%252C%2522n52-2%2522%252C%2522n119-5%2522%252C%2522n81-1%2522%252C%2522n125-1%2522%252C%2522n149-0%2522%252C%2522n85-0%2522%252C%2522n9-0%2522%252C%2522n10-3%2522%252C%2522n21-1%2522%252C%2522n15-2%2522%252C%2522n155-1%2522%252C%2522n6-2%2522%252C%2522n63-0%2522%252C%2522n94-2%2522%252C%2522n23-1%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%2522false%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%3D253f8598ead74ffd%3AT%3D1570009058%3AS%3DALNI_MaVr2M898oUraOrZtdXHJBYzD5WRg&cdm=www.golem.de&bc=31&lmt=1570009058&dt=1570009058965&dlt=1570009058647&idt=313&ea=0&frm=23&biw=1585&bih=1185&isw=301&ish=250&oid=3&adx=993&ady=4486&adk=4008869679&uci=88ufgtcjmwx2&ifi=1&ifk=4200391111&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.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=1942422950.1570009058&ga_sid=1570009059&ga_hid=888384545&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019093001.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
cafe /
Resource Hash
d7f29376368e05289528808c6f5e3bb31cd2ac6f1e8577da7a2f785079f73f0d
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:39 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
125
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_2019093001.js
securepubads.g.doubleclick.net/gpt/ Frame 8F93
63 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019093001.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019093001.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
25ee8438325f726833afbcc7f75f152d9640156bda461c1b4636275af51c5dbe
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 30 Sep 2019 13:06:17 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24646
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:38 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame 8F93
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019093001.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/74.0.3729.169 Safari/537.36

Response headers

ads
securepubads.g.doubleclick.net/gampad/ Frame 7C86
302 B
205 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4075293221621794&correlator=3207627681317297&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&eid=21062414%2C21063635&vrg=2019092602&guci=2.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20191002&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%252203412b7eabb5c32092d8052409111d9c%2522%255D%252C%2522mbrseg%2522%253A%255B%2522ff6482ed%2522%252C%2522b3838f1f%2522%252C%252278315b65%2522%255D%252C%2522mbrstatus%2522%253A%255B%2522called-idfound%2522%255D%252C%2522nuggad%2522%253A%255B%2522n127-0%2522%252C%2522n121-2%2522%252C%2522n126-1%2522%252C%2522n69-0%2522%252C%2522n75-0%2522%252C%2522n91-0%2522%252C%2522n62-1%2522%252C%2522n116-0%2522%252C%2522n158-1%2522%252C%2522n104-0%2522%252C%2522n139-1%2522%252C%2522n128-2%2522%252C%2522n5-5%2522%252C%2522n109-0%2522%252C%2522n105-0%2522%252C%2522n159-0%2522%252C%2522n114-0%2522%252C%2522n20-1%2522%252C%2522n80-1%2522%252C%2522n117-2%2522%252C%2522n58-1%2522%252C%2522n123-2%2522%252C%2522n90-1%2522%252C%2522n76-1%2522%252C%2522n66-1%2522%252C%2522n101-1%2522%252C%2522n77-0%2522%252C%2522n60-1%2522%252C%2522n64-0%2522%252C%2522n111-0%2522%252C%2522n136-0%2522%252C%2522n103-0%2522%252C%2522n17-1%2522%252C%2522n137-0%2522%252C%2522n161-1%2522%252C%2522n86-0%2522%252C%2522n147-4%2522%252C%2522n3-1%2522%252C%2522n83-0%2522%252C%2522n8-5%2522%252C%2522n107-0%2522%252C%2522n57-1%2522%252C%2522n99-1%2522%252C%2522n120-2%2522%252C%2522n118-6%2522%252C%2522n153-1%2522%252C%2522n82-1%2522%252C%2522n33-1%2522%252C%2522n39-1%2522%252C%2522n156-1%2522%252C%2522n124-1%2522%252C%2522n138-0%2522%252C%2522n140-0%2522%252C%2522n141-0%2522%252C%2522n157-1%2522%252C%2522n43-1%2522%252C%2522n142-0%2522%252C%2522n7-2%2522%252C%2522n110-0%2522%252C%2522n87-0%2522%252C%2522n12-2%2522%252C%2522n102-0%2522%252C%2522n92-1%2522%252C%2522n122-1%2522%252C%2522n11-1%2522%252C%2522n46-1%2522%252C%2522n79-1%2522%252C%2522n93-3%2522%252C%2522n148-0%2522%252C%2522n42-1%2522%252C%2522n2-6%2522%252C%2522n67-0%2522%252C%2522n115-1%2522%252C%2522n89-2%2522%252C%2522n154-1%2522%252C%2522n84-0%2522%252C%2522n108-0%2522%252C%2522n54-0%2522%252C%2522n18-1%2522%252C%2522n88-1%2522%252C%2522n160-1%2522%252C%2522n78-1%2522%252C%2522n44-1%2522%252C%2522n106-1%2522%252C%2522n52-2%2522%252C%2522n119-5%2522%252C%2522n81-1%2522%252C%2522n125-1%2522%252C%2522n149-0%2522%252C%2522n85-0%2522%252C%2522n9-0%2522%252C%2522n10-3%2522%252C%2522n21-1%2522%252C%2522n15-2%2522%252C%2522n155-1%2522%252C%2522n6-2%2522%252C%2522n63-0%2522%252C%2522n94-2%2522%252C%2522n23-1%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%2522false%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%3D253f8598ead74ffd%3AT%3D1570009058%3AS%3DALNI_MaVr2M898oUraOrZtdXHJBYzD5WRg&cdm=www.golem.de&bc=31&abxe=1&lmt=1570009058&dt=1570009058976&dlt=1570009058642&idt=327&ea=0&frm=23&biw=1585&bih=1185&isw=970&ish=251&oid=3&adx=308&ady=1619&adk=2408324468&uci=kh5k0mfhtxby&ifi=1&ifk=3801567061&u_tz=120&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.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=1942422950.1570009058&ga_sid=1570009059&ga_hid=591150096&fws=256&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019092602.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
cafe /
Resource Hash
c490bd91dfbe6bb4367d8bce43edb36a897342519a126664a097909ff7679c4c
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:39 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
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_2019092602.js
securepubads.g.doubleclick.net/gpt/ Frame 7C86
63 KB
24 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019092602.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019092602.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.194 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s08-in-f2.1e100.net
Software
sffe /
Resource Hash
35c073a53df4dd054afab9758b90a88846802754ff15fc3b31cc9af133c8a401
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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:39 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 26 Sep 2019 18:43:36 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
24721
x-xss-protection
0
expires
Wed, 02 Oct 2019 09:37:39 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/ Frame 7C86
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019092602.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/74.0.3729.169 Safari/537.36

Response headers

truncated
/ Frame 2386
215 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
e011b2f4d3dabaea088701d4d4a8024561bcef60a745e3ec41f6b7f2030a344b

Request headers

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

Response headers

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

Request headers

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

Response headers

Content-Type
image/png
truncated
/ Frame FCC5
213 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
3341a937d392ac6893916d5dae7efd6da62d257cccd68fd018242069dff1763c

Request headers

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

Response headers

Content-Type
image/png
truncated
/ Frame 8F93
208 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7dafa997035d795c9c23778718a4ba60ea7eebbab85f95bcdead8d01f4640900

Request headers

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

Response headers

Content-Type
image/png
truncated
/ Frame 7C86
208 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
449c96ff92893665c63d897f63c5899be59a2bf98a336a956fc9720981d8b0a0

Request headers

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

Response headers

Content-Type
image/png
data
lb18.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb18.s400.meetrics.net/data?/N/UyDRQAAKktFLkqFFlqwF23A52AwwALl1FDLkqFKlkyB23A52AwwA2qoFx1A3wAwwA5wA13A11A0wAxqFlpFnsFz0BxBF/k0FVEmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A52A32A43AxmAjpFk9BxzA4yA23A43Ay2Az4AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF90A44A52A32A43AxmAhwFk9B04A45A23A24A3xAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3wAwwA5wA15Aw3A4BELlnFBUkzFnBPPDAAZAwSAcAAAAP3MAAAAAAABdKgAPBAAFAAdKgTYeNAPAAAXUAKAABYeNAZCAAOA55A55A85B55A58E55A55AGAxzAx3A0xArYeNASksFqFjAAAAAAAAAAAAEAAAdKgAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAw4E2wAwBEMAxzA4yA23A43Ay2Az4ANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A23A24A3xADAzrF5BFKA04A45A23A24A3xAKA04A45A23A24A3xAxAlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEzrF5BFdXUAKAAsEAYJAFAAAYeNAAAAAKAIhFsmFwhFnlFBkFAAAAAAAAAAAAAAAAQtjFHRGlUA
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.3.206 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h213.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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:39 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 02-Oct-19 09:37:38 GMT
data
lb18.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb18.s400.meetrics.net/data?/N/UyEYQAA/k0F9ImvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A52A32A43AxmAjpFk9BxzA4yA23A43Ay2Az4AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF90A44A52A32A43AxmAhwFk9B04A45A23A24A3xAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3wAwwA5wA15Aw3A4mEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A54AwxAy0A3mAjpFk9BxzA4yA23A43Ay2A3xAmzEp6Fl9BzwAx4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9yEljF0hFunFslFymAhwFj9B04A45A4wAxyA03AmhEwkF90A44A54AwxAy0A3mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3wAwwA5wA15Aw4A4BELlnFCUkzFYBPHAAAAAAAABVWfAPBAAFAAVWfThRjAPAAAAAAAAABhRjAZCAAOA55A55A85B55A58E55A55AGAxyA40Aw1ArhRjASksFFGjAAAAAAAAAAAAEAAAVWfAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAx4Ey1AwBEMAxzA4yA23A43Ay2A3xANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A4wAxyA03AKAylFj0FhuFnsFlyBKA04A45A4wAxyA03AKA04A45A4wAxyA03A4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBdAAAAAAAAAAAAFAAAhRjAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFU9RyWA
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.3.206 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h213.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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:39 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 02-Oct-19 09:37:38 GMT
data
lb18.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb18.s400.meetrics.net/data?/N/UyFZQAA/k0FXNmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A52A32A43AxmAjpFk9BxzA4yA23A43Ay2Az4AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF90A44A52A32A43AxmAhwFk9B04A45A23A24A3xAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3wAwwA5wA15Aw3A4mEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A54AwxAy0A3mAjpFk9BxzA4yA23A43Ay2A3xAmzEp6Fl9BzwAx4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9yEljF0hFunFslFymAhwFj9B04A45A4wAxyA03AmhEwkF90A44A54AwxAy0A3mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3wAwwA5wA15Aw4A4mEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A53A53A45A2mAjpFk9BxzA4yA23A13A4wA0wAmzEp6Fl9B53Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEhuFulFymBhwFj9B04A45A35A34A52AmhEwkF90A44A53A53A45A2mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3wAwwA5wA15Aw5A1BELlnFDTkzFPPEAAAAAAAABU1ZASksF2EjAAAAAAAAAAAAEAAAU1ZAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA53Aw4Ey1AwBEMAxzA4yA23A13A4wA0wANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A35A34A52AGAihFuuFlyFKA04A45A35A34A52AKA04A45A35A34A52A0AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFQtjFvhG0YA
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.3.206 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h213.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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:39 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 02-Oct-19 09:37:38 GMT
data
lb18.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb18.s400.meetrics.net/data?/N/UyGdQAAUkzFJBPAAAFAAU1ZTbosAPBAA0EAMCABbosAZCAAOA55A55A85B55A58E55A55AGAxwA14AxyArbosARksF6d0EAMCAKPA6DAFAAAbosAAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFQRbQSA
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.3.206 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h213.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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:39 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 02-Oct-19 09:37:38 GMT
data
lb18.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb18.s400.meetrics.net/data?/N/UyHdQAA/k0F4RmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A52A32A43AxmAjpFk9BxzA4yA23A43Ay2Az4AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF90A44A52A32A43AxmAhwFk9B04A45A23A24A3xAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3wAwwA5wA15Aw3A4mEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A54AwxAy0A3mAjpFk9BxzA4yA23A43Ay2A3xAmzEp6Fl9BzwAx4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9yEljF0hFunFslFymAhwFj9B04A45A4wAxyA03AmhEwkF90A44A54AwxAy0A3mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3wAwwA5wA15Aw4A4mEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A53A53A45A2mAjpFk9BxzA4yA23A13A4wA0wAmzEp6Fl9B53Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEhuFulFymBhwFj9B04A45A35A34A52AmhEwkF90A44A53A53A45A2mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3wAwwA5wA15Aw5A1mEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A24Aw3A00AmjEpkF9xAz4Ay2A34A3yA21A2mAzpF6lF9zAwwA42BwxAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B04A45A24Aw3A00AmhEwkF90A44A52A4wA30A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA13AwwAw5Aw1A5xAwwATkzFARksFAQtjFTR32ZA
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.3.206 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h213.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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:39 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 02-Oct-19 09:37:38 GMT
data
lb18.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb18.s400.meetrics.net/data?/N/UyIkQAALlnFEUkzFVBPDAAAAAAAABaGAAPAAAFAAaGATTfPAPAAAhPAwPABTfPAZCAAOA55A55A85B55A58E55A55ADA0xAwBErTfPASksF8FjAAAAAAAAAAAAEAAAaGAAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAw4E2wAxBEMAxzA4yA23A43Ay2A12ANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A24Aw3A00AJAylFj0FhuFnsFlBFKA04A45A24Aw3A00AKA04A45A24Aw3A00A3AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlBFdhPAwPAsEAZJAFAAATfPAAAAAKAIhFsmFwhFnlFBkFAAAAAAAAAAAAAAAAQtjFUYnxSA
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.3.206 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h213.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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:39 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 02-Oct-19 09:37:38 GMT
data
lb18.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb18.s400.meetrics.net/data?/N/UyJlQAA/k0FaWmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A52A32A43AxmAjpFk9BxzA4yA23A43Ay2Az4AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF90A44A52A32A43AxmAhwFk9B04A45A23A24A3xAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3wAwwA5wA15Aw3A4mEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A54AwxAy0A3mAjpFk9BxzA4yA23A43Ay2A3xAmzEp6Fl9BzwAx4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9yEljF0hFunFslFymAhwFj9B04A45A4wAxyA03AmhEwkF90A44A54AwxAy0A3mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3wAwwA5wA15Aw4A4mEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A53A53A45A2mAjpFk9BxzA4yA23A13A4wA0wAmzEp6Fl9B53Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEhuFulFymBhwFj9B04A45A35A34A52AmhEwkF90A44A53A53A45A2mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A3wAwwA5wA15Aw5A1mEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A24Aw3A00AmjEpkF9xAz4Ay2A34A3yA21A2mAzpF6lF9zAwwA42BwxAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B04A45A24Aw3A00AmhEwkF90A44A52A4wA30A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA13AwwAw5Aw1A5xAwwAmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B05A4wA05AwyA40AmjEpkF9xAz4Ay2Az2A11A11AymAzpF6lF95A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BipFssFivFhyFkyBmhEwjF90A54Aw0A5wAy4A0mAhwFk9B05A4wA05AwyA40AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFpsFsiFvhFykFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA13AwwAw5Aw1A5xAw4ATkzFARksFAQtjFR/rNeA
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.3.206 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h213.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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:39 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 02-Oct-19 09:37:38 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?cache=5157689367
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBlaWZveG9oT3VjaGFuZ2E9UGVpZm94b2hPdWNoYW5nYXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVGV8fCh4LlRlPTApO3guVGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5UZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5UbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay55YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuZ2YoYyk7YS5xdShtKTthLnB1KGwpO2EuWHQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS55dSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5raC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUua2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQW09dGhpcy5hWzhdO3RoaXMuRXY9dGhpcy5hWzddO3RoaXMuU2o9dGhpcy5hWzldO3RoaXMuS3A9dGhpcy5hWzRdO3RoaXMuam49dGhpcy5hWzddO3RoaXMuWG89dGhpcy5hWzNdO3RoaXMucGs9dGhpcy5hWzldO3RoaXMuem89dGhpcy5hWzZdO3RoaXMuUW89dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNl19Yy50bT1iO2IucHJvdG90eXBlPXt6bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQW06dGhpcy5EdihhKX0sRHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkV2OnRoaXMuUmooYSl9LFJqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Tajp0aGlzLkpwKGEpfSxKcDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLktwOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qbjp0aGlzLldvKGEpfSxXbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWG86dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5wazp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpvOnRoaXMuUG8oYSl9LFBvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMudG18fGhhLHNjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLnptKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlRvPSExO3RoaXMuQ2I9InNldHVwIjt0aGlzLk5jPVtdO3RoaXMubmUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuSHQuYmluZCh0aGlzKSk7dGhpcy5uYj17fTt0aGlzLlJnPXt9O3RoaXMuZGY9ITF9Yy5maz1iO2IucHJvdG90eXBlPXtUdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5uYil0aGlzLm5iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm5iW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5kZnx8KHRoaXMuZGY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmRmfSxvYjpmdW5jdGlvbihhKXt0aGlzLm5iW2FdfHwodGhpcy5uYlthXT0wKTt0aGlzLm5iW2FdKz0xOzU8dGhpcy5uYlthXSYmIXRoaXMuUmdbYV0mJih0aGlzLlJnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuVHUoKSwhMCkpfSxuZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LApldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUW46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEh0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLkd0KGEuZGF0YSl9LEd0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCwKZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGdlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LG9nOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR2coYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmpoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxHZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsKaWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sTm46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLnFxKGEpKXJldHVybjsoYj10aGlzLm9nKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0scXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sCndnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxMcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx4ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEZnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxQaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50OwpyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxFZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLHE9MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCoKZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5FZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmUoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHplOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sS2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt5PWs7dT1tO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKHEsNSkrKG5eCnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKG0pK2IobCkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxIcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGhkOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT0KbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17TGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sZnI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sRWw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sVW06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LApRazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LGltOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sSG86ZnVuY3Rpb24oKXtyZXR1cm4gYS5MaSgpfHxhLlVpKCl8fGEuZnIoKXx8YS5FbCgpfHxhLlVtKCl8fGEuUWsoKXx8YS5pbSgpfX07cmV0dXJuIG51bGwhPWEuSG8oKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxaYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxmYTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxJcTpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sd3A6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sRnU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQmc6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmNpKGIpKyI6Iit0aGlzLmNpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5DYj1hfSx5ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkNiO3RoaXMuY2UoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTsKYS5kaXNwYXRjaEV2ZW50KGYpfSxCYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMueWcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5CYyhCKX0sSnQ6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTsKYi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5JcSgpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LE11OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5ZYigpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuY2UoYSl9LGNlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSnQoYSk7aWYoYilpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2UoYil9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLkpjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9bS5KYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYik7Cm0ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxLZDpmdW5jdGlvbihhKXtpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGIsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLkpjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LExlOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLmJwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxlKCl9LmJpbmQodGhpcyksNTAwKX0sdmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmtiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx5ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sa2I6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5uZChhKToiIn0sbmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy55ZShhKTsKYiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxjZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuR2UoYSl8fHRoaXMuTHIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5jZiYmd2luZG93LnNhbmRib3guY2ZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5jZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5jZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy53ZyhhKSlyZXR1cm4gdGhpcy53ZyhhKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5hYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIucWQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuTm4oZSxhKTtyZXR1cm4gZX0sYWI6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyxrKXt2YXIgbD1lfHxtO2U9ITA7ayYmKGU9ITEpO2lmKGwmJmwuVilpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihhLGIsZCxmLGMsbCxnLGspfS5iaW5kKHRoaXMpLDUwMCl9LGpoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxsczpmdW5jdGlvbihhLGIsZCl7dGhpcy5qaChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5OYylmb3IodmFyIGMgaW4gdGhpcy5OYylhPWEuc3BsaXQoYykuam9pbih0aGlzLk5jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS54YihhKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxraDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGEsZi5MYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMubHMoZi5xZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCnl1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk5jPWF9LEd3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5hYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sRnI6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9fX0pKGMpO3ZhciBRPWMuZmt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPQphfHx7fX1jLmVrPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IudXQ9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuRXM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iua3c9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5icT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnR3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWGY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuUGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5VZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5ZZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuRm49e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuU2Y9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5Qdj17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuY3E9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5vdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5rZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnFwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5kZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLnljPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5XZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuSG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5VYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuJGQ9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuYmU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLkduPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5qaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLkhzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5sZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuaXc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTHY9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk12PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Ldj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLkZzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5la3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hbD10aGlzLmFbNl07dGhpcy5xaj10aGlzLmFbNF07dGhpcy5rdD10aGlzLmFbM107dGhpcy54aj10aGlzLmFbMTBdO3RoaXMubHE9dGhpcy5hWzEwXTt0aGlzLmxqPXRoaXMuYVs1XTt0aGlzLkl2PXRoaXMuYVs0XTt0aGlzLkp1PXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuTGw9YjtiLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFsOnRoaXMucGooYSl9LHBqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xajp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMua3Q6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhqOnRoaXMua3EoYSl9LGtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5scTp0aGlzLmtqKGEpfSwKa2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmxqOnRoaXMuSHYoYSl9LEh2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jdjp0aGlzLkl1KGEpfSxJdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSnU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLkxsfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy4kayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmdrPWI7Yi5wcm90b3R5cGU9e3plOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxsYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LERxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LGxkOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5sZChhKwo2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5sZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuemUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmxkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxBcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxZZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnplKHRoaXMuRHEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5sZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIEo9CmMuZ2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ209dGhpcy5hWzldO3RoaXMuRnc9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMuT2w9YjtiLnByb3RvdHlwZT17Zm06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdtOnRoaXMuRXcoYSl9LEV3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gdzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuT2x8fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLmZtKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzoKLy4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5naj1ifSkoYyk7dmFyIEw9Yy5nanx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc209dGhpcy5hWzFdO3RoaXMuemk9dGhpcy5hWzNdO3RoaXMuQ209dGhpcy5hWzldO3RoaXMuT2o9dGhpcy5hWzZdO3RoaXMuZXI9dGhpcy5hWzEwXTt0aGlzLndsPXRoaXMuYVs2XTt0aGlzLnd2PXRoaXMuYVsxXTt0aGlzLlBwPXRoaXMuYVs0XTt0aGlzLkVuPXRoaXMuYVs3XTt0aGlzLkJwPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuRG09YjtiLnByb3RvdHlwZT17cm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNtOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56aTp0aGlzLkJtKGEpfSxCbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ206dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9qOnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5lcjp0aGlzLnZsKGEpfSx2bDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud2w6dGhpcy52dihhKX0sdnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMud3Y6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBwOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbjp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLkRtfHxsYSx4Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5ybSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLlNsPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5LYz0xMDA7dGhpcy5JYj0wO3RoaXMuV2E9MTUwO3RoaXMuTGI9MDt0aGlzLnJ1KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYT8KKHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKX0sYnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxiZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHJ1OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSxCcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmxhKCldPWI7TSYmTS5naCYmTS5TdShiKX0sdHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/CiEwOiExfSxHcjpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEx4OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuU2x8fHQ7KGZ1bmN0aW9uKGMpe2MuVWw9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5LYz0xMDt0aGlzLkliPTA7dGhpcy5XYT01MDt0aGlzLlg9bnVsbDt0aGlzLm5hPSExO3RoaXMucGxheWVyPWI7dGhpcy5CYj0iIjt0aGlzLnFnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuS2EoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD0KaC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxCdTpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sdXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSx1dTpmdW5jdGlvbihiKXt0aGlzLk9lPWJ9LHN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2V9LE5lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLktjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7CmVsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxFZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxCZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LE54OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLldxKCl8fHRoaXMuSm4oKTt0aGlzLkJkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sdng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sSm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sV3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxBYTpmdW5jdGlvbigpe3JldHVybiExfSxEeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hfSxjYTpmdW5jdGlvbigpe3RoaXMubmE9ITB9LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmCmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSmg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxyeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSxFaDpmdW5jdGlvbigpe3RoaXMuQmI9bnVsbH0seHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkJiJiYoYj0hMCk7cmV0dXJuIGJ9LEl4OmZ1bmN0aW9uKCl7dGhpcy5xZ3x8KHRoaXMucWc9ITApfSx1ZTpmdW5jdGlvbigpe3JldHVybiExfSxveDpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5VbHx8cDsoZnVuY3Rpb24oYyl7Yy51aT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLkxmPQoiMSI7dGhpcy5NZj0iMiI7dGhpcy51bj0iMyI7dGhpcy5RYz0wO3RoaXMubmg9MzA7dGhpcy5SYj1bXTt0aGlzLmdiPVtdO3RoaXMub2M9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuWmY9dGhpcy5maT0hMTt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5nZihiKTt0aGlzLnN1KGEpfSxnOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuZml8fCh0aGlzLmZpPSEwLGUuTGUoKSl9LFNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5hYyYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0seHI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2Eua2EoKV18fCh3aW5kb3dbYS5rYSgpXT17fSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXXx8KHdpbmRvd1thLmthKCldW2IubGEoKV09Cnt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWWIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXT0xfSxEcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmthKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldLmluaXRpYXRvciE9ZS5ZYigpJiYodGhpcy5oZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnhhKCkpe3RoaXMueHIoKTtpZighdGhpcy5EcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5oZigpO3JldHVybn10aGlzLmhmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5aaCgpO3RoaXMuWmY9ITA7YSYmImZ1bmN0aW9uIj09CnR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5nYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYodGhpcy5SYj1lLnVuaXF1ZSh0aGlzLlJiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5SYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGg9MDtoPHRoaXMuZ2IubGVuZ3RoO2grKyl0aGlzLm9jW3RoaXMuZ2JbaF0ucmVhc29uXT09dGhpcy5vY1tiXSYmYS5wdXNoKHRoaXMuZ2JbaF0uZGV0YWlsKSx0aGlzLm9jW3RoaXMuZ2JbaF0ucmVhc29uXTx0aGlzLm9jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5nYltoXS5kZXRhaWwpLGI9dGhpcy5nYltoXS5yZWFzb24pO3RoaXMub2NbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSwKYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sd3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGhmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0senU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnVufSxvYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0seGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuUWN9LGdmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sc3U6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sb3M6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIHY9Yy51aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5acD10aGlzLmFbOV07dGhpcy5Rcj10aGlzLmFbNl07dGhpcy5Hdj10aGlzLmFbN107dGhpcy52bz10aGlzLmFbNV07dGhpcy5nbj10aGlzLmFbNV07dGhpcy51cD10aGlzLmFbOF07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy50aj1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY2w6dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpwOnRoaXMuUHIoYSl9LFByOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Rcjp0aGlzLkZ2KGEpfSxGdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuR3Y6dGhpcy51byhhKX0sdW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZvOnRoaXMuZm4oYSl9LApmbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmduOnRoaXMudHAoYSl9LHRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cDp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLnRqfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5ibCg0KTsoZnVuY3Rpb24oYyl7Yy5Iaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ianx8b2E7KGZ1bmN0aW9uKGMpe2MuSWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLmZ4O2E/YS5xYT9hLnFhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7CmYuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuSWp8fHBhOyhmdW5jdGlvbihjKXtjLkpqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiYKd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Kanx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhvPXRoaXMuYVsxMF07dGhpcy5xcz10aGlzLmFbNF07dGhpcy55dD10aGlzLmFbNF07dGhpcy5hbz10aGlzLmFbM107dGhpcy5Bcz10aGlzLmFbNF07dGhpcy5rdj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs2XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueG86dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFzOnRoaXMueHQoYSl9LAp4dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueXQ6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmFvOnRoaXMuenMoYSl9LHpzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Bczp0aGlzLmp2KGEpfSxqdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua3Y6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLlVvfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy53byg0KTsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMudmcoKTt0aGlzLnhnKCk7dGhpcy5wcD0hMX0sdmc6ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKYnx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seGc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpOwphLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk9lJiYoMCx0aGlzLk9lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJgpiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Da3x8c2E7KGZ1bmN0aW9uKGMpe2MuQms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYWU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiYKYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5TYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5TZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmgmJgohdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS53ZCgpLGEucGUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuU2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5TZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5uaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlRjLmluZGV4T2YoYSkmJgp0aGlzLlRjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5UYy5sZW5ndGg+PXRoaXMuYWUmJnRoaXMubSgpKX0sb3M6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xOnRoaXMucmU/dGhpcy5yZSsrOnRoaXMucmU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUGgoYS52aWRlb1RhZyk/YS5iYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlNjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMucmU+dGhpcy5zZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnZnKCksYS54ZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ca3x8dGE7KGZ1bmN0aW9uKGMpe2MuRGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy55cSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLkdyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0scXg6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCnlxOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ea3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdzPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzJdfWMuTXc9YjtiLnByb3RvdHlwZT17ZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmdzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgd2E9Yy5Nd3x8d2EsQWM9bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuZnMoNCk7KGZ1bmN0aW9uKGMpe2MuSG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLkpkKGIpfS5iaW5kKHRoaXMpKX0sSmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LERlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpOwppZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxBYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5IbXx8eGE7KGZ1bmN0aW9uKGMpe2MuR209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkVjPXRoaXMuQ2E9dGhpcy5YYz0hMTt0aGlzLkFoPWUuSGIoMTApO3RoaXMuZWk9ITA7dGhpcy50Yz10aGlzLlZnPSExO3RoaXMuQ3MoYi5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLnFoKCksdGhpcy5ZbygpLHRoaXMucWIoKSl9LENzOmZ1bmN0aW9uKGIpe3JldHVybiBlLmZhKCJ0LW9ubGluZS5kZSIpPyExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LEp4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLAoiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuSiwiOyIsdHlwZW9mIGIuSiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLklhP2IuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuSWE/dHlwZW9mIGIuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5ZZDoKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLllkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/CnR5cGVvZiBiLkoucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5oZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmhlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuQWgpfSx5YjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmCih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMueWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnFhPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnFhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnFhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnFhfSxJZzpmdW5jdGlvbigpe2lmKCF0aGlzLkVjKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRWM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkVjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRWN9LEVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVWcpe3ZhciBiPQp0aGlzLnliKCksYT10aGlzLkNyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5VZz0hMCl9cmV0dXJuIHRoaXMuVWd9LENyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5YYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuWGM9ITApO3JldHVybiB0aGlzLlhjfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsaD0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5VdCgpfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxVdDpmdW5jdGlvbigpe3RoaXMudGM9ITA7dmFyIGI9dGhpcy5JZygpO2lmKGJ8fHRoaXMueGEoKSl7dmFyIGE9ImFkRXJyb3IiLGg9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuVmEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnVjPQohMDtpZihlLmZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIisKZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnVjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5nYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LHB4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5uZyYmYi5hZHMmJih0aGlzLm5nPWIuYWRzKTtyZXR1cm4gdGhpcy5uZ30sWW86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7CnRoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlNlKCl9LmJpbmQodGhpcykpfSxmZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuSWcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCkpfSxxaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5FcigpKXt2YXIgYT10aGlzLnliKCksaD10aGlzLlhiKCk7YSYmaCYmKHRoaXMueWIoKSx0aGlzLlhiKCksdGhpcy50Y3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5WZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnliKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5nYSgpKToodGhpcy5nYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuVmc9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xaCgpfS5iaW5kKHRoaXMpLDUwKX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7CmlmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sWm86ZnVuY3Rpb24oKXt0aGlzLnpjfHwodGhpcy56Yz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuemMhPWIuYWRzLnN0YXRlJiYodGhpcy56Yz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09CnRoaXMuemMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy56Yz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWm8oKX0uYmluZCh0aGlzKSwxMCl9LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS5aYihkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpKX0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmVpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmVpLGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKZ3A6ZnVuY3Rpb24oKXt0aGlzLnl4fHwoMTA8dGhpcy5Xdj8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLld2KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuYXUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ3AoKX0uYmluZCh0aGlzKSw1MCkpKX0sYXU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuWHYpe3RoaXMuWHY9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpOwpiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5HbXx8eWE7KGZ1bmN0aW9uKGMpe2MuSW09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlFoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5RaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxRaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLnhlKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpfX0pfSkoYyk7dmFyIHphPWMuSW18fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaj10aGlzLmFbMl07dGhpcy5DdD10aGlzLmFbOV07dGhpcy5vbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs4XX1jLklrPWI7Yi5wcm90b3R5cGU9e1lqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWmo6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkN0OnRoaXMubm8oYSl9LG5vOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMuSWt8fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5Zaig0KTsoZnVuY3Rpb24oYyl7Yy5JbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLlVlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlcoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LER0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQmIsaD10aGlzLmxhKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTsKZCYmYSYmYS5hYyYmKDA8PWguaW5kZXhPZihkKXx8YS53ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxBYTpmdW5jdGlvbigpe3RoaXMuVWUrKztpZigxMDx0aGlzLlVlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLAoiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LEpkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgQ2E9Yy5JbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuSGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXtpZighdGhpcy50ZSlpZih0aGlzLkRifHwKKHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksCjEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKX19LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQ2EoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLmdxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELApmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5tKCl9LmJpbmQodGhpcykpLHRoaXMuZ3E9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5EdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5IbHx8RGE7KGZ1bmN0aW9uKGMpe2MuSmw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYKMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm5hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9CmMuSmx8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ldD10aGlzLmFbNF07dGhpcy5Ldz10aGlzLmFbN107dGhpcy5MdT10aGlzLmFbN107dGhpcy53cj10aGlzLmFbNF07dGhpcy5UbT10aGlzLmFbMTBdO3RoaXMuc249dGhpcy5hWzddO3RoaXMudXI9dGhpcy5hWzFdO3RoaXMuWGo9dGhpcy5hWzEwXTt0aGlzLnF3PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzFdfWMuQWk9YjtiLnByb3RvdHlwZT17ZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmV0OnRoaXMuSncoYSl9LEp3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS3c6dGhpcy5LdShhKX0sS3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkx1OnRoaXMudnIoYSl9LHZyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy53cjp0aGlzLlNtKGEpfSxTbTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLlRtOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbjp0aGlzLnRyKGEpfSx0cjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudXI6dGhpcy5XaihhKX0sV2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Yajp0aGlzLnB3KGEpfSxwdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnF3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgR2E9Yy5BaXx8R2EsQ2M9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Q2MuZHQoNCk7KGZ1bmN0aW9uKGMpe2Mudms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuRmcoYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJgooYT1hLnBhcmVudE5vZGUpfXRoaXMuRnQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLkZ0KXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlcoaCk7dGhpcy5aKGgpOwp0aGlzLmpkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5qZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuamQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxmcDpmdW5jdGlvbigpe2UuYWgodGhpcy5qZCk7ZS5FZSh0aGlzLmpkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sSWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBIYT1jLnZrfHxIYTsoZnVuY3Rpb24oYyl7Yy51az12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy51a3x8SWE7KGZ1bmN0aW9uKGMpe2Mud2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj0KbC5pbnJlYWQsYT1lLkZnKGIsImVsZW1lbnRJRCIpO2lmKGUuYWgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEphPWMud2t8fEphLEthPW5ldyBKYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5iaj10aGlzLmFbOV07dGhpcy5BbD10aGlzLmFbMTBdO3RoaXMuV2w9dGhpcy5hWzZdO3RoaXMuY3Q9dGhpcy5hWzFdO3RoaXMuSWk9dGhpcy5hWzRdO3RoaXMuTXA9dGhpcy5hWzldO3RoaXMuJGk9dGhpcy5hWzFdO3RoaXMuc3M9dGhpcy5hWzddO3RoaXMuUHE9dGhpcy5hWzNdOwp0aGlzLllyPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuU249YjtiLnByb3RvdHlwZT17YWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmJqOnRoaXMuemwoYSl9LHpsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5BbDp0aGlzLlZsKGEpfSxWbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuV2w6dGhpcy5idChhKX0sYnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jdDp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSWk6dGhpcy5McChhKX0sTHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1wOnRoaXMuWmkoYSl9LFppOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kaTp0aGlzLnJzKGEpfSxyczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3M6dGhpcy5PcShhKX0sT3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlBxOnRoaXMuWHIoYSl9LFhyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ZcjoKdGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTGE9Yy5Tbnx8TGEsRGM9bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGMuYWooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmhrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LHR1OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sS246ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5oa3x8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApoLGQsZil7dGhpcy5mYj1hO3RoaXMuQWc9dGhpcy5uaT0hMTt0aGlzLnJoPWQ7dGhpcy5SaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5mYj1uZXcgeihhKSk7dmFyIGM9dGhpcy5zYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5IZSh0aGlzLmZiLnVybCkmJm0uTWQpe3ZhciBlPW5ldyB6KGEudXJsKTtlLnR1KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmCihiPSEwKTtifHxtLmlhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5pYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuaWs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZmIuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuQWcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLlJoP3RoaXMuc2Iub3Blbih0aGlzLmZiLm1ldGhvZCx0aGlzLmZiLnVybCwhMSk6dGhpcy5zYi5vcGVuKHRoaXMuZmIubWV0aG9kLHRoaXMuZmIudXJsLCEwKSx0aGlzLm5pfHwodGhpcy5zYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuc2Iuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLnNiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLnNiLnNlbmQoYSl9Y2F0Y2goZil7bSYmbS5IZSh0aGlzLmZiLnVybCk/bS5NZD9tLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkhlKHRoaXMuZmIudXJsKSx0aGlzLnJoJiZ0aGlzLnJoKCl9cmV0dXJuIHRoaXMuc2J9fX0pKGMpO3ZhciBNYT1jLmlrfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGE9dGhpcy5WZD0hMX1jLmhqPWI7Yi5wcm90b3R5cGU9e3h1OmZ1bmN0aW9uKGEpe3RoaXMuVmQ9YX0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5IYT1hfSxadDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLCJyZWdpc3RlcmluZ3MgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYixhKX0pfXZhciBiPXtQdzoiQWRDbGlja1RocnUiLFJ3OiJBZEVycm9yIixTdzoiQWRTdG9wcGVkIixWdzoiQWRMaW5lYXJDaGFuZ2UiLFd3OiJBZFRhZ1BhcnNlZCIsWnc6IkFkVmlkZW9Db21wbGV0ZSIsYng6IkFkTG9hZGVkIixjeDoiQWRTa2lwcGVkIixkeDoiQWRTdGFydGVkIixUdzoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLFV3OiJBZEltcHJlc3Npb24iLFF3OiJBZENyZWF0aXZlVmlldyIsWHc6IkFkVmlkZW9NaWRwb2ludCIsWXc6IkFkUGF1c2VkIiwkdzoiQWRWaWRlb1N0YXJ0IixheDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGI9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLlZkLGJbZF0pfSxZdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSwKYil7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGIsYSl9KX1pZih0aGlzLkhhJiZ0aGlzLkhhLlVkKWZvcih2YXIgYiBpbiB0aGlzLkhhLlVkKXRoaXMuSGEuVWQuaGFzT3duUHJvcGVydHkoYikmJmEodGhpcy5IYSx0aGlzLkhhLlVkW2JdKTt0aGlzLkhhJiZ0aGlzLkhhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhLmdldEVycm9yKCk7YSYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixhKX0uYmluZCh0aGlzKSwxMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLlZkJiZ0aGlzLlp0KCk7dGhpcy5IYSYmdGhpcy5ZdCgpfX19KShjKTt2YXIgTmE9Yy5oanx8TmE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlVhPSExO3RoaXMud2M9IiI7dGhpcy5pZT0KdGhpcy52Yz10aGlzLndiPW51bGw7dGhpcy54cD10aGlzLkpiPXRoaXMuaWg9ITE7dGhpcy5MYT0iIjt0aGlzLmRoPSExO3RoaXMud2E9dGhpcy5vZD0iIjt0aGlzLlpnPXRoaXMuVj10aGlzLmlzRW5hYmxlZD10aGlzLiRlPSExO3RoaXMucGE9W107dGhpcy5PZz10aGlzLmZjPSIiO3RoaXMucWU9ITE7dGhpcy5xZj0wO3RoaXMuR2Y9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5FZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuUWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMubmM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLmhjPSIiO3RoaXMuaWM9W107dGhpcy5qYz1bXTt0aGlzLklkPVtdO3RoaXMuZ2M9IiI7dGhpcy5yZj0wO3RoaXMudmlkZW9wbGF6YT0Ke307dGhpcy5EYz0hMTt0aGlzLmhwPXRoaXMuT2Q9bnVsbDt0aGlzLkxoPXRoaXMubGM9dGhpcy5zZz10aGlzLnVmPXRoaXMuTWQ9dGhpcy5rZT10aGlzLlJjPSExO3RoaXMuaGI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMucGQ9MDt0aGlzLlFnPSExO3RoaXMuUGc9MUUzO3RoaXMuWmM9ITE7dGhpcy5RYT0xRTM7dGhpcy5PZj0iIn1jLmprPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMud2MsYWR0YWdtb2RpZmllcjp0aGlzLndiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy52YyxhZHRhZ3JlZ2V4OnRoaXMuaWUsYml0cmF0ZTp0aGlzLlFhLGpzcG9wdXBzOnRoaXMuaWgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMueHAsaG9tYWRBbGlhczp0aGlzLkxhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5kaCxnbG9iYWxDb25maWc6dGhpcy5vZCxjbGllbnRDb25maWc6dGhpcy53YSwKaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5WLGlzQmxvY2tlZDp0aGlzLlpnLHNlcnZlcjp0aGlzLnBhLHN2bUNvbmZpZzp0aGlzLmZjLGhvbWFkQWRwYXRoOnRoaXMuT2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5xZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5xZixIT01BRF9WRVJJRklFRDp0aGlzLkdmLEhPTUFEX0JMT0NLRUQ6dGhpcy5FZixIT01BRF9OT0JMT0NLRVI6dGhpcy5RYixIT01BRF9BREJMT0NLRVI6dGhpcy5uYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRmYsdGVzdEhpZGU6dGhpcy5oYyx0ZXN0VGFnczp0aGlzLmljLHRlc3RUYWdzSlM6dGhpcy5qYyx0ZXN0VGFnc1hIUjp0aGlzLklkLHRlc3RDb29raWU6dGhpcy5nYyx0aHJvdHRsZTp0aGlzLnJmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuRGMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5ocCxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlJjLApibG9ja2VkV2FzQ2FsbGVkOnRoaXMua2UsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTWQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudWYsY29uZmlnRmFpbHVyZXM6dGhpcy5oYixzaXRlQ29uZmlnOnRoaXMuRmEsc2VydmVySWQ6dGhpcy5JaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuamIsdnBhaWQ6dGhpcy5sYyxza2lwQWxsb3dlZDp0aGlzLkxoLHZtYXBzOnRoaXMua2ksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLlpjLGFkRmFsbGJhY2tVUkw6dGhpcy5PZn19LFVxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmhiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuaGJbYl0mJjE9PXRoaXMuaGJbYl0mJihhPSEwKTtyZXR1cm4gYX0sZWY6ZnVuY3Rpb24oYSl7dGhpcy5oYlthXT0hMH0senE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltiXSYmMT09dGhpcy5oYltiXSYmYS5wdXNoKGIpOwpyZXR1cm4gYX0sSGQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5MbyhhKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixnPSIiO2lmKCF0aGlzLlVhJiYhYilyZXR1cm4gbmV3IHooYSk7Zj10aGlzLkdlKGEpO2M9dGhpcy56YShhKTtmPyh0aGlzLkZjKCk/ZT1hOmU9Yy5wcm90b2NvbCsKIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5KYygpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLndjfHx0aGlzLndifHx0aGlzLnZjfHx0aGlzLmllKSYmKGc9dGhpcy55cyhnKSk7YT1uZXcgeihlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkFxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGcpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sR2U6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/CmI9ITA6dGhpcy5GYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sRmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMucGEmJnRoaXMucGEubGVuZ3RoJiYwPHRoaXMucGEubGVuZ3RoJiYoYj10aGlzLnBhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEhlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuR2UoYSk7cmV0dXJuIGJ9LEFxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT0KdHlwZW9mIHRoaXMuTGEmJjA8dGhpcy5MYS5sZW5ndGgpcmV0dXJuIHRoaXMuTGE7Zm9yKGQgaW4gdGhpcy5MYSlpZihiPXRoaXMuTGFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5reDtyZXR1cm4ibm9uZSJ9LHFkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFbdGhpcy5JaF19LEpjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5xZCgpLGI9dGhpcy5LaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxvaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx4czpmdW5jdGlvbihhLApiKXt2YXIgZD1lLnphKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxDPTA7QzxnLmxlbmd0aDtDKyspe3ZhciBrPWdbQ10uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5vaChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMub2goZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx5czpmdW5jdGlvbihhKXt0aGlzLndjJiYoYSs9dGhpcy53Yyk7aWYodGhpcy53Yilmb3IodmFyIGIgaW4gdGhpcy53Yil0aGlzLndiLmhhc093blByb3BlcnR5KGIpJiYKKGE9YS5yZXBsYWNlKGIsdGhpcy53YltiXSkpO3RoaXMudmMmJihhPXRoaXMueHMoYSx0aGlzLnZjKSk7cmV0dXJuIGF9LGVwOmZ1bmN0aW9uKCl7dGhpcy5GYSYmdGhpcy5GYS5jbGllbnRBUElzJiZ0aGlzLiRvKHRoaXMuRmEuY2xpZW50QVBJcyl9LCRvOmZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiPW5ldyBOYTthLnB1Ymxpc2hlckFQSSYmYi54dShhLnB1Ymxpc2hlckFQSSk7YS5wbGF5ZXImJmIud3UoYS5wbGF5ZXIpO2IuZygpfX0sbDpmdW5jdGlvbihhLGIsZCxmLGMsZSl7bT10aGlzO3RoaXMuZGg9ITA7dGhpcy5vZD1hO3RoaXMud2E9Yjt0aGlzLiRlPWQ7dGhpcy5PZD1mO3RoaXMuQWM9Yzt0aGlzLkZhPWV8fHt9O3RoaXMuZXAoKTt0aGlzLmtzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLndhKXRoaXMuaHMoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9YigpLHRoaXMueGMoKX1jYXRjaChnKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iLHRoaXMueGMoKX1jYXRjaChrKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfX0scGI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGtzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLm9kK3RoaXMuZmUoImdsb2JhbCIpKSx0aGlzLlFxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMueGMoKX0uYmluZCh0aGlzKSwhMCl9LGhzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLndhK3RoaXMuZmUoImNsaWVudCIsLTEhPXRoaXMud2EuaW5kZXhPZigiPyIpKSksdGhpcy54Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5lZigiY2xpZW50Iik7dGhpcy5pYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLAohMCl9LGZlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5IYigpKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5GYSYmdGhpcy5GYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGlhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmtlKXt0aGlzLmtlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChoKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwphPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkFjPSExKTt0aGlzLkFjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQWM/dGhpcy5BYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5WPXRoaXMuWmc9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkVmKSk7dGhpcy5OYigpO2UuQmMoay51dCk7KGI9ZS5aYih0aGlzLnFkKCkpKXx8KGI9ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sUXE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLndhfHx0aGlzLmZjfHx0aGlzLkxhfHx0aGlzLnhjKCk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLlFiKSksdGhpcy5OYigpKX19LHhjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLndhfWVsc2UgYT10aGlzLndhO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYS5lbmFibGVkKTt0aGlzLlY9IXRoaXMuaXNFbmFibGVkO3RoaXMucGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5mYSgid2ViLmRlIil8fGUuZmEoImdteC5uZXQiKXx8ZS5mYSgiZ214LmF0Iil8fGUuZmEoImdteC5jaCIpfHxlLmZhKCIxdW5kMS5kZSIpKSYmIXRoaXMuRmMoKSlmb3IoYj0wO2I8dGhpcy5wYS5sZW5ndGg7YisrKXRoaXMucGFbYl09dGhpcy5wYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmZjPWEuY29uZmlnfHwiIjt0aGlzLkxhPWEuYWxpYXN8fApudWxsO3RoaXMuT2c9YS5hZHBhdGh8fCIiO3RoaXMucWU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5JaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5wYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmZjJiZ0aGlzLkxhJiZ0aGlzLnBhLmxlbmd0aD90aGlzLkdjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxHYzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkpjKCkpLGQ9dGhpcy56YSh0aGlzLmZjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0KIlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmZjK3RoaXMuZmUoImN1c3RvbWVyIikpO3RoaXMuRGEoYix0aGlzLlZ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJjdXN0b21lciIpO2E/dGhpcy5obT90aGlzLmlhKCJub1NWTUNvbmZpZyIpOih0aGlzLmhtPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5HYyghMCl9LmJpbmQodGhpcyksITApfX0sVnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5EYz0hMDt0aGlzLkdjKCEwKTtyZXR1cm59fXRoaXMuTWQ9dGhpcy5NYihiLnN0cmljdCk7dGhpcy51Zj10aGlzLk1iKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnNnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj0KdGhpcy5NYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYi5lbmFibGVkKTt0aGlzLmhjPWIudGVzdGhpZGV8fCIiO3RoaXMuamM9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5JZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMud2M9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy53Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy52Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuaWU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuaWg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5KYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5sYz1iLnZwYWlkfHwhMTt0aGlzLkZhLnZwYWlkPXRoaXMubGM7dGhpcy5MaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLiRjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5raT1iLnZtYXBzfHwiIjt0aGlzLlpjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fAoxRTM7dGhpcy5PZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5nYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLkhxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5xZSYmKHRoaXMuZ2M9bnVsbCk7dGhpcy5yZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5EYz0hMCx0aGlzLkdjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLm52KCkmJih0aGlzLmhjfHx0aGlzLmpjfHx0aGlzLmljfHx0aGlzLmdjfHx0aGlzLklkKT90aGlzLiRlPyh0aGlzLlVhPXRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5RYikpLHRoaXMubWUoKSx0aGlzLk5iKCkpOnRoaXMuWnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy4kdSgpKX19LFp1OmZ1bmN0aW9uKCl7dGhpcy5ZdSgpOwp0aGlzLmF2KCl9LGF2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksQz1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLAoiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEMpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnhiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPQpkKXt2YXIgYz1lLmhkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkZhJiZ0aGlzLkZhLnBsYXllciYmdGhpcy5GYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sJHU6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LE9jOmZ1bmN0aW9uKGEpe3RoaXMuUmM9ITA7dGhpcy5WfHwodGhpcy5WPXRoaXMuVWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLk5iKCksdGhpcy5tZSgpKX0sWXU6ZnVuY3Rpb24oKXtpZih0aGlzLmhjKXt2YXIgYT1lLmhkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5oaCgpKXRoaXMuT2ModGhpcy5uYywKIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmhjKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaGMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuVmgoKX19ZWxzZSB0aGlzLlZoKCl9LFVoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLmR2KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5uZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmljPXRoaXMuSWQpJiZ0aGlzLmljLmxlbmd0aCl7dmFyIGQ9dGhpcy5pYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLm5mKCl9LGR2OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkRhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxWaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtjPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsCnRoaXMuSGIoKSk7dGhpcy5ldihjLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVWguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLk9jKHRoaXMubmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrYysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuamMmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksYzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuVWgoKX0sZXY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGMoKXtnKCkmJmIoKX1mdW5jdGlvbiBlKCl7ZygpJiZkKCl9ZnVuY3Rpb24gZygpe3JldHVybiBDPyh3aW5kb3cuY2xlYXJUaW1lb3V0KEMpLCEwKTohMX12YXIgQz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2MoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZnKCkmJmUoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTsKay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWM7ay5vbmVycm9yPWU7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlKX1jYXRjaChsKXtjKCl9fSxuZjpmdW5jdGlvbigpe3RoaXMuZ2M/KHRoaXMucWYrKyx0aGlzLkRhKG5ldyB6KHRoaXMuZ2MpLHRoaXMuWHUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMub2YoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5TaCgpfSxvZjpmdW5jdGlvbihhKXt0aGlzLk9jKHRoaXMuRmYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxYdTpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5xZj90aGlzLm5mKCk6dGhpcy5vZigiQkJCIik6CiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlNoKCk6dGhpcy5vZigiQUFBIil9LFNoOmZ1bmN0aW9uKCl7dGhpcy5WPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMubWUoKX0saGg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlJjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS5mYSgidC1vbmxpbmUuZGUiKXx8ZS5mYSgiZ2lnYS5kZSIpfHxlLmZhKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLmhoKCksITApOwpkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5HZikpO3RoaXMuT2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5PZCYmdGhpcy5PZCgpfSxjcDpmdW5jdGlvbigpe2lmKHRoaXMudWYmJnRoaXMuVXEoKSl7dmFyIGE9dGhpcy56cSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sWmg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxEYTpmdW5jdGlvbihhLGIsZCxjLHEsZyl7dGhpcy5wZHx8KHRoaXMucGQ9MCk7dGhpcy5wZCsrO3RoaXMucGQ+dGhpcy5QZyYmIXRoaXMuUWcmJih0aGlzLlFnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5QZywhMCkpO2E9bmV3IE1hKGEsCmIsZCk7YyYmKGEubmk9ITApO3EmJmUuSHIoKSYmKGEuQWc9ITApO2cmJihhLlJoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGFwOmZ1bmN0aW9uKCl7ZS5WYSgpfHxlLmFiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxjPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/CmEuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5GYygpfHwoYT10aGlzLnphKGMpLGM9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Zy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtnLm5ldHdvcmtTdGF0ZT09Zy5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5pYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2cuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2cuc2V0QXR0cmlidXRlKCJzcmMiLGMpfWVsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sV3U6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PQp0aGlzLmtpfSxicDpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuRGEoYSx0aGlzLk92LmJpbmQodGhpcyksdGhpcy5Odi5iaW5kKHRoaXMpKX0sT3Y6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1kfHx0aGlzLmVxKCl9LE52OmZ1bmN0aW9uKCl7fSwKZXE6ZnVuY3Rpb24oKXtlLkJjKGsuY3EpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaWEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LG1lOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuSmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5KYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkpiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgSjt3aW5kb3dbZC5rYSgpXT10aGlzO2UuYWIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sbnY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5yZn0sSHE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgphLmxlbmd0aCldfSxIYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsYyxlLGcsayxsLG09MDttPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSxnPWQ+PjIsZD0oZCYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGMpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LHphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGM9MTQ7Yy0tOylkW2JbY11dPWFbY118fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LEtoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZCxoO2ZvcihkPTc7MDw9ZDtkLS0paD1hPj4+NCpkJjE1LGMrPWgudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGc9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdSx2LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8bi0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZSk7CnN3aXRjaChuJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChuPj4+MjkpO3gucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKylnW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspZ1tjXT1kKGdbYy0zXV5nW2MtOF1eZ1tjLTE0XV5nW2MtMTZdLDEpO2U9aztuPWw7cD1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1kKGUsNSkrKG4mcHx+biZ1KSt2K2dbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWQoZSw1KSsobl5wXnUpK3YrZ1tjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz00MDs1OT49YztjKyspdz1kKGUsNSkrKG4mcHxuJnV8cCZ1KSt2K2dbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihyKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5qa3x8T2EsbT1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxuPXRoaXMuYVs5XTt0aGlzLnh3PXRoaXMuYVsxXTt0aGlzLmxtPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzNdfWMuWm49YjtiLnByb3RvdHlwZT17a246ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxuOnRoaXMud3coYSl9LHd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHc6dGhpcy5rbShhKX0sa206ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgUGE9Yy5abnx8UGEsRWM9bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RWMua24oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5mLlA/dGhpcy5iYj1hLmYuUCgpOgp0aGlzLmJiPSIiO2EuZi5YZyYmYS5mLlhnKHtwYXVzZTp0aGlzLndkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuR2guYmluZCh0aGlzKSxtdXRlOnRoaXMuUGUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy54di5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmliO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuVmI9dGhpcy5ZYz0hMTt0aGlzLkdvPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuRmQ9e307ZS5vYigibmV3QmlnQWRJZCIpO3RoaXMuT289ZS5hYSgxMCk7dGhpcy5sZj0wO3RoaXMuV2M9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5XYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmIuZikmJnRoaXMuYi5mLnMmJihhPXRoaXMuYi5mLnMoKSksdGhpcy5XYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYKKHRoaXMuUm49Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5zaD10aGlzLkVkPSExO3RoaXMubGg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmVlPSExO3RoaXMuYmk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuR2I9ZS5hYSgxMCk7dGhpcy5FYj1lLmFhKDEwKTt0aGlzLk1oPWUuYWEoMTApO3RoaXMuY29uZj17fTt0aGlzLlBkPXRoaXMuT2I9dGhpcy5vZT10aGlzLmVkPXRoaXMuR2Q9dGhpcy5yYj10aGlzLm1jPXRoaXMudWg9dGhpcy5rZD10aGlzLnB2PXRoaXMudWI9dGhpcy5GYj0hMTt0aGlzLnJjPVtdO3RoaXMuY2M9e307dGhpcy5zdD0yMDA7dGhpcy5CZj10aGlzLkNmPXRoaXMuamU9dGhpcy5BZj10aGlzLlplPSExO3RoaXMudmQ9e319Yy5kaz1iO2IucHJvdG90eXBlPXtvdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9CmF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sJGg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk91KCk7ZS52KGsuSG4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sS2U6ZnVuY3Rpb24oYSxiLGMsZil7dGhpcy51Yj1jO3ZhciBnPSExO2YmJmYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihnPSEwKTtpZih0aGlzLkwuVil0aGlzLmxmKyssZS5vYigibmV3U21hbGxBZElkIiksdGhpcy5MLmNwKCksZj1tLmdldENvbmZpZygpLHRoaXMuTC5VYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy4kaCgpLG5ldyBTKHRoaXMsYSx0aGlzLmxoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLApiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubGMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy4kaCgpLG5ldyBTKHRoaXMsYSx0aGlzLmxoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5MLmxjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Zi5RYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUmEoKTtlbHNle3ZhciB0Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0Yy5LZShhLGIsYyl9LDUwKX19LFZlOmZ1bmN0aW9uKGEpe2EuJGEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO3RoaXMuUGQ9dGhpcy5PYj10aGlzLmtkPSExO3RoaXMuYz1hO3RoaXMuQ3UodGhpcy5jKTt0aGlzLnZkPW5ldyBRYSh0aGlzLmMuUXYsdGhpcy52aWRlbyx7fSk7dGhpcy5MZyhhKTt0aGlzLnJjPXRoaXMuQ2coYSk7dGhpcy5rcCgpfSxMZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5GZD10aGlzLktxKGEpKSx0aGlzLkxnKGEucGFyZW50KSl9LENnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5DZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLnVxKGEpKSk7cmV0dXJuIGN9LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5VJiZhLlUuZ2V0QXR0cmlidXRlKXtiPWEuVS5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sS3E6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0iIjtpZihhLlUpe2I9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Zj1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLmtiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuJGEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYj0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGI9YS5lcnJvci5kZXRhaWwuY29kZSksYS5nZCYmYS5nZC5lcnJvciYmYS5nZC5lcnJvci5jb2RlJiYoYj1hLmdkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuUGMuY29kZTpiPT1HLldkLmNvZGU/ZS52KGsua3csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTooZS5MZSgpLGI9PUcuSmYuY29kZSYmZS52KGsuRHMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk7ZS52KGsuYnEsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSk7dGhpcy5QdSgpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS52KGsuUHYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5LZi5jb2RlOmUudihrLm93LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LlhkLmNvZGU6ZS52KGsudHcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy5UZC5jb2RlOmUudihrLkVzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5TZC5jb2RlOmUudihrLkx2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVtbXlhZCIpO2JyZWFrOwpjYXNlIHcuRGYuY29kZTplLnYoay5Ndix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5QYS5sZW5ndGg7KXRyeXt2YXIgYz1hLlBhLnBvcCgpO3RoaXMuSmUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LEN1OmZ1bmN0aW9uKGEpe3RoaXMub2U9ITE7dGhpcy5QYj10aGlzLmIuSzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5QYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTtpZihjJiZjLmVudnZhcnMpdHJ5e2I9Yy5lbnZ2YXJzKCkudmlkZW9TbG90LAp0aGlzLlplPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuS3g9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiZiLnNldEF0dHJpYnV0ZShnLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2ddKTt0aGlzLlJuJiZ0aGlzLnBsYXllci51ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIudWUoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuTy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5PW2NdLnR5cGUpJiYKdGhpcy5MbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuWmUmJmIubG9hZCgpO2lmKHRoaXMuV2goYikpe3RoaXMuTmgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuUG4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLlplP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2goayl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5ucCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSx0aGlzLkF1KCkpOnRoaXMuYy5vcmlnaW4udGcody5UZCl9LEF1OmZ1bmN0aW9uKCl7dGhpcy5BZj0hMDt0aGlzLnJiPXRoaXMubWM9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5sZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMucmI9ITApO2UubmUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4udmEmJmUuUW4odGhpcy5jLm9yaWdpbi52YSk7dGhpcy5OaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9RS5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi52aCgpO3RoaXMuYi5qZigpO2ZvcihhPXRoaXMuYi5LO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpOwphLnBhcmVudHx8dGhpcy5iLmpmKCk7dGhpcy50YT10aGlzLlBiPXRoaXMuYi5LO3RoaXMuZ2koInZwYWlkIik7aWYodGhpcy5yYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLktiKCJtdXRlZCIsImNvbnRlbnQiKTtlLnYoay50ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfXRoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLAoiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYy5OcSgpLGM9dGhpcy5jLkIuT3JpZ2luYWxBZFBhcmFtZXRlcnMsZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5jZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuTCk7dGhpcy5ILnNyYz1hO2UuZ2UoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYi5mLkFhJiYhdGhpcy5HZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsueWMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmIuJGIoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMucmM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdihhKTsKaWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5adigpLHRoaXMuYi4kYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuUGQ9ITA7ZS52KGsuamksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuRmUodGhpcy5PYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLiRiKCEwKSx0aGlzLmN3KCkpOyJBZFZpZGVvU3RhcnQiPT0KYS5kYXRhLm5hbWUmJih0aGlzLmIuJGIoITApLHRoaXMuZ3coKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZXcoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuZncoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5odygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5kdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5saSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5VYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5rZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXt0aGlzLkwuWmMmJihhPSJfYmxhbmsiKTt2YXIgYj13aW5kb3cub3BlbigiIiwKYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJ3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLnYoay5iZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiR2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5DZiYmKHRoaXMuQmY9ITEsdGhpcy5lYygpKSx0aGlzLmF3KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMucmI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLAohMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMucmI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGUudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfX0uYmluZCh0aGlzKSk7ZS5nZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTtlLmdlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7dGhpcy5iLiRmKGZ1bmN0aW9uKGEpe2UubWEodGhpcy5ILCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sJHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTsKdGhpcy50cmFjaygicGF1c2UiKTtlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5tYz0hMH0sYXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubWM9ITF9LGN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuV2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sWnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7CnRoaXMuT2goKTtlLnYoay5TZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxndzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxldzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLmtkPSEwO3RoaXMuWWEoImZpcnN0UXVhcnRpbGUiKTtlLnYoay5QZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxmdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5ZYSgibWlkcG9pbnQiKTtlLnYoay5VZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxodzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIik7ZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSl9LGR3OmZ1bmN0aW9uKCl7dGhpcy53ZigpO3RoaXMuWWEoImNvbXBsZXRlIil9LGxpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2UubmUoKTt0aGlzLkg9ITE7dGhpcy5SYShhKX19LFl2OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2c7IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGIubWF0Y2goYykpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLnYoay5pdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubGkoITApfSwKTG46ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7aWYoYi5VYSYmYi5pc0VuYWJsZWQmJiFiLkZjKCkpe3ZhciBkPWIuemEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWMoYix0aGlzLkwpO2Yub25lcnJvcj10aGlzLlZ2LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGMoYix0aGlzLkwpKX0sV2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFBuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmhpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKdGhpcy5paS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLndmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMueGYuYmluZCh0aGlzKSl9LEFkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmhpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmlpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy54Zi5iaW5kKHRoaXMpKX0saGk6ZnVuY3Rpb24oYSl7dGhpcy5WYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZifHx0aGlzLnlmKGEpfS5iaW5kKHRoaXMpLAp0aGlzLkdvKSl9LHlmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlljJiZ0aGlzLldoKHRoaXMudmlkZW8pJiYhdGhpcy5GYiYmIXRoaXMuVmIpe3RoaXMuWWM9ITA7dHJ5e2lmKCFlLlZhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkZifHwodGhpcy5GYj0hMCx0aGlzLkFkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5aYSgpLCEwKSx0aGlzLkwuc2d8fHRoaXMuTC5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLlJhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5aYSgpLCEwKX10aGlzLlN2KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIuamYoKTt0aGlzLlJ2KCk7dGhpcy5naSgpO3RoaXMuZGcoKTt0aGlzLmIudmgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMubWYoKX19LG1mOmZ1bmN0aW9uKCl7dGhpcy5lZHx8CnRoaXMuUWYoKX0sUWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy52aWRlby5wbGF5KCk7aWYoYiYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5lZHx8KGE/dGhpcy5SYSgpOih0aGlzLlBlKCEwKSx0aGlzLlFmKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmRjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmRjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5lZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubWYoKSl9LmJpbmQodGhpcyk7dGhpcy53ZSgpLkpoKHRoaXMpfSx3ZjpmdW5jdGlvbigpe3RoaXMuTC5qYiYmIXRoaXMuRmImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwKITApLHRoaXMuWWEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS52KGsuRm4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlJhKCl9LEluOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPSExLGY9MDtmPGEubGVuZ3RoO2YrKyljPWUuR2coYVtmXSksYi5wdXNoKGMpO2E9e2hhc2hlczpifTthPWsuVGEoYSx0aGlzLkEoKSk7ZS5NdShhKX0sUmE6ZnVuY3Rpb24oYSl7dGhpcy5jJiZ0aGlzLmMuUWQmJnRoaXMuSW4odGhpcy5jLlFkKTtpZighdGhpcy5vZSlpZih0aGlzLm9lPSEwLHRoaXMuUGR8fChlLnYoay5Icyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy50Ynx8dGhpcy5jLnBjKXtlLm9iKCJuZXdTbWFsbEFkSWQiKTt0aGlzLmxmKys7dGhpcy5WYj10aGlzLlljPSExO3RyeXt0aGlzLkFkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuRWQ9ITE7dHJ5e3RoaXMuYi5kaSgpfWNhdGNoKGcpe310aGlzLkdkPSEwO3RoaXMuYi5BZSgpO3RoaXMuYWM9ITE7dGhpcy53ZSgpLkVoKCk7dGhpcy5jLnRiJiZ0aGlzLmMub3JpZ2luLlFlKCk7dGhpcy5jLnBjJiYoYT90aGlzLmMub3JpZ2luLnBoKCk6dGhpcy5wZSgpKX1lbHNlIHRoaXMucGUoKX0sVnY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5BZCh0aGlzLnZpZGVvKSx0aGlzLnhmKGEpKX0seGY6ZnVuY3Rpb24oYSl7dGhpcy5WYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkwuYXAoKTsKdGhpcy5jLm9yaWdpbi50Zyh3LlRkKX0saWk6ZnVuY3Rpb24oKXtpZih0aGlzLnB2KXRoaXMuUmEoKTtlbHNle3RoaXMuYWM9ITA7dGhpcy5iLmYuQWEmJiF0aGlzLkdkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay55Yyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5zdihhKTtpZighdGhpcy5PYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5QZD0hMDtlLnYoay5qaSx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuRmUodGhpcy5PYil9Yz0iIjt0aGlzLmMua2YmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWgpKSYmKGM9dGhpcy5jLmtmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkVkfHwodGhpcy5FZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5XZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuYy50Yj8odGhpcy5WYj10aGlzLlljPSExLHRoaXMuQWQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuRWQ9ITEsdGhpcy5iLmRpKCksdGhpcy5jLm9yaWdpbi5RZSgpKTp0aGlzLlJhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLldjLnJlcGxhY2UoIlt0aW1lXSIsZS5CZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmVlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxhaTpmdW5jdGlvbigpe3RoaXMudWh8fCh0aGlzLnVoPSEwLHRoaXMua2R8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxzdjpmdW5jdGlvbihhKXtlLnYoay5iZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2E9PXRoaXMuYml8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmFpKCl9LmJpbmQodGhpcykpLHRoaXMuRmJ8fHRoaXMuT2goKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuTC5qYiYmdGhpcy5ZYSgic3RhcnQiKSxlLnYoay5TZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLGUudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMua2Q9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLnYoay5QZix0aGlzLmMuQiwKdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5ZYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5VZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksdGhpcy5iaT1hKX0sTmg6ZnVuY3Rpb24oYSxiKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iK2EsYiwhMCl9LE91OmZ1bmN0aW9uKCl7ZS5LZChbInN0YXRzX2hkX2FkX2NhbGw6IisKdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sT2g6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFB1OmZ1bmN0aW9uKCl7ZS5LZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFhhOmZ1bmN0aW9uKGEpe2UuS2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWWE6ZnVuY3Rpb24oYSl7KHRoaXMuQWZ8fHRoaXMuTC5qYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLlphKCksITApfSxLYjpmdW5jdGlvbihhLGIpe3RoaXMuTC5qYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkZiKXt0aGlzLnZkJiZ0aGlzLnZkLnRyYWNrJiZ0aGlzLnZkLnRyYWNrKGEpO2lmKCJtdXRlIj09CmF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5McSh0aGlzLmMuUGEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmplPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuRmQuaW1wcmVzc2lvbnMmJmUuRnIoZy51cmwsdGhpcy5GZC5pbXByZXNzaW9ucyk/dGhpcy5KZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuR24sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHthZElkOnRoaXMuRmQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkplKGcudXJsLGcudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmMuUGE9CnRoaXMudnAodGhpcy5jLlBhLGEpfWNhdGNoKG0pe319fSxaYTpmdW5jdGlvbigpe3ZhciBhPWUuVmEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLkFmJiYoYj0iX3ZwYWlkIik7dGhpcy5DZiYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxKZTpmdW5jdGlvbihhLGIsYyxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxjJiZiLktuKGMpLGZ8fChmPXRoaXMucmcpLGV8fChlPXRoaXMucmcpLHRoaXMuTW4oYSksdGhpcy5MLkRhKGIsZnVuY3Rpb24oKXt0aGlzLkRoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LE1uOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09Im9wZW4ifSxEaDpmdW5jdGlvbihhKXt0aGlzLmNjW2FdPSJjbG9zZWQifSxrcDpmdW5jdGlvbigpe3RoaXMuY2M9e319LFJ1OmZ1bmN0aW9uKCl7dmFyIGE9MCxiO2ZvcihiIGluIHRoaXMuY2MpdGhpcy5jYy5oYXNPd25Qcm9wZXJ0eShiKSYmCiJvcGVuIj09dGhpcy5jY1tiXSYmYSsrO3JldHVybiBhfSxMcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHZwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFN2OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Udi5iaW5kKHRoaXMpKX0sVHY6ZnVuY3Rpb24oKXtlLlZhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmVjKCk6dGhpcy5jLlViJiYoZS52KGsua2csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLlpjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPQp3aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5VYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuVWIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxSdjpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0KIiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5XYy5yZXBsYWNlKCJbdGltZV0iLGUuQmcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC4kYyYmKGI9dGhpcy5MLiRjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC4kYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sQ2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC4kYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYKKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxnaTpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMucnA7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuR2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWGguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkViO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ydi5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnF2LmJpbmQodGhpcykpOwpnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLk1oO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9CjEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLmtmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlZhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0KImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5CYT10aGlzLnRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi4kZihmdW5jdGlvbihhKXt0aGlzLkJhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5QZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGVjOmZ1bmN0aW9uKCl7dGhpcy5CYSYmImJsb2NrIj09dGhpcy5CYS5zdHlsZS5kaXNwbGF5fHx0aGlzLkJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxYaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuJGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxZaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMubWM/KGUubWEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLm1jPSExKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLm1jPSEwKX0sd2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuJGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEdoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKSl9LHF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxydjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMucmI/KGUubWEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGUudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSx4djpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsudGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGRjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmRjKTt0aGlzLmVkfHx0aGlzLmVlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5tZigpKX0scGU6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUuaGQoKTshdGhpcy5MLmxjfHxlLlZhKCl8fCFjLmlzQ2hyb21lJiYhYy5pc0ZpcmVmb3h8fGMuaXNFZGdlfHwKIShhfHwhdGhpcy5qZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy5zaHx8IXRoaXMuTC5SYyYmInNwaWVnZWwuZGUiIT1lLlpiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwicHJlcm9sbCIhPWUuQ2I/KHRoaXMuZWQ9ITAsdGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy5tZygpKToodGhpcy5zaD10aGlzLkNmPXRoaXMuQmY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5qZT0hMCxhPWUuY2coYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuS2UoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LG1nOmZ1bmN0aW9uKGEpe3RoaXMuUnUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCEwKX0uYmluZCh0aGlzKSx0aGlzLnN0KToodGhpcy5HZD0hMCx0aGlzLmIuQWUoKSx0aGlzLmIuY3UoKSx0aGlzLmFjPSExLAplLnYoay5xcCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMud2UoKS5FaCgpKX0sd2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sZGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZS5FZSh0aGlzLnZpZGVvLGEpP3RoaXMuR2goKTp0aGlzLndkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5yYyYmMDx0aGlzLnJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5yYykpO3RoaXMudmlkZW8mJgp0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuT28rIi0iK3RoaXMubGY7dGhpcy5jJiZ0aGlzLmMuSGcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkhnKCkpO3JldHVybiBhfSxyZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuZGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRqPXRoaXMuYVs0XTt0aGlzLlhzPXRoaXMuYVs3XTt0aGlzLlJtPXRoaXMuYVs5XTt0aGlzLk9yPXRoaXMuYVsxMF07dGhpcy5zbz10aGlzLmFbM107dGhpcy52aj10aGlzLmFbMV07dGhpcy5Ddj10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOF07dGhpcy5ubD10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX0KYy50bz1iO2IucHJvdG90eXBlPXtDajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRGo6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhzOnRoaXMuUW0oYSl9LFFtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5SbTp0aGlzLk5yKGEpfSxOcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuT3I6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNvOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52ajp0aGlzLkJ2KGEpfSxCdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ3Y6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmd0OnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qbDp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy50b3x8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuQ2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnFjPXRoaXMuc2M9ITE7dGhpcy52YT0iIjt0aGlzLnpmPSExO3RoaXMuU2c9IiI7ZCYmZC5lbXB0eT90aGlzLm5zKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRm09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuaGQoKSxiO2I9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKdmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLm9nKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8CiJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkhkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLkRhKGIsdGhpcy5tcy5iaW5kKHRoaXMpLAp0aGlzLmpzLmJpbmQodGhpcykpfSxEZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5LcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5XdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxLcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmCmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LG1zOmZ1bmN0aW9uKGEpe3RoaXMuTXQoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpOwp0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlNnPWEucmVzcG9uc2VVUkw7dGhpcy5ZLmxlbmd0aD90aGlzLkljKCk6dGhpcy5zYSh0aGlzLlNhKHcuUGMse2Vycm9yOnRoaXMuemY/Ry5XZDpHLklmfSkpfSxuczpmdW5jdGlvbihhKXt0cnl7dGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpO3RoaXMucWM9dGhpcy5UaCgpO3RoaXMuWS5sZW5ndGg/dGhpcy5JYygpOnRoaXMuc2EodGhpcy5TYSh3LlBjLHtlcnJvcjp0aGlzLnpmP0cuV2Q6Ry5JZn0pKX0sanM6ZnVuY3Rpb24oKXt0aGlzLnNhKHRoaXMuU2Eody5IZix7ZGVwdGg6YX0pKX0sSWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5NcigpP3RoaXMuZnYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5NZygpLGgse0FkU3lzdGVtOnRoaXMudHEoKSwKdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMuc2EodGhpcy5TYSh3LktmKSk6KGE9MCx0aGlzLkp2KCkmJnRoaXMuVmUodGhpcy5zcCgpKSl9LFFlOmZ1bmN0aW9uKCl7dGhpcy5zYz8odGhpcy5zYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5RZSgpfSxwaDpmdW5jdGlvbigpe3RoaXMucWM/KHRoaXMucWM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSWMoKSk6dGhpcy5wYXJlbnQucGgoKX0sSnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdigpP3RoaXMuYnYoKT8hMDooLTEhPXRoaXMuQ2MoKT90aGlzLnNhKHRoaXMuU2Eody5TZCkpOnRoaXMuc2EodGhpcy5TYSh3LkRmKSksITEpOih0aGlzLnNhKHRoaXMuU2Eody5QYyxHLkpmKSksITEpfSxWZTpmdW5jdGlvbihhKXt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5RZHx8KGEuUWQ9W10pO2EuUWQucHVzaCh0aGlzLlNnKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuTWUoKSk7CmEudGI9YS50Yj9hLnRiOnRoaXMuc2M7YS5wYz1hLnBjP2EucGM6dGhpcy5xYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7dGhpcy5wYXJlbnQuVmUoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLmR1cmF0aW9uPXRoaXMuQ2MoKTthLk89dGhpcy5KZygpO2EuVWI9dGhpcy52cSgpO2EuUXY9W107YS5vcmlnaW49dGhpczthLkI9dGhpcy5zcSgpO2Eua2Y9dGhpcy5KcShhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7cmV0dXJuIGF9LHNhOmZ1bmN0aW9uKGIpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPQp3LlNkLmNvZGU/Yi5QYS5jb25jYXQodGhpcy53cSgpKTpiLlBhLmNvbmNhdCh0aGlzLkVxKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuV2ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5zYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnNhJiZ0aGlzLnBhcmVudC5zYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sdGc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sZnY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxjdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuSmcoKS5sZW5ndGh9LGJ2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5DYygpfSxwZjpmdW5jdGlvbigpe3JldHVybiAxPAp0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxUaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMucGYoKSYmKGE9ITApO3JldHVybiBhfSxNdDpmdW5jdGlvbihhKXt0aGlzLnZhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy52YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuemY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sTXI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLk1nKCkubGVuZ3RofSxNZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LHRxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmUodGhpcy5VLAoiQWRTeXN0ZW0iKX0sTWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy4kZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5rYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LCRnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuJGcoYS5wYXJlbnROb2RlKTohMX0sRXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT0KYS50eXBlfSl9LHdxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx2cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxKZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxseDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5rYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8CjFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sc3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5uZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9CmJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LENjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxKcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkZ1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sdmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD8KdGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0seWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkZtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFyPXRoaXMuYVs2XTt0aGlzLmZvPXRoaXMuYVs2XTt0aGlzLnp3PXRoaXMuYVs5XTt0aGlzLktvPXRoaXMuYVsxMF07dGhpcy5kcz10aGlzLmFbMTBdO3RoaXMuRXA9dGhpcy5hWzVdO3RoaXMuR3A9dGhpcy5hWzZdO3RoaXMuc2o9CnRoaXMuYVsyXTt0aGlzLmNvPXRoaXMuYVs2XTt0aGlzLnFvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLkNwPWI7Yi5wcm90b3R5cGU9e3ByOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5xcjp0aGlzLmVvKGEpfSxlbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZm86dGhpcy55dyhhKX0seXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnp3OnRoaXMuSm8oYSl9LEpvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Lbzp0aGlzLmNzKGEpfSxjczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZHM6dGhpcy5EcChhKX0sRHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkVwOnRoaXMuRnAoYSl9LEZwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HcDp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNqOnRoaXMuYm8oYSl9LGJvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5jbzp0aGlzLnBvKGEpfSxwbzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnFvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5DcHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkI9dGhpcy5wYz10aGlzLnRiPSExO3RoaXMuQmU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkNlPSIifWMuUmw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sQ3E6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkdhKXt2YXIgYT10aGlzLm9yaWdpbi5HYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5CZT1hW2NdKX1yZXR1cm4gdGhpcy5CZX0sSGc6ZnVuY3Rpb24oKXtpZih0aGlzLkNlKXJldHVybiB0aGlzLkNlO3ZhciBhPSIiOyhhPXRoaXMuQ3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkNlPWF9LE5xOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5SbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2k9dGhpcy5hWzFdO3RoaXMuWW09dGhpcy5hWzldO3RoaXMuVnA9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNF19Yy5wdD1iO2IucHJvdG90eXBlPXtGaTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkdpOnRoaXMuWG0oYSl9LFhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ZbTp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLnB0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5GaSg0KTt2YXIgdz17WGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LERmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxQYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCk9hOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApPYToiTE9BRF9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LE53Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxTZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17SWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sT3c6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT209dGhpcy5hWzEwXTt0aGlzLm53PXRoaXMuYVsyXTt0aGlzLnJrPXRoaXMuYVs0XTt0aGlzLkFrPXRoaXMuYVs2XTt0aGlzLlVuPXRoaXMuYVs4XTt0aGlzLlVyPXRoaXMuYVsyXTt0aGlzLlFqPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzVdfWMuUms9YjtiLnByb3RvdHlwZT17Tm06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk9tOnRoaXMubHcoYSl9LGx3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5udzp0aGlzLnFrKGEpfSxxazpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnJrOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Bazp0aGlzLlRuKGEpfSxUbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVW46dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVyOnRoaXMuUGooYSl9LFBqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Rajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuUmt8fFhhLEljPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLk5tKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuZ2Q9Yjt0aGlzLlBhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5Faj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuRWp8fFVhO2M9CmN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5obD10aGlzLmFbNl07dGhpcy5tdD10aGlzLmFbMl07dGhpcy5MdD10aGlzLmFbN107dGhpcy5ndT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy5Hcz1iO2IucHJvdG90eXBlPXtnbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaGw6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm10OnRoaXMuS3QoYSl9LEt0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5MdDp0aGlzLmZ1KGEpfSxmdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZ3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLkdzfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZ2woNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLkZoPWE7dGhpcy52aWRlbz1iO3RoaXMuTmQ9W107dGhpcy5DaD1bXTt0aGlzLlJlPVtdO3RoaXMuVXY9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlhrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuRmgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5GaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LApnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2cuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgaz1nLmNvbnRlbnRXaW5kb3c7ay5HeD17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy4kdC5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5SdC5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuTmQucHVzaCh7c3JjOmMsZnJhbWU6Zyx0dDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LAp0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuUmUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5SZVtiXTtjLnR5cGU9PT1hJiZjLlZvKHRoaXMueHEoYSkpfX0seHE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7UHg6ITAsT3g6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7Q3g6InZpZGVvIixSeDoianNDdXN0b20iLFN4OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsVHg6MSxteDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLAphZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxNcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuTmQubGVuZ3RoO2IrKylpZih0aGlzLk5kW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuTmRbYl0udHQ7cmV0dXJuIiJ9LCR0OmZ1bmN0aW9uKGEsYil7dGhpcy5DaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5NcShiKSx2ZW5kb3I6Yn0pO3RoaXMuTnUoKX0sUnQ6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLlV2Lm1hcChmdW5jdGlvbihhKXt0aGlzLmFnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYWcoYSxiKX0sYWc6ZnVuY3Rpb24oYSxiKXt0aGlzLlJlLnB1c2goe3R5cGU6YSxWbzpiLE14OiExfSl9LE51OmZ1bmN0aW9uKCl7dGhpcy5DaC5tYXAoZnVuY3Rpb24oYSl7YS5Jcnx8CihhLkZ4KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5ReCxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuSXI9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWGt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhpPXRoaXMuYVs1XTt0aGlzLllpPXRoaXMuYVsxXTt0aGlzLlJwPXRoaXMuYVs1XTt0aGlzLkhrPXRoaXMuYVs1XTt0aGlzLmF0PXRoaXMuYVs4XTt0aGlzLml1PXRoaXMuYVszXTt0aGlzLm5rPXRoaXMuYVs0XTt0aGlzLiRxPXRoaXMuYVszXTt0aGlzLmZsPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy5pcj1iO2IucHJvdG90eXBlPXt3aTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueGk6dGhpcy5YaShhKX0sClhpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZaTp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUnA6dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhrOnRoaXMuJHMoYSl9LCRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaXU6dGhpcy5tayhhKX0sbWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5rOnRoaXMuWnEoYSl9LFpxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kcTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmlyfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2Mud2koNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5pYj1hLkVnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuYmc9ITE7dGhpcy5UYj1bXX1jLm9qPWI7Yi5wcm90b3R5cGU9e3JxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZT0wLGI9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUsCnk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnJxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5hcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmCihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sVXU6ZnVuY3Rpb24oKXt0aGlzLmJnPSEwfSxkaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sdmg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay55Yyx0aGlzLmYucygpKX0sY3U6ZnVuY3Rpb24oKXt0aGlzLmJnfHwodGhpcy5mLnBsYXkoKSxlLnYoay5kZCx0aGlzLmYucygpKSl9LGpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9CiJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5pYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuaWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5pYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmliLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaWIpO3RoaXMuZi5MYyYmdGhpcy5mLkxjKCk/dGhpcy5mLkVnKCkuYXBwZW5kQ2hpbGQodGhpcy5LKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy4kYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sCmFyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxqcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LCRiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuanEodGhpcy5pYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmCjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQWUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLkxjKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLksuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5UYi5sZW5ndGg7YSsrKXRoaXMuVGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5QaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLiRiLmJpbmQodGhpcyksMTApfSwkZjpmdW5jdGlvbihhKXt0aGlzLlRifHwKKHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEFlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMub2p8fCRhLEU9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuYWEoMTApO04uY29udHJvbHM9ITA7RS5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCkEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1vPXRoaXMuYVsyXTt0aGlzLmRqPXRoaXMuYVs5XTt0aGlzLkR3PXRoaXMuYVs3XTt0aGlzLmpqPXRoaXMuYVsyXTt0aGlzLkNpPXRoaXMuYVs1XTt0aGlzLlZzPXRoaXMuYVszXTt0aGlzLnBsPXRoaXMuYVs3XTt0aGlzLmJzPXRoaXMuYVsyXTt0aGlzLnZ3PXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuRW09YjtiLnByb3RvdHlwZT17bG86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1vOnRoaXMuY2ooYSl9LGNqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kajp0aGlzLkN3KGEpfSxDdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRHc6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmpqOnRoaXMuQmkoYSl9LEJpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DaTp0aGlzLlVzKGEpfSwKVXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZzOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wbDp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYnM6dGhpcy51dyhhKX0sdXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnZ3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5FbXx8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMubG8oNCk7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLAphPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5CZChiKTt0aGlzLnBnKCl9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LApEZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5DbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuQmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7dGhpcy5TYj10aGlzLlNifHwhMTt0aGlzLlRmPXRoaXMuVmY9dGhpcy5XZz10aGlzLmVhPXRoaXMuc2Y9CiExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuaHEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnNmPSEwO3RoaXMuV2cmJnRoaXMuamcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLmFjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuYmQoKTt0aGlzLldnPSEwO3RoaXMuamcoKX0uYmluZCh0aGlzKSk7dGhpcy5mZygpfSwKamc6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5iZCgpO2lmKCF0aGlzLnNmJiYhdGhpcy5iZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuc2YmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0sYmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLktnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LEtnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGZnOmZ1bmN0aW9uKCl7aWYodGhpcy5iZCgpKXt2YXIgYj10aGlzLktnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdOwp0aGlzLlZmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9Yi5qeH10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LG54OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkF4KCk6ITF9LENjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5DYygpOi0xfSxGcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxocTpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy51KCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwKMTAwKX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5EZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkZxKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuQmx8fGRiOyhmdW5jdGlvbihjKXtjLkRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sSnI6ZnVuY3Rpb24oKXt3aW5kb3cuT08uWGwudm4udG4/d2luZG93Lk9PLlhsLnZuLnRuLmh4KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpyKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9CmRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnhlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMuRGx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaz10aGlzLmFbOV07dGhpcy55az10aGlzLmFbN107dGhpcy5haz10aGlzLmFbMTBdO3RoaXMuZmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5Pcz1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRms6CnRoaXMueGsoYSl9LHhrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy55azp0aGlzLiRqKGEpfSwkajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYWs6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5Pc3x8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuRWsoNCk7KGZ1bmN0aW9uKGMpe2MuU2k9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMTt0aGlzLk5nKCl9LE5nOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTsKYnx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sCk5hOmZ1bmN0aW9uKCl7dGhpcy55aCgpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuU2l8fGhiOyhmdW5jdGlvbihjKXtjLlJpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMucmEoKTp0aGlzLm0oKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmdnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2coYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGliPWMuUml8fGliOyhmdW5jdGlvbihjKXtjLlRpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sQmg6ZnVuY3Rpb24oYil7Yj1uZXcgaGIoYik7Yi5uYT90aGlzLlQoKTp0aGlzLk4oYil8fAooYi5CZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5pcXx8KHRoaXMuaXE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkJoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5CaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGpiPWMuVGl8fGpiLFQ9bmV3IGpiKHIpO1QuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy55bT10aGlzLmFbMl07dGhpcy5jcj10aGlzLmFbMl07dGhpcy56dj10aGlzLmFbNF07dGhpcy5Haj10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLmxsPWI7Yi5wcm90b3R5cGU9e3htOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy55bTp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3I6dGhpcy55dihhKX0seXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnp2OnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR2o6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5sbHx8a2IsTmM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMueG0oNCk7KGZ1bmN0aW9uKGMpe2Mubm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sTGM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ubXx8VTsoZnVuY3Rpb24oYyl7Yy5tbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlZjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eC5WYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLk1zKGEpfS5iaW5kKHRoaXMpKTt4LlZjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3guVmMoIiMiK2IsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTsKeC5UcSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufX10aGlzLnUoImFkZXJyb3IiLGEpO3RoaXMuRygpfX0pfSkoYyk7dmFyIFY9Yy5tbXx8VjsoZnVuY3Rpb24oYyl7Yy5vbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMudWQmJihiPWUud3AoYix0aGlzLnVkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5SKGQpO3ZhciBmPW5ldyBWKGQsdGhpcy5JKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy51ZHx8KHRoaXMudWQ9W10pLHRoaXMudWQucHVzaChiW2FdKSxkPW5ldyBVKGcpLHRoaXMuTihkKXx8KHRoaXMuUihkKSxmPW5ldyBWKGQsdGhpcy5JKSwKZi5nKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxWYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSxndjpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmRhfHx0aGlzLmRhJiYhdGhpcy5kYVthXSl0aGlzLkhjfHwodGhpcy5IYz1bXSksdGhpcy5IYy5wdXNoKGIpLHRoaXMuYnUoKSYmKHRoaXMuYmYoKSx0aGlzLmcoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5kYVthXVtjXSYmMDx0aGlzLmRhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuZGFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmRhW2FdW2NdW2RdKGIpfX0sVHE6ZnVuY3Rpb24oKXtpZih0aGlzLkhjKWZvcih2YXIgYj0KMDtiPHRoaXMuSGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5IY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmRhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5kYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnguZ3YoYil9fSl9KShjKTt2YXIgbGI9Yy5vbXx8bGIseD1uZXcgbGIocik7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ocj10aGlzLmFbOF07dGhpcy5vdD10aGlzLmFbOV07CnRoaXMuWHA9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMuQW49YjtiLnByb3RvdHlwZT17Z3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ocjp0aGlzLm50KGEpfSxudDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub3Q6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5Bbnx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuZ3IoNCk7KGZ1bmN0aW9uKGMpe2MuT2k9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7CnZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLk9pfHxuYjsoZnVuY3Rpb24oYyl7Yy5QaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTsKdmFyIG9iPWMuUGl8fG9iOyhmdW5jdGlvbihjKXtjLlFpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkkpKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuUWl8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy56cj10aGlzLmFbMl07dGhpcy5ObD10aGlzLmFbN107dGhpcy5Ucz10aGlzLmFbMV07dGhpcy5qcD10aGlzLmFbM107dGhpcy5Xbj10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsyXX1jLmptPWI7Yi5wcm90b3R5cGU9e3lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cjp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTmw6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRzOnRoaXMuaXAoYSl9LGlwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qcDp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlduOnRoaXMuaShhKX0sCmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIHJiPWMuam18fHJiLFBjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLnlyKDQpOyhmdW5jdGlvbihjKXtjLnJsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5XKGIpO3RoaXMuWihhKTt0aGlzLlF0KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LApwbGF5OmZ1bmN0aW9uKCl7fSxRdDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnBhdXNlJiZ0aGlzLmphLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnJlc3VtZSYmdGhpcy5qYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEubXV0ZSYmdGhpcy5qYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LApmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS51bm11dGUmJnRoaXMuamEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxYZzpmdW5jdGlvbihiKXt0aGlzLmphPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBzYj1jLnJsfHxzYjsoZnVuY3Rpb24oYyl7Yy5xbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubWk9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMubWkmJih0aGlzLkcoKSx0aGlzLm1pPSEwLHRoaXMub2EoKSk7YS5LYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgdGI9Yy5xbHx8dGI7KGZ1bmN0aW9uKGMpe2Muc2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZzpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYj1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgc2IoYltkXSksdGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgdGIoYyx0aGlzLkkpKS5nKCkpfX1lbHNlIHRoaXMuVCgpfX0pfSkoYyk7dmFyIHViPWMuc2x8fHViLFc9bmV3IHViKHIpO1cuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRvPXRoaXMuYVs0XTt0aGlzLnVsPXRoaXMuYVs2XTt0aGlzLmxrPXRoaXMuYVs4XTt0aGlzLlNxPXRoaXMuYVsxMF07dGhpcy5Uaz10aGlzLmFbN107dGhpcy5Tcj10aGlzLmFbN107dGhpcy5Kcz10aGlzLmFbM107dGhpcy5ucT10aGlzLmFbOF07CnRoaXMuc3I9dGhpcy5hWzEwXTt0aGlzLkJ3PXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy52aT1iO2IucHJvdG90eXBlPXtDbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRG86dGhpcy50bChhKX0sdGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVsOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sazp0aGlzLlJxKGEpfSxScTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU3E6dGhpcy5TayhhKX0sU2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRrOnRoaXMuUnIoYSl9LFJyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Tcjp0aGlzLklzKGEpfSxJczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSnM6dGhpcy5tcShhKX0sbXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm5xOnRoaXMucnIoYSl9LHJyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zcjp0aGlzLkF3KGEpfSxBdzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkJ3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy52aXx8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UWMuQ28oNCk7KGZ1bmN0aW9uKGMpe2MuTG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LAp1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlg/KDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgd2I9Yy5MbXx8d2I7KGZ1bmN0aW9uKGMpe2MuS209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLApiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxPdDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuZWJ8fCh0aGlzLmViPVtdKTt0aGlzLmViLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5yYSgpOnRoaXMudSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTsKdGhpcy5DYT90aGlzLk90KHRoaXMuQ2EpOih0aGlzLkNhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5DYSl7dGhpcy5HKCk7cmV0dXJufWlmKCF0aGlzLnRjKXt0aGlzLkcoKTtyZXR1cm59Yj0hMDtpZih0aGlzLmViJiZ0aGlzLmViLmxlbmd0aCYmMTx0aGlzLmViLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuZWIubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuZWJbYV0mJjMwMyE9dGhpcy5lYlthXSYmNDAzIT10aGlzLmViW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5LbXx8eGI7KGZ1bmN0aW9uKGMpe2MuTW09CnQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgd2IoYi5pdGVtKGEpKTt0aGlzLk4oYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLlIoYyksKG5ldyB4YihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgeWI9Yy5NbXx8eWIsemI9bmV3IHliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZvPXRoaXMuYVsyXTt0aGlzLiRyPXRoaXMuYVs2XTt0aGlzLldyPXRoaXMuYVsxMF07dGhpcy5pdj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5QbT1iO2IucHJvdG90eXBlPXtFbzpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLkZvOnRoaXMuWnIoYSl9LFpyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kcjp0aGlzLlZyKGEpfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3I6dGhpcy5odihhKX0saHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLml2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy5QbXx8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMuRW8oNCk7KGZ1bmN0aW9uKGMpe2MuZG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlcoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pOwp0aGlzLldlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5FdCgpfS5iaW5kKHRoaXMpLDUwMCl9LEV0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuV2UmJgp3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLldlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sUXU6ZnVuY3Rpb24oKXt0aGlzLldlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgQmI9Yy5kbXx8QmI7KGZ1bmN0aW9uKGMpe2MuY209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKTt0aGlzLmtjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLnVzPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5rY3x8KHRoaXMua2M9CjAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8Cih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMua2N8fHRoaXMua2MrKyx0aGlzLmtjPD10aGlzLnVzPyh0aGlzLmtjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5RdSgpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLAoxMDApfX0pfSkoYyk7dmFyIENiPWMuY218fENiOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IEJiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsdGhpcy5JKSkuZygpKSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgRGI9Yy5lbXx8RGIsRWI9bmV3IERiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuTHc9CmI7Yi5wcm90b3R5cGU9e2pyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5rcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEZiPWMuTHd8fEZiLFNjPW5ldyBGYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLmpyKDQpOyhmdW5jdGlvbihjKXtjLlpsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMuWmx8fEdiOyhmdW5jdGlvbihjKXtjLllsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5LYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMub3AoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5tZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMuZXMoKTp0aGlzLmlnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksCjFFMyl9LG9wOmZ1bmN0aW9uKCl7dGhpcy5SZigpfHx0aGlzLm0oITApfSxlczpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWQoKTshYi5xYSYmYi5ZJiZiLmd4JiZiLml4JiYodGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSgpKX0saWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZygpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGgpZm9yKHZhciBiPQpsLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5LYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy50aD1iW2NdKTtyZXR1cm4gdGhpcy50aH0sQng6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubWQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5ZbHx8SGI7KGZ1bmN0aW9uKGMpe2MuJGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0KMDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEdiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBIYihjLHRoaXMuSSkpLmcoKSl9cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBJYj1jLiRsfHxJYixKYj1uZXcgSWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueWw9dGhpcy5hWzRdO3RoaXMubXA9dGhpcy5hWzVdO3RoaXMudXY9dGhpcy5hWzEwXTt0aGlzLldpPXRoaXMuYVszXTt0aGlzLktpPXRoaXMuYVszXTt0aGlzLllxPXRoaXMuYVsyXTt0aGlzLmJuPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzEwXX1jLkF2PWI7Yi5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLm1wOnRoaXMudHYoYSl9LHR2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51djp0aGlzLlZpKGEpfSxWaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuV2k6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktpOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ZcTp0aGlzLmFuKGEpfSxhbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLkF2fHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy54bCg0KTsoZnVuY3Rpb24oYyl7Yy5Waz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7CkgmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sCkFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxMYzpmdW5jdGlvbigpe3JldHVybiEwfSxLYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Wa3x8WDsoZnVuY3Rpb24oYyl7Yy5Vaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5YZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhlPQpiLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlhlJiZiIT10aGlzLlhlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuZmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLkh4KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy51KCJhZGVycm9yIiksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFk9Yy5Va3x8WTsoZnVuY3Rpb24oYyl7Yy5Xaz0KdC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWChiKSxiLm5hP3RoaXMuYmYoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksCmIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuV2t8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWk9dGhpcy5hWzddO3RoaXMuV209dGhpcy5hWzRdO3RoaXMuem49dGhpcy5hWzZdO3RoaXMuTm89dGhpcy5hWzddO3RoaXMuSXc9dGhpcy5hWzFdO3RoaXMua289dGhpcy5hWzhdO3RoaXMubXU9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOV19Yy5KbT1iO2IucHJvdG90eXBlPXtEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRWk6dGhpcy5WbShhKX0sVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldtOnRoaXMueW4oYSl9LHluOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy56bjp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5IdyhhKX0sSHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5Jdzp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmtvOnRoaXMubHUoYSl9LGx1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5tdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLkptfHxOYixVYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5EaSg0KTsoZnVuY3Rpb24oYyl7Yy5Vaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LApudTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sRXg6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgT2I9Yy5Vanx8T2I7KGZ1bmN0aW9uKGMpe2MuVGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGEpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk7Yi5PbigiZmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oInRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5vYSgpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgUGI9Yy5Uanx8UGI7KGZ1bmN0aW9uKGMpe2MuVmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yayYmCndpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycyl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yay5HZXRBbGxQbGF5ZXJzKCk7aWYoYiYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX19dGhpcy5UKCl9fSl9KShjKTt2YXIgUWI9Yy5Wanx8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklwPXRoaXMuYVs3XTt0aGlzLm5uPXRoaXMuYVs5XTt0aGlzLmJtPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzFdfWMuUnM9YjtiLnByb3RvdHlwZT17SHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JcDp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLm5uOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLlJzfHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5IcCg0KTsoZnVuY3Rpb24oYyl7Yy5kbj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSwKTGQ6ZnVuY3Rpb24oYil7dmFyIGE9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LFB0OmZ1bmN0aW9uKCl7dGhpcy5SZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuTGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUmR8fCh0aGlzLlJkPSEwLHRoaXMuTGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LApwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxBYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuZG58fFRiOyhmdW5jdGlvbihjKXtjLmNuPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFR0OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSwKYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWQoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmFkKGEpfS5iaW5kKHRoaXMpKX0sYWQ6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7CmEuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMudSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5tKCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxOZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5hZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTmYuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5UdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLk5mKCk7dGhpcy5TdCgpfSxTdDpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsCnRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuTnQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5OdD0hMH19KX0pKGMpO3ZhciBVYj1jLmNufHxVYjsoZnVuY3Rpb24oYyl7Yy5lbj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLlB0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTsKdmFyIFZiPWMuZW58fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenA9dGhpcy5hWzNdO3RoaXMuemo9dGhpcy5hWzddO3RoaXMuVHA9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMTBdfWMuS2w9YjtiLnByb3RvdHlwZT17eXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpwOnRoaXMueWooYSl9LHlqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56ajp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLktsfHxYYixXYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1XYy55cCg0KTsKKGZ1bmN0aW9uKGMpe2Mudm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy53aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLkJzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxudTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLAphPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQnN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMud2gmJih0aGlzLndoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE89Yy52bXx8TzsoZnVuY3Rpb24oYyl7Yy51bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5EYisrLDE1PHRoaXMuRGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnp1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSwKaGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLnVtfHxQOyhmdW5jdGlvbihjKXtjLndtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuYmYoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLndtfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudGs9CnRoaXMuYVs4XTt0aGlzLm12PXRoaXMuYVs0XTt0aGlzLnhuPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTnM9YjtiLnByb3RvdHlwZT17c2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRrOnRoaXMubHYoYSl9LGx2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tdjp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5Oc3x8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuc2soNCk7KGZ1bmN0aW9uKGMpe2MuS2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpOwp2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5XKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5La3x8WjsoZnVuY3Rpb24oYyl7Yy5Kaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkVjPXRoaXMuQ2E9dGhpcy5YYz0hMTt0aGlzLkFoPWUuSGIoMTApO3RoaXMuYmgoKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiYKYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnFhPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5xYigpLCEwO3RoaXMuVGcrKztpZigxMDx0aGlzLlRnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmguYmluZCh0aGlzKSwxMDApLCExfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT0KYXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITB9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkprfHxhYTsoZnVuY3Rpb24oYyl7Yy5Maz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYKMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLkxrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQm89dGhpcy5hWzhdO3RoaXMuQ249dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMl19Yy5zaT1iO2IucHJvdG90eXBlPXtBbzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkJvOnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGNjPWMuc2l8fGNjLFljPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVljLkFvKDQpOyhmdW5jdGlvbihjKXtjLkxqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBkYz1jLkxqfHxkYzsoZnVuY3Rpb24oYyl7Yy5Laj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5oZygpfSxoZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuS2p8fGVjOyhmdW5jdGlvbihjKXtjLk1qPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmCndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgZGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubmEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7KG5ldyBlYyhiLHRoaXMuSSkpLmcoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGZjPWMuTWp8fGZjLGdjPW5ldyBmYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdz10aGlzLmFbMl07dGhpcy5Zbj10aGlzLmFbOF07dGhpcy5wcT10aGlzLmFbNl07dGhpcy5Caj10aGlzLmFbOF07dGhpcy5Oaz10aGlzLmFbMl07dGhpcy5uaj10aGlzLmFbOF07dGhpcy5pbz10aGlzLmFbM107dGhpcy5ydD10aGlzLmFbOF07dGhpcy5OaT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmt1PWI7Yi5wcm90b3R5cGU9e3J3OmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuc3c6dGhpcy5YbihhKX0sWG46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlluOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5wcTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQmo6dGhpcy5NayhhKX0sTWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk5rOnRoaXMubWooYSl9LG1qOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5uajp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaW86dGhpcy5xdChhKX0scXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnJ0OnRoaXMuTWkoYSl9LE1pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5OaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMua3V8fGhjLFpjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5ydyg0KTsoZnVuY3Rpb24oYyl7Yy5waT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5waXx8aWM7KGZ1bmN0aW9uKGMpe2Mub2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubGUoKTt0aGlzLmVnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmVnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGUuYmluZCh0aGlzKSwxMDApfSxsZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxlLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIGpjPWMub2l8fGpjOyhmdW5jdGlvbihjKXtjLnJpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj0KbmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMucml8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xbT10aGlzLmFbNl07dGhpcy5jaz10aGlzLmFbMV07dGhpcy5acz10aGlzLmFbMTBdO3RoaXMucW49dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5rbD1iOwpiLnByb3RvdHlwZT17cG06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnFtOnRoaXMuYmsoYSl9LGJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5jazp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWnM6dGhpcy5wbihhKX0scG46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5rbHx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMucG0oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZWg9dGhpcy5naD10aGlzLmZoPSExO3RoaXMueGQ9W107dGhpcy5hZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuVGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5HcShhKTpbXSxiO3RoaXMuZ2g9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZmg9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuSGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmFmKXtpZih0aGlzLmVoKWJyZWFrO2I9dGhpcy5hZltjXTt0aGlzLnZmKGIpJiYodGhpcy54ZC5wdXNoKGIpLHRoaXMuSGgoYikpfX0sdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgp0PyEwOiExfSxHcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5hZltjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEhoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSxTdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZmgpZm9yKHRoaXMuZWg9ITAsYT0wO2E8dGhpcy54ZC5sZW5ndGg7YSsrKXRoaXMueGRbYV0uTGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54ZFthXS5MYil9fX0pKGMpO3ZhciBuYz1jLlRsfHxuYyxNPW5ldyBuYztNLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vcj10aGlzLmFbMTBdO3RoaXMuaXQ9dGhpcy5hWzFdO3RoaXMuQXQ9dGhpcy5hWzVdO3RoaXMuR2w9dGhpcy5hWzEwXTsKdGhpcy53cz10aGlzLmFbOV07dGhpcy5Rcz10aGlzLmFbNV07dGhpcy5tcj10aGlzLmFbN107dGhpcy5IdT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs3XX1jLmZxPWI7Yi5wcm90b3R5cGU9e25yOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vcjp0aGlzLmh0KGEpfSxodDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaXQ6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkF0OnRoaXMuRmwoYSl9LEZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HbDp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud3M6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFzOnRoaXMubHIoYSl9LGxyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5tcjp0aGlzLkd1KGEpfSxHdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuajphfX19KShjKTt2YXIgb2M9Yy5mcXx8b2MsYWQ9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9YWQubnIoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuQmMoay5LdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOgotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkJjKGsuRnMpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtGLndpZHRoPTE7Ri5oZWlnaHQ9MTtGLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgYmQ9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgST1uZXcgSixsPSExO0kua2EoKTtJLllnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5rYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuWWcoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTtJLmthKCk7CnZhciBjZD1iZChmdW5jdGlvbigpe2UueWcod2luZG93LEkuQXIoKSx7aWQ6Y2R9KX0sNTAwKSxpYT1lLmFhKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd0PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuTnA9YjtiLnByb3RvdHlwZT17dnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnd0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5OcHx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQudnQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnhoPXRoaXMuY29uZj10aGlzLmxiPXRoaXMucGxheWVyPW51bGw7dGhpcy5zZD0wOwp0aGlzLmJiPSIiO3RoaXMueWQ9W107dGhpcy56ZD0wO3RoaXMuemg9ITE7dGhpcy5ZZT1bXTtlLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy50aT1iO2IucHJvdG90eXBlPXt2dTpmdW5jdGlvbihhKXt0aGlzLnhoPWF9LGdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0scXU6ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSxwdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxNYzpmdW5jdGlvbihhLGIpe2UuZmEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5CcigpKXRoaXMubGIubCh0aGlzLmxiLm9kLHRoaXMubGIud2EsdGhpcy5sYi4kZSxmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmxiLkFjKTtlbHNlIGlmKHRoaXMuVnEoKSl0aGlzLmp1KGZ1bmN0aW9uKCl7dGhpcy5NYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsueWMsdGhpcy5wbGF5ZXIucygpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLlV1KCk7bC5leGl0RnVsbHNjcmVlbigpO2Uub2IoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLmxiLApnKTtsLm91KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy50cyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkllJiYoYz10aGlzLnBsYXllci5JZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5LZShhLGMsZik7dGhpcy5wbGF5ZXIuSmgobCl9fSxCcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnNkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuc2QuZ2V0VGltZSgpLHRoaXMuc2Q9YSwzRTU8Yj8hMDohMTt0aGlzLnNkPWE7cmV0dXJuITF9LEV1OmZ1bmN0aW9uKCl7ZS5vYigicHJlcm9sbCIpO2UuZmYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMudWcoYSkpP3RoaXMuTWMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX0sRHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueGgpe2UuZmYoInBvc3Ryb2xsIik7ZS5vYigicG9zdHJvbGwiKTt0aGlzLnZ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnVnKGMpKT90aGlzLk1jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX19LHVnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxXdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLkJ1KHRoaXMuRHUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5vYigibWlkcm9sbCIpO2UuZmYoIm1pZHJvbGwiKTtpZighdGhpcy5taCl7dGhpcy5taD0hMDt2YXIgYj10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5NYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5taD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5kZCwKdGhpcy5wbGF5ZXIucygpKSl9fSxWdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnV1KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmUoKX0sZzpmdW5jdGlvbigpe3RoaXMuRXUoKTt0aGlzLnBsYXllci5OZSYmdGhpcy5WdCgpO3RoaXMuV3QoKX0sWHQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy55ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuR3coYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnpkPXRoaXMueWQubGVuZ3RofSxWcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy56ZCYmKGE9ITApO3JldHVybiBhfSwKanU6ZnVuY3Rpb24oYSl7dGhpcy56aD1hO2ZvcihhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXVsiZnVuY3Rpb24iXSh0aGlzLkl0LmJpbmQodGhpcykpfSxJdDpmdW5jdGlvbihhKXt0aGlzLnpkLS07YSYmdGhpcy5ZZS5wdXNoKGEpOzA+PXRoaXMuemQmJnRoaXMuemgoKX0sdHM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWWUubGVuZ3RoO2MrKyliPXRoaXMuWWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWms9dGhpcy5hWzhdO3RoaXMuJG09dGhpcy5hWzhdO3RoaXMuUWw9dGhpcy5hWzNdO3RoaXMuYXE9dGhpcy5hWzddO3RoaXMuZXU9dGhpcy5hWzFdO3RoaXMuTHM9dGhpcy5hWzhdO3RoaXMuUGs9CnRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzVdfWMuSW89YjtiLnByb3RvdHlwZT17WWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlprOnRoaXMuWm0oYSl9LFptOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy4kbTp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUWw6dGhpcy4kcChhKX0sJHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFxOnRoaXMuZHUoYSl9LGR1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZXU6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxzOnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuSW98fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Zayg0KX0pLmNhbGwoUGVpZm94b2hPdWNoYW5nYSxQZWlmb3hvaE91Y2hhbmdhKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.19.35 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:40 GMT
Last-Modified
Wed, 02 Oct 2019 04:06:44 GMT
Server
AmazonS3
x-amz-request-id
FCE2C1AE870F4387
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
dm9+kwEJ6dVqW+1RtsaeUnxpVQTIwkaOe0i1ET192UdE0/XNyO6qAkETX0oB0CtGjMtMK1mlXyY=
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=2201231374
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBlaWZveG9oT3VjaGFuZ2E9UGVpZm94b2hPdWNoYW5nYXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVGV8fCh4LlRlPTApO3guVGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5UZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5UbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay55YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuZ2YoYyk7YS5xdShtKTthLnB1KGwpO2EuWHQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS55dSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5raC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUua2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQW09dGhpcy5hWzhdO3RoaXMuRXY9dGhpcy5hWzddO3RoaXMuU2o9dGhpcy5hWzldO3RoaXMuS3A9dGhpcy5hWzRdO3RoaXMuam49dGhpcy5hWzddO3RoaXMuWG89dGhpcy5hWzNdO3RoaXMucGs9dGhpcy5hWzldO3RoaXMuem89dGhpcy5hWzZdO3RoaXMuUW89dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNl19Yy50bT1iO2IucHJvdG90eXBlPXt6bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQW06dGhpcy5EdihhKX0sRHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkV2OnRoaXMuUmooYSl9LFJqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Tajp0aGlzLkpwKGEpfSxKcDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLktwOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qbjp0aGlzLldvKGEpfSxXbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWG86dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5wazp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpvOnRoaXMuUG8oYSl9LFBvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMudG18fGhhLHNjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLnptKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlRvPSExO3RoaXMuQ2I9InNldHVwIjt0aGlzLk5jPVtdO3RoaXMubmUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuSHQuYmluZCh0aGlzKSk7dGhpcy5uYj17fTt0aGlzLlJnPXt9O3RoaXMuZGY9ITF9Yy5maz1iO2IucHJvdG90eXBlPXtUdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5uYil0aGlzLm5iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm5iW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5kZnx8KHRoaXMuZGY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmRmfSxvYjpmdW5jdGlvbihhKXt0aGlzLm5iW2FdfHwodGhpcy5uYlthXT0wKTt0aGlzLm5iW2FdKz0xOzU8dGhpcy5uYlthXSYmIXRoaXMuUmdbYV0mJih0aGlzLlJnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuVHUoKSwhMCkpfSxuZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LApldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUW46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEh0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLkd0KGEuZGF0YSl9LEd0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCwKZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGdlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LG9nOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR2coYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmpoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxHZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsKaWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sTm46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLnFxKGEpKXJldHVybjsoYj10aGlzLm9nKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0scXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sCndnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxMcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx4ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEZnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxQaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50OwpyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxFZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLHE9MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCoKZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5FZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmUoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHplOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sS2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt5PWs7dT1tO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKHEsNSkrKG5eCnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKG0pK2IobCkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxIcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGhkOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT0KbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17TGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sZnI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sRWw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sVW06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LApRazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LGltOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sSG86ZnVuY3Rpb24oKXtyZXR1cm4gYS5MaSgpfHxhLlVpKCl8fGEuZnIoKXx8YS5FbCgpfHxhLlVtKCl8fGEuUWsoKXx8YS5pbSgpfX07cmV0dXJuIG51bGwhPWEuSG8oKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxaYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxmYTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxJcTpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sd3A6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sRnU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQmc6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmNpKGIpKyI6Iit0aGlzLmNpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5DYj1hfSx5ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkNiO3RoaXMuY2UoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTsKYS5kaXNwYXRjaEV2ZW50KGYpfSxCYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMueWcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5CYyhCKX0sSnQ6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTsKYi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5JcSgpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LE11OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5ZYigpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuY2UoYSl9LGNlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSnQoYSk7aWYoYilpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2UoYil9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLkpjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9bS5KYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYik7Cm0ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxLZDpmdW5jdGlvbihhKXtpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGIsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLkpjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LExlOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLmJwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxlKCl9LmJpbmQodGhpcyksNTAwKX0sdmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmtiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx5ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sa2I6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5uZChhKToiIn0sbmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy55ZShhKTsKYiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxjZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuR2UoYSl8fHRoaXMuTHIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5jZiYmd2luZG93LnNhbmRib3guY2ZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5jZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5jZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy53ZyhhKSlyZXR1cm4gdGhpcy53ZyhhKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5hYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIucWQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuTm4oZSxhKTtyZXR1cm4gZX0sYWI6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyxrKXt2YXIgbD1lfHxtO2U9ITA7ayYmKGU9ITEpO2lmKGwmJmwuVilpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihhLGIsZCxmLGMsbCxnLGspfS5iaW5kKHRoaXMpLDUwMCl9LGpoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxsczpmdW5jdGlvbihhLGIsZCl7dGhpcy5qaChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5OYylmb3IodmFyIGMgaW4gdGhpcy5OYylhPWEuc3BsaXQoYykuam9pbih0aGlzLk5jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS54YihhKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxraDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGEsZi5MYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMubHMoZi5xZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCnl1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk5jPWF9LEd3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5hYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sRnI6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9fX0pKGMpO3ZhciBRPWMuZmt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPQphfHx7fX1jLmVrPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IudXQ9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuRXM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iua3c9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5icT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnR3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWGY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuUGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5VZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5ZZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuRm49e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuU2Y9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5Qdj17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuY3E9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5vdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5rZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnFwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5kZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLnljPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5XZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuSG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5VYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuJGQ9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuYmU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLkduPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5qaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLkhzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5sZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuaXc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTHY9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk12PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Ldj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLkZzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5la3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hbD10aGlzLmFbNl07dGhpcy5xaj10aGlzLmFbNF07dGhpcy5rdD10aGlzLmFbM107dGhpcy54aj10aGlzLmFbMTBdO3RoaXMubHE9dGhpcy5hWzEwXTt0aGlzLmxqPXRoaXMuYVs1XTt0aGlzLkl2PXRoaXMuYVs0XTt0aGlzLkp1PXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuTGw9YjtiLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFsOnRoaXMucGooYSl9LHBqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xajp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMua3Q6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhqOnRoaXMua3EoYSl9LGtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5scTp0aGlzLmtqKGEpfSwKa2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmxqOnRoaXMuSHYoYSl9LEh2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jdjp0aGlzLkl1KGEpfSxJdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSnU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLkxsfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy4kayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmdrPWI7Yi5wcm90b3R5cGU9e3plOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxsYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LERxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LGxkOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5sZChhKwo2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5sZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuemUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmxkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxBcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxZZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnplKHRoaXMuRHEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5sZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIEo9CmMuZ2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ209dGhpcy5hWzldO3RoaXMuRnc9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMuT2w9YjtiLnByb3RvdHlwZT17Zm06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdtOnRoaXMuRXcoYSl9LEV3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gdzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuT2x8fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLmZtKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzoKLy4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5naj1ifSkoYyk7dmFyIEw9Yy5nanx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc209dGhpcy5hWzFdO3RoaXMuemk9dGhpcy5hWzNdO3RoaXMuQ209dGhpcy5hWzldO3RoaXMuT2o9dGhpcy5hWzZdO3RoaXMuZXI9dGhpcy5hWzEwXTt0aGlzLndsPXRoaXMuYVs2XTt0aGlzLnd2PXRoaXMuYVsxXTt0aGlzLlBwPXRoaXMuYVs0XTt0aGlzLkVuPXRoaXMuYVs3XTt0aGlzLkJwPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuRG09YjtiLnByb3RvdHlwZT17cm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNtOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56aTp0aGlzLkJtKGEpfSxCbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ206dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9qOnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5lcjp0aGlzLnZsKGEpfSx2bDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud2w6dGhpcy52dihhKX0sdnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMud3Y6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBwOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbjp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLkRtfHxsYSx4Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5ybSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLlNsPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5LYz0xMDA7dGhpcy5JYj0wO3RoaXMuV2E9MTUwO3RoaXMuTGI9MDt0aGlzLnJ1KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYT8KKHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKX0sYnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxiZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHJ1OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSxCcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmxhKCldPWI7TSYmTS5naCYmTS5TdShiKX0sdHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/CiEwOiExfSxHcjpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEx4OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuU2x8fHQ7KGZ1bmN0aW9uKGMpe2MuVWw9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5LYz0xMDt0aGlzLkliPTA7dGhpcy5XYT01MDt0aGlzLlg9bnVsbDt0aGlzLm5hPSExO3RoaXMucGxheWVyPWI7dGhpcy5CYj0iIjt0aGlzLnFnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuS2EoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD0KaC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxCdTpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sdXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSx1dTpmdW5jdGlvbihiKXt0aGlzLk9lPWJ9LHN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2V9LE5lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLktjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7CmVsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxFZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxCZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LE54OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLldxKCl8fHRoaXMuSm4oKTt0aGlzLkJkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sdng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sSm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sV3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxBYTpmdW5jdGlvbigpe3JldHVybiExfSxEeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hfSxjYTpmdW5jdGlvbigpe3RoaXMubmE9ITB9LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmCmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSmg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxyeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSxFaDpmdW5jdGlvbigpe3RoaXMuQmI9bnVsbH0seHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkJiJiYoYj0hMCk7cmV0dXJuIGJ9LEl4OmZ1bmN0aW9uKCl7dGhpcy5xZ3x8KHRoaXMucWc9ITApfSx1ZTpmdW5jdGlvbigpe3JldHVybiExfSxveDpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5VbHx8cDsoZnVuY3Rpb24oYyl7Yy51aT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLkxmPQoiMSI7dGhpcy5NZj0iMiI7dGhpcy51bj0iMyI7dGhpcy5RYz0wO3RoaXMubmg9MzA7dGhpcy5SYj1bXTt0aGlzLmdiPVtdO3RoaXMub2M9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuWmY9dGhpcy5maT0hMTt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5nZihiKTt0aGlzLnN1KGEpfSxnOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuZml8fCh0aGlzLmZpPSEwLGUuTGUoKSl9LFNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5hYyYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0seHI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2Eua2EoKV18fCh3aW5kb3dbYS5rYSgpXT17fSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXXx8KHdpbmRvd1thLmthKCldW2IubGEoKV09Cnt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWWIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXT0xfSxEcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmthKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldLmluaXRpYXRvciE9ZS5ZYigpJiYodGhpcy5oZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnhhKCkpe3RoaXMueHIoKTtpZighdGhpcy5EcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5oZigpO3JldHVybn10aGlzLmhmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5aaCgpO3RoaXMuWmY9ITA7YSYmImZ1bmN0aW9uIj09CnR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5nYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYodGhpcy5SYj1lLnVuaXF1ZSh0aGlzLlJiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5SYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGg9MDtoPHRoaXMuZ2IubGVuZ3RoO2grKyl0aGlzLm9jW3RoaXMuZ2JbaF0ucmVhc29uXT09dGhpcy5vY1tiXSYmYS5wdXNoKHRoaXMuZ2JbaF0uZGV0YWlsKSx0aGlzLm9jW3RoaXMuZ2JbaF0ucmVhc29uXTx0aGlzLm9jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5nYltoXS5kZXRhaWwpLGI9dGhpcy5nYltoXS5yZWFzb24pO3RoaXMub2NbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSwKYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sd3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGhmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0senU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnVufSxvYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0seGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuUWN9LGdmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sc3U6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sb3M6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIHY9Yy51aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5acD10aGlzLmFbOV07dGhpcy5Rcj10aGlzLmFbNl07dGhpcy5Hdj10aGlzLmFbN107dGhpcy52bz10aGlzLmFbNV07dGhpcy5nbj10aGlzLmFbNV07dGhpcy51cD10aGlzLmFbOF07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy50aj1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY2w6dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpwOnRoaXMuUHIoYSl9LFByOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Rcjp0aGlzLkZ2KGEpfSxGdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuR3Y6dGhpcy51byhhKX0sdW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZvOnRoaXMuZm4oYSl9LApmbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmduOnRoaXMudHAoYSl9LHRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cDp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLnRqfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5ibCg0KTsoZnVuY3Rpb24oYyl7Yy5Iaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ianx8b2E7KGZ1bmN0aW9uKGMpe2MuSWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLmZ4O2E/YS5xYT9hLnFhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7CmYuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuSWp8fHBhOyhmdW5jdGlvbihjKXtjLkpqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiYKd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Kanx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhvPXRoaXMuYVsxMF07dGhpcy5xcz10aGlzLmFbNF07dGhpcy55dD10aGlzLmFbNF07dGhpcy5hbz10aGlzLmFbM107dGhpcy5Bcz10aGlzLmFbNF07dGhpcy5rdj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs2XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueG86dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFzOnRoaXMueHQoYSl9LAp4dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueXQ6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmFvOnRoaXMuenMoYSl9LHpzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Bczp0aGlzLmp2KGEpfSxqdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua3Y6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLlVvfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy53byg0KTsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMudmcoKTt0aGlzLnhnKCk7dGhpcy5wcD0hMX0sdmc6ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKYnx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seGc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpOwphLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk9lJiYoMCx0aGlzLk9lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJgpiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Da3x8c2E7KGZ1bmN0aW9uKGMpe2MuQms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYWU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiYKYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5TYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5TZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmgmJgohdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS53ZCgpLGEucGUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuU2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5TZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5uaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlRjLmluZGV4T2YoYSkmJgp0aGlzLlRjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5UYy5sZW5ndGg+PXRoaXMuYWUmJnRoaXMubSgpKX0sb3M6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xOnRoaXMucmU/dGhpcy5yZSsrOnRoaXMucmU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUGgoYS52aWRlb1RhZyk/YS5iYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlNjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMucmU+dGhpcy5zZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnZnKCksYS54ZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ca3x8dGE7KGZ1bmN0aW9uKGMpe2MuRGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy55cSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLkdyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0scXg6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCnlxOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ea3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdzPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzJdfWMuTXc9YjtiLnByb3RvdHlwZT17ZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmdzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgd2E9Yy5Nd3x8d2EsQWM9bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuZnMoNCk7KGZ1bmN0aW9uKGMpe2MuSG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLkpkKGIpfS5iaW5kKHRoaXMpKX0sSmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LERlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpOwppZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxBYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5IbXx8eGE7KGZ1bmN0aW9uKGMpe2MuR209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkVjPXRoaXMuQ2E9dGhpcy5YYz0hMTt0aGlzLkFoPWUuSGIoMTApO3RoaXMuZWk9ITA7dGhpcy50Yz10aGlzLlZnPSExO3RoaXMuQ3MoYi5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLnFoKCksdGhpcy5ZbygpLHRoaXMucWIoKSl9LENzOmZ1bmN0aW9uKGIpe3JldHVybiBlLmZhKCJ0LW9ubGluZS5kZSIpPyExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LEp4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLAoiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuSiwiOyIsdHlwZW9mIGIuSiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLklhP2IuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuSWE/dHlwZW9mIGIuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5ZZDoKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLllkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/CnR5cGVvZiBiLkoucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5oZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmhlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuQWgpfSx5YjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmCih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMueWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnFhPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnFhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnFhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnFhfSxJZzpmdW5jdGlvbigpe2lmKCF0aGlzLkVjKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRWM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkVjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRWN9LEVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVWcpe3ZhciBiPQp0aGlzLnliKCksYT10aGlzLkNyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5VZz0hMCl9cmV0dXJuIHRoaXMuVWd9LENyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5YYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuWGM9ITApO3JldHVybiB0aGlzLlhjfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsaD0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5VdCgpfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxVdDpmdW5jdGlvbigpe3RoaXMudGM9ITA7dmFyIGI9dGhpcy5JZygpO2lmKGJ8fHRoaXMueGEoKSl7dmFyIGE9ImFkRXJyb3IiLGg9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuVmEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnVjPQohMDtpZihlLmZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIisKZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnVjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5nYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LHB4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5uZyYmYi5hZHMmJih0aGlzLm5nPWIuYWRzKTtyZXR1cm4gdGhpcy5uZ30sWW86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7CnRoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlNlKCl9LmJpbmQodGhpcykpfSxmZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuSWcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCkpfSxxaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5FcigpKXt2YXIgYT10aGlzLnliKCksaD10aGlzLlhiKCk7YSYmaCYmKHRoaXMueWIoKSx0aGlzLlhiKCksdGhpcy50Y3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5WZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnliKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5nYSgpKToodGhpcy5nYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuVmc9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xaCgpfS5iaW5kKHRoaXMpLDUwKX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7CmlmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sWm86ZnVuY3Rpb24oKXt0aGlzLnpjfHwodGhpcy56Yz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuemMhPWIuYWRzLnN0YXRlJiYodGhpcy56Yz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09CnRoaXMuemMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy56Yz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWm8oKX0uYmluZCh0aGlzKSwxMCl9LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS5aYihkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpKX0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmVpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmVpLGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKZ3A6ZnVuY3Rpb24oKXt0aGlzLnl4fHwoMTA8dGhpcy5Xdj8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLld2KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuYXUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ3AoKX0uYmluZCh0aGlzKSw1MCkpKX0sYXU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuWHYpe3RoaXMuWHY9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpOwpiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5HbXx8eWE7KGZ1bmN0aW9uKGMpe2MuSW09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlFoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5RaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxRaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLnhlKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpfX0pfSkoYyk7dmFyIHphPWMuSW18fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaj10aGlzLmFbMl07dGhpcy5DdD10aGlzLmFbOV07dGhpcy5vbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs4XX1jLklrPWI7Yi5wcm90b3R5cGU9e1lqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWmo6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkN0OnRoaXMubm8oYSl9LG5vOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMuSWt8fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5Zaig0KTsoZnVuY3Rpb24oYyl7Yy5JbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLlVlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlcoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LER0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQmIsaD10aGlzLmxhKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTsKZCYmYSYmYS5hYyYmKDA8PWguaW5kZXhPZihkKXx8YS53ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxBYTpmdW5jdGlvbigpe3RoaXMuVWUrKztpZigxMDx0aGlzLlVlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLAoiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LEpkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgQ2E9Yy5JbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuSGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXtpZighdGhpcy50ZSlpZih0aGlzLkRifHwKKHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksCjEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKX19LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQ2EoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLmdxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELApmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5tKCl9LmJpbmQodGhpcykpLHRoaXMuZ3E9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5EdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5IbHx8RGE7KGZ1bmN0aW9uKGMpe2MuSmw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYKMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm5hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9CmMuSmx8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ldD10aGlzLmFbNF07dGhpcy5Ldz10aGlzLmFbN107dGhpcy5MdT10aGlzLmFbN107dGhpcy53cj10aGlzLmFbNF07dGhpcy5UbT10aGlzLmFbMTBdO3RoaXMuc249dGhpcy5hWzddO3RoaXMudXI9dGhpcy5hWzFdO3RoaXMuWGo9dGhpcy5hWzEwXTt0aGlzLnF3PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzFdfWMuQWk9YjtiLnByb3RvdHlwZT17ZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmV0OnRoaXMuSncoYSl9LEp3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS3c6dGhpcy5LdShhKX0sS3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkx1OnRoaXMudnIoYSl9LHZyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy53cjp0aGlzLlNtKGEpfSxTbTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLlRtOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbjp0aGlzLnRyKGEpfSx0cjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudXI6dGhpcy5XaihhKX0sV2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Yajp0aGlzLnB3KGEpfSxwdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnF3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgR2E9Yy5BaXx8R2EsQ2M9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Q2MuZHQoNCk7KGZ1bmN0aW9uKGMpe2Mudms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuRmcoYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJgooYT1hLnBhcmVudE5vZGUpfXRoaXMuRnQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLkZ0KXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlcoaCk7dGhpcy5aKGgpOwp0aGlzLmpkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5qZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuamQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxmcDpmdW5jdGlvbigpe2UuYWgodGhpcy5qZCk7ZS5FZSh0aGlzLmpkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sSWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBIYT1jLnZrfHxIYTsoZnVuY3Rpb24oYyl7Yy51az12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy51a3x8SWE7KGZ1bmN0aW9uKGMpe2Mud2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj0KbC5pbnJlYWQsYT1lLkZnKGIsImVsZW1lbnRJRCIpO2lmKGUuYWgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEphPWMud2t8fEphLEthPW5ldyBKYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5iaj10aGlzLmFbOV07dGhpcy5BbD10aGlzLmFbMTBdO3RoaXMuV2w9dGhpcy5hWzZdO3RoaXMuY3Q9dGhpcy5hWzFdO3RoaXMuSWk9dGhpcy5hWzRdO3RoaXMuTXA9dGhpcy5hWzldO3RoaXMuJGk9dGhpcy5hWzFdO3RoaXMuc3M9dGhpcy5hWzddO3RoaXMuUHE9dGhpcy5hWzNdOwp0aGlzLllyPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuU249YjtiLnByb3RvdHlwZT17YWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmJqOnRoaXMuemwoYSl9LHpsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5BbDp0aGlzLlZsKGEpfSxWbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuV2w6dGhpcy5idChhKX0sYnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jdDp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSWk6dGhpcy5McChhKX0sTHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1wOnRoaXMuWmkoYSl9LFppOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kaTp0aGlzLnJzKGEpfSxyczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3M6dGhpcy5PcShhKX0sT3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlBxOnRoaXMuWHIoYSl9LFhyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ZcjoKdGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTGE9Yy5Tbnx8TGEsRGM9bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGMuYWooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmhrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LHR1OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sS246ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5oa3x8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApoLGQsZil7dGhpcy5mYj1hO3RoaXMuQWc9dGhpcy5uaT0hMTt0aGlzLnJoPWQ7dGhpcy5SaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5mYj1uZXcgeihhKSk7dmFyIGM9dGhpcy5zYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5IZSh0aGlzLmZiLnVybCkmJm0uTWQpe3ZhciBlPW5ldyB6KGEudXJsKTtlLnR1KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmCihiPSEwKTtifHxtLmlhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5pYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuaWs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZmIuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuQWcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLlJoP3RoaXMuc2Iub3Blbih0aGlzLmZiLm1ldGhvZCx0aGlzLmZiLnVybCwhMSk6dGhpcy5zYi5vcGVuKHRoaXMuZmIubWV0aG9kLHRoaXMuZmIudXJsLCEwKSx0aGlzLm5pfHwodGhpcy5zYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuc2Iuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLnNiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLnNiLnNlbmQoYSl9Y2F0Y2goZil7bSYmbS5IZSh0aGlzLmZiLnVybCk/bS5NZD9tLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkhlKHRoaXMuZmIudXJsKSx0aGlzLnJoJiZ0aGlzLnJoKCl9cmV0dXJuIHRoaXMuc2J9fX0pKGMpO3ZhciBNYT1jLmlrfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGE9dGhpcy5WZD0hMX1jLmhqPWI7Yi5wcm90b3R5cGU9e3h1OmZ1bmN0aW9uKGEpe3RoaXMuVmQ9YX0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5IYT1hfSxadDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLCJyZWdpc3RlcmluZ3MgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYixhKX0pfXZhciBiPXtQdzoiQWRDbGlja1RocnUiLFJ3OiJBZEVycm9yIixTdzoiQWRTdG9wcGVkIixWdzoiQWRMaW5lYXJDaGFuZ2UiLFd3OiJBZFRhZ1BhcnNlZCIsWnc6IkFkVmlkZW9Db21wbGV0ZSIsYng6IkFkTG9hZGVkIixjeDoiQWRTa2lwcGVkIixkeDoiQWRTdGFydGVkIixUdzoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLFV3OiJBZEltcHJlc3Npb24iLFF3OiJBZENyZWF0aXZlVmlldyIsWHc6IkFkVmlkZW9NaWRwb2ludCIsWXc6IkFkUGF1c2VkIiwkdzoiQWRWaWRlb1N0YXJ0IixheDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGI9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLlZkLGJbZF0pfSxZdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSwKYil7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGIsYSl9KX1pZih0aGlzLkhhJiZ0aGlzLkhhLlVkKWZvcih2YXIgYiBpbiB0aGlzLkhhLlVkKXRoaXMuSGEuVWQuaGFzT3duUHJvcGVydHkoYikmJmEodGhpcy5IYSx0aGlzLkhhLlVkW2JdKTt0aGlzLkhhJiZ0aGlzLkhhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhLmdldEVycm9yKCk7YSYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixhKX0uYmluZCh0aGlzKSwxMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLlZkJiZ0aGlzLlp0KCk7dGhpcy5IYSYmdGhpcy5ZdCgpfX19KShjKTt2YXIgTmE9Yy5oanx8TmE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlVhPSExO3RoaXMud2M9IiI7dGhpcy5pZT0KdGhpcy52Yz10aGlzLndiPW51bGw7dGhpcy54cD10aGlzLkpiPXRoaXMuaWg9ITE7dGhpcy5MYT0iIjt0aGlzLmRoPSExO3RoaXMud2E9dGhpcy5vZD0iIjt0aGlzLlpnPXRoaXMuVj10aGlzLmlzRW5hYmxlZD10aGlzLiRlPSExO3RoaXMucGE9W107dGhpcy5PZz10aGlzLmZjPSIiO3RoaXMucWU9ITE7dGhpcy5xZj0wO3RoaXMuR2Y9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5FZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuUWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMubmM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLmhjPSIiO3RoaXMuaWM9W107dGhpcy5qYz1bXTt0aGlzLklkPVtdO3RoaXMuZ2M9IiI7dGhpcy5yZj0wO3RoaXMudmlkZW9wbGF6YT0Ke307dGhpcy5EYz0hMTt0aGlzLmhwPXRoaXMuT2Q9bnVsbDt0aGlzLkxoPXRoaXMubGM9dGhpcy5zZz10aGlzLnVmPXRoaXMuTWQ9dGhpcy5rZT10aGlzLlJjPSExO3RoaXMuaGI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMucGQ9MDt0aGlzLlFnPSExO3RoaXMuUGc9MUUzO3RoaXMuWmM9ITE7dGhpcy5RYT0xRTM7dGhpcy5PZj0iIn1jLmprPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMud2MsYWR0YWdtb2RpZmllcjp0aGlzLndiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy52YyxhZHRhZ3JlZ2V4OnRoaXMuaWUsYml0cmF0ZTp0aGlzLlFhLGpzcG9wdXBzOnRoaXMuaWgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMueHAsaG9tYWRBbGlhczp0aGlzLkxhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5kaCxnbG9iYWxDb25maWc6dGhpcy5vZCxjbGllbnRDb25maWc6dGhpcy53YSwKaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5WLGlzQmxvY2tlZDp0aGlzLlpnLHNlcnZlcjp0aGlzLnBhLHN2bUNvbmZpZzp0aGlzLmZjLGhvbWFkQWRwYXRoOnRoaXMuT2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5xZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5xZixIT01BRF9WRVJJRklFRDp0aGlzLkdmLEhPTUFEX0JMT0NLRUQ6dGhpcy5FZixIT01BRF9OT0JMT0NLRVI6dGhpcy5RYixIT01BRF9BREJMT0NLRVI6dGhpcy5uYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRmYsdGVzdEhpZGU6dGhpcy5oYyx0ZXN0VGFnczp0aGlzLmljLHRlc3RUYWdzSlM6dGhpcy5qYyx0ZXN0VGFnc1hIUjp0aGlzLklkLHRlc3RDb29raWU6dGhpcy5nYyx0aHJvdHRsZTp0aGlzLnJmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuRGMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5ocCxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlJjLApibG9ja2VkV2FzQ2FsbGVkOnRoaXMua2UsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTWQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudWYsY29uZmlnRmFpbHVyZXM6dGhpcy5oYixzaXRlQ29uZmlnOnRoaXMuRmEsc2VydmVySWQ6dGhpcy5JaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuamIsdnBhaWQ6dGhpcy5sYyxza2lwQWxsb3dlZDp0aGlzLkxoLHZtYXBzOnRoaXMua2ksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLlpjLGFkRmFsbGJhY2tVUkw6dGhpcy5PZn19LFVxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmhiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuaGJbYl0mJjE9PXRoaXMuaGJbYl0mJihhPSEwKTtyZXR1cm4gYX0sZWY6ZnVuY3Rpb24oYSl7dGhpcy5oYlthXT0hMH0senE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltiXSYmMT09dGhpcy5oYltiXSYmYS5wdXNoKGIpOwpyZXR1cm4gYX0sSGQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5MbyhhKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixnPSIiO2lmKCF0aGlzLlVhJiYhYilyZXR1cm4gbmV3IHooYSk7Zj10aGlzLkdlKGEpO2M9dGhpcy56YShhKTtmPyh0aGlzLkZjKCk/ZT1hOmU9Yy5wcm90b2NvbCsKIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5KYygpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLndjfHx0aGlzLndifHx0aGlzLnZjfHx0aGlzLmllKSYmKGc9dGhpcy55cyhnKSk7YT1uZXcgeihlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkFxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGcpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sR2U6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/CmI9ITA6dGhpcy5GYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sRmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMucGEmJnRoaXMucGEubGVuZ3RoJiYwPHRoaXMucGEubGVuZ3RoJiYoYj10aGlzLnBhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEhlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuR2UoYSk7cmV0dXJuIGJ9LEFxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT0KdHlwZW9mIHRoaXMuTGEmJjA8dGhpcy5MYS5sZW5ndGgpcmV0dXJuIHRoaXMuTGE7Zm9yKGQgaW4gdGhpcy5MYSlpZihiPXRoaXMuTGFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5reDtyZXR1cm4ibm9uZSJ9LHFkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFbdGhpcy5JaF19LEpjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5xZCgpLGI9dGhpcy5LaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxvaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx4czpmdW5jdGlvbihhLApiKXt2YXIgZD1lLnphKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxDPTA7QzxnLmxlbmd0aDtDKyspe3ZhciBrPWdbQ10uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5vaChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMub2goZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx5czpmdW5jdGlvbihhKXt0aGlzLndjJiYoYSs9dGhpcy53Yyk7aWYodGhpcy53Yilmb3IodmFyIGIgaW4gdGhpcy53Yil0aGlzLndiLmhhc093blByb3BlcnR5KGIpJiYKKGE9YS5yZXBsYWNlKGIsdGhpcy53YltiXSkpO3RoaXMudmMmJihhPXRoaXMueHMoYSx0aGlzLnZjKSk7cmV0dXJuIGF9LGVwOmZ1bmN0aW9uKCl7dGhpcy5GYSYmdGhpcy5GYS5jbGllbnRBUElzJiZ0aGlzLiRvKHRoaXMuRmEuY2xpZW50QVBJcyl9LCRvOmZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiPW5ldyBOYTthLnB1Ymxpc2hlckFQSSYmYi54dShhLnB1Ymxpc2hlckFQSSk7YS5wbGF5ZXImJmIud3UoYS5wbGF5ZXIpO2IuZygpfX0sbDpmdW5jdGlvbihhLGIsZCxmLGMsZSl7bT10aGlzO3RoaXMuZGg9ITA7dGhpcy5vZD1hO3RoaXMud2E9Yjt0aGlzLiRlPWQ7dGhpcy5PZD1mO3RoaXMuQWM9Yzt0aGlzLkZhPWV8fHt9O3RoaXMuZXAoKTt0aGlzLmtzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLndhKXRoaXMuaHMoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9YigpLHRoaXMueGMoKX1jYXRjaChnKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iLHRoaXMueGMoKX1jYXRjaChrKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfX0scGI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGtzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLm9kK3RoaXMuZmUoImdsb2JhbCIpKSx0aGlzLlFxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMueGMoKX0uYmluZCh0aGlzKSwhMCl9LGhzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLndhK3RoaXMuZmUoImNsaWVudCIsLTEhPXRoaXMud2EuaW5kZXhPZigiPyIpKSksdGhpcy54Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5lZigiY2xpZW50Iik7dGhpcy5pYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLAohMCl9LGZlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5IYigpKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5GYSYmdGhpcy5GYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGlhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmtlKXt0aGlzLmtlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChoKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwphPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkFjPSExKTt0aGlzLkFjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQWM/dGhpcy5BYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5WPXRoaXMuWmc9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkVmKSk7dGhpcy5OYigpO2UuQmMoay51dCk7KGI9ZS5aYih0aGlzLnFkKCkpKXx8KGI9ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sUXE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLndhfHx0aGlzLmZjfHx0aGlzLkxhfHx0aGlzLnhjKCk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLlFiKSksdGhpcy5OYigpKX19LHhjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLndhfWVsc2UgYT10aGlzLndhO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYS5lbmFibGVkKTt0aGlzLlY9IXRoaXMuaXNFbmFibGVkO3RoaXMucGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5mYSgid2ViLmRlIil8fGUuZmEoImdteC5uZXQiKXx8ZS5mYSgiZ214LmF0Iil8fGUuZmEoImdteC5jaCIpfHxlLmZhKCIxdW5kMS5kZSIpKSYmIXRoaXMuRmMoKSlmb3IoYj0wO2I8dGhpcy5wYS5sZW5ndGg7YisrKXRoaXMucGFbYl09dGhpcy5wYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmZjPWEuY29uZmlnfHwiIjt0aGlzLkxhPWEuYWxpYXN8fApudWxsO3RoaXMuT2c9YS5hZHBhdGh8fCIiO3RoaXMucWU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5JaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5wYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmZjJiZ0aGlzLkxhJiZ0aGlzLnBhLmxlbmd0aD90aGlzLkdjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxHYzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkpjKCkpLGQ9dGhpcy56YSh0aGlzLmZjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0KIlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmZjK3RoaXMuZmUoImN1c3RvbWVyIikpO3RoaXMuRGEoYix0aGlzLlZ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJjdXN0b21lciIpO2E/dGhpcy5obT90aGlzLmlhKCJub1NWTUNvbmZpZyIpOih0aGlzLmhtPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5HYyghMCl9LmJpbmQodGhpcyksITApfX0sVnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5EYz0hMDt0aGlzLkdjKCEwKTtyZXR1cm59fXRoaXMuTWQ9dGhpcy5NYihiLnN0cmljdCk7dGhpcy51Zj10aGlzLk1iKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnNnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj0KdGhpcy5NYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYi5lbmFibGVkKTt0aGlzLmhjPWIudGVzdGhpZGV8fCIiO3RoaXMuamM9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5JZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMud2M9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy53Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy52Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuaWU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuaWg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5KYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5sYz1iLnZwYWlkfHwhMTt0aGlzLkZhLnZwYWlkPXRoaXMubGM7dGhpcy5MaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLiRjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5raT1iLnZtYXBzfHwiIjt0aGlzLlpjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fAoxRTM7dGhpcy5PZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5nYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLkhxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5xZSYmKHRoaXMuZ2M9bnVsbCk7dGhpcy5yZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5EYz0hMCx0aGlzLkdjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLm52KCkmJih0aGlzLmhjfHx0aGlzLmpjfHx0aGlzLmljfHx0aGlzLmdjfHx0aGlzLklkKT90aGlzLiRlPyh0aGlzLlVhPXRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5RYikpLHRoaXMubWUoKSx0aGlzLk5iKCkpOnRoaXMuWnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy4kdSgpKX19LFp1OmZ1bmN0aW9uKCl7dGhpcy5ZdSgpOwp0aGlzLmF2KCl9LGF2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksQz1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLAoiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEMpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnhiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPQpkKXt2YXIgYz1lLmhkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkZhJiZ0aGlzLkZhLnBsYXllciYmdGhpcy5GYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sJHU6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LE9jOmZ1bmN0aW9uKGEpe3RoaXMuUmM9ITA7dGhpcy5WfHwodGhpcy5WPXRoaXMuVWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLk5iKCksdGhpcy5tZSgpKX0sWXU6ZnVuY3Rpb24oKXtpZih0aGlzLmhjKXt2YXIgYT1lLmhkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5oaCgpKXRoaXMuT2ModGhpcy5uYywKIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmhjKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaGMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuVmgoKX19ZWxzZSB0aGlzLlZoKCl9LFVoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLmR2KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5uZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmljPXRoaXMuSWQpJiZ0aGlzLmljLmxlbmd0aCl7dmFyIGQ9dGhpcy5pYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLm5mKCl9LGR2OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkRhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxWaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtjPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsCnRoaXMuSGIoKSk7dGhpcy5ldihjLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVWguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLk9jKHRoaXMubmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrYysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuamMmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksYzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuVWgoKX0sZXY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGMoKXtnKCkmJmIoKX1mdW5jdGlvbiBlKCl7ZygpJiZkKCl9ZnVuY3Rpb24gZygpe3JldHVybiBDPyh3aW5kb3cuY2xlYXJUaW1lb3V0KEMpLCEwKTohMX12YXIgQz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2MoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZnKCkmJmUoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTsKay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWM7ay5vbmVycm9yPWU7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlKX1jYXRjaChsKXtjKCl9fSxuZjpmdW5jdGlvbigpe3RoaXMuZ2M/KHRoaXMucWYrKyx0aGlzLkRhKG5ldyB6KHRoaXMuZ2MpLHRoaXMuWHUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMub2YoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5TaCgpfSxvZjpmdW5jdGlvbihhKXt0aGlzLk9jKHRoaXMuRmYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxYdTpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5xZj90aGlzLm5mKCk6dGhpcy5vZigiQkJCIik6CiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlNoKCk6dGhpcy5vZigiQUFBIil9LFNoOmZ1bmN0aW9uKCl7dGhpcy5WPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMubWUoKX0saGg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlJjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS5mYSgidC1vbmxpbmUuZGUiKXx8ZS5mYSgiZ2lnYS5kZSIpfHxlLmZhKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLmhoKCksITApOwpkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5HZikpO3RoaXMuT2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5PZCYmdGhpcy5PZCgpfSxjcDpmdW5jdGlvbigpe2lmKHRoaXMudWYmJnRoaXMuVXEoKSl7dmFyIGE9dGhpcy56cSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sWmg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxEYTpmdW5jdGlvbihhLGIsZCxjLHEsZyl7dGhpcy5wZHx8KHRoaXMucGQ9MCk7dGhpcy5wZCsrO3RoaXMucGQ+dGhpcy5QZyYmIXRoaXMuUWcmJih0aGlzLlFnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5QZywhMCkpO2E9bmV3IE1hKGEsCmIsZCk7YyYmKGEubmk9ITApO3EmJmUuSHIoKSYmKGEuQWc9ITApO2cmJihhLlJoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGFwOmZ1bmN0aW9uKCl7ZS5WYSgpfHxlLmFiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxjPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/CmEuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5GYygpfHwoYT10aGlzLnphKGMpLGM9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Zy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtnLm5ldHdvcmtTdGF0ZT09Zy5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5pYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2cuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2cuc2V0QXR0cmlidXRlKCJzcmMiLGMpfWVsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sV3U6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PQp0aGlzLmtpfSxicDpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuRGEoYSx0aGlzLk92LmJpbmQodGhpcyksdGhpcy5Odi5iaW5kKHRoaXMpKX0sT3Y6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1kfHx0aGlzLmVxKCl9LE52OmZ1bmN0aW9uKCl7fSwKZXE6ZnVuY3Rpb24oKXtlLkJjKGsuY3EpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaWEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LG1lOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuSmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5KYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkpiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgSjt3aW5kb3dbZC5rYSgpXT10aGlzO2UuYWIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sbnY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5yZn0sSHE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgphLmxlbmd0aCldfSxIYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsYyxlLGcsayxsLG09MDttPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSxnPWQ+PjIsZD0oZCYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGMpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LHphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGM9MTQ7Yy0tOylkW2JbY11dPWFbY118fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LEtoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZCxoO2ZvcihkPTc7MDw9ZDtkLS0paD1hPj4+NCpkJjE1LGMrPWgudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGc9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdSx2LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8bi0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZSk7CnN3aXRjaChuJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChuPj4+MjkpO3gucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKylnW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspZ1tjXT1kKGdbYy0zXV5nW2MtOF1eZ1tjLTE0XV5nW2MtMTZdLDEpO2U9aztuPWw7cD1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1kKGUsNSkrKG4mcHx+biZ1KSt2K2dbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWQoZSw1KSsobl5wXnUpK3YrZ1tjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz00MDs1OT49YztjKyspdz1kKGUsNSkrKG4mcHxuJnV8cCZ1KSt2K2dbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihyKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5qa3x8T2EsbT1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxuPXRoaXMuYVs5XTt0aGlzLnh3PXRoaXMuYVsxXTt0aGlzLmxtPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzNdfWMuWm49YjtiLnByb3RvdHlwZT17a246ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxuOnRoaXMud3coYSl9LHd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHc6dGhpcy5rbShhKX0sa206ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgUGE9Yy5abnx8UGEsRWM9bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RWMua24oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5mLlA/dGhpcy5iYj1hLmYuUCgpOgp0aGlzLmJiPSIiO2EuZi5YZyYmYS5mLlhnKHtwYXVzZTp0aGlzLndkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuR2guYmluZCh0aGlzKSxtdXRlOnRoaXMuUGUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy54di5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmliO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuVmI9dGhpcy5ZYz0hMTt0aGlzLkdvPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuRmQ9e307ZS5vYigibmV3QmlnQWRJZCIpO3RoaXMuT289ZS5hYSgxMCk7dGhpcy5sZj0wO3RoaXMuV2M9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5XYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmIuZikmJnRoaXMuYi5mLnMmJihhPXRoaXMuYi5mLnMoKSksdGhpcy5XYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYKKHRoaXMuUm49Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5zaD10aGlzLkVkPSExO3RoaXMubGg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmVlPSExO3RoaXMuYmk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuR2I9ZS5hYSgxMCk7dGhpcy5FYj1lLmFhKDEwKTt0aGlzLk1oPWUuYWEoMTApO3RoaXMuY29uZj17fTt0aGlzLlBkPXRoaXMuT2I9dGhpcy5vZT10aGlzLmVkPXRoaXMuR2Q9dGhpcy5yYj10aGlzLm1jPXRoaXMudWg9dGhpcy5rZD10aGlzLnB2PXRoaXMudWI9dGhpcy5GYj0hMTt0aGlzLnJjPVtdO3RoaXMuY2M9e307dGhpcy5zdD0yMDA7dGhpcy5CZj10aGlzLkNmPXRoaXMuamU9dGhpcy5BZj10aGlzLlplPSExO3RoaXMudmQ9e319Yy5kaz1iO2IucHJvdG90eXBlPXtvdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9CmF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sJGg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk91KCk7ZS52KGsuSG4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sS2U6ZnVuY3Rpb24oYSxiLGMsZil7dGhpcy51Yj1jO3ZhciBnPSExO2YmJmYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihnPSEwKTtpZih0aGlzLkwuVil0aGlzLmxmKyssZS5vYigibmV3U21hbGxBZElkIiksdGhpcy5MLmNwKCksZj1tLmdldENvbmZpZygpLHRoaXMuTC5VYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy4kaCgpLG5ldyBTKHRoaXMsYSx0aGlzLmxoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLApiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubGMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy4kaCgpLG5ldyBTKHRoaXMsYSx0aGlzLmxoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5MLmxjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Zi5RYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUmEoKTtlbHNle3ZhciB0Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0Yy5LZShhLGIsYyl9LDUwKX19LFZlOmZ1bmN0aW9uKGEpe2EuJGEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO3RoaXMuUGQ9dGhpcy5PYj10aGlzLmtkPSExO3RoaXMuYz1hO3RoaXMuQ3UodGhpcy5jKTt0aGlzLnZkPW5ldyBRYSh0aGlzLmMuUXYsdGhpcy52aWRlbyx7fSk7dGhpcy5MZyhhKTt0aGlzLnJjPXRoaXMuQ2coYSk7dGhpcy5rcCgpfSxMZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5GZD10aGlzLktxKGEpKSx0aGlzLkxnKGEucGFyZW50KSl9LENnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5DZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLnVxKGEpKSk7cmV0dXJuIGN9LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5VJiZhLlUuZ2V0QXR0cmlidXRlKXtiPWEuVS5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sS3E6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0iIjtpZihhLlUpe2I9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Zj1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLmtiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuJGEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYj0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGI9YS5lcnJvci5kZXRhaWwuY29kZSksYS5nZCYmYS5nZC5lcnJvciYmYS5nZC5lcnJvci5jb2RlJiYoYj1hLmdkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuUGMuY29kZTpiPT1HLldkLmNvZGU/ZS52KGsua3csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTooZS5MZSgpLGI9PUcuSmYuY29kZSYmZS52KGsuRHMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk7ZS52KGsuYnEsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSk7dGhpcy5QdSgpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS52KGsuUHYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5LZi5jb2RlOmUudihrLm93LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LlhkLmNvZGU6ZS52KGsudHcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy5UZC5jb2RlOmUudihrLkVzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5TZC5jb2RlOmUudihrLkx2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVtbXlhZCIpO2JyZWFrOwpjYXNlIHcuRGYuY29kZTplLnYoay5Ndix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5QYS5sZW5ndGg7KXRyeXt2YXIgYz1hLlBhLnBvcCgpO3RoaXMuSmUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LEN1OmZ1bmN0aW9uKGEpe3RoaXMub2U9ITE7dGhpcy5QYj10aGlzLmIuSzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5QYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTtpZihjJiZjLmVudnZhcnMpdHJ5e2I9Yy5lbnZ2YXJzKCkudmlkZW9TbG90LAp0aGlzLlplPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuS3g9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiZiLnNldEF0dHJpYnV0ZShnLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2ddKTt0aGlzLlJuJiZ0aGlzLnBsYXllci51ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIudWUoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuTy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5PW2NdLnR5cGUpJiYKdGhpcy5MbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuWmUmJmIubG9hZCgpO2lmKHRoaXMuV2goYikpe3RoaXMuTmgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuUG4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLlplP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2goayl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5ucCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSx0aGlzLkF1KCkpOnRoaXMuYy5vcmlnaW4udGcody5UZCl9LEF1OmZ1bmN0aW9uKCl7dGhpcy5BZj0hMDt0aGlzLnJiPXRoaXMubWM9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5sZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMucmI9ITApO2UubmUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4udmEmJmUuUW4odGhpcy5jLm9yaWdpbi52YSk7dGhpcy5OaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9RS5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi52aCgpO3RoaXMuYi5qZigpO2ZvcihhPXRoaXMuYi5LO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpOwphLnBhcmVudHx8dGhpcy5iLmpmKCk7dGhpcy50YT10aGlzLlBiPXRoaXMuYi5LO3RoaXMuZ2koInZwYWlkIik7aWYodGhpcy5yYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLktiKCJtdXRlZCIsImNvbnRlbnQiKTtlLnYoay50ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfXRoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLAoiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYy5OcSgpLGM9dGhpcy5jLkIuT3JpZ2luYWxBZFBhcmFtZXRlcnMsZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5jZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuTCk7dGhpcy5ILnNyYz1hO2UuZ2UoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYi5mLkFhJiYhdGhpcy5HZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsueWMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmIuJGIoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMucmM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdihhKTsKaWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5adigpLHRoaXMuYi4kYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuUGQ9ITA7ZS52KGsuamksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuRmUodGhpcy5PYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLiRiKCEwKSx0aGlzLmN3KCkpOyJBZFZpZGVvU3RhcnQiPT0KYS5kYXRhLm5hbWUmJih0aGlzLmIuJGIoITApLHRoaXMuZ3coKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZXcoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuZncoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5odygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5kdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5saSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5VYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5rZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXt0aGlzLkwuWmMmJihhPSJfYmxhbmsiKTt2YXIgYj13aW5kb3cub3BlbigiIiwKYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJ3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLnYoay5iZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiR2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5DZiYmKHRoaXMuQmY9ITEsdGhpcy5lYygpKSx0aGlzLmF3KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMucmI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLAohMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMucmI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGUudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfX0uYmluZCh0aGlzKSk7ZS5nZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTtlLmdlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7dGhpcy5iLiRmKGZ1bmN0aW9uKGEpe2UubWEodGhpcy5ILCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sJHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTsKdGhpcy50cmFjaygicGF1c2UiKTtlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5tYz0hMH0sYXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubWM9ITF9LGN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuV2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sWnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7CnRoaXMuT2goKTtlLnYoay5TZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxndzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxldzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLmtkPSEwO3RoaXMuWWEoImZpcnN0UXVhcnRpbGUiKTtlLnYoay5QZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxmdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5ZYSgibWlkcG9pbnQiKTtlLnYoay5VZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxodzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIik7ZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSl9LGR3OmZ1bmN0aW9uKCl7dGhpcy53ZigpO3RoaXMuWWEoImNvbXBsZXRlIil9LGxpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2UubmUoKTt0aGlzLkg9ITE7dGhpcy5SYShhKX19LFl2OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2c7IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGIubWF0Y2goYykpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLnYoay5pdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubGkoITApfSwKTG46ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7aWYoYi5VYSYmYi5pc0VuYWJsZWQmJiFiLkZjKCkpe3ZhciBkPWIuemEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWMoYix0aGlzLkwpO2Yub25lcnJvcj10aGlzLlZ2LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGMoYix0aGlzLkwpKX0sV2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFBuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmhpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKdGhpcy5paS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLndmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMueGYuYmluZCh0aGlzKSl9LEFkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmhpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmlpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy54Zi5iaW5kKHRoaXMpKX0saGk6ZnVuY3Rpb24oYSl7dGhpcy5WYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZifHx0aGlzLnlmKGEpfS5iaW5kKHRoaXMpLAp0aGlzLkdvKSl9LHlmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlljJiZ0aGlzLldoKHRoaXMudmlkZW8pJiYhdGhpcy5GYiYmIXRoaXMuVmIpe3RoaXMuWWM9ITA7dHJ5e2lmKCFlLlZhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkZifHwodGhpcy5GYj0hMCx0aGlzLkFkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5aYSgpLCEwKSx0aGlzLkwuc2d8fHRoaXMuTC5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLlJhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5aYSgpLCEwKX10aGlzLlN2KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIuamYoKTt0aGlzLlJ2KCk7dGhpcy5naSgpO3RoaXMuZGcoKTt0aGlzLmIudmgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMubWYoKX19LG1mOmZ1bmN0aW9uKCl7dGhpcy5lZHx8CnRoaXMuUWYoKX0sUWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy52aWRlby5wbGF5KCk7aWYoYiYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5lZHx8KGE/dGhpcy5SYSgpOih0aGlzLlBlKCEwKSx0aGlzLlFmKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmRjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmRjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5lZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubWYoKSl9LmJpbmQodGhpcyk7dGhpcy53ZSgpLkpoKHRoaXMpfSx3ZjpmdW5jdGlvbigpe3RoaXMuTC5qYiYmIXRoaXMuRmImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwKITApLHRoaXMuWWEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS52KGsuRm4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlJhKCl9LEluOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPSExLGY9MDtmPGEubGVuZ3RoO2YrKyljPWUuR2coYVtmXSksYi5wdXNoKGMpO2E9e2hhc2hlczpifTthPWsuVGEoYSx0aGlzLkEoKSk7ZS5NdShhKX0sUmE6ZnVuY3Rpb24oYSl7dGhpcy5jJiZ0aGlzLmMuUWQmJnRoaXMuSW4odGhpcy5jLlFkKTtpZighdGhpcy5vZSlpZih0aGlzLm9lPSEwLHRoaXMuUGR8fChlLnYoay5Icyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy50Ynx8dGhpcy5jLnBjKXtlLm9iKCJuZXdTbWFsbEFkSWQiKTt0aGlzLmxmKys7dGhpcy5WYj10aGlzLlljPSExO3RyeXt0aGlzLkFkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuRWQ9ITE7dHJ5e3RoaXMuYi5kaSgpfWNhdGNoKGcpe310aGlzLkdkPSEwO3RoaXMuYi5BZSgpO3RoaXMuYWM9ITE7dGhpcy53ZSgpLkVoKCk7dGhpcy5jLnRiJiZ0aGlzLmMub3JpZ2luLlFlKCk7dGhpcy5jLnBjJiYoYT90aGlzLmMub3JpZ2luLnBoKCk6dGhpcy5wZSgpKX1lbHNlIHRoaXMucGUoKX0sVnY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5BZCh0aGlzLnZpZGVvKSx0aGlzLnhmKGEpKX0seGY6ZnVuY3Rpb24oYSl7dGhpcy5WYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkwuYXAoKTsKdGhpcy5jLm9yaWdpbi50Zyh3LlRkKX0saWk6ZnVuY3Rpb24oKXtpZih0aGlzLnB2KXRoaXMuUmEoKTtlbHNle3RoaXMuYWM9ITA7dGhpcy5iLmYuQWEmJiF0aGlzLkdkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay55Yyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5zdihhKTtpZighdGhpcy5PYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5QZD0hMDtlLnYoay5qaSx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuRmUodGhpcy5PYil9Yz0iIjt0aGlzLmMua2YmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWgpKSYmKGM9dGhpcy5jLmtmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkVkfHwodGhpcy5FZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5XZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuYy50Yj8odGhpcy5WYj10aGlzLlljPSExLHRoaXMuQWQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuRWQ9ITEsdGhpcy5iLmRpKCksdGhpcy5jLm9yaWdpbi5RZSgpKTp0aGlzLlJhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLldjLnJlcGxhY2UoIlt0aW1lXSIsZS5CZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmVlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxhaTpmdW5jdGlvbigpe3RoaXMudWh8fCh0aGlzLnVoPSEwLHRoaXMua2R8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxzdjpmdW5jdGlvbihhKXtlLnYoay5iZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2E9PXRoaXMuYml8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmFpKCl9LmJpbmQodGhpcykpLHRoaXMuRmJ8fHRoaXMuT2goKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuTC5qYiYmdGhpcy5ZYSgic3RhcnQiKSxlLnYoay5TZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLGUudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMua2Q9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLnYoay5QZix0aGlzLmMuQiwKdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5ZYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5VZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksdGhpcy5iaT1hKX0sTmg6ZnVuY3Rpb24oYSxiKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iK2EsYiwhMCl9LE91OmZ1bmN0aW9uKCl7ZS5LZChbInN0YXRzX2hkX2FkX2NhbGw6IisKdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sT2g6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFB1OmZ1bmN0aW9uKCl7ZS5LZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFhhOmZ1bmN0aW9uKGEpe2UuS2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWWE6ZnVuY3Rpb24oYSl7KHRoaXMuQWZ8fHRoaXMuTC5qYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLlphKCksITApfSxLYjpmdW5jdGlvbihhLGIpe3RoaXMuTC5qYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkZiKXt0aGlzLnZkJiZ0aGlzLnZkLnRyYWNrJiZ0aGlzLnZkLnRyYWNrKGEpO2lmKCJtdXRlIj09CmF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5McSh0aGlzLmMuUGEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmplPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuRmQuaW1wcmVzc2lvbnMmJmUuRnIoZy51cmwsdGhpcy5GZC5pbXByZXNzaW9ucyk/dGhpcy5KZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuR24sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHthZElkOnRoaXMuRmQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkplKGcudXJsLGcudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmMuUGE9CnRoaXMudnAodGhpcy5jLlBhLGEpfWNhdGNoKG0pe319fSxaYTpmdW5jdGlvbigpe3ZhciBhPWUuVmEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLkFmJiYoYj0iX3ZwYWlkIik7dGhpcy5DZiYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxKZTpmdW5jdGlvbihhLGIsYyxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxjJiZiLktuKGMpLGZ8fChmPXRoaXMucmcpLGV8fChlPXRoaXMucmcpLHRoaXMuTW4oYSksdGhpcy5MLkRhKGIsZnVuY3Rpb24oKXt0aGlzLkRoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LE1uOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09Im9wZW4ifSxEaDpmdW5jdGlvbihhKXt0aGlzLmNjW2FdPSJjbG9zZWQifSxrcDpmdW5jdGlvbigpe3RoaXMuY2M9e319LFJ1OmZ1bmN0aW9uKCl7dmFyIGE9MCxiO2ZvcihiIGluIHRoaXMuY2MpdGhpcy5jYy5oYXNPd25Qcm9wZXJ0eShiKSYmCiJvcGVuIj09dGhpcy5jY1tiXSYmYSsrO3JldHVybiBhfSxMcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHZwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFN2OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Udi5iaW5kKHRoaXMpKX0sVHY6ZnVuY3Rpb24oKXtlLlZhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmVjKCk6dGhpcy5jLlViJiYoZS52KGsua2csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLlpjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPQp3aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5VYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuVWIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxSdjpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0KIiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5XYy5yZXBsYWNlKCJbdGltZV0iLGUuQmcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC4kYyYmKGI9dGhpcy5MLiRjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC4kYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sQ2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC4kYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYKKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxnaTpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMucnA7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuR2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWGguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkViO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ydi5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnF2LmJpbmQodGhpcykpOwpnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLk1oO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9CjEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLmtmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlZhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0KImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5CYT10aGlzLnRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi4kZihmdW5jdGlvbihhKXt0aGlzLkJhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5QZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGVjOmZ1bmN0aW9uKCl7dGhpcy5CYSYmImJsb2NrIj09dGhpcy5CYS5zdHlsZS5kaXNwbGF5fHx0aGlzLkJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxYaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuJGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxZaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMubWM/KGUubWEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLm1jPSExKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLm1jPSEwKX0sd2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuJGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEdoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKSl9LHF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxydjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMucmI/KGUubWEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGUudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSx4djpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsudGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGRjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmRjKTt0aGlzLmVkfHx0aGlzLmVlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5tZigpKX0scGU6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUuaGQoKTshdGhpcy5MLmxjfHxlLlZhKCl8fCFjLmlzQ2hyb21lJiYhYy5pc0ZpcmVmb3h8fGMuaXNFZGdlfHwKIShhfHwhdGhpcy5qZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy5zaHx8IXRoaXMuTC5SYyYmInNwaWVnZWwuZGUiIT1lLlpiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwicHJlcm9sbCIhPWUuQ2I/KHRoaXMuZWQ9ITAsdGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy5tZygpKToodGhpcy5zaD10aGlzLkNmPXRoaXMuQmY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5qZT0hMCxhPWUuY2coYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuS2UoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LG1nOmZ1bmN0aW9uKGEpe3RoaXMuUnUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCEwKX0uYmluZCh0aGlzKSx0aGlzLnN0KToodGhpcy5HZD0hMCx0aGlzLmIuQWUoKSx0aGlzLmIuY3UoKSx0aGlzLmFjPSExLAplLnYoay5xcCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMud2UoKS5FaCgpKX0sd2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sZGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZS5FZSh0aGlzLnZpZGVvLGEpP3RoaXMuR2goKTp0aGlzLndkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5yYyYmMDx0aGlzLnJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5yYykpO3RoaXMudmlkZW8mJgp0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuT28rIi0iK3RoaXMubGY7dGhpcy5jJiZ0aGlzLmMuSGcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkhnKCkpO3JldHVybiBhfSxyZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuZGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRqPXRoaXMuYVs0XTt0aGlzLlhzPXRoaXMuYVs3XTt0aGlzLlJtPXRoaXMuYVs5XTt0aGlzLk9yPXRoaXMuYVsxMF07dGhpcy5zbz10aGlzLmFbM107dGhpcy52aj10aGlzLmFbMV07dGhpcy5Ddj10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOF07dGhpcy5ubD10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX0KYy50bz1iO2IucHJvdG90eXBlPXtDajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRGo6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhzOnRoaXMuUW0oYSl9LFFtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5SbTp0aGlzLk5yKGEpfSxOcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuT3I6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNvOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52ajp0aGlzLkJ2KGEpfSxCdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ3Y6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmd0OnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qbDp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy50b3x8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuQ2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnFjPXRoaXMuc2M9ITE7dGhpcy52YT0iIjt0aGlzLnpmPSExO3RoaXMuU2c9IiI7ZCYmZC5lbXB0eT90aGlzLm5zKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRm09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuaGQoKSxiO2I9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKdmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLm9nKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8CiJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkhkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLkRhKGIsdGhpcy5tcy5iaW5kKHRoaXMpLAp0aGlzLmpzLmJpbmQodGhpcykpfSxEZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5LcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5XdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxLcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmCmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LG1zOmZ1bmN0aW9uKGEpe3RoaXMuTXQoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpOwp0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlNnPWEucmVzcG9uc2VVUkw7dGhpcy5ZLmxlbmd0aD90aGlzLkljKCk6dGhpcy5zYSh0aGlzLlNhKHcuUGMse2Vycm9yOnRoaXMuemY/Ry5XZDpHLklmfSkpfSxuczpmdW5jdGlvbihhKXt0cnl7dGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpO3RoaXMucWM9dGhpcy5UaCgpO3RoaXMuWS5sZW5ndGg/dGhpcy5JYygpOnRoaXMuc2EodGhpcy5TYSh3LlBjLHtlcnJvcjp0aGlzLnpmP0cuV2Q6Ry5JZn0pKX0sanM6ZnVuY3Rpb24oKXt0aGlzLnNhKHRoaXMuU2Eody5IZix7ZGVwdGg6YX0pKX0sSWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5NcigpP3RoaXMuZnYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5NZygpLGgse0FkU3lzdGVtOnRoaXMudHEoKSwKdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMuc2EodGhpcy5TYSh3LktmKSk6KGE9MCx0aGlzLkp2KCkmJnRoaXMuVmUodGhpcy5zcCgpKSl9LFFlOmZ1bmN0aW9uKCl7dGhpcy5zYz8odGhpcy5zYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5RZSgpfSxwaDpmdW5jdGlvbigpe3RoaXMucWM/KHRoaXMucWM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSWMoKSk6dGhpcy5wYXJlbnQucGgoKX0sSnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdigpP3RoaXMuYnYoKT8hMDooLTEhPXRoaXMuQ2MoKT90aGlzLnNhKHRoaXMuU2Eody5TZCkpOnRoaXMuc2EodGhpcy5TYSh3LkRmKSksITEpOih0aGlzLnNhKHRoaXMuU2Eody5QYyxHLkpmKSksITEpfSxWZTpmdW5jdGlvbihhKXt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5RZHx8KGEuUWQ9W10pO2EuUWQucHVzaCh0aGlzLlNnKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuTWUoKSk7CmEudGI9YS50Yj9hLnRiOnRoaXMuc2M7YS5wYz1hLnBjP2EucGM6dGhpcy5xYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7dGhpcy5wYXJlbnQuVmUoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLmR1cmF0aW9uPXRoaXMuQ2MoKTthLk89dGhpcy5KZygpO2EuVWI9dGhpcy52cSgpO2EuUXY9W107YS5vcmlnaW49dGhpczthLkI9dGhpcy5zcSgpO2Eua2Y9dGhpcy5KcShhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7cmV0dXJuIGF9LHNhOmZ1bmN0aW9uKGIpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPQp3LlNkLmNvZGU/Yi5QYS5jb25jYXQodGhpcy53cSgpKTpiLlBhLmNvbmNhdCh0aGlzLkVxKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuV2ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5zYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnNhJiZ0aGlzLnBhcmVudC5zYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sdGc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sZnY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxjdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuSmcoKS5sZW5ndGh9LGJ2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5DYygpfSxwZjpmdW5jdGlvbigpe3JldHVybiAxPAp0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxUaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMucGYoKSYmKGE9ITApO3JldHVybiBhfSxNdDpmdW5jdGlvbihhKXt0aGlzLnZhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy52YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuemY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sTXI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLk1nKCkubGVuZ3RofSxNZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LHRxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmUodGhpcy5VLAoiQWRTeXN0ZW0iKX0sTWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy4kZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5rYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LCRnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuJGcoYS5wYXJlbnROb2RlKTohMX0sRXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT0KYS50eXBlfSl9LHdxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx2cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxKZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxseDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5rYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8CjFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sc3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5uZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9CmJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LENjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxKcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkZ1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sdmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD8KdGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0seWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkZtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFyPXRoaXMuYVs2XTt0aGlzLmZvPXRoaXMuYVs2XTt0aGlzLnp3PXRoaXMuYVs5XTt0aGlzLktvPXRoaXMuYVsxMF07dGhpcy5kcz10aGlzLmFbMTBdO3RoaXMuRXA9dGhpcy5hWzVdO3RoaXMuR3A9dGhpcy5hWzZdO3RoaXMuc2o9CnRoaXMuYVsyXTt0aGlzLmNvPXRoaXMuYVs2XTt0aGlzLnFvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLkNwPWI7Yi5wcm90b3R5cGU9e3ByOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5xcjp0aGlzLmVvKGEpfSxlbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZm86dGhpcy55dyhhKX0seXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnp3OnRoaXMuSm8oYSl9LEpvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Lbzp0aGlzLmNzKGEpfSxjczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZHM6dGhpcy5EcChhKX0sRHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkVwOnRoaXMuRnAoYSl9LEZwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HcDp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNqOnRoaXMuYm8oYSl9LGJvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5jbzp0aGlzLnBvKGEpfSxwbzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnFvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5DcHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkI9dGhpcy5wYz10aGlzLnRiPSExO3RoaXMuQmU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkNlPSIifWMuUmw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sQ3E6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkdhKXt2YXIgYT10aGlzLm9yaWdpbi5HYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5CZT1hW2NdKX1yZXR1cm4gdGhpcy5CZX0sSGc6ZnVuY3Rpb24oKXtpZih0aGlzLkNlKXJldHVybiB0aGlzLkNlO3ZhciBhPSIiOyhhPXRoaXMuQ3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkNlPWF9LE5xOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5SbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2k9dGhpcy5hWzFdO3RoaXMuWW09dGhpcy5hWzldO3RoaXMuVnA9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNF19Yy5wdD1iO2IucHJvdG90eXBlPXtGaTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkdpOnRoaXMuWG0oYSl9LFhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ZbTp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLnB0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5GaSg0KTt2YXIgdz17WGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LERmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxQYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCk9hOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApPYToiTE9BRF9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LE53Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxTZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17SWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sT3c6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT209dGhpcy5hWzEwXTt0aGlzLm53PXRoaXMuYVsyXTt0aGlzLnJrPXRoaXMuYVs0XTt0aGlzLkFrPXRoaXMuYVs2XTt0aGlzLlVuPXRoaXMuYVs4XTt0aGlzLlVyPXRoaXMuYVsyXTt0aGlzLlFqPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzVdfWMuUms9YjtiLnByb3RvdHlwZT17Tm06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk9tOnRoaXMubHcoYSl9LGx3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5udzp0aGlzLnFrKGEpfSxxazpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnJrOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Bazp0aGlzLlRuKGEpfSxUbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVW46dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVyOnRoaXMuUGooYSl9LFBqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Rajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuUmt8fFhhLEljPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLk5tKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuZ2Q9Yjt0aGlzLlBhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5Faj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuRWp8fFVhO2M9CmN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5obD10aGlzLmFbNl07dGhpcy5tdD10aGlzLmFbMl07dGhpcy5MdD10aGlzLmFbN107dGhpcy5ndT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy5Hcz1iO2IucHJvdG90eXBlPXtnbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaGw6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm10OnRoaXMuS3QoYSl9LEt0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5MdDp0aGlzLmZ1KGEpfSxmdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZ3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLkdzfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZ2woNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLkZoPWE7dGhpcy52aWRlbz1iO3RoaXMuTmQ9W107dGhpcy5DaD1bXTt0aGlzLlJlPVtdO3RoaXMuVXY9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlhrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuRmgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5GaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LApnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2cuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgaz1nLmNvbnRlbnRXaW5kb3c7ay5HeD17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy4kdC5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5SdC5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuTmQucHVzaCh7c3JjOmMsZnJhbWU6Zyx0dDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LAp0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuUmUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5SZVtiXTtjLnR5cGU9PT1hJiZjLlZvKHRoaXMueHEoYSkpfX0seHE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7UHg6ITAsT3g6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7Q3g6InZpZGVvIixSeDoianNDdXN0b20iLFN4OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsVHg6MSxteDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLAphZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxNcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuTmQubGVuZ3RoO2IrKylpZih0aGlzLk5kW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuTmRbYl0udHQ7cmV0dXJuIiJ9LCR0OmZ1bmN0aW9uKGEsYil7dGhpcy5DaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5NcShiKSx2ZW5kb3I6Yn0pO3RoaXMuTnUoKX0sUnQ6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLlV2Lm1hcChmdW5jdGlvbihhKXt0aGlzLmFnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYWcoYSxiKX0sYWc6ZnVuY3Rpb24oYSxiKXt0aGlzLlJlLnB1c2goe3R5cGU6YSxWbzpiLE14OiExfSl9LE51OmZ1bmN0aW9uKCl7dGhpcy5DaC5tYXAoZnVuY3Rpb24oYSl7YS5Jcnx8CihhLkZ4KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5ReCxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuSXI9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWGt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhpPXRoaXMuYVs1XTt0aGlzLllpPXRoaXMuYVsxXTt0aGlzLlJwPXRoaXMuYVs1XTt0aGlzLkhrPXRoaXMuYVs1XTt0aGlzLmF0PXRoaXMuYVs4XTt0aGlzLml1PXRoaXMuYVszXTt0aGlzLm5rPXRoaXMuYVs0XTt0aGlzLiRxPXRoaXMuYVszXTt0aGlzLmZsPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy5pcj1iO2IucHJvdG90eXBlPXt3aTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueGk6dGhpcy5YaShhKX0sClhpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZaTp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUnA6dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhrOnRoaXMuJHMoYSl9LCRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaXU6dGhpcy5tayhhKX0sbWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5rOnRoaXMuWnEoYSl9LFpxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kcTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmlyfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2Mud2koNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5pYj1hLkVnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuYmc9ITE7dGhpcy5UYj1bXX1jLm9qPWI7Yi5wcm90b3R5cGU9e3JxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZT0wLGI9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUsCnk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnJxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5hcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmCihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sVXU6ZnVuY3Rpb24oKXt0aGlzLmJnPSEwfSxkaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sdmg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay55Yyx0aGlzLmYucygpKX0sY3U6ZnVuY3Rpb24oKXt0aGlzLmJnfHwodGhpcy5mLnBsYXkoKSxlLnYoay5kZCx0aGlzLmYucygpKSl9LGpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9CiJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5pYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuaWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5pYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmliLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaWIpO3RoaXMuZi5MYyYmdGhpcy5mLkxjKCk/dGhpcy5mLkVnKCkuYXBwZW5kQ2hpbGQodGhpcy5LKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy4kYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sCmFyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxqcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LCRiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuanEodGhpcy5pYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmCjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQWUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLkxjKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLksuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5UYi5sZW5ndGg7YSsrKXRoaXMuVGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5QaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLiRiLmJpbmQodGhpcyksMTApfSwkZjpmdW5jdGlvbihhKXt0aGlzLlRifHwKKHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEFlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMub2p8fCRhLEU9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuYWEoMTApO04uY29udHJvbHM9ITA7RS5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCkEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1vPXRoaXMuYVsyXTt0aGlzLmRqPXRoaXMuYVs5XTt0aGlzLkR3PXRoaXMuYVs3XTt0aGlzLmpqPXRoaXMuYVsyXTt0aGlzLkNpPXRoaXMuYVs1XTt0aGlzLlZzPXRoaXMuYVszXTt0aGlzLnBsPXRoaXMuYVs3XTt0aGlzLmJzPXRoaXMuYVsyXTt0aGlzLnZ3PXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuRW09YjtiLnByb3RvdHlwZT17bG86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1vOnRoaXMuY2ooYSl9LGNqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kajp0aGlzLkN3KGEpfSxDdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRHc6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmpqOnRoaXMuQmkoYSl9LEJpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DaTp0aGlzLlVzKGEpfSwKVXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZzOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wbDp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYnM6dGhpcy51dyhhKX0sdXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnZ3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5FbXx8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMubG8oNCk7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLAphPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5CZChiKTt0aGlzLnBnKCl9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LApEZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5DbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuQmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7dGhpcy5TYj10aGlzLlNifHwhMTt0aGlzLlRmPXRoaXMuVmY9dGhpcy5XZz10aGlzLmVhPXRoaXMuc2Y9CiExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuaHEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnNmPSEwO3RoaXMuV2cmJnRoaXMuamcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLmFjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuYmQoKTt0aGlzLldnPSEwO3RoaXMuamcoKX0uYmluZCh0aGlzKSk7dGhpcy5mZygpfSwKamc6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5iZCgpO2lmKCF0aGlzLnNmJiYhdGhpcy5iZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuc2YmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0sYmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLktnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LEtnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGZnOmZ1bmN0aW9uKCl7aWYodGhpcy5iZCgpKXt2YXIgYj10aGlzLktnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdOwp0aGlzLlZmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9Yi5qeH10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LG54OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkF4KCk6ITF9LENjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5DYygpOi0xfSxGcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxocTpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy51KCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwKMTAwKX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5EZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkZxKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuQmx8fGRiOyhmdW5jdGlvbihjKXtjLkRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sSnI6ZnVuY3Rpb24oKXt3aW5kb3cuT08uWGwudm4udG4/d2luZG93Lk9PLlhsLnZuLnRuLmh4KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpyKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9CmRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnhlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMuRGx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaz10aGlzLmFbOV07dGhpcy55az10aGlzLmFbN107dGhpcy5haz10aGlzLmFbMTBdO3RoaXMuZmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5Pcz1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRms6CnRoaXMueGsoYSl9LHhrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy55azp0aGlzLiRqKGEpfSwkajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYWs6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5Pc3x8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuRWsoNCk7KGZ1bmN0aW9uKGMpe2MuU2k9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMTt0aGlzLk5nKCl9LE5nOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTsKYnx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sCk5hOmZ1bmN0aW9uKCl7dGhpcy55aCgpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuU2l8fGhiOyhmdW5jdGlvbihjKXtjLlJpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMucmEoKTp0aGlzLm0oKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmdnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2coYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGliPWMuUml8fGliOyhmdW5jdGlvbihjKXtjLlRpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sQmg6ZnVuY3Rpb24oYil7Yj1uZXcgaGIoYik7Yi5uYT90aGlzLlQoKTp0aGlzLk4oYil8fAooYi5CZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5pcXx8KHRoaXMuaXE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkJoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5CaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGpiPWMuVGl8fGpiLFQ9bmV3IGpiKHIpO1QuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy55bT10aGlzLmFbMl07dGhpcy5jcj10aGlzLmFbMl07dGhpcy56dj10aGlzLmFbNF07dGhpcy5Haj10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLmxsPWI7Yi5wcm90b3R5cGU9e3htOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy55bTp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3I6dGhpcy55dihhKX0seXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnp2OnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR2o6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5sbHx8a2IsTmM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMueG0oNCk7KGZ1bmN0aW9uKGMpe2Mubm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sTGM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ubXx8VTsoZnVuY3Rpb24oYyl7Yy5tbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlZjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eC5WYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLk1zKGEpfS5iaW5kKHRoaXMpKTt4LlZjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3guVmMoIiMiK2IsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTsKeC5UcSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufX10aGlzLnUoImFkZXJyb3IiLGEpO3RoaXMuRygpfX0pfSkoYyk7dmFyIFY9Yy5tbXx8VjsoZnVuY3Rpb24oYyl7Yy5vbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMudWQmJihiPWUud3AoYix0aGlzLnVkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5SKGQpO3ZhciBmPW5ldyBWKGQsdGhpcy5JKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy51ZHx8KHRoaXMudWQ9W10pLHRoaXMudWQucHVzaChiW2FdKSxkPW5ldyBVKGcpLHRoaXMuTihkKXx8KHRoaXMuUihkKSxmPW5ldyBWKGQsdGhpcy5JKSwKZi5nKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxWYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSxndjpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmRhfHx0aGlzLmRhJiYhdGhpcy5kYVthXSl0aGlzLkhjfHwodGhpcy5IYz1bXSksdGhpcy5IYy5wdXNoKGIpLHRoaXMuYnUoKSYmKHRoaXMuYmYoKSx0aGlzLmcoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5kYVthXVtjXSYmMDx0aGlzLmRhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuZGFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmRhW2FdW2NdW2RdKGIpfX0sVHE6ZnVuY3Rpb24oKXtpZih0aGlzLkhjKWZvcih2YXIgYj0KMDtiPHRoaXMuSGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5IY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmRhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5kYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnguZ3YoYil9fSl9KShjKTt2YXIgbGI9Yy5vbXx8bGIseD1uZXcgbGIocik7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ocj10aGlzLmFbOF07dGhpcy5vdD10aGlzLmFbOV07CnRoaXMuWHA9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMuQW49YjtiLnByb3RvdHlwZT17Z3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ocjp0aGlzLm50KGEpfSxudDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub3Q6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5Bbnx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuZ3IoNCk7KGZ1bmN0aW9uKGMpe2MuT2k9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7CnZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLk9pfHxuYjsoZnVuY3Rpb24oYyl7Yy5QaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTsKdmFyIG9iPWMuUGl8fG9iOyhmdW5jdGlvbihjKXtjLlFpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkkpKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuUWl8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy56cj10aGlzLmFbMl07dGhpcy5ObD10aGlzLmFbN107dGhpcy5Ucz10aGlzLmFbMV07dGhpcy5qcD10aGlzLmFbM107dGhpcy5Xbj10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsyXX1jLmptPWI7Yi5wcm90b3R5cGU9e3lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cjp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTmw6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRzOnRoaXMuaXAoYSl9LGlwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qcDp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlduOnRoaXMuaShhKX0sCmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIHJiPWMuam18fHJiLFBjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLnlyKDQpOyhmdW5jdGlvbihjKXtjLnJsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5XKGIpO3RoaXMuWihhKTt0aGlzLlF0KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LApwbGF5OmZ1bmN0aW9uKCl7fSxRdDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnBhdXNlJiZ0aGlzLmphLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnJlc3VtZSYmdGhpcy5qYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEubXV0ZSYmdGhpcy5qYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LApmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS51bm11dGUmJnRoaXMuamEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxYZzpmdW5jdGlvbihiKXt0aGlzLmphPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBzYj1jLnJsfHxzYjsoZnVuY3Rpb24oYyl7Yy5xbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubWk9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMubWkmJih0aGlzLkcoKSx0aGlzLm1pPSEwLHRoaXMub2EoKSk7YS5LYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgdGI9Yy5xbHx8dGI7KGZ1bmN0aW9uKGMpe2Muc2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZzpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYj1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgc2IoYltkXSksdGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgdGIoYyx0aGlzLkkpKS5nKCkpfX1lbHNlIHRoaXMuVCgpfX0pfSkoYyk7dmFyIHViPWMuc2x8fHViLFc9bmV3IHViKHIpO1cuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRvPXRoaXMuYVs0XTt0aGlzLnVsPXRoaXMuYVs2XTt0aGlzLmxrPXRoaXMuYVs4XTt0aGlzLlNxPXRoaXMuYVsxMF07dGhpcy5Uaz10aGlzLmFbN107dGhpcy5Tcj10aGlzLmFbN107dGhpcy5Kcz10aGlzLmFbM107dGhpcy5ucT10aGlzLmFbOF07CnRoaXMuc3I9dGhpcy5hWzEwXTt0aGlzLkJ3PXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy52aT1iO2IucHJvdG90eXBlPXtDbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRG86dGhpcy50bChhKX0sdGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVsOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sazp0aGlzLlJxKGEpfSxScTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU3E6dGhpcy5TayhhKX0sU2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRrOnRoaXMuUnIoYSl9LFJyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Tcjp0aGlzLklzKGEpfSxJczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSnM6dGhpcy5tcShhKX0sbXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm5xOnRoaXMucnIoYSl9LHJyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zcjp0aGlzLkF3KGEpfSxBdzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkJ3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy52aXx8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UWMuQ28oNCk7KGZ1bmN0aW9uKGMpe2MuTG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LAp1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlg/KDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgd2I9Yy5MbXx8d2I7KGZ1bmN0aW9uKGMpe2MuS209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLApiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxPdDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuZWJ8fCh0aGlzLmViPVtdKTt0aGlzLmViLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5yYSgpOnRoaXMudSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTsKdGhpcy5DYT90aGlzLk90KHRoaXMuQ2EpOih0aGlzLkNhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5DYSl7dGhpcy5HKCk7cmV0dXJufWlmKCF0aGlzLnRjKXt0aGlzLkcoKTtyZXR1cm59Yj0hMDtpZih0aGlzLmViJiZ0aGlzLmViLmxlbmd0aCYmMTx0aGlzLmViLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuZWIubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuZWJbYV0mJjMwMyE9dGhpcy5lYlthXSYmNDAzIT10aGlzLmViW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5LbXx8eGI7KGZ1bmN0aW9uKGMpe2MuTW09CnQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgd2IoYi5pdGVtKGEpKTt0aGlzLk4oYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLlIoYyksKG5ldyB4YihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgeWI9Yy5NbXx8eWIsemI9bmV3IHliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZvPXRoaXMuYVsyXTt0aGlzLiRyPXRoaXMuYVs2XTt0aGlzLldyPXRoaXMuYVsxMF07dGhpcy5pdj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5QbT1iO2IucHJvdG90eXBlPXtFbzpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLkZvOnRoaXMuWnIoYSl9LFpyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kcjp0aGlzLlZyKGEpfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3I6dGhpcy5odihhKX0saHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLml2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy5QbXx8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMuRW8oNCk7KGZ1bmN0aW9uKGMpe2MuZG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlcoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pOwp0aGlzLldlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5FdCgpfS5iaW5kKHRoaXMpLDUwMCl9LEV0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuV2UmJgp3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLldlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sUXU6ZnVuY3Rpb24oKXt0aGlzLldlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgQmI9Yy5kbXx8QmI7KGZ1bmN0aW9uKGMpe2MuY209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKTt0aGlzLmtjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLnVzPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5rY3x8KHRoaXMua2M9CjAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8Cih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMua2N8fHRoaXMua2MrKyx0aGlzLmtjPD10aGlzLnVzPyh0aGlzLmtjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5RdSgpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLAoxMDApfX0pfSkoYyk7dmFyIENiPWMuY218fENiOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IEJiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsdGhpcy5JKSkuZygpKSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgRGI9Yy5lbXx8RGIsRWI9bmV3IERiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuTHc9CmI7Yi5wcm90b3R5cGU9e2pyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5rcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEZiPWMuTHd8fEZiLFNjPW5ldyBGYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLmpyKDQpOyhmdW5jdGlvbihjKXtjLlpsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMuWmx8fEdiOyhmdW5jdGlvbihjKXtjLllsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5LYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMub3AoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5tZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMuZXMoKTp0aGlzLmlnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksCjFFMyl9LG9wOmZ1bmN0aW9uKCl7dGhpcy5SZigpfHx0aGlzLm0oITApfSxlczpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWQoKTshYi5xYSYmYi5ZJiZiLmd4JiZiLml4JiYodGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSgpKX0saWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZygpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGgpZm9yKHZhciBiPQpsLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5LYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy50aD1iW2NdKTtyZXR1cm4gdGhpcy50aH0sQng6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubWQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5ZbHx8SGI7KGZ1bmN0aW9uKGMpe2MuJGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0KMDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEdiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBIYihjLHRoaXMuSSkpLmcoKSl9cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBJYj1jLiRsfHxJYixKYj1uZXcgSWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueWw9dGhpcy5hWzRdO3RoaXMubXA9dGhpcy5hWzVdO3RoaXMudXY9dGhpcy5hWzEwXTt0aGlzLldpPXRoaXMuYVszXTt0aGlzLktpPXRoaXMuYVszXTt0aGlzLllxPXRoaXMuYVsyXTt0aGlzLmJuPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzEwXX1jLkF2PWI7Yi5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLm1wOnRoaXMudHYoYSl9LHR2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51djp0aGlzLlZpKGEpfSxWaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuV2k6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktpOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ZcTp0aGlzLmFuKGEpfSxhbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLkF2fHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy54bCg0KTsoZnVuY3Rpb24oYyl7Yy5Waz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7CkgmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sCkFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxMYzpmdW5jdGlvbigpe3JldHVybiEwfSxLYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Wa3x8WDsoZnVuY3Rpb24oYyl7Yy5Vaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5YZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhlPQpiLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlhlJiZiIT10aGlzLlhlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuZmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLkh4KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy51KCJhZGVycm9yIiksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFk9Yy5Va3x8WTsoZnVuY3Rpb24oYyl7Yy5Xaz0KdC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWChiKSxiLm5hP3RoaXMuYmYoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksCmIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuV2t8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWk9dGhpcy5hWzddO3RoaXMuV209dGhpcy5hWzRdO3RoaXMuem49dGhpcy5hWzZdO3RoaXMuTm89dGhpcy5hWzddO3RoaXMuSXc9dGhpcy5hWzFdO3RoaXMua289dGhpcy5hWzhdO3RoaXMubXU9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOV19Yy5KbT1iO2IucHJvdG90eXBlPXtEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRWk6dGhpcy5WbShhKX0sVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldtOnRoaXMueW4oYSl9LHluOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy56bjp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5IdyhhKX0sSHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5Jdzp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmtvOnRoaXMubHUoYSl9LGx1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5tdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLkptfHxOYixVYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5EaSg0KTsoZnVuY3Rpb24oYyl7Yy5Vaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LApudTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sRXg6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgT2I9Yy5Vanx8T2I7KGZ1bmN0aW9uKGMpe2MuVGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGEpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk7Yi5PbigiZmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oInRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5vYSgpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgUGI9Yy5Uanx8UGI7KGZ1bmN0aW9uKGMpe2MuVmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yayYmCndpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycyl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yay5HZXRBbGxQbGF5ZXJzKCk7aWYoYiYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX19dGhpcy5UKCl9fSl9KShjKTt2YXIgUWI9Yy5Wanx8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklwPXRoaXMuYVs3XTt0aGlzLm5uPXRoaXMuYVs5XTt0aGlzLmJtPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzFdfWMuUnM9YjtiLnByb3RvdHlwZT17SHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JcDp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLm5uOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLlJzfHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5IcCg0KTsoZnVuY3Rpb24oYyl7Yy5kbj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSwKTGQ6ZnVuY3Rpb24oYil7dmFyIGE9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LFB0OmZ1bmN0aW9uKCl7dGhpcy5SZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuTGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUmR8fCh0aGlzLlJkPSEwLHRoaXMuTGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LApwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxBYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuZG58fFRiOyhmdW5jdGlvbihjKXtjLmNuPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFR0OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSwKYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWQoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmFkKGEpfS5iaW5kKHRoaXMpKX0sYWQ6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7CmEuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMudSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5tKCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxOZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5hZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTmYuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5UdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLk5mKCk7dGhpcy5TdCgpfSxTdDpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsCnRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuTnQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5OdD0hMH19KX0pKGMpO3ZhciBVYj1jLmNufHxVYjsoZnVuY3Rpb24oYyl7Yy5lbj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLlB0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTsKdmFyIFZiPWMuZW58fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenA9dGhpcy5hWzNdO3RoaXMuemo9dGhpcy5hWzddO3RoaXMuVHA9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMTBdfWMuS2w9YjtiLnByb3RvdHlwZT17eXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpwOnRoaXMueWooYSl9LHlqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56ajp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLktsfHxYYixXYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1XYy55cCg0KTsKKGZ1bmN0aW9uKGMpe2Mudm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy53aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLkJzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxudTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLAphPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQnN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMud2gmJih0aGlzLndoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE89Yy52bXx8TzsoZnVuY3Rpb24oYyl7Yy51bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5EYisrLDE1PHRoaXMuRGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnp1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSwKaGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLnVtfHxQOyhmdW5jdGlvbihjKXtjLndtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuYmYoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLndtfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudGs9CnRoaXMuYVs4XTt0aGlzLm12PXRoaXMuYVs0XTt0aGlzLnhuPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTnM9YjtiLnByb3RvdHlwZT17c2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRrOnRoaXMubHYoYSl9LGx2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tdjp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5Oc3x8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuc2soNCk7KGZ1bmN0aW9uKGMpe2MuS2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpOwp2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5XKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5La3x8WjsoZnVuY3Rpb24oYyl7Yy5Kaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkVjPXRoaXMuQ2E9dGhpcy5YYz0hMTt0aGlzLkFoPWUuSGIoMTApO3RoaXMuYmgoKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiYKYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnFhPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5xYigpLCEwO3RoaXMuVGcrKztpZigxMDx0aGlzLlRnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmguYmluZCh0aGlzKSwxMDApLCExfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT0KYXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITB9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkprfHxhYTsoZnVuY3Rpb24oYyl7Yy5Maz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYKMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLkxrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQm89dGhpcy5hWzhdO3RoaXMuQ249dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMl19Yy5zaT1iO2IucHJvdG90eXBlPXtBbzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkJvOnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGNjPWMuc2l8fGNjLFljPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVljLkFvKDQpOyhmdW5jdGlvbihjKXtjLkxqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBkYz1jLkxqfHxkYzsoZnVuY3Rpb24oYyl7Yy5Laj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5oZygpfSxoZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuS2p8fGVjOyhmdW5jdGlvbihjKXtjLk1qPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmCndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgZGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubmEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7KG5ldyBlYyhiLHRoaXMuSSkpLmcoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGZjPWMuTWp8fGZjLGdjPW5ldyBmYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdz10aGlzLmFbMl07dGhpcy5Zbj10aGlzLmFbOF07dGhpcy5wcT10aGlzLmFbNl07dGhpcy5Caj10aGlzLmFbOF07dGhpcy5Oaz10aGlzLmFbMl07dGhpcy5uaj10aGlzLmFbOF07dGhpcy5pbz10aGlzLmFbM107dGhpcy5ydD10aGlzLmFbOF07dGhpcy5OaT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmt1PWI7Yi5wcm90b3R5cGU9e3J3OmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuc3c6dGhpcy5YbihhKX0sWG46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlluOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5wcTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQmo6dGhpcy5NayhhKX0sTWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk5rOnRoaXMubWooYSl9LG1qOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5uajp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaW86dGhpcy5xdChhKX0scXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnJ0OnRoaXMuTWkoYSl9LE1pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5OaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMua3V8fGhjLFpjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5ydyg0KTsoZnVuY3Rpb24oYyl7Yy5waT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5waXx8aWM7KGZ1bmN0aW9uKGMpe2Mub2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubGUoKTt0aGlzLmVnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmVnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGUuYmluZCh0aGlzKSwxMDApfSxsZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxlLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIGpjPWMub2l8fGpjOyhmdW5jdGlvbihjKXtjLnJpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj0KbmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMucml8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xbT10aGlzLmFbNl07dGhpcy5jaz10aGlzLmFbMV07dGhpcy5acz10aGlzLmFbMTBdO3RoaXMucW49dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5rbD1iOwpiLnByb3RvdHlwZT17cG06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnFtOnRoaXMuYmsoYSl9LGJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5jazp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWnM6dGhpcy5wbihhKX0scG46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5rbHx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMucG0oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZWg9dGhpcy5naD10aGlzLmZoPSExO3RoaXMueGQ9W107dGhpcy5hZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuVGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5HcShhKTpbXSxiO3RoaXMuZ2g9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZmg9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuSGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmFmKXtpZih0aGlzLmVoKWJyZWFrO2I9dGhpcy5hZltjXTt0aGlzLnZmKGIpJiYodGhpcy54ZC5wdXNoKGIpLHRoaXMuSGgoYikpfX0sdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgp0PyEwOiExfSxHcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5hZltjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEhoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSxTdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZmgpZm9yKHRoaXMuZWg9ITAsYT0wO2E8dGhpcy54ZC5sZW5ndGg7YSsrKXRoaXMueGRbYV0uTGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54ZFthXS5MYil9fX0pKGMpO3ZhciBuYz1jLlRsfHxuYyxNPW5ldyBuYztNLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vcj10aGlzLmFbMTBdO3RoaXMuaXQ9dGhpcy5hWzFdO3RoaXMuQXQ9dGhpcy5hWzVdO3RoaXMuR2w9dGhpcy5hWzEwXTsKdGhpcy53cz10aGlzLmFbOV07dGhpcy5Rcz10aGlzLmFbNV07dGhpcy5tcj10aGlzLmFbN107dGhpcy5IdT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs3XX1jLmZxPWI7Yi5wcm90b3R5cGU9e25yOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vcjp0aGlzLmh0KGEpfSxodDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaXQ6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkF0OnRoaXMuRmwoYSl9LEZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HbDp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud3M6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFzOnRoaXMubHIoYSl9LGxyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5tcjp0aGlzLkd1KGEpfSxHdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuajphfX19KShjKTt2YXIgb2M9Yy5mcXx8b2MsYWQ9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9YWQubnIoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuQmMoay5LdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOgotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkJjKGsuRnMpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtGLndpZHRoPTE7Ri5oZWlnaHQ9MTtGLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgYmQ9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgST1uZXcgSixsPSExO0kua2EoKTtJLllnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5rYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuWWcoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTtJLmthKCk7CnZhciBjZD1iZChmdW5jdGlvbigpe2UueWcod2luZG93LEkuQXIoKSx7aWQ6Y2R9KX0sNTAwKSxpYT1lLmFhKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd0PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuTnA9YjtiLnByb3RvdHlwZT17dnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnd0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5OcHx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQudnQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnhoPXRoaXMuY29uZj10aGlzLmxiPXRoaXMucGxheWVyPW51bGw7dGhpcy5zZD0wOwp0aGlzLmJiPSIiO3RoaXMueWQ9W107dGhpcy56ZD0wO3RoaXMuemg9ITE7dGhpcy5ZZT1bXTtlLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy50aT1iO2IucHJvdG90eXBlPXt2dTpmdW5jdGlvbihhKXt0aGlzLnhoPWF9LGdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0scXU6ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSxwdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxNYzpmdW5jdGlvbihhLGIpe2UuZmEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5CcigpKXRoaXMubGIubCh0aGlzLmxiLm9kLHRoaXMubGIud2EsdGhpcy5sYi4kZSxmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmxiLkFjKTtlbHNlIGlmKHRoaXMuVnEoKSl0aGlzLmp1KGZ1bmN0aW9uKCl7dGhpcy5NYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsueWMsdGhpcy5wbGF5ZXIucygpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLlV1KCk7bC5leGl0RnVsbHNjcmVlbigpO2Uub2IoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLmxiLApnKTtsLm91KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy50cyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkllJiYoYz10aGlzLnBsYXllci5JZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5LZShhLGMsZik7dGhpcy5wbGF5ZXIuSmgobCl9fSxCcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnNkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuc2QuZ2V0VGltZSgpLHRoaXMuc2Q9YSwzRTU8Yj8hMDohMTt0aGlzLnNkPWE7cmV0dXJuITF9LEV1OmZ1bmN0aW9uKCl7ZS5vYigicHJlcm9sbCIpO2UuZmYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMudWcoYSkpP3RoaXMuTWMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX0sRHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueGgpe2UuZmYoInBvc3Ryb2xsIik7ZS5vYigicG9zdHJvbGwiKTt0aGlzLnZ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnVnKGMpKT90aGlzLk1jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX19LHVnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxXdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLkJ1KHRoaXMuRHUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5vYigibWlkcm9sbCIpO2UuZmYoIm1pZHJvbGwiKTtpZighdGhpcy5taCl7dGhpcy5taD0hMDt2YXIgYj10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5NYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5taD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5kZCwKdGhpcy5wbGF5ZXIucygpKSl9fSxWdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnV1KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmUoKX0sZzpmdW5jdGlvbigpe3RoaXMuRXUoKTt0aGlzLnBsYXllci5OZSYmdGhpcy5WdCgpO3RoaXMuV3QoKX0sWHQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy55ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuR3coYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnpkPXRoaXMueWQubGVuZ3RofSxWcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy56ZCYmKGE9ITApO3JldHVybiBhfSwKanU6ZnVuY3Rpb24oYSl7dGhpcy56aD1hO2ZvcihhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXVsiZnVuY3Rpb24iXSh0aGlzLkl0LmJpbmQodGhpcykpfSxJdDpmdW5jdGlvbihhKXt0aGlzLnpkLS07YSYmdGhpcy5ZZS5wdXNoKGEpOzA+PXRoaXMuemQmJnRoaXMuemgoKX0sdHM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWWUubGVuZ3RoO2MrKyliPXRoaXMuWWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWms9dGhpcy5hWzhdO3RoaXMuJG09dGhpcy5hWzhdO3RoaXMuUWw9dGhpcy5hWzNdO3RoaXMuYXE9dGhpcy5hWzddO3RoaXMuZXU9dGhpcy5hWzFdO3RoaXMuTHM9dGhpcy5hWzhdO3RoaXMuUGs9CnRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzVdfWMuSW89YjtiLnByb3RvdHlwZT17WWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlprOnRoaXMuWm0oYSl9LFptOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy4kbTp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUWw6dGhpcy4kcChhKX0sJHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFxOnRoaXMuZHUoYSl9LGR1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZXU6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxzOnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuSW98fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Zayg0KX0pLmNhbGwoUGVpZm94b2hPdWNoYW5nYSxQZWlmb3hvaE91Y2hhbmdhKTsK
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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:39 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=4620614167
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBlaWZveG9oT3VjaGFuZ2E9UGVpZm94b2hPdWNoYW5nYXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVGV8fCh4LlRlPTApO3guVGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5UZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5UbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay55YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuZ2YoYyk7YS5xdShtKTthLnB1KGwpO2EuWHQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS55dSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5raC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUua2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQW09dGhpcy5hWzhdO3RoaXMuRXY9dGhpcy5hWzddO3RoaXMuU2o9dGhpcy5hWzldO3RoaXMuS3A9dGhpcy5hWzRdO3RoaXMuam49dGhpcy5hWzddO3RoaXMuWG89dGhpcy5hWzNdO3RoaXMucGs9dGhpcy5hWzldO3RoaXMuem89dGhpcy5hWzZdO3RoaXMuUW89dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNl19Yy50bT1iO2IucHJvdG90eXBlPXt6bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQW06dGhpcy5EdihhKX0sRHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkV2OnRoaXMuUmooYSl9LFJqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Tajp0aGlzLkpwKGEpfSxKcDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLktwOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qbjp0aGlzLldvKGEpfSxXbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWG86dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5wazp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpvOnRoaXMuUG8oYSl9LFBvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMudG18fGhhLHNjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLnptKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlRvPSExO3RoaXMuQ2I9InNldHVwIjt0aGlzLk5jPVtdO3RoaXMubmUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuSHQuYmluZCh0aGlzKSk7dGhpcy5uYj17fTt0aGlzLlJnPXt9O3RoaXMuZGY9ITF9Yy5maz1iO2IucHJvdG90eXBlPXtUdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5uYil0aGlzLm5iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm5iW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5kZnx8KHRoaXMuZGY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmRmfSxvYjpmdW5jdGlvbihhKXt0aGlzLm5iW2FdfHwodGhpcy5uYlthXT0wKTt0aGlzLm5iW2FdKz0xOzU8dGhpcy5uYlthXSYmIXRoaXMuUmdbYV0mJih0aGlzLlJnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuVHUoKSwhMCkpfSxuZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LApldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUW46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEh0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLkd0KGEuZGF0YSl9LEd0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCwKZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGdlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LG9nOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR2coYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmpoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxHZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsKaWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sTm46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLnFxKGEpKXJldHVybjsoYj10aGlzLm9nKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0scXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sCndnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxMcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx4ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEZnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxQaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50OwpyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxFZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLHE9MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCoKZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5FZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmUoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHplOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sS2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt5PWs7dT1tO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKHEsNSkrKG5eCnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKG0pK2IobCkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxIcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGhkOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT0KbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17TGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sZnI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sRWw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sVW06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LApRazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LGltOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sSG86ZnVuY3Rpb24oKXtyZXR1cm4gYS5MaSgpfHxhLlVpKCl8fGEuZnIoKXx8YS5FbCgpfHxhLlVtKCl8fGEuUWsoKXx8YS5pbSgpfX07cmV0dXJuIG51bGwhPWEuSG8oKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxaYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxmYTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxJcTpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sd3A6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sRnU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQmc6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmNpKGIpKyI6Iit0aGlzLmNpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5DYj1hfSx5ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkNiO3RoaXMuY2UoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTsKYS5kaXNwYXRjaEV2ZW50KGYpfSxCYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMueWcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5CYyhCKX0sSnQ6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTsKYi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5JcSgpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LE11OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5ZYigpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuY2UoYSl9LGNlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSnQoYSk7aWYoYilpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2UoYil9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLkpjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9bS5KYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYik7Cm0ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxLZDpmdW5jdGlvbihhKXtpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGIsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLkpjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LExlOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLmJwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxlKCl9LmJpbmQodGhpcyksNTAwKX0sdmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmtiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx5ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sa2I6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5uZChhKToiIn0sbmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy55ZShhKTsKYiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxjZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuR2UoYSl8fHRoaXMuTHIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5jZiYmd2luZG93LnNhbmRib3guY2ZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5jZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5jZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy53ZyhhKSlyZXR1cm4gdGhpcy53ZyhhKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5hYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIucWQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuTm4oZSxhKTtyZXR1cm4gZX0sYWI6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyxrKXt2YXIgbD1lfHxtO2U9ITA7ayYmKGU9ITEpO2lmKGwmJmwuVilpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihhLGIsZCxmLGMsbCxnLGspfS5iaW5kKHRoaXMpLDUwMCl9LGpoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxsczpmdW5jdGlvbihhLGIsZCl7dGhpcy5qaChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5OYylmb3IodmFyIGMgaW4gdGhpcy5OYylhPWEuc3BsaXQoYykuam9pbih0aGlzLk5jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS54YihhKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxraDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGEsZi5MYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMubHMoZi5xZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCnl1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk5jPWF9LEd3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5hYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sRnI6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9fX0pKGMpO3ZhciBRPWMuZmt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPQphfHx7fX1jLmVrPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IudXQ9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuRXM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iua3c9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5icT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnR3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWGY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuUGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5VZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5ZZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuRm49e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuU2Y9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5Qdj17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuY3E9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5vdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5rZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnFwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5kZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLnljPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5XZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuSG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5VYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuJGQ9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuYmU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLkduPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5qaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLkhzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5sZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuaXc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTHY9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk12PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Ldj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLkZzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5la3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hbD10aGlzLmFbNl07dGhpcy5xaj10aGlzLmFbNF07dGhpcy5rdD10aGlzLmFbM107dGhpcy54aj10aGlzLmFbMTBdO3RoaXMubHE9dGhpcy5hWzEwXTt0aGlzLmxqPXRoaXMuYVs1XTt0aGlzLkl2PXRoaXMuYVs0XTt0aGlzLkp1PXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuTGw9YjtiLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFsOnRoaXMucGooYSl9LHBqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xajp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMua3Q6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhqOnRoaXMua3EoYSl9LGtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5scTp0aGlzLmtqKGEpfSwKa2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmxqOnRoaXMuSHYoYSl9LEh2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jdjp0aGlzLkl1KGEpfSxJdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSnU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLkxsfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy4kayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmdrPWI7Yi5wcm90b3R5cGU9e3plOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxsYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LERxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LGxkOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5sZChhKwo2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5sZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuemUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmxkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxBcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxZZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnplKHRoaXMuRHEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5sZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIEo9CmMuZ2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ209dGhpcy5hWzldO3RoaXMuRnc9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMuT2w9YjtiLnByb3RvdHlwZT17Zm06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdtOnRoaXMuRXcoYSl9LEV3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gdzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuT2x8fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLmZtKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzoKLy4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5naj1ifSkoYyk7dmFyIEw9Yy5nanx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc209dGhpcy5hWzFdO3RoaXMuemk9dGhpcy5hWzNdO3RoaXMuQ209dGhpcy5hWzldO3RoaXMuT2o9dGhpcy5hWzZdO3RoaXMuZXI9dGhpcy5hWzEwXTt0aGlzLndsPXRoaXMuYVs2XTt0aGlzLnd2PXRoaXMuYVsxXTt0aGlzLlBwPXRoaXMuYVs0XTt0aGlzLkVuPXRoaXMuYVs3XTt0aGlzLkJwPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuRG09YjtiLnByb3RvdHlwZT17cm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNtOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56aTp0aGlzLkJtKGEpfSxCbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ206dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9qOnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5lcjp0aGlzLnZsKGEpfSx2bDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud2w6dGhpcy52dihhKX0sdnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMud3Y6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBwOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbjp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLkRtfHxsYSx4Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5ybSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLlNsPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5LYz0xMDA7dGhpcy5JYj0wO3RoaXMuV2E9MTUwO3RoaXMuTGI9MDt0aGlzLnJ1KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYT8KKHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKX0sYnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxiZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHJ1OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSxCcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmxhKCldPWI7TSYmTS5naCYmTS5TdShiKX0sdHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/CiEwOiExfSxHcjpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEx4OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuU2x8fHQ7KGZ1bmN0aW9uKGMpe2MuVWw9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5LYz0xMDt0aGlzLkliPTA7dGhpcy5XYT01MDt0aGlzLlg9bnVsbDt0aGlzLm5hPSExO3RoaXMucGxheWVyPWI7dGhpcy5CYj0iIjt0aGlzLnFnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuS2EoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD0KaC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxCdTpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sdXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSx1dTpmdW5jdGlvbihiKXt0aGlzLk9lPWJ9LHN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2V9LE5lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLktjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7CmVsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxFZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxCZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LE54OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLldxKCl8fHRoaXMuSm4oKTt0aGlzLkJkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sdng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sSm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sV3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxBYTpmdW5jdGlvbigpe3JldHVybiExfSxEeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hfSxjYTpmdW5jdGlvbigpe3RoaXMubmE9ITB9LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmCmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSmg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxyeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSxFaDpmdW5jdGlvbigpe3RoaXMuQmI9bnVsbH0seHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkJiJiYoYj0hMCk7cmV0dXJuIGJ9LEl4OmZ1bmN0aW9uKCl7dGhpcy5xZ3x8KHRoaXMucWc9ITApfSx1ZTpmdW5jdGlvbigpe3JldHVybiExfSxveDpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5VbHx8cDsoZnVuY3Rpb24oYyl7Yy51aT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLkxmPQoiMSI7dGhpcy5NZj0iMiI7dGhpcy51bj0iMyI7dGhpcy5RYz0wO3RoaXMubmg9MzA7dGhpcy5SYj1bXTt0aGlzLmdiPVtdO3RoaXMub2M9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuWmY9dGhpcy5maT0hMTt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5nZihiKTt0aGlzLnN1KGEpfSxnOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuZml8fCh0aGlzLmZpPSEwLGUuTGUoKSl9LFNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5hYyYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0seHI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2Eua2EoKV18fCh3aW5kb3dbYS5rYSgpXT17fSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXXx8KHdpbmRvd1thLmthKCldW2IubGEoKV09Cnt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWWIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXT0xfSxEcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmthKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldLmluaXRpYXRvciE9ZS5ZYigpJiYodGhpcy5oZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnhhKCkpe3RoaXMueHIoKTtpZighdGhpcy5EcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5oZigpO3JldHVybn10aGlzLmhmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5aaCgpO3RoaXMuWmY9ITA7YSYmImZ1bmN0aW9uIj09CnR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5nYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYodGhpcy5SYj1lLnVuaXF1ZSh0aGlzLlJiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5SYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGg9MDtoPHRoaXMuZ2IubGVuZ3RoO2grKyl0aGlzLm9jW3RoaXMuZ2JbaF0ucmVhc29uXT09dGhpcy5vY1tiXSYmYS5wdXNoKHRoaXMuZ2JbaF0uZGV0YWlsKSx0aGlzLm9jW3RoaXMuZ2JbaF0ucmVhc29uXTx0aGlzLm9jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5nYltoXS5kZXRhaWwpLGI9dGhpcy5nYltoXS5yZWFzb24pO3RoaXMub2NbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSwKYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sd3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGhmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0senU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnVufSxvYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0seGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuUWN9LGdmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sc3U6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sb3M6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIHY9Yy51aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5acD10aGlzLmFbOV07dGhpcy5Rcj10aGlzLmFbNl07dGhpcy5Hdj10aGlzLmFbN107dGhpcy52bz10aGlzLmFbNV07dGhpcy5nbj10aGlzLmFbNV07dGhpcy51cD10aGlzLmFbOF07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy50aj1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY2w6dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpwOnRoaXMuUHIoYSl9LFByOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Rcjp0aGlzLkZ2KGEpfSxGdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuR3Y6dGhpcy51byhhKX0sdW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZvOnRoaXMuZm4oYSl9LApmbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmduOnRoaXMudHAoYSl9LHRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cDp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLnRqfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5ibCg0KTsoZnVuY3Rpb24oYyl7Yy5Iaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ianx8b2E7KGZ1bmN0aW9uKGMpe2MuSWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLmZ4O2E/YS5xYT9hLnFhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7CmYuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuSWp8fHBhOyhmdW5jdGlvbihjKXtjLkpqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiYKd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Kanx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhvPXRoaXMuYVsxMF07dGhpcy5xcz10aGlzLmFbNF07dGhpcy55dD10aGlzLmFbNF07dGhpcy5hbz10aGlzLmFbM107dGhpcy5Bcz10aGlzLmFbNF07dGhpcy5rdj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs2XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueG86dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFzOnRoaXMueHQoYSl9LAp4dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueXQ6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmFvOnRoaXMuenMoYSl9LHpzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Bczp0aGlzLmp2KGEpfSxqdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua3Y6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLlVvfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy53byg0KTsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMudmcoKTt0aGlzLnhnKCk7dGhpcy5wcD0hMX0sdmc6ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKYnx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seGc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpOwphLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk9lJiYoMCx0aGlzLk9lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJgpiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Da3x8c2E7KGZ1bmN0aW9uKGMpe2MuQms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYWU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiYKYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5TYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5TZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmgmJgohdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS53ZCgpLGEucGUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuU2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5TZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5uaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlRjLmluZGV4T2YoYSkmJgp0aGlzLlRjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5UYy5sZW5ndGg+PXRoaXMuYWUmJnRoaXMubSgpKX0sb3M6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xOnRoaXMucmU/dGhpcy5yZSsrOnRoaXMucmU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUGgoYS52aWRlb1RhZyk/YS5iYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlNjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMucmU+dGhpcy5zZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnZnKCksYS54ZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ca3x8dGE7KGZ1bmN0aW9uKGMpe2MuRGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy55cSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLkdyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0scXg6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCnlxOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ea3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdzPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzJdfWMuTXc9YjtiLnByb3RvdHlwZT17ZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmdzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgd2E9Yy5Nd3x8d2EsQWM9bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuZnMoNCk7KGZ1bmN0aW9uKGMpe2MuSG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLkpkKGIpfS5iaW5kKHRoaXMpKX0sSmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LERlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpOwppZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxBYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5IbXx8eGE7KGZ1bmN0aW9uKGMpe2MuR209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkVjPXRoaXMuQ2E9dGhpcy5YYz0hMTt0aGlzLkFoPWUuSGIoMTApO3RoaXMuZWk9ITA7dGhpcy50Yz10aGlzLlZnPSExO3RoaXMuQ3MoYi5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLnFoKCksdGhpcy5ZbygpLHRoaXMucWIoKSl9LENzOmZ1bmN0aW9uKGIpe3JldHVybiBlLmZhKCJ0LW9ubGluZS5kZSIpPyExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LEp4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLAoiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuSiwiOyIsdHlwZW9mIGIuSiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLklhP2IuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuSWE/dHlwZW9mIGIuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5ZZDoKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLllkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/CnR5cGVvZiBiLkoucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5oZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmhlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuQWgpfSx5YjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmCih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMueWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnFhPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnFhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnFhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnFhfSxJZzpmdW5jdGlvbigpe2lmKCF0aGlzLkVjKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRWM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkVjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRWN9LEVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVWcpe3ZhciBiPQp0aGlzLnliKCksYT10aGlzLkNyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5VZz0hMCl9cmV0dXJuIHRoaXMuVWd9LENyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5YYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuWGM9ITApO3JldHVybiB0aGlzLlhjfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsaD0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5VdCgpfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxVdDpmdW5jdGlvbigpe3RoaXMudGM9ITA7dmFyIGI9dGhpcy5JZygpO2lmKGJ8fHRoaXMueGEoKSl7dmFyIGE9ImFkRXJyb3IiLGg9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuVmEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnVjPQohMDtpZihlLmZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIisKZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnVjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5nYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LHB4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5uZyYmYi5hZHMmJih0aGlzLm5nPWIuYWRzKTtyZXR1cm4gdGhpcy5uZ30sWW86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7CnRoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlNlKCl9LmJpbmQodGhpcykpfSxmZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuSWcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCkpfSxxaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5FcigpKXt2YXIgYT10aGlzLnliKCksaD10aGlzLlhiKCk7YSYmaCYmKHRoaXMueWIoKSx0aGlzLlhiKCksdGhpcy50Y3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5WZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnliKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5nYSgpKToodGhpcy5nYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuVmc9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xaCgpfS5iaW5kKHRoaXMpLDUwKX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7CmlmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sWm86ZnVuY3Rpb24oKXt0aGlzLnpjfHwodGhpcy56Yz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuemMhPWIuYWRzLnN0YXRlJiYodGhpcy56Yz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09CnRoaXMuemMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy56Yz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWm8oKX0uYmluZCh0aGlzKSwxMCl9LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS5aYihkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpKX0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmVpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmVpLGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKZ3A6ZnVuY3Rpb24oKXt0aGlzLnl4fHwoMTA8dGhpcy5Xdj8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLld2KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuYXUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ3AoKX0uYmluZCh0aGlzKSw1MCkpKX0sYXU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuWHYpe3RoaXMuWHY9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpOwpiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5HbXx8eWE7KGZ1bmN0aW9uKGMpe2MuSW09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlFoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5RaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxRaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLnhlKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpfX0pfSkoYyk7dmFyIHphPWMuSW18fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaj10aGlzLmFbMl07dGhpcy5DdD10aGlzLmFbOV07dGhpcy5vbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs4XX1jLklrPWI7Yi5wcm90b3R5cGU9e1lqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWmo6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkN0OnRoaXMubm8oYSl9LG5vOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMuSWt8fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5Zaig0KTsoZnVuY3Rpb24oYyl7Yy5JbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLlVlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlcoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LER0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQmIsaD10aGlzLmxhKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTsKZCYmYSYmYS5hYyYmKDA8PWguaW5kZXhPZihkKXx8YS53ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxBYTpmdW5jdGlvbigpe3RoaXMuVWUrKztpZigxMDx0aGlzLlVlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLAoiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LEpkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgQ2E9Yy5JbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuSGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXtpZighdGhpcy50ZSlpZih0aGlzLkRifHwKKHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksCjEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKX19LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQ2EoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLmdxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELApmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5tKCl9LmJpbmQodGhpcykpLHRoaXMuZ3E9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5EdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5IbHx8RGE7KGZ1bmN0aW9uKGMpe2MuSmw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYKMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm5hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9CmMuSmx8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ldD10aGlzLmFbNF07dGhpcy5Ldz10aGlzLmFbN107dGhpcy5MdT10aGlzLmFbN107dGhpcy53cj10aGlzLmFbNF07dGhpcy5UbT10aGlzLmFbMTBdO3RoaXMuc249dGhpcy5hWzddO3RoaXMudXI9dGhpcy5hWzFdO3RoaXMuWGo9dGhpcy5hWzEwXTt0aGlzLnF3PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzFdfWMuQWk9YjtiLnByb3RvdHlwZT17ZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmV0OnRoaXMuSncoYSl9LEp3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS3c6dGhpcy5LdShhKX0sS3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkx1OnRoaXMudnIoYSl9LHZyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy53cjp0aGlzLlNtKGEpfSxTbTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLlRtOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbjp0aGlzLnRyKGEpfSx0cjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudXI6dGhpcy5XaihhKX0sV2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Yajp0aGlzLnB3KGEpfSxwdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnF3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgR2E9Yy5BaXx8R2EsQ2M9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Q2MuZHQoNCk7KGZ1bmN0aW9uKGMpe2Mudms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuRmcoYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJgooYT1hLnBhcmVudE5vZGUpfXRoaXMuRnQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLkZ0KXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlcoaCk7dGhpcy5aKGgpOwp0aGlzLmpkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5qZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuamQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxmcDpmdW5jdGlvbigpe2UuYWgodGhpcy5qZCk7ZS5FZSh0aGlzLmpkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sSWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBIYT1jLnZrfHxIYTsoZnVuY3Rpb24oYyl7Yy51az12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy51a3x8SWE7KGZ1bmN0aW9uKGMpe2Mud2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj0KbC5pbnJlYWQsYT1lLkZnKGIsImVsZW1lbnRJRCIpO2lmKGUuYWgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEphPWMud2t8fEphLEthPW5ldyBKYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5iaj10aGlzLmFbOV07dGhpcy5BbD10aGlzLmFbMTBdO3RoaXMuV2w9dGhpcy5hWzZdO3RoaXMuY3Q9dGhpcy5hWzFdO3RoaXMuSWk9dGhpcy5hWzRdO3RoaXMuTXA9dGhpcy5hWzldO3RoaXMuJGk9dGhpcy5hWzFdO3RoaXMuc3M9dGhpcy5hWzddO3RoaXMuUHE9dGhpcy5hWzNdOwp0aGlzLllyPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuU249YjtiLnByb3RvdHlwZT17YWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmJqOnRoaXMuemwoYSl9LHpsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5BbDp0aGlzLlZsKGEpfSxWbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuV2w6dGhpcy5idChhKX0sYnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jdDp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSWk6dGhpcy5McChhKX0sTHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1wOnRoaXMuWmkoYSl9LFppOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kaTp0aGlzLnJzKGEpfSxyczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3M6dGhpcy5PcShhKX0sT3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlBxOnRoaXMuWHIoYSl9LFhyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ZcjoKdGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTGE9Yy5Tbnx8TGEsRGM9bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGMuYWooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmhrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LHR1OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sS246ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5oa3x8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApoLGQsZil7dGhpcy5mYj1hO3RoaXMuQWc9dGhpcy5uaT0hMTt0aGlzLnJoPWQ7dGhpcy5SaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5mYj1uZXcgeihhKSk7dmFyIGM9dGhpcy5zYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5IZSh0aGlzLmZiLnVybCkmJm0uTWQpe3ZhciBlPW5ldyB6KGEudXJsKTtlLnR1KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmCihiPSEwKTtifHxtLmlhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5pYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuaWs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZmIuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuQWcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLlJoP3RoaXMuc2Iub3Blbih0aGlzLmZiLm1ldGhvZCx0aGlzLmZiLnVybCwhMSk6dGhpcy5zYi5vcGVuKHRoaXMuZmIubWV0aG9kLHRoaXMuZmIudXJsLCEwKSx0aGlzLm5pfHwodGhpcy5zYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuc2Iuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLnNiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLnNiLnNlbmQoYSl9Y2F0Y2goZil7bSYmbS5IZSh0aGlzLmZiLnVybCk/bS5NZD9tLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkhlKHRoaXMuZmIudXJsKSx0aGlzLnJoJiZ0aGlzLnJoKCl9cmV0dXJuIHRoaXMuc2J9fX0pKGMpO3ZhciBNYT1jLmlrfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGE9dGhpcy5WZD0hMX1jLmhqPWI7Yi5wcm90b3R5cGU9e3h1OmZ1bmN0aW9uKGEpe3RoaXMuVmQ9YX0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5IYT1hfSxadDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLCJyZWdpc3RlcmluZ3MgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYixhKX0pfXZhciBiPXtQdzoiQWRDbGlja1RocnUiLFJ3OiJBZEVycm9yIixTdzoiQWRTdG9wcGVkIixWdzoiQWRMaW5lYXJDaGFuZ2UiLFd3OiJBZFRhZ1BhcnNlZCIsWnc6IkFkVmlkZW9Db21wbGV0ZSIsYng6IkFkTG9hZGVkIixjeDoiQWRTa2lwcGVkIixkeDoiQWRTdGFydGVkIixUdzoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLFV3OiJBZEltcHJlc3Npb24iLFF3OiJBZENyZWF0aXZlVmlldyIsWHc6IkFkVmlkZW9NaWRwb2ludCIsWXc6IkFkUGF1c2VkIiwkdzoiQWRWaWRlb1N0YXJ0IixheDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGI9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLlZkLGJbZF0pfSxZdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSwKYil7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGIsYSl9KX1pZih0aGlzLkhhJiZ0aGlzLkhhLlVkKWZvcih2YXIgYiBpbiB0aGlzLkhhLlVkKXRoaXMuSGEuVWQuaGFzT3duUHJvcGVydHkoYikmJmEodGhpcy5IYSx0aGlzLkhhLlVkW2JdKTt0aGlzLkhhJiZ0aGlzLkhhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhLmdldEVycm9yKCk7YSYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixhKX0uYmluZCh0aGlzKSwxMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLlZkJiZ0aGlzLlp0KCk7dGhpcy5IYSYmdGhpcy5ZdCgpfX19KShjKTt2YXIgTmE9Yy5oanx8TmE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlVhPSExO3RoaXMud2M9IiI7dGhpcy5pZT0KdGhpcy52Yz10aGlzLndiPW51bGw7dGhpcy54cD10aGlzLkpiPXRoaXMuaWg9ITE7dGhpcy5MYT0iIjt0aGlzLmRoPSExO3RoaXMud2E9dGhpcy5vZD0iIjt0aGlzLlpnPXRoaXMuVj10aGlzLmlzRW5hYmxlZD10aGlzLiRlPSExO3RoaXMucGE9W107dGhpcy5PZz10aGlzLmZjPSIiO3RoaXMucWU9ITE7dGhpcy5xZj0wO3RoaXMuR2Y9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5FZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuUWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMubmM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLmhjPSIiO3RoaXMuaWM9W107dGhpcy5qYz1bXTt0aGlzLklkPVtdO3RoaXMuZ2M9IiI7dGhpcy5yZj0wO3RoaXMudmlkZW9wbGF6YT0Ke307dGhpcy5EYz0hMTt0aGlzLmhwPXRoaXMuT2Q9bnVsbDt0aGlzLkxoPXRoaXMubGM9dGhpcy5zZz10aGlzLnVmPXRoaXMuTWQ9dGhpcy5rZT10aGlzLlJjPSExO3RoaXMuaGI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMucGQ9MDt0aGlzLlFnPSExO3RoaXMuUGc9MUUzO3RoaXMuWmM9ITE7dGhpcy5RYT0xRTM7dGhpcy5PZj0iIn1jLmprPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMud2MsYWR0YWdtb2RpZmllcjp0aGlzLndiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy52YyxhZHRhZ3JlZ2V4OnRoaXMuaWUsYml0cmF0ZTp0aGlzLlFhLGpzcG9wdXBzOnRoaXMuaWgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMueHAsaG9tYWRBbGlhczp0aGlzLkxhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5kaCxnbG9iYWxDb25maWc6dGhpcy5vZCxjbGllbnRDb25maWc6dGhpcy53YSwKaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5WLGlzQmxvY2tlZDp0aGlzLlpnLHNlcnZlcjp0aGlzLnBhLHN2bUNvbmZpZzp0aGlzLmZjLGhvbWFkQWRwYXRoOnRoaXMuT2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5xZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5xZixIT01BRF9WRVJJRklFRDp0aGlzLkdmLEhPTUFEX0JMT0NLRUQ6dGhpcy5FZixIT01BRF9OT0JMT0NLRVI6dGhpcy5RYixIT01BRF9BREJMT0NLRVI6dGhpcy5uYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRmYsdGVzdEhpZGU6dGhpcy5oYyx0ZXN0VGFnczp0aGlzLmljLHRlc3RUYWdzSlM6dGhpcy5qYyx0ZXN0VGFnc1hIUjp0aGlzLklkLHRlc3RDb29raWU6dGhpcy5nYyx0aHJvdHRsZTp0aGlzLnJmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuRGMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5ocCxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlJjLApibG9ja2VkV2FzQ2FsbGVkOnRoaXMua2UsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTWQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudWYsY29uZmlnRmFpbHVyZXM6dGhpcy5oYixzaXRlQ29uZmlnOnRoaXMuRmEsc2VydmVySWQ6dGhpcy5JaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuamIsdnBhaWQ6dGhpcy5sYyxza2lwQWxsb3dlZDp0aGlzLkxoLHZtYXBzOnRoaXMua2ksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLlpjLGFkRmFsbGJhY2tVUkw6dGhpcy5PZn19LFVxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmhiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuaGJbYl0mJjE9PXRoaXMuaGJbYl0mJihhPSEwKTtyZXR1cm4gYX0sZWY6ZnVuY3Rpb24oYSl7dGhpcy5oYlthXT0hMH0senE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltiXSYmMT09dGhpcy5oYltiXSYmYS5wdXNoKGIpOwpyZXR1cm4gYX0sSGQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5MbyhhKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixnPSIiO2lmKCF0aGlzLlVhJiYhYilyZXR1cm4gbmV3IHooYSk7Zj10aGlzLkdlKGEpO2M9dGhpcy56YShhKTtmPyh0aGlzLkZjKCk/ZT1hOmU9Yy5wcm90b2NvbCsKIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5KYygpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLndjfHx0aGlzLndifHx0aGlzLnZjfHx0aGlzLmllKSYmKGc9dGhpcy55cyhnKSk7YT1uZXcgeihlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkFxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGcpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sR2U6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/CmI9ITA6dGhpcy5GYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sRmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMucGEmJnRoaXMucGEubGVuZ3RoJiYwPHRoaXMucGEubGVuZ3RoJiYoYj10aGlzLnBhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEhlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuR2UoYSk7cmV0dXJuIGJ9LEFxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT0KdHlwZW9mIHRoaXMuTGEmJjA8dGhpcy5MYS5sZW5ndGgpcmV0dXJuIHRoaXMuTGE7Zm9yKGQgaW4gdGhpcy5MYSlpZihiPXRoaXMuTGFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5reDtyZXR1cm4ibm9uZSJ9LHFkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFbdGhpcy5JaF19LEpjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5xZCgpLGI9dGhpcy5LaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxvaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx4czpmdW5jdGlvbihhLApiKXt2YXIgZD1lLnphKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxDPTA7QzxnLmxlbmd0aDtDKyspe3ZhciBrPWdbQ10uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5vaChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMub2goZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx5czpmdW5jdGlvbihhKXt0aGlzLndjJiYoYSs9dGhpcy53Yyk7aWYodGhpcy53Yilmb3IodmFyIGIgaW4gdGhpcy53Yil0aGlzLndiLmhhc093blByb3BlcnR5KGIpJiYKKGE9YS5yZXBsYWNlKGIsdGhpcy53YltiXSkpO3RoaXMudmMmJihhPXRoaXMueHMoYSx0aGlzLnZjKSk7cmV0dXJuIGF9LGVwOmZ1bmN0aW9uKCl7dGhpcy5GYSYmdGhpcy5GYS5jbGllbnRBUElzJiZ0aGlzLiRvKHRoaXMuRmEuY2xpZW50QVBJcyl9LCRvOmZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiPW5ldyBOYTthLnB1Ymxpc2hlckFQSSYmYi54dShhLnB1Ymxpc2hlckFQSSk7YS5wbGF5ZXImJmIud3UoYS5wbGF5ZXIpO2IuZygpfX0sbDpmdW5jdGlvbihhLGIsZCxmLGMsZSl7bT10aGlzO3RoaXMuZGg9ITA7dGhpcy5vZD1hO3RoaXMud2E9Yjt0aGlzLiRlPWQ7dGhpcy5PZD1mO3RoaXMuQWM9Yzt0aGlzLkZhPWV8fHt9O3RoaXMuZXAoKTt0aGlzLmtzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLndhKXRoaXMuaHMoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9YigpLHRoaXMueGMoKX1jYXRjaChnKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iLHRoaXMueGMoKX1jYXRjaChrKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfX0scGI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGtzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLm9kK3RoaXMuZmUoImdsb2JhbCIpKSx0aGlzLlFxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMueGMoKX0uYmluZCh0aGlzKSwhMCl9LGhzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLndhK3RoaXMuZmUoImNsaWVudCIsLTEhPXRoaXMud2EuaW5kZXhPZigiPyIpKSksdGhpcy54Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5lZigiY2xpZW50Iik7dGhpcy5pYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLAohMCl9LGZlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5IYigpKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5GYSYmdGhpcy5GYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGlhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmtlKXt0aGlzLmtlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChoKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwphPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkFjPSExKTt0aGlzLkFjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQWM/dGhpcy5BYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5WPXRoaXMuWmc9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkVmKSk7dGhpcy5OYigpO2UuQmMoay51dCk7KGI9ZS5aYih0aGlzLnFkKCkpKXx8KGI9ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sUXE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLndhfHx0aGlzLmZjfHx0aGlzLkxhfHx0aGlzLnhjKCk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLlFiKSksdGhpcy5OYigpKX19LHhjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLndhfWVsc2UgYT10aGlzLndhO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYS5lbmFibGVkKTt0aGlzLlY9IXRoaXMuaXNFbmFibGVkO3RoaXMucGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5mYSgid2ViLmRlIil8fGUuZmEoImdteC5uZXQiKXx8ZS5mYSgiZ214LmF0Iil8fGUuZmEoImdteC5jaCIpfHxlLmZhKCIxdW5kMS5kZSIpKSYmIXRoaXMuRmMoKSlmb3IoYj0wO2I8dGhpcy5wYS5sZW5ndGg7YisrKXRoaXMucGFbYl09dGhpcy5wYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmZjPWEuY29uZmlnfHwiIjt0aGlzLkxhPWEuYWxpYXN8fApudWxsO3RoaXMuT2c9YS5hZHBhdGh8fCIiO3RoaXMucWU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5JaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5wYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmZjJiZ0aGlzLkxhJiZ0aGlzLnBhLmxlbmd0aD90aGlzLkdjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxHYzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkpjKCkpLGQ9dGhpcy56YSh0aGlzLmZjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0KIlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmZjK3RoaXMuZmUoImN1c3RvbWVyIikpO3RoaXMuRGEoYix0aGlzLlZ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJjdXN0b21lciIpO2E/dGhpcy5obT90aGlzLmlhKCJub1NWTUNvbmZpZyIpOih0aGlzLmhtPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5HYyghMCl9LmJpbmQodGhpcyksITApfX0sVnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5EYz0hMDt0aGlzLkdjKCEwKTtyZXR1cm59fXRoaXMuTWQ9dGhpcy5NYihiLnN0cmljdCk7dGhpcy51Zj10aGlzLk1iKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnNnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj0KdGhpcy5NYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYi5lbmFibGVkKTt0aGlzLmhjPWIudGVzdGhpZGV8fCIiO3RoaXMuamM9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5JZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMud2M9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy53Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy52Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuaWU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuaWg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5KYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5sYz1iLnZwYWlkfHwhMTt0aGlzLkZhLnZwYWlkPXRoaXMubGM7dGhpcy5MaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLiRjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5raT1iLnZtYXBzfHwiIjt0aGlzLlpjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fAoxRTM7dGhpcy5PZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5nYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLkhxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5xZSYmKHRoaXMuZ2M9bnVsbCk7dGhpcy5yZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5EYz0hMCx0aGlzLkdjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLm52KCkmJih0aGlzLmhjfHx0aGlzLmpjfHx0aGlzLmljfHx0aGlzLmdjfHx0aGlzLklkKT90aGlzLiRlPyh0aGlzLlVhPXRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5RYikpLHRoaXMubWUoKSx0aGlzLk5iKCkpOnRoaXMuWnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy4kdSgpKX19LFp1OmZ1bmN0aW9uKCl7dGhpcy5ZdSgpOwp0aGlzLmF2KCl9LGF2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksQz1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLAoiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEMpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnhiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPQpkKXt2YXIgYz1lLmhkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkZhJiZ0aGlzLkZhLnBsYXllciYmdGhpcy5GYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sJHU6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LE9jOmZ1bmN0aW9uKGEpe3RoaXMuUmM9ITA7dGhpcy5WfHwodGhpcy5WPXRoaXMuVWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLk5iKCksdGhpcy5tZSgpKX0sWXU6ZnVuY3Rpb24oKXtpZih0aGlzLmhjKXt2YXIgYT1lLmhkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5oaCgpKXRoaXMuT2ModGhpcy5uYywKIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmhjKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaGMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuVmgoKX19ZWxzZSB0aGlzLlZoKCl9LFVoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLmR2KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5uZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmljPXRoaXMuSWQpJiZ0aGlzLmljLmxlbmd0aCl7dmFyIGQ9dGhpcy5pYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLm5mKCl9LGR2OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkRhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxWaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtjPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsCnRoaXMuSGIoKSk7dGhpcy5ldihjLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVWguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLk9jKHRoaXMubmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrYysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuamMmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksYzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuVWgoKX0sZXY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGMoKXtnKCkmJmIoKX1mdW5jdGlvbiBlKCl7ZygpJiZkKCl9ZnVuY3Rpb24gZygpe3JldHVybiBDPyh3aW5kb3cuY2xlYXJUaW1lb3V0KEMpLCEwKTohMX12YXIgQz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2MoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZnKCkmJmUoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTsKay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWM7ay5vbmVycm9yPWU7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlKX1jYXRjaChsKXtjKCl9fSxuZjpmdW5jdGlvbigpe3RoaXMuZ2M/KHRoaXMucWYrKyx0aGlzLkRhKG5ldyB6KHRoaXMuZ2MpLHRoaXMuWHUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMub2YoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5TaCgpfSxvZjpmdW5jdGlvbihhKXt0aGlzLk9jKHRoaXMuRmYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxYdTpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5xZj90aGlzLm5mKCk6dGhpcy5vZigiQkJCIik6CiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlNoKCk6dGhpcy5vZigiQUFBIil9LFNoOmZ1bmN0aW9uKCl7dGhpcy5WPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMubWUoKX0saGg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlJjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS5mYSgidC1vbmxpbmUuZGUiKXx8ZS5mYSgiZ2lnYS5kZSIpfHxlLmZhKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLmhoKCksITApOwpkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5HZikpO3RoaXMuT2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5PZCYmdGhpcy5PZCgpfSxjcDpmdW5jdGlvbigpe2lmKHRoaXMudWYmJnRoaXMuVXEoKSl7dmFyIGE9dGhpcy56cSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sWmg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxEYTpmdW5jdGlvbihhLGIsZCxjLHEsZyl7dGhpcy5wZHx8KHRoaXMucGQ9MCk7dGhpcy5wZCsrO3RoaXMucGQ+dGhpcy5QZyYmIXRoaXMuUWcmJih0aGlzLlFnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5QZywhMCkpO2E9bmV3IE1hKGEsCmIsZCk7YyYmKGEubmk9ITApO3EmJmUuSHIoKSYmKGEuQWc9ITApO2cmJihhLlJoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGFwOmZ1bmN0aW9uKCl7ZS5WYSgpfHxlLmFiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxjPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/CmEuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5GYygpfHwoYT10aGlzLnphKGMpLGM9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Zy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtnLm5ldHdvcmtTdGF0ZT09Zy5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5pYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2cuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2cuc2V0QXR0cmlidXRlKCJzcmMiLGMpfWVsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sV3U6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PQp0aGlzLmtpfSxicDpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuRGEoYSx0aGlzLk92LmJpbmQodGhpcyksdGhpcy5Odi5iaW5kKHRoaXMpKX0sT3Y6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1kfHx0aGlzLmVxKCl9LE52OmZ1bmN0aW9uKCl7fSwKZXE6ZnVuY3Rpb24oKXtlLkJjKGsuY3EpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaWEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LG1lOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuSmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5KYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkpiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgSjt3aW5kb3dbZC5rYSgpXT10aGlzO2UuYWIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sbnY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5yZn0sSHE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgphLmxlbmd0aCldfSxIYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsYyxlLGcsayxsLG09MDttPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSxnPWQ+PjIsZD0oZCYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGMpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LHphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGM9MTQ7Yy0tOylkW2JbY11dPWFbY118fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LEtoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZCxoO2ZvcihkPTc7MDw9ZDtkLS0paD1hPj4+NCpkJjE1LGMrPWgudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGc9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdSx2LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8bi0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZSk7CnN3aXRjaChuJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChuPj4+MjkpO3gucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKylnW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspZ1tjXT1kKGdbYy0zXV5nW2MtOF1eZ1tjLTE0XV5nW2MtMTZdLDEpO2U9aztuPWw7cD1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1kKGUsNSkrKG4mcHx+biZ1KSt2K2dbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWQoZSw1KSsobl5wXnUpK3YrZ1tjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz00MDs1OT49YztjKyspdz1kKGUsNSkrKG4mcHxuJnV8cCZ1KSt2K2dbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihyKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5qa3x8T2EsbT1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxuPXRoaXMuYVs5XTt0aGlzLnh3PXRoaXMuYVsxXTt0aGlzLmxtPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzNdfWMuWm49YjtiLnByb3RvdHlwZT17a246ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxuOnRoaXMud3coYSl9LHd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHc6dGhpcy5rbShhKX0sa206ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgUGE9Yy5abnx8UGEsRWM9bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RWMua24oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5mLlA/dGhpcy5iYj1hLmYuUCgpOgp0aGlzLmJiPSIiO2EuZi5YZyYmYS5mLlhnKHtwYXVzZTp0aGlzLndkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuR2guYmluZCh0aGlzKSxtdXRlOnRoaXMuUGUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy54di5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmliO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuVmI9dGhpcy5ZYz0hMTt0aGlzLkdvPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuRmQ9e307ZS5vYigibmV3QmlnQWRJZCIpO3RoaXMuT289ZS5hYSgxMCk7dGhpcy5sZj0wO3RoaXMuV2M9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5XYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmIuZikmJnRoaXMuYi5mLnMmJihhPXRoaXMuYi5mLnMoKSksdGhpcy5XYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYKKHRoaXMuUm49Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5zaD10aGlzLkVkPSExO3RoaXMubGg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmVlPSExO3RoaXMuYmk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuR2I9ZS5hYSgxMCk7dGhpcy5FYj1lLmFhKDEwKTt0aGlzLk1oPWUuYWEoMTApO3RoaXMuY29uZj17fTt0aGlzLlBkPXRoaXMuT2I9dGhpcy5vZT10aGlzLmVkPXRoaXMuR2Q9dGhpcy5yYj10aGlzLm1jPXRoaXMudWg9dGhpcy5rZD10aGlzLnB2PXRoaXMudWI9dGhpcy5GYj0hMTt0aGlzLnJjPVtdO3RoaXMuY2M9e307dGhpcy5zdD0yMDA7dGhpcy5CZj10aGlzLkNmPXRoaXMuamU9dGhpcy5BZj10aGlzLlplPSExO3RoaXMudmQ9e319Yy5kaz1iO2IucHJvdG90eXBlPXtvdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9CmF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sJGg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk91KCk7ZS52KGsuSG4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sS2U6ZnVuY3Rpb24oYSxiLGMsZil7dGhpcy51Yj1jO3ZhciBnPSExO2YmJmYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihnPSEwKTtpZih0aGlzLkwuVil0aGlzLmxmKyssZS5vYigibmV3U21hbGxBZElkIiksdGhpcy5MLmNwKCksZj1tLmdldENvbmZpZygpLHRoaXMuTC5VYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy4kaCgpLG5ldyBTKHRoaXMsYSx0aGlzLmxoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLApiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubGMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy4kaCgpLG5ldyBTKHRoaXMsYSx0aGlzLmxoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5MLmxjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Zi5RYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUmEoKTtlbHNle3ZhciB0Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0Yy5LZShhLGIsYyl9LDUwKX19LFZlOmZ1bmN0aW9uKGEpe2EuJGEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO3RoaXMuUGQ9dGhpcy5PYj10aGlzLmtkPSExO3RoaXMuYz1hO3RoaXMuQ3UodGhpcy5jKTt0aGlzLnZkPW5ldyBRYSh0aGlzLmMuUXYsdGhpcy52aWRlbyx7fSk7dGhpcy5MZyhhKTt0aGlzLnJjPXRoaXMuQ2coYSk7dGhpcy5rcCgpfSxMZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5GZD10aGlzLktxKGEpKSx0aGlzLkxnKGEucGFyZW50KSl9LENnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5DZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLnVxKGEpKSk7cmV0dXJuIGN9LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5VJiZhLlUuZ2V0QXR0cmlidXRlKXtiPWEuVS5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sS3E6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0iIjtpZihhLlUpe2I9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Zj1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLmtiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuJGEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYj0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGI9YS5lcnJvci5kZXRhaWwuY29kZSksYS5nZCYmYS5nZC5lcnJvciYmYS5nZC5lcnJvci5jb2RlJiYoYj1hLmdkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuUGMuY29kZTpiPT1HLldkLmNvZGU/ZS52KGsua3csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTooZS5MZSgpLGI9PUcuSmYuY29kZSYmZS52KGsuRHMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk7ZS52KGsuYnEsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSk7dGhpcy5QdSgpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS52KGsuUHYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5LZi5jb2RlOmUudihrLm93LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LlhkLmNvZGU6ZS52KGsudHcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy5UZC5jb2RlOmUudihrLkVzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5TZC5jb2RlOmUudihrLkx2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVtbXlhZCIpO2JyZWFrOwpjYXNlIHcuRGYuY29kZTplLnYoay5Ndix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5QYS5sZW5ndGg7KXRyeXt2YXIgYz1hLlBhLnBvcCgpO3RoaXMuSmUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LEN1OmZ1bmN0aW9uKGEpe3RoaXMub2U9ITE7dGhpcy5QYj10aGlzLmIuSzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5QYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTtpZihjJiZjLmVudnZhcnMpdHJ5e2I9Yy5lbnZ2YXJzKCkudmlkZW9TbG90LAp0aGlzLlplPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuS3g9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiZiLnNldEF0dHJpYnV0ZShnLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2ddKTt0aGlzLlJuJiZ0aGlzLnBsYXllci51ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIudWUoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuTy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5PW2NdLnR5cGUpJiYKdGhpcy5MbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuWmUmJmIubG9hZCgpO2lmKHRoaXMuV2goYikpe3RoaXMuTmgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuUG4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLlplP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2goayl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5ucCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSx0aGlzLkF1KCkpOnRoaXMuYy5vcmlnaW4udGcody5UZCl9LEF1OmZ1bmN0aW9uKCl7dGhpcy5BZj0hMDt0aGlzLnJiPXRoaXMubWM9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5sZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMucmI9ITApO2UubmUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4udmEmJmUuUW4odGhpcy5jLm9yaWdpbi52YSk7dGhpcy5OaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9RS5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi52aCgpO3RoaXMuYi5qZigpO2ZvcihhPXRoaXMuYi5LO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpOwphLnBhcmVudHx8dGhpcy5iLmpmKCk7dGhpcy50YT10aGlzLlBiPXRoaXMuYi5LO3RoaXMuZ2koInZwYWlkIik7aWYodGhpcy5yYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLktiKCJtdXRlZCIsImNvbnRlbnQiKTtlLnYoay50ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfXRoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLAoiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYy5OcSgpLGM9dGhpcy5jLkIuT3JpZ2luYWxBZFBhcmFtZXRlcnMsZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5jZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuTCk7dGhpcy5ILnNyYz1hO2UuZ2UoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYi5mLkFhJiYhdGhpcy5HZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsueWMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmIuJGIoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMucmM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdihhKTsKaWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5adigpLHRoaXMuYi4kYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuUGQ9ITA7ZS52KGsuamksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuRmUodGhpcy5PYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLiRiKCEwKSx0aGlzLmN3KCkpOyJBZFZpZGVvU3RhcnQiPT0KYS5kYXRhLm5hbWUmJih0aGlzLmIuJGIoITApLHRoaXMuZ3coKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZXcoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuZncoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5odygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5kdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5saSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5VYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5rZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXt0aGlzLkwuWmMmJihhPSJfYmxhbmsiKTt2YXIgYj13aW5kb3cub3BlbigiIiwKYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJ3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLnYoay5iZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiR2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5DZiYmKHRoaXMuQmY9ITEsdGhpcy5lYygpKSx0aGlzLmF3KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMucmI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLAohMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMucmI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGUudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfX0uYmluZCh0aGlzKSk7ZS5nZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTtlLmdlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7dGhpcy5iLiRmKGZ1bmN0aW9uKGEpe2UubWEodGhpcy5ILCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sJHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTsKdGhpcy50cmFjaygicGF1c2UiKTtlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5tYz0hMH0sYXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubWM9ITF9LGN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuV2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sWnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7CnRoaXMuT2goKTtlLnYoay5TZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxndzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxldzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLmtkPSEwO3RoaXMuWWEoImZpcnN0UXVhcnRpbGUiKTtlLnYoay5QZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxmdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5ZYSgibWlkcG9pbnQiKTtlLnYoay5VZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxodzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIik7ZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSl9LGR3OmZ1bmN0aW9uKCl7dGhpcy53ZigpO3RoaXMuWWEoImNvbXBsZXRlIil9LGxpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2UubmUoKTt0aGlzLkg9ITE7dGhpcy5SYShhKX19LFl2OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2c7IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGIubWF0Y2goYykpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLnYoay5pdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubGkoITApfSwKTG46ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7aWYoYi5VYSYmYi5pc0VuYWJsZWQmJiFiLkZjKCkpe3ZhciBkPWIuemEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWMoYix0aGlzLkwpO2Yub25lcnJvcj10aGlzLlZ2LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGMoYix0aGlzLkwpKX0sV2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFBuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmhpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKdGhpcy5paS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLndmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMueGYuYmluZCh0aGlzKSl9LEFkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmhpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmlpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy54Zi5iaW5kKHRoaXMpKX0saGk6ZnVuY3Rpb24oYSl7dGhpcy5WYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZifHx0aGlzLnlmKGEpfS5iaW5kKHRoaXMpLAp0aGlzLkdvKSl9LHlmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlljJiZ0aGlzLldoKHRoaXMudmlkZW8pJiYhdGhpcy5GYiYmIXRoaXMuVmIpe3RoaXMuWWM9ITA7dHJ5e2lmKCFlLlZhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkZifHwodGhpcy5GYj0hMCx0aGlzLkFkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5aYSgpLCEwKSx0aGlzLkwuc2d8fHRoaXMuTC5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLlJhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5aYSgpLCEwKX10aGlzLlN2KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIuamYoKTt0aGlzLlJ2KCk7dGhpcy5naSgpO3RoaXMuZGcoKTt0aGlzLmIudmgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMubWYoKX19LG1mOmZ1bmN0aW9uKCl7dGhpcy5lZHx8CnRoaXMuUWYoKX0sUWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy52aWRlby5wbGF5KCk7aWYoYiYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5lZHx8KGE/dGhpcy5SYSgpOih0aGlzLlBlKCEwKSx0aGlzLlFmKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmRjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmRjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5lZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubWYoKSl9LmJpbmQodGhpcyk7dGhpcy53ZSgpLkpoKHRoaXMpfSx3ZjpmdW5jdGlvbigpe3RoaXMuTC5qYiYmIXRoaXMuRmImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwKITApLHRoaXMuWWEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS52KGsuRm4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlJhKCl9LEluOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPSExLGY9MDtmPGEubGVuZ3RoO2YrKyljPWUuR2coYVtmXSksYi5wdXNoKGMpO2E9e2hhc2hlczpifTthPWsuVGEoYSx0aGlzLkEoKSk7ZS5NdShhKX0sUmE6ZnVuY3Rpb24oYSl7dGhpcy5jJiZ0aGlzLmMuUWQmJnRoaXMuSW4odGhpcy5jLlFkKTtpZighdGhpcy5vZSlpZih0aGlzLm9lPSEwLHRoaXMuUGR8fChlLnYoay5Icyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy50Ynx8dGhpcy5jLnBjKXtlLm9iKCJuZXdTbWFsbEFkSWQiKTt0aGlzLmxmKys7dGhpcy5WYj10aGlzLlljPSExO3RyeXt0aGlzLkFkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuRWQ9ITE7dHJ5e3RoaXMuYi5kaSgpfWNhdGNoKGcpe310aGlzLkdkPSEwO3RoaXMuYi5BZSgpO3RoaXMuYWM9ITE7dGhpcy53ZSgpLkVoKCk7dGhpcy5jLnRiJiZ0aGlzLmMub3JpZ2luLlFlKCk7dGhpcy5jLnBjJiYoYT90aGlzLmMub3JpZ2luLnBoKCk6dGhpcy5wZSgpKX1lbHNlIHRoaXMucGUoKX0sVnY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5BZCh0aGlzLnZpZGVvKSx0aGlzLnhmKGEpKX0seGY6ZnVuY3Rpb24oYSl7dGhpcy5WYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkwuYXAoKTsKdGhpcy5jLm9yaWdpbi50Zyh3LlRkKX0saWk6ZnVuY3Rpb24oKXtpZih0aGlzLnB2KXRoaXMuUmEoKTtlbHNle3RoaXMuYWM9ITA7dGhpcy5iLmYuQWEmJiF0aGlzLkdkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay55Yyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5zdihhKTtpZighdGhpcy5PYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5QZD0hMDtlLnYoay5qaSx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuRmUodGhpcy5PYil9Yz0iIjt0aGlzLmMua2YmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWgpKSYmKGM9dGhpcy5jLmtmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkVkfHwodGhpcy5FZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5XZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuYy50Yj8odGhpcy5WYj10aGlzLlljPSExLHRoaXMuQWQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuRWQ9ITEsdGhpcy5iLmRpKCksdGhpcy5jLm9yaWdpbi5RZSgpKTp0aGlzLlJhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLldjLnJlcGxhY2UoIlt0aW1lXSIsZS5CZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmVlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxhaTpmdW5jdGlvbigpe3RoaXMudWh8fCh0aGlzLnVoPSEwLHRoaXMua2R8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxzdjpmdW5jdGlvbihhKXtlLnYoay5iZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2E9PXRoaXMuYml8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmFpKCl9LmJpbmQodGhpcykpLHRoaXMuRmJ8fHRoaXMuT2goKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuTC5qYiYmdGhpcy5ZYSgic3RhcnQiKSxlLnYoay5TZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLGUudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMua2Q9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLnYoay5QZix0aGlzLmMuQiwKdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5ZYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5VZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksdGhpcy5iaT1hKX0sTmg6ZnVuY3Rpb24oYSxiKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iK2EsYiwhMCl9LE91OmZ1bmN0aW9uKCl7ZS5LZChbInN0YXRzX2hkX2FkX2NhbGw6IisKdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sT2g6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFB1OmZ1bmN0aW9uKCl7ZS5LZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFhhOmZ1bmN0aW9uKGEpe2UuS2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWWE6ZnVuY3Rpb24oYSl7KHRoaXMuQWZ8fHRoaXMuTC5qYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLlphKCksITApfSxLYjpmdW5jdGlvbihhLGIpe3RoaXMuTC5qYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkZiKXt0aGlzLnZkJiZ0aGlzLnZkLnRyYWNrJiZ0aGlzLnZkLnRyYWNrKGEpO2lmKCJtdXRlIj09CmF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5McSh0aGlzLmMuUGEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmplPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuRmQuaW1wcmVzc2lvbnMmJmUuRnIoZy51cmwsdGhpcy5GZC5pbXByZXNzaW9ucyk/dGhpcy5KZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuR24sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHthZElkOnRoaXMuRmQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkplKGcudXJsLGcudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmMuUGE9CnRoaXMudnAodGhpcy5jLlBhLGEpfWNhdGNoKG0pe319fSxaYTpmdW5jdGlvbigpe3ZhciBhPWUuVmEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLkFmJiYoYj0iX3ZwYWlkIik7dGhpcy5DZiYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxKZTpmdW5jdGlvbihhLGIsYyxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxjJiZiLktuKGMpLGZ8fChmPXRoaXMucmcpLGV8fChlPXRoaXMucmcpLHRoaXMuTW4oYSksdGhpcy5MLkRhKGIsZnVuY3Rpb24oKXt0aGlzLkRoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LE1uOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09Im9wZW4ifSxEaDpmdW5jdGlvbihhKXt0aGlzLmNjW2FdPSJjbG9zZWQifSxrcDpmdW5jdGlvbigpe3RoaXMuY2M9e319LFJ1OmZ1bmN0aW9uKCl7dmFyIGE9MCxiO2ZvcihiIGluIHRoaXMuY2MpdGhpcy5jYy5oYXNPd25Qcm9wZXJ0eShiKSYmCiJvcGVuIj09dGhpcy5jY1tiXSYmYSsrO3JldHVybiBhfSxMcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHZwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFN2OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Udi5iaW5kKHRoaXMpKX0sVHY6ZnVuY3Rpb24oKXtlLlZhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmVjKCk6dGhpcy5jLlViJiYoZS52KGsua2csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLlpjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPQp3aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5VYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuVWIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxSdjpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0KIiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5XYy5yZXBsYWNlKCJbdGltZV0iLGUuQmcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC4kYyYmKGI9dGhpcy5MLiRjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC4kYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sQ2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC4kYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYKKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxnaTpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMucnA7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuR2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWGguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkViO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ydi5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnF2LmJpbmQodGhpcykpOwpnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLk1oO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9CjEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLmtmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlZhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0KImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5CYT10aGlzLnRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi4kZihmdW5jdGlvbihhKXt0aGlzLkJhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5QZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGVjOmZ1bmN0aW9uKCl7dGhpcy5CYSYmImJsb2NrIj09dGhpcy5CYS5zdHlsZS5kaXNwbGF5fHx0aGlzLkJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxYaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuJGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxZaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMubWM/KGUubWEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLm1jPSExKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLm1jPSEwKX0sd2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuJGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEdoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKSl9LHF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxydjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMucmI/KGUubWEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGUudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSx4djpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsudGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGRjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmRjKTt0aGlzLmVkfHx0aGlzLmVlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5tZigpKX0scGU6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUuaGQoKTshdGhpcy5MLmxjfHxlLlZhKCl8fCFjLmlzQ2hyb21lJiYhYy5pc0ZpcmVmb3h8fGMuaXNFZGdlfHwKIShhfHwhdGhpcy5qZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy5zaHx8IXRoaXMuTC5SYyYmInNwaWVnZWwuZGUiIT1lLlpiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwicHJlcm9sbCIhPWUuQ2I/KHRoaXMuZWQ9ITAsdGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy5tZygpKToodGhpcy5zaD10aGlzLkNmPXRoaXMuQmY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5qZT0hMCxhPWUuY2coYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuS2UoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LG1nOmZ1bmN0aW9uKGEpe3RoaXMuUnUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCEwKX0uYmluZCh0aGlzKSx0aGlzLnN0KToodGhpcy5HZD0hMCx0aGlzLmIuQWUoKSx0aGlzLmIuY3UoKSx0aGlzLmFjPSExLAplLnYoay5xcCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMud2UoKS5FaCgpKX0sd2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sZGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZS5FZSh0aGlzLnZpZGVvLGEpP3RoaXMuR2goKTp0aGlzLndkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5yYyYmMDx0aGlzLnJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5yYykpO3RoaXMudmlkZW8mJgp0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuT28rIi0iK3RoaXMubGY7dGhpcy5jJiZ0aGlzLmMuSGcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkhnKCkpO3JldHVybiBhfSxyZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuZGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRqPXRoaXMuYVs0XTt0aGlzLlhzPXRoaXMuYVs3XTt0aGlzLlJtPXRoaXMuYVs5XTt0aGlzLk9yPXRoaXMuYVsxMF07dGhpcy5zbz10aGlzLmFbM107dGhpcy52aj10aGlzLmFbMV07dGhpcy5Ddj10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOF07dGhpcy5ubD10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX0KYy50bz1iO2IucHJvdG90eXBlPXtDajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRGo6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhzOnRoaXMuUW0oYSl9LFFtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5SbTp0aGlzLk5yKGEpfSxOcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuT3I6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNvOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52ajp0aGlzLkJ2KGEpfSxCdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ3Y6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmd0OnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qbDp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy50b3x8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuQ2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnFjPXRoaXMuc2M9ITE7dGhpcy52YT0iIjt0aGlzLnpmPSExO3RoaXMuU2c9IiI7ZCYmZC5lbXB0eT90aGlzLm5zKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRm09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuaGQoKSxiO2I9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKdmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLm9nKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8CiJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkhkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLkRhKGIsdGhpcy5tcy5iaW5kKHRoaXMpLAp0aGlzLmpzLmJpbmQodGhpcykpfSxEZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5LcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5XdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxLcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmCmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LG1zOmZ1bmN0aW9uKGEpe3RoaXMuTXQoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpOwp0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlNnPWEucmVzcG9uc2VVUkw7dGhpcy5ZLmxlbmd0aD90aGlzLkljKCk6dGhpcy5zYSh0aGlzLlNhKHcuUGMse2Vycm9yOnRoaXMuemY/Ry5XZDpHLklmfSkpfSxuczpmdW5jdGlvbihhKXt0cnl7dGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpO3RoaXMucWM9dGhpcy5UaCgpO3RoaXMuWS5sZW5ndGg/dGhpcy5JYygpOnRoaXMuc2EodGhpcy5TYSh3LlBjLHtlcnJvcjp0aGlzLnpmP0cuV2Q6Ry5JZn0pKX0sanM6ZnVuY3Rpb24oKXt0aGlzLnNhKHRoaXMuU2Eody5IZix7ZGVwdGg6YX0pKX0sSWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5NcigpP3RoaXMuZnYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5NZygpLGgse0FkU3lzdGVtOnRoaXMudHEoKSwKdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMuc2EodGhpcy5TYSh3LktmKSk6KGE9MCx0aGlzLkp2KCkmJnRoaXMuVmUodGhpcy5zcCgpKSl9LFFlOmZ1bmN0aW9uKCl7dGhpcy5zYz8odGhpcy5zYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5RZSgpfSxwaDpmdW5jdGlvbigpe3RoaXMucWM/KHRoaXMucWM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSWMoKSk6dGhpcy5wYXJlbnQucGgoKX0sSnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdigpP3RoaXMuYnYoKT8hMDooLTEhPXRoaXMuQ2MoKT90aGlzLnNhKHRoaXMuU2Eody5TZCkpOnRoaXMuc2EodGhpcy5TYSh3LkRmKSksITEpOih0aGlzLnNhKHRoaXMuU2Eody5QYyxHLkpmKSksITEpfSxWZTpmdW5jdGlvbihhKXt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5RZHx8KGEuUWQ9W10pO2EuUWQucHVzaCh0aGlzLlNnKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuTWUoKSk7CmEudGI9YS50Yj9hLnRiOnRoaXMuc2M7YS5wYz1hLnBjP2EucGM6dGhpcy5xYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7dGhpcy5wYXJlbnQuVmUoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLmR1cmF0aW9uPXRoaXMuQ2MoKTthLk89dGhpcy5KZygpO2EuVWI9dGhpcy52cSgpO2EuUXY9W107YS5vcmlnaW49dGhpczthLkI9dGhpcy5zcSgpO2Eua2Y9dGhpcy5KcShhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7cmV0dXJuIGF9LHNhOmZ1bmN0aW9uKGIpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPQp3LlNkLmNvZGU/Yi5QYS5jb25jYXQodGhpcy53cSgpKTpiLlBhLmNvbmNhdCh0aGlzLkVxKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuV2ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5zYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnNhJiZ0aGlzLnBhcmVudC5zYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sdGc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sZnY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxjdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuSmcoKS5sZW5ndGh9LGJ2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5DYygpfSxwZjpmdW5jdGlvbigpe3JldHVybiAxPAp0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxUaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMucGYoKSYmKGE9ITApO3JldHVybiBhfSxNdDpmdW5jdGlvbihhKXt0aGlzLnZhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy52YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuemY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sTXI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLk1nKCkubGVuZ3RofSxNZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LHRxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmUodGhpcy5VLAoiQWRTeXN0ZW0iKX0sTWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy4kZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5rYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LCRnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuJGcoYS5wYXJlbnROb2RlKTohMX0sRXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT0KYS50eXBlfSl9LHdxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx2cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxKZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxseDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5rYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8CjFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sc3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5uZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9CmJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LENjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxKcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkZ1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sdmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD8KdGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0seWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkZtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFyPXRoaXMuYVs2XTt0aGlzLmZvPXRoaXMuYVs2XTt0aGlzLnp3PXRoaXMuYVs5XTt0aGlzLktvPXRoaXMuYVsxMF07dGhpcy5kcz10aGlzLmFbMTBdO3RoaXMuRXA9dGhpcy5hWzVdO3RoaXMuR3A9dGhpcy5hWzZdO3RoaXMuc2o9CnRoaXMuYVsyXTt0aGlzLmNvPXRoaXMuYVs2XTt0aGlzLnFvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLkNwPWI7Yi5wcm90b3R5cGU9e3ByOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5xcjp0aGlzLmVvKGEpfSxlbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZm86dGhpcy55dyhhKX0seXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnp3OnRoaXMuSm8oYSl9LEpvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Lbzp0aGlzLmNzKGEpfSxjczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZHM6dGhpcy5EcChhKX0sRHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkVwOnRoaXMuRnAoYSl9LEZwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HcDp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNqOnRoaXMuYm8oYSl9LGJvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5jbzp0aGlzLnBvKGEpfSxwbzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnFvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5DcHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkI9dGhpcy5wYz10aGlzLnRiPSExO3RoaXMuQmU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkNlPSIifWMuUmw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sQ3E6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkdhKXt2YXIgYT10aGlzLm9yaWdpbi5HYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5CZT1hW2NdKX1yZXR1cm4gdGhpcy5CZX0sSGc6ZnVuY3Rpb24oKXtpZih0aGlzLkNlKXJldHVybiB0aGlzLkNlO3ZhciBhPSIiOyhhPXRoaXMuQ3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkNlPWF9LE5xOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5SbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2k9dGhpcy5hWzFdO3RoaXMuWW09dGhpcy5hWzldO3RoaXMuVnA9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNF19Yy5wdD1iO2IucHJvdG90eXBlPXtGaTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkdpOnRoaXMuWG0oYSl9LFhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ZbTp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLnB0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5GaSg0KTt2YXIgdz17WGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LERmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxQYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCk9hOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApPYToiTE9BRF9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LE53Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxTZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17SWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sT3c6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT209dGhpcy5hWzEwXTt0aGlzLm53PXRoaXMuYVsyXTt0aGlzLnJrPXRoaXMuYVs0XTt0aGlzLkFrPXRoaXMuYVs2XTt0aGlzLlVuPXRoaXMuYVs4XTt0aGlzLlVyPXRoaXMuYVsyXTt0aGlzLlFqPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzVdfWMuUms9YjtiLnByb3RvdHlwZT17Tm06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk9tOnRoaXMubHcoYSl9LGx3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5udzp0aGlzLnFrKGEpfSxxazpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnJrOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Bazp0aGlzLlRuKGEpfSxUbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVW46dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVyOnRoaXMuUGooYSl9LFBqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Rajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuUmt8fFhhLEljPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLk5tKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuZ2Q9Yjt0aGlzLlBhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5Faj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuRWp8fFVhO2M9CmN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5obD10aGlzLmFbNl07dGhpcy5tdD10aGlzLmFbMl07dGhpcy5MdD10aGlzLmFbN107dGhpcy5ndT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy5Hcz1iO2IucHJvdG90eXBlPXtnbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaGw6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm10OnRoaXMuS3QoYSl9LEt0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5MdDp0aGlzLmZ1KGEpfSxmdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZ3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLkdzfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZ2woNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLkZoPWE7dGhpcy52aWRlbz1iO3RoaXMuTmQ9W107dGhpcy5DaD1bXTt0aGlzLlJlPVtdO3RoaXMuVXY9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlhrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuRmgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5GaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LApnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2cuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgaz1nLmNvbnRlbnRXaW5kb3c7ay5HeD17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy4kdC5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5SdC5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuTmQucHVzaCh7c3JjOmMsZnJhbWU6Zyx0dDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LAp0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuUmUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5SZVtiXTtjLnR5cGU9PT1hJiZjLlZvKHRoaXMueHEoYSkpfX0seHE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7UHg6ITAsT3g6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7Q3g6InZpZGVvIixSeDoianNDdXN0b20iLFN4OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsVHg6MSxteDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLAphZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxNcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuTmQubGVuZ3RoO2IrKylpZih0aGlzLk5kW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuTmRbYl0udHQ7cmV0dXJuIiJ9LCR0OmZ1bmN0aW9uKGEsYil7dGhpcy5DaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5NcShiKSx2ZW5kb3I6Yn0pO3RoaXMuTnUoKX0sUnQ6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLlV2Lm1hcChmdW5jdGlvbihhKXt0aGlzLmFnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYWcoYSxiKX0sYWc6ZnVuY3Rpb24oYSxiKXt0aGlzLlJlLnB1c2goe3R5cGU6YSxWbzpiLE14OiExfSl9LE51OmZ1bmN0aW9uKCl7dGhpcy5DaC5tYXAoZnVuY3Rpb24oYSl7YS5Jcnx8CihhLkZ4KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5ReCxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuSXI9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWGt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhpPXRoaXMuYVs1XTt0aGlzLllpPXRoaXMuYVsxXTt0aGlzLlJwPXRoaXMuYVs1XTt0aGlzLkhrPXRoaXMuYVs1XTt0aGlzLmF0PXRoaXMuYVs4XTt0aGlzLml1PXRoaXMuYVszXTt0aGlzLm5rPXRoaXMuYVs0XTt0aGlzLiRxPXRoaXMuYVszXTt0aGlzLmZsPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy5pcj1iO2IucHJvdG90eXBlPXt3aTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueGk6dGhpcy5YaShhKX0sClhpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZaTp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUnA6dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhrOnRoaXMuJHMoYSl9LCRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaXU6dGhpcy5tayhhKX0sbWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5rOnRoaXMuWnEoYSl9LFpxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kcTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmlyfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2Mud2koNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5pYj1hLkVnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuYmc9ITE7dGhpcy5UYj1bXX1jLm9qPWI7Yi5wcm90b3R5cGU9e3JxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZT0wLGI9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUsCnk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnJxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5hcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmCihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sVXU6ZnVuY3Rpb24oKXt0aGlzLmJnPSEwfSxkaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sdmg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay55Yyx0aGlzLmYucygpKX0sY3U6ZnVuY3Rpb24oKXt0aGlzLmJnfHwodGhpcy5mLnBsYXkoKSxlLnYoay5kZCx0aGlzLmYucygpKSl9LGpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9CiJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5pYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuaWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5pYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmliLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaWIpO3RoaXMuZi5MYyYmdGhpcy5mLkxjKCk/dGhpcy5mLkVnKCkuYXBwZW5kQ2hpbGQodGhpcy5LKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy4kYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sCmFyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxqcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LCRiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuanEodGhpcy5pYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmCjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQWUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLkxjKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLksuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5UYi5sZW5ndGg7YSsrKXRoaXMuVGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5QaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLiRiLmJpbmQodGhpcyksMTApfSwkZjpmdW5jdGlvbihhKXt0aGlzLlRifHwKKHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEFlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMub2p8fCRhLEU9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuYWEoMTApO04uY29udHJvbHM9ITA7RS5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCkEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1vPXRoaXMuYVsyXTt0aGlzLmRqPXRoaXMuYVs5XTt0aGlzLkR3PXRoaXMuYVs3XTt0aGlzLmpqPXRoaXMuYVsyXTt0aGlzLkNpPXRoaXMuYVs1XTt0aGlzLlZzPXRoaXMuYVszXTt0aGlzLnBsPXRoaXMuYVs3XTt0aGlzLmJzPXRoaXMuYVsyXTt0aGlzLnZ3PXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuRW09YjtiLnByb3RvdHlwZT17bG86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1vOnRoaXMuY2ooYSl9LGNqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kajp0aGlzLkN3KGEpfSxDdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRHc6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmpqOnRoaXMuQmkoYSl9LEJpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DaTp0aGlzLlVzKGEpfSwKVXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZzOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wbDp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYnM6dGhpcy51dyhhKX0sdXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnZ3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5FbXx8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMubG8oNCk7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLAphPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5CZChiKTt0aGlzLnBnKCl9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LApEZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5DbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuQmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7dGhpcy5TYj10aGlzLlNifHwhMTt0aGlzLlRmPXRoaXMuVmY9dGhpcy5XZz10aGlzLmVhPXRoaXMuc2Y9CiExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuaHEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnNmPSEwO3RoaXMuV2cmJnRoaXMuamcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLmFjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuYmQoKTt0aGlzLldnPSEwO3RoaXMuamcoKX0uYmluZCh0aGlzKSk7dGhpcy5mZygpfSwKamc6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5iZCgpO2lmKCF0aGlzLnNmJiYhdGhpcy5iZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuc2YmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0sYmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLktnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LEtnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGZnOmZ1bmN0aW9uKCl7aWYodGhpcy5iZCgpKXt2YXIgYj10aGlzLktnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdOwp0aGlzLlZmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9Yi5qeH10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LG54OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkF4KCk6ITF9LENjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5DYygpOi0xfSxGcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxocTpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy51KCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwKMTAwKX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5EZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkZxKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuQmx8fGRiOyhmdW5jdGlvbihjKXtjLkRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sSnI6ZnVuY3Rpb24oKXt3aW5kb3cuT08uWGwudm4udG4/d2luZG93Lk9PLlhsLnZuLnRuLmh4KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpyKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9CmRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnhlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMuRGx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaz10aGlzLmFbOV07dGhpcy55az10aGlzLmFbN107dGhpcy5haz10aGlzLmFbMTBdO3RoaXMuZmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5Pcz1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRms6CnRoaXMueGsoYSl9LHhrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy55azp0aGlzLiRqKGEpfSwkajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYWs6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5Pc3x8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuRWsoNCk7KGZ1bmN0aW9uKGMpe2MuU2k9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMTt0aGlzLk5nKCl9LE5nOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTsKYnx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sCk5hOmZ1bmN0aW9uKCl7dGhpcy55aCgpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuU2l8fGhiOyhmdW5jdGlvbihjKXtjLlJpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMucmEoKTp0aGlzLm0oKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmdnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2coYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGliPWMuUml8fGliOyhmdW5jdGlvbihjKXtjLlRpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sQmg6ZnVuY3Rpb24oYil7Yj1uZXcgaGIoYik7Yi5uYT90aGlzLlQoKTp0aGlzLk4oYil8fAooYi5CZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5pcXx8KHRoaXMuaXE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkJoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5CaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGpiPWMuVGl8fGpiLFQ9bmV3IGpiKHIpO1QuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy55bT10aGlzLmFbMl07dGhpcy5jcj10aGlzLmFbMl07dGhpcy56dj10aGlzLmFbNF07dGhpcy5Haj10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLmxsPWI7Yi5wcm90b3R5cGU9e3htOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy55bTp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3I6dGhpcy55dihhKX0seXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnp2OnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR2o6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5sbHx8a2IsTmM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMueG0oNCk7KGZ1bmN0aW9uKGMpe2Mubm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sTGM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ubXx8VTsoZnVuY3Rpb24oYyl7Yy5tbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlZjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eC5WYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLk1zKGEpfS5iaW5kKHRoaXMpKTt4LlZjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3guVmMoIiMiK2IsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTsKeC5UcSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufX10aGlzLnUoImFkZXJyb3IiLGEpO3RoaXMuRygpfX0pfSkoYyk7dmFyIFY9Yy5tbXx8VjsoZnVuY3Rpb24oYyl7Yy5vbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMudWQmJihiPWUud3AoYix0aGlzLnVkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5SKGQpO3ZhciBmPW5ldyBWKGQsdGhpcy5JKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy51ZHx8KHRoaXMudWQ9W10pLHRoaXMudWQucHVzaChiW2FdKSxkPW5ldyBVKGcpLHRoaXMuTihkKXx8KHRoaXMuUihkKSxmPW5ldyBWKGQsdGhpcy5JKSwKZi5nKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxWYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSxndjpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmRhfHx0aGlzLmRhJiYhdGhpcy5kYVthXSl0aGlzLkhjfHwodGhpcy5IYz1bXSksdGhpcy5IYy5wdXNoKGIpLHRoaXMuYnUoKSYmKHRoaXMuYmYoKSx0aGlzLmcoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5kYVthXVtjXSYmMDx0aGlzLmRhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuZGFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmRhW2FdW2NdW2RdKGIpfX0sVHE6ZnVuY3Rpb24oKXtpZih0aGlzLkhjKWZvcih2YXIgYj0KMDtiPHRoaXMuSGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5IY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmRhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5kYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnguZ3YoYil9fSl9KShjKTt2YXIgbGI9Yy5vbXx8bGIseD1uZXcgbGIocik7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ocj10aGlzLmFbOF07dGhpcy5vdD10aGlzLmFbOV07CnRoaXMuWHA9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMuQW49YjtiLnByb3RvdHlwZT17Z3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ocjp0aGlzLm50KGEpfSxudDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub3Q6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5Bbnx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuZ3IoNCk7KGZ1bmN0aW9uKGMpe2MuT2k9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7CnZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLk9pfHxuYjsoZnVuY3Rpb24oYyl7Yy5QaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTsKdmFyIG9iPWMuUGl8fG9iOyhmdW5jdGlvbihjKXtjLlFpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkkpKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuUWl8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy56cj10aGlzLmFbMl07dGhpcy5ObD10aGlzLmFbN107dGhpcy5Ucz10aGlzLmFbMV07dGhpcy5qcD10aGlzLmFbM107dGhpcy5Xbj10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsyXX1jLmptPWI7Yi5wcm90b3R5cGU9e3lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cjp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTmw6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRzOnRoaXMuaXAoYSl9LGlwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qcDp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlduOnRoaXMuaShhKX0sCmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIHJiPWMuam18fHJiLFBjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLnlyKDQpOyhmdW5jdGlvbihjKXtjLnJsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5XKGIpO3RoaXMuWihhKTt0aGlzLlF0KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LApwbGF5OmZ1bmN0aW9uKCl7fSxRdDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnBhdXNlJiZ0aGlzLmphLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnJlc3VtZSYmdGhpcy5qYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEubXV0ZSYmdGhpcy5qYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LApmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS51bm11dGUmJnRoaXMuamEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxYZzpmdW5jdGlvbihiKXt0aGlzLmphPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBzYj1jLnJsfHxzYjsoZnVuY3Rpb24oYyl7Yy5xbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubWk9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMubWkmJih0aGlzLkcoKSx0aGlzLm1pPSEwLHRoaXMub2EoKSk7YS5LYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgdGI9Yy5xbHx8dGI7KGZ1bmN0aW9uKGMpe2Muc2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZzpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYj1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgc2IoYltkXSksdGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgdGIoYyx0aGlzLkkpKS5nKCkpfX1lbHNlIHRoaXMuVCgpfX0pfSkoYyk7dmFyIHViPWMuc2x8fHViLFc9bmV3IHViKHIpO1cuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRvPXRoaXMuYVs0XTt0aGlzLnVsPXRoaXMuYVs2XTt0aGlzLmxrPXRoaXMuYVs4XTt0aGlzLlNxPXRoaXMuYVsxMF07dGhpcy5Uaz10aGlzLmFbN107dGhpcy5Tcj10aGlzLmFbN107dGhpcy5Kcz10aGlzLmFbM107dGhpcy5ucT10aGlzLmFbOF07CnRoaXMuc3I9dGhpcy5hWzEwXTt0aGlzLkJ3PXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy52aT1iO2IucHJvdG90eXBlPXtDbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRG86dGhpcy50bChhKX0sdGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVsOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sazp0aGlzLlJxKGEpfSxScTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU3E6dGhpcy5TayhhKX0sU2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRrOnRoaXMuUnIoYSl9LFJyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Tcjp0aGlzLklzKGEpfSxJczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSnM6dGhpcy5tcShhKX0sbXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm5xOnRoaXMucnIoYSl9LHJyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zcjp0aGlzLkF3KGEpfSxBdzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkJ3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy52aXx8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UWMuQ28oNCk7KGZ1bmN0aW9uKGMpe2MuTG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LAp1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlg/KDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgd2I9Yy5MbXx8d2I7KGZ1bmN0aW9uKGMpe2MuS209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLApiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxPdDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuZWJ8fCh0aGlzLmViPVtdKTt0aGlzLmViLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5yYSgpOnRoaXMudSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTsKdGhpcy5DYT90aGlzLk90KHRoaXMuQ2EpOih0aGlzLkNhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5DYSl7dGhpcy5HKCk7cmV0dXJufWlmKCF0aGlzLnRjKXt0aGlzLkcoKTtyZXR1cm59Yj0hMDtpZih0aGlzLmViJiZ0aGlzLmViLmxlbmd0aCYmMTx0aGlzLmViLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuZWIubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuZWJbYV0mJjMwMyE9dGhpcy5lYlthXSYmNDAzIT10aGlzLmViW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5LbXx8eGI7KGZ1bmN0aW9uKGMpe2MuTW09CnQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgd2IoYi5pdGVtKGEpKTt0aGlzLk4oYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLlIoYyksKG5ldyB4YihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgeWI9Yy5NbXx8eWIsemI9bmV3IHliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZvPXRoaXMuYVsyXTt0aGlzLiRyPXRoaXMuYVs2XTt0aGlzLldyPXRoaXMuYVsxMF07dGhpcy5pdj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5QbT1iO2IucHJvdG90eXBlPXtFbzpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLkZvOnRoaXMuWnIoYSl9LFpyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kcjp0aGlzLlZyKGEpfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3I6dGhpcy5odihhKX0saHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLml2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy5QbXx8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMuRW8oNCk7KGZ1bmN0aW9uKGMpe2MuZG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlcoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pOwp0aGlzLldlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5FdCgpfS5iaW5kKHRoaXMpLDUwMCl9LEV0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuV2UmJgp3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLldlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sUXU6ZnVuY3Rpb24oKXt0aGlzLldlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgQmI9Yy5kbXx8QmI7KGZ1bmN0aW9uKGMpe2MuY209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKTt0aGlzLmtjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLnVzPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5rY3x8KHRoaXMua2M9CjAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8Cih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMua2N8fHRoaXMua2MrKyx0aGlzLmtjPD10aGlzLnVzPyh0aGlzLmtjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5RdSgpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLAoxMDApfX0pfSkoYyk7dmFyIENiPWMuY218fENiOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IEJiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsdGhpcy5JKSkuZygpKSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgRGI9Yy5lbXx8RGIsRWI9bmV3IERiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuTHc9CmI7Yi5wcm90b3R5cGU9e2pyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5rcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEZiPWMuTHd8fEZiLFNjPW5ldyBGYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLmpyKDQpOyhmdW5jdGlvbihjKXtjLlpsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMuWmx8fEdiOyhmdW5jdGlvbihjKXtjLllsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5LYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMub3AoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5tZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMuZXMoKTp0aGlzLmlnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksCjFFMyl9LG9wOmZ1bmN0aW9uKCl7dGhpcy5SZigpfHx0aGlzLm0oITApfSxlczpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWQoKTshYi5xYSYmYi5ZJiZiLmd4JiZiLml4JiYodGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSgpKX0saWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZygpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGgpZm9yKHZhciBiPQpsLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5LYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy50aD1iW2NdKTtyZXR1cm4gdGhpcy50aH0sQng6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubWQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5ZbHx8SGI7KGZ1bmN0aW9uKGMpe2MuJGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0KMDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEdiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBIYihjLHRoaXMuSSkpLmcoKSl9cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBJYj1jLiRsfHxJYixKYj1uZXcgSWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueWw9dGhpcy5hWzRdO3RoaXMubXA9dGhpcy5hWzVdO3RoaXMudXY9dGhpcy5hWzEwXTt0aGlzLldpPXRoaXMuYVszXTt0aGlzLktpPXRoaXMuYVszXTt0aGlzLllxPXRoaXMuYVsyXTt0aGlzLmJuPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzEwXX1jLkF2PWI7Yi5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLm1wOnRoaXMudHYoYSl9LHR2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51djp0aGlzLlZpKGEpfSxWaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuV2k6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktpOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ZcTp0aGlzLmFuKGEpfSxhbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLkF2fHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy54bCg0KTsoZnVuY3Rpb24oYyl7Yy5Waz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7CkgmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sCkFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxMYzpmdW5jdGlvbigpe3JldHVybiEwfSxLYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Wa3x8WDsoZnVuY3Rpb24oYyl7Yy5Vaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5YZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhlPQpiLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlhlJiZiIT10aGlzLlhlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuZmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLkh4KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy51KCJhZGVycm9yIiksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFk9Yy5Va3x8WTsoZnVuY3Rpb24oYyl7Yy5Xaz0KdC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWChiKSxiLm5hP3RoaXMuYmYoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksCmIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuV2t8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWk9dGhpcy5hWzddO3RoaXMuV209dGhpcy5hWzRdO3RoaXMuem49dGhpcy5hWzZdO3RoaXMuTm89dGhpcy5hWzddO3RoaXMuSXc9dGhpcy5hWzFdO3RoaXMua289dGhpcy5hWzhdO3RoaXMubXU9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOV19Yy5KbT1iO2IucHJvdG90eXBlPXtEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRWk6dGhpcy5WbShhKX0sVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldtOnRoaXMueW4oYSl9LHluOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy56bjp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5IdyhhKX0sSHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5Jdzp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmtvOnRoaXMubHUoYSl9LGx1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5tdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLkptfHxOYixVYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5EaSg0KTsoZnVuY3Rpb24oYyl7Yy5Vaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LApudTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sRXg6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgT2I9Yy5Vanx8T2I7KGZ1bmN0aW9uKGMpe2MuVGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGEpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk7Yi5PbigiZmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oInRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5vYSgpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgUGI9Yy5Uanx8UGI7KGZ1bmN0aW9uKGMpe2MuVmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yayYmCndpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycyl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yay5HZXRBbGxQbGF5ZXJzKCk7aWYoYiYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX19dGhpcy5UKCl9fSl9KShjKTt2YXIgUWI9Yy5Wanx8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklwPXRoaXMuYVs3XTt0aGlzLm5uPXRoaXMuYVs5XTt0aGlzLmJtPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzFdfWMuUnM9YjtiLnByb3RvdHlwZT17SHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JcDp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLm5uOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLlJzfHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5IcCg0KTsoZnVuY3Rpb24oYyl7Yy5kbj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSwKTGQ6ZnVuY3Rpb24oYil7dmFyIGE9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LFB0OmZ1bmN0aW9uKCl7dGhpcy5SZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuTGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUmR8fCh0aGlzLlJkPSEwLHRoaXMuTGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LApwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxBYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuZG58fFRiOyhmdW5jdGlvbihjKXtjLmNuPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFR0OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSwKYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWQoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmFkKGEpfS5iaW5kKHRoaXMpKX0sYWQ6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7CmEuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMudSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5tKCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxOZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5hZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTmYuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5UdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLk5mKCk7dGhpcy5TdCgpfSxTdDpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsCnRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuTnQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5OdD0hMH19KX0pKGMpO3ZhciBVYj1jLmNufHxVYjsoZnVuY3Rpb24oYyl7Yy5lbj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLlB0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTsKdmFyIFZiPWMuZW58fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenA9dGhpcy5hWzNdO3RoaXMuemo9dGhpcy5hWzddO3RoaXMuVHA9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMTBdfWMuS2w9YjtiLnByb3RvdHlwZT17eXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpwOnRoaXMueWooYSl9LHlqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56ajp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLktsfHxYYixXYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1XYy55cCg0KTsKKGZ1bmN0aW9uKGMpe2Mudm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy53aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLkJzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxudTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLAphPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQnN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMud2gmJih0aGlzLndoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE89Yy52bXx8TzsoZnVuY3Rpb24oYyl7Yy51bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5EYisrLDE1PHRoaXMuRGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnp1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSwKaGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLnVtfHxQOyhmdW5jdGlvbihjKXtjLndtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuYmYoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLndtfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudGs9CnRoaXMuYVs4XTt0aGlzLm12PXRoaXMuYVs0XTt0aGlzLnhuPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTnM9YjtiLnByb3RvdHlwZT17c2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRrOnRoaXMubHYoYSl9LGx2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tdjp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5Oc3x8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuc2soNCk7KGZ1bmN0aW9uKGMpe2MuS2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpOwp2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5XKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5La3x8WjsoZnVuY3Rpb24oYyl7Yy5Kaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkVjPXRoaXMuQ2E9dGhpcy5YYz0hMTt0aGlzLkFoPWUuSGIoMTApO3RoaXMuYmgoKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiYKYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnFhPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5xYigpLCEwO3RoaXMuVGcrKztpZigxMDx0aGlzLlRnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmguYmluZCh0aGlzKSwxMDApLCExfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT0KYXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITB9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkprfHxhYTsoZnVuY3Rpb24oYyl7Yy5Maz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYKMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLkxrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQm89dGhpcy5hWzhdO3RoaXMuQ249dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMl19Yy5zaT1iO2IucHJvdG90eXBlPXtBbzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkJvOnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGNjPWMuc2l8fGNjLFljPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVljLkFvKDQpOyhmdW5jdGlvbihjKXtjLkxqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBkYz1jLkxqfHxkYzsoZnVuY3Rpb24oYyl7Yy5Laj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5oZygpfSxoZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuS2p8fGVjOyhmdW5jdGlvbihjKXtjLk1qPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmCndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgZGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubmEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7KG5ldyBlYyhiLHRoaXMuSSkpLmcoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGZjPWMuTWp8fGZjLGdjPW5ldyBmYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdz10aGlzLmFbMl07dGhpcy5Zbj10aGlzLmFbOF07dGhpcy5wcT10aGlzLmFbNl07dGhpcy5Caj10aGlzLmFbOF07dGhpcy5Oaz10aGlzLmFbMl07dGhpcy5uaj10aGlzLmFbOF07dGhpcy5pbz10aGlzLmFbM107dGhpcy5ydD10aGlzLmFbOF07dGhpcy5OaT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmt1PWI7Yi5wcm90b3R5cGU9e3J3OmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuc3c6dGhpcy5YbihhKX0sWG46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlluOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5wcTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQmo6dGhpcy5NayhhKX0sTWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk5rOnRoaXMubWooYSl9LG1qOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5uajp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaW86dGhpcy5xdChhKX0scXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnJ0OnRoaXMuTWkoYSl9LE1pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5OaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMua3V8fGhjLFpjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5ydyg0KTsoZnVuY3Rpb24oYyl7Yy5waT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5waXx8aWM7KGZ1bmN0aW9uKGMpe2Mub2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubGUoKTt0aGlzLmVnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmVnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGUuYmluZCh0aGlzKSwxMDApfSxsZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxlLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIGpjPWMub2l8fGpjOyhmdW5jdGlvbihjKXtjLnJpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj0KbmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMucml8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xbT10aGlzLmFbNl07dGhpcy5jaz10aGlzLmFbMV07dGhpcy5acz10aGlzLmFbMTBdO3RoaXMucW49dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5rbD1iOwpiLnByb3RvdHlwZT17cG06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnFtOnRoaXMuYmsoYSl9LGJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5jazp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWnM6dGhpcy5wbihhKX0scG46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5rbHx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMucG0oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZWg9dGhpcy5naD10aGlzLmZoPSExO3RoaXMueGQ9W107dGhpcy5hZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuVGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5HcShhKTpbXSxiO3RoaXMuZ2g9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZmg9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuSGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmFmKXtpZih0aGlzLmVoKWJyZWFrO2I9dGhpcy5hZltjXTt0aGlzLnZmKGIpJiYodGhpcy54ZC5wdXNoKGIpLHRoaXMuSGgoYikpfX0sdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgp0PyEwOiExfSxHcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5hZltjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEhoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSxTdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZmgpZm9yKHRoaXMuZWg9ITAsYT0wO2E8dGhpcy54ZC5sZW5ndGg7YSsrKXRoaXMueGRbYV0uTGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54ZFthXS5MYil9fX0pKGMpO3ZhciBuYz1jLlRsfHxuYyxNPW5ldyBuYztNLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vcj10aGlzLmFbMTBdO3RoaXMuaXQ9dGhpcy5hWzFdO3RoaXMuQXQ9dGhpcy5hWzVdO3RoaXMuR2w9dGhpcy5hWzEwXTsKdGhpcy53cz10aGlzLmFbOV07dGhpcy5Rcz10aGlzLmFbNV07dGhpcy5tcj10aGlzLmFbN107dGhpcy5IdT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs3XX1jLmZxPWI7Yi5wcm90b3R5cGU9e25yOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vcjp0aGlzLmh0KGEpfSxodDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaXQ6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkF0OnRoaXMuRmwoYSl9LEZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HbDp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud3M6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFzOnRoaXMubHIoYSl9LGxyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5tcjp0aGlzLkd1KGEpfSxHdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuajphfX19KShjKTt2YXIgb2M9Yy5mcXx8b2MsYWQ9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9YWQubnIoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuQmMoay5LdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOgotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkJjKGsuRnMpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtGLndpZHRoPTE7Ri5oZWlnaHQ9MTtGLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgYmQ9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgST1uZXcgSixsPSExO0kua2EoKTtJLllnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5rYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuWWcoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTtJLmthKCk7CnZhciBjZD1iZChmdW5jdGlvbigpe2UueWcod2luZG93LEkuQXIoKSx7aWQ6Y2R9KX0sNTAwKSxpYT1lLmFhKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd0PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuTnA9YjtiLnByb3RvdHlwZT17dnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnd0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5OcHx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQudnQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnhoPXRoaXMuY29uZj10aGlzLmxiPXRoaXMucGxheWVyPW51bGw7dGhpcy5zZD0wOwp0aGlzLmJiPSIiO3RoaXMueWQ9W107dGhpcy56ZD0wO3RoaXMuemg9ITE7dGhpcy5ZZT1bXTtlLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy50aT1iO2IucHJvdG90eXBlPXt2dTpmdW5jdGlvbihhKXt0aGlzLnhoPWF9LGdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0scXU6ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSxwdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxNYzpmdW5jdGlvbihhLGIpe2UuZmEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5CcigpKXRoaXMubGIubCh0aGlzLmxiLm9kLHRoaXMubGIud2EsdGhpcy5sYi4kZSxmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmxiLkFjKTtlbHNlIGlmKHRoaXMuVnEoKSl0aGlzLmp1KGZ1bmN0aW9uKCl7dGhpcy5NYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsueWMsdGhpcy5wbGF5ZXIucygpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLlV1KCk7bC5leGl0RnVsbHNjcmVlbigpO2Uub2IoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLmxiLApnKTtsLm91KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy50cyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkllJiYoYz10aGlzLnBsYXllci5JZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5LZShhLGMsZik7dGhpcy5wbGF5ZXIuSmgobCl9fSxCcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnNkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuc2QuZ2V0VGltZSgpLHRoaXMuc2Q9YSwzRTU8Yj8hMDohMTt0aGlzLnNkPWE7cmV0dXJuITF9LEV1OmZ1bmN0aW9uKCl7ZS5vYigicHJlcm9sbCIpO2UuZmYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMudWcoYSkpP3RoaXMuTWMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX0sRHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueGgpe2UuZmYoInBvc3Ryb2xsIik7ZS5vYigicG9zdHJvbGwiKTt0aGlzLnZ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnVnKGMpKT90aGlzLk1jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX19LHVnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxXdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLkJ1KHRoaXMuRHUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5vYigibWlkcm9sbCIpO2UuZmYoIm1pZHJvbGwiKTtpZighdGhpcy5taCl7dGhpcy5taD0hMDt2YXIgYj10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5NYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5taD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5kZCwKdGhpcy5wbGF5ZXIucygpKSl9fSxWdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnV1KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmUoKX0sZzpmdW5jdGlvbigpe3RoaXMuRXUoKTt0aGlzLnBsYXllci5OZSYmdGhpcy5WdCgpO3RoaXMuV3QoKX0sWHQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy55ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuR3coYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnpkPXRoaXMueWQubGVuZ3RofSxWcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy56ZCYmKGE9ITApO3JldHVybiBhfSwKanU6ZnVuY3Rpb24oYSl7dGhpcy56aD1hO2ZvcihhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXVsiZnVuY3Rpb24iXSh0aGlzLkl0LmJpbmQodGhpcykpfSxJdDpmdW5jdGlvbihhKXt0aGlzLnpkLS07YSYmdGhpcy5ZZS5wdXNoKGEpOzA+PXRoaXMuemQmJnRoaXMuemgoKX0sdHM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWWUubGVuZ3RoO2MrKyliPXRoaXMuWWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWms9dGhpcy5hWzhdO3RoaXMuJG09dGhpcy5hWzhdO3RoaXMuUWw9dGhpcy5hWzNdO3RoaXMuYXE9dGhpcy5hWzddO3RoaXMuZXU9dGhpcy5hWzFdO3RoaXMuTHM9dGhpcy5hWzhdO3RoaXMuUGs9CnRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzVdfWMuSW89YjtiLnByb3RvdHlwZT17WWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlprOnRoaXMuWm0oYSl9LFptOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy4kbTp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUWw6dGhpcy4kcChhKX0sJHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFxOnRoaXMuZHUoYSl9LGR1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZXU6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxzOnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuSW98fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Zayg0KX0pLmNhbGwoUGVpZm94b2hPdWNoYW5nYSxQZWlmb3hvaE91Y2hhbmdhKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.196.127 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-196-127.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:11 GMT
Via
1.1 37c215a6cf8b04439db2f97a633421e6.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
57
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
lw1z9Oer-c7oF58SC-dvfujIO_eeMaE-QbgPkv2m9voYb_Y7hchfuQ==
Expires
0
/
ssl.1.damoh.golem.de/5a451242a9536cb496fef32551b56f6783bd28dd/
311 B
1 KB
XHR
General
Full URL
https://ssl.1.damoh.golem.de/5a451242a9536cb496fef32551b56f6783bd28dd/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBlaWZveG9oT3VjaGFuZ2E9UGVpZm94b2hPdWNoYW5nYXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVGV8fCh4LlRlPTApO3guVGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5UZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5UbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay55YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuZ2YoYyk7YS5xdShtKTthLnB1KGwpO2EuWHQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS55dSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5raC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUua2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQW09dGhpcy5hWzhdO3RoaXMuRXY9dGhpcy5hWzddO3RoaXMuU2o9dGhpcy5hWzldO3RoaXMuS3A9dGhpcy5hWzRdO3RoaXMuam49dGhpcy5hWzddO3RoaXMuWG89dGhpcy5hWzNdO3RoaXMucGs9dGhpcy5hWzldO3RoaXMuem89dGhpcy5hWzZdO3RoaXMuUW89dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNl19Yy50bT1iO2IucHJvdG90eXBlPXt6bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQW06dGhpcy5EdihhKX0sRHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkV2OnRoaXMuUmooYSl9LFJqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Tajp0aGlzLkpwKGEpfSxKcDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLktwOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qbjp0aGlzLldvKGEpfSxXbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWG86dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5wazp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpvOnRoaXMuUG8oYSl9LFBvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMudG18fGhhLHNjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLnptKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlRvPSExO3RoaXMuQ2I9InNldHVwIjt0aGlzLk5jPVtdO3RoaXMubmUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuSHQuYmluZCh0aGlzKSk7dGhpcy5uYj17fTt0aGlzLlJnPXt9O3RoaXMuZGY9ITF9Yy5maz1iO2IucHJvdG90eXBlPXtUdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5uYil0aGlzLm5iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm5iW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5kZnx8KHRoaXMuZGY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmRmfSxvYjpmdW5jdGlvbihhKXt0aGlzLm5iW2FdfHwodGhpcy5uYlthXT0wKTt0aGlzLm5iW2FdKz0xOzU8dGhpcy5uYlthXSYmIXRoaXMuUmdbYV0mJih0aGlzLlJnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuVHUoKSwhMCkpfSxuZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LApldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUW46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEh0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLkd0KGEuZGF0YSl9LEd0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCwKZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGdlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LG9nOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR2coYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmpoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxHZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsKaWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sTm46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLnFxKGEpKXJldHVybjsoYj10aGlzLm9nKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0scXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sCndnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxMcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx4ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEZnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxQaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50OwpyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxFZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLHE9MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCoKZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5FZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmUoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHplOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sS2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt5PWs7dT1tO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKHEsNSkrKG5eCnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKG0pK2IobCkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxIcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGhkOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT0KbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17TGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sZnI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sRWw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sVW06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LApRazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LGltOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sSG86ZnVuY3Rpb24oKXtyZXR1cm4gYS5MaSgpfHxhLlVpKCl8fGEuZnIoKXx8YS5FbCgpfHxhLlVtKCl8fGEuUWsoKXx8YS5pbSgpfX07cmV0dXJuIG51bGwhPWEuSG8oKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxaYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxmYTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxJcTpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sd3A6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sRnU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQmc6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmNpKGIpKyI6Iit0aGlzLmNpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5DYj1hfSx5ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkNiO3RoaXMuY2UoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTsKYS5kaXNwYXRjaEV2ZW50KGYpfSxCYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMueWcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5CYyhCKX0sSnQ6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTsKYi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5JcSgpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LE11OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5ZYigpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuY2UoYSl9LGNlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSnQoYSk7aWYoYilpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2UoYil9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLkpjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9bS5KYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYik7Cm0ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxLZDpmdW5jdGlvbihhKXtpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGIsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLkpjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LExlOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLmJwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxlKCl9LmJpbmQodGhpcyksNTAwKX0sdmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmtiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx5ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sa2I6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5uZChhKToiIn0sbmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy55ZShhKTsKYiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxjZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuR2UoYSl8fHRoaXMuTHIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5jZiYmd2luZG93LnNhbmRib3guY2ZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5jZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5jZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy53ZyhhKSlyZXR1cm4gdGhpcy53ZyhhKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5hYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIucWQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuTm4oZSxhKTtyZXR1cm4gZX0sYWI6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyxrKXt2YXIgbD1lfHxtO2U9ITA7ayYmKGU9ITEpO2lmKGwmJmwuVilpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihhLGIsZCxmLGMsbCxnLGspfS5iaW5kKHRoaXMpLDUwMCl9LGpoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxsczpmdW5jdGlvbihhLGIsZCl7dGhpcy5qaChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5OYylmb3IodmFyIGMgaW4gdGhpcy5OYylhPWEuc3BsaXQoYykuam9pbih0aGlzLk5jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS54YihhKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxraDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGEsZi5MYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMubHMoZi5xZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCnl1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk5jPWF9LEd3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5hYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sRnI6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9fX0pKGMpO3ZhciBRPWMuZmt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPQphfHx7fX1jLmVrPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IudXQ9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuRXM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iua3c9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5icT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnR3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWGY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuUGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5VZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5ZZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuRm49e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuU2Y9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5Qdj17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuY3E9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5vdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5rZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnFwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5kZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLnljPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5XZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuSG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5VYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuJGQ9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuYmU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLkduPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5qaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLkhzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5sZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuaXc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTHY9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk12PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Ldj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLkZzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5la3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hbD10aGlzLmFbNl07dGhpcy5xaj10aGlzLmFbNF07dGhpcy5rdD10aGlzLmFbM107dGhpcy54aj10aGlzLmFbMTBdO3RoaXMubHE9dGhpcy5hWzEwXTt0aGlzLmxqPXRoaXMuYVs1XTt0aGlzLkl2PXRoaXMuYVs0XTt0aGlzLkp1PXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuTGw9YjtiLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFsOnRoaXMucGooYSl9LHBqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xajp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMua3Q6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhqOnRoaXMua3EoYSl9LGtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5scTp0aGlzLmtqKGEpfSwKa2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmxqOnRoaXMuSHYoYSl9LEh2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jdjp0aGlzLkl1KGEpfSxJdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSnU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLkxsfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy4kayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmdrPWI7Yi5wcm90b3R5cGU9e3plOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxsYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LERxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LGxkOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5sZChhKwo2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5sZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuemUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmxkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxBcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxZZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnplKHRoaXMuRHEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5sZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIEo9CmMuZ2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ209dGhpcy5hWzldO3RoaXMuRnc9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMuT2w9YjtiLnByb3RvdHlwZT17Zm06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdtOnRoaXMuRXcoYSl9LEV3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gdzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuT2x8fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLmZtKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzoKLy4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5naj1ifSkoYyk7dmFyIEw9Yy5nanx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc209dGhpcy5hWzFdO3RoaXMuemk9dGhpcy5hWzNdO3RoaXMuQ209dGhpcy5hWzldO3RoaXMuT2o9dGhpcy5hWzZdO3RoaXMuZXI9dGhpcy5hWzEwXTt0aGlzLndsPXRoaXMuYVs2XTt0aGlzLnd2PXRoaXMuYVsxXTt0aGlzLlBwPXRoaXMuYVs0XTt0aGlzLkVuPXRoaXMuYVs3XTt0aGlzLkJwPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuRG09YjtiLnByb3RvdHlwZT17cm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNtOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56aTp0aGlzLkJtKGEpfSxCbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ206dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9qOnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5lcjp0aGlzLnZsKGEpfSx2bDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud2w6dGhpcy52dihhKX0sdnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMud3Y6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBwOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbjp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLkRtfHxsYSx4Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5ybSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLlNsPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5LYz0xMDA7dGhpcy5JYj0wO3RoaXMuV2E9MTUwO3RoaXMuTGI9MDt0aGlzLnJ1KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYT8KKHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKX0sYnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxiZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHJ1OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSxCcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmxhKCldPWI7TSYmTS5naCYmTS5TdShiKX0sdHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/CiEwOiExfSxHcjpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEx4OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuU2x8fHQ7KGZ1bmN0aW9uKGMpe2MuVWw9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5LYz0xMDt0aGlzLkliPTA7dGhpcy5XYT01MDt0aGlzLlg9bnVsbDt0aGlzLm5hPSExO3RoaXMucGxheWVyPWI7dGhpcy5CYj0iIjt0aGlzLnFnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuS2EoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD0KaC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxCdTpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sdXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSx1dTpmdW5jdGlvbihiKXt0aGlzLk9lPWJ9LHN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2V9LE5lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLktjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7CmVsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxFZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxCZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LE54OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLldxKCl8fHRoaXMuSm4oKTt0aGlzLkJkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sdng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sSm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sV3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxBYTpmdW5jdGlvbigpe3JldHVybiExfSxEeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hfSxjYTpmdW5jdGlvbigpe3RoaXMubmE9ITB9LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmCmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSmg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxyeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSxFaDpmdW5jdGlvbigpe3RoaXMuQmI9bnVsbH0seHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkJiJiYoYj0hMCk7cmV0dXJuIGJ9LEl4OmZ1bmN0aW9uKCl7dGhpcy5xZ3x8KHRoaXMucWc9ITApfSx1ZTpmdW5jdGlvbigpe3JldHVybiExfSxveDpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5VbHx8cDsoZnVuY3Rpb24oYyl7Yy51aT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLkxmPQoiMSI7dGhpcy5NZj0iMiI7dGhpcy51bj0iMyI7dGhpcy5RYz0wO3RoaXMubmg9MzA7dGhpcy5SYj1bXTt0aGlzLmdiPVtdO3RoaXMub2M9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuWmY9dGhpcy5maT0hMTt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5nZihiKTt0aGlzLnN1KGEpfSxnOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuZml8fCh0aGlzLmZpPSEwLGUuTGUoKSl9LFNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5hYyYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0seHI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2Eua2EoKV18fCh3aW5kb3dbYS5rYSgpXT17fSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXXx8KHdpbmRvd1thLmthKCldW2IubGEoKV09Cnt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWWIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXT0xfSxEcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmthKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldLmluaXRpYXRvciE9ZS5ZYigpJiYodGhpcy5oZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnhhKCkpe3RoaXMueHIoKTtpZighdGhpcy5EcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5oZigpO3JldHVybn10aGlzLmhmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5aaCgpO3RoaXMuWmY9ITA7YSYmImZ1bmN0aW9uIj09CnR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5nYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYodGhpcy5SYj1lLnVuaXF1ZSh0aGlzLlJiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5SYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGg9MDtoPHRoaXMuZ2IubGVuZ3RoO2grKyl0aGlzLm9jW3RoaXMuZ2JbaF0ucmVhc29uXT09dGhpcy5vY1tiXSYmYS5wdXNoKHRoaXMuZ2JbaF0uZGV0YWlsKSx0aGlzLm9jW3RoaXMuZ2JbaF0ucmVhc29uXTx0aGlzLm9jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5nYltoXS5kZXRhaWwpLGI9dGhpcy5nYltoXS5yZWFzb24pO3RoaXMub2NbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSwKYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sd3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGhmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0senU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnVufSxvYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0seGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuUWN9LGdmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sc3U6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sb3M6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIHY9Yy51aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5acD10aGlzLmFbOV07dGhpcy5Rcj10aGlzLmFbNl07dGhpcy5Hdj10aGlzLmFbN107dGhpcy52bz10aGlzLmFbNV07dGhpcy5nbj10aGlzLmFbNV07dGhpcy51cD10aGlzLmFbOF07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy50aj1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY2w6dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpwOnRoaXMuUHIoYSl9LFByOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Rcjp0aGlzLkZ2KGEpfSxGdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuR3Y6dGhpcy51byhhKX0sdW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZvOnRoaXMuZm4oYSl9LApmbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmduOnRoaXMudHAoYSl9LHRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cDp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLnRqfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5ibCg0KTsoZnVuY3Rpb24oYyl7Yy5Iaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ianx8b2E7KGZ1bmN0aW9uKGMpe2MuSWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLmZ4O2E/YS5xYT9hLnFhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7CmYuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuSWp8fHBhOyhmdW5jdGlvbihjKXtjLkpqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiYKd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Kanx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhvPXRoaXMuYVsxMF07dGhpcy5xcz10aGlzLmFbNF07dGhpcy55dD10aGlzLmFbNF07dGhpcy5hbz10aGlzLmFbM107dGhpcy5Bcz10aGlzLmFbNF07dGhpcy5rdj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs2XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueG86dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFzOnRoaXMueHQoYSl9LAp4dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueXQ6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmFvOnRoaXMuenMoYSl9LHpzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Bczp0aGlzLmp2KGEpfSxqdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua3Y6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLlVvfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy53byg0KTsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMudmcoKTt0aGlzLnhnKCk7dGhpcy5wcD0hMX0sdmc6ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKYnx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seGc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpOwphLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk9lJiYoMCx0aGlzLk9lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJgpiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Da3x8c2E7KGZ1bmN0aW9uKGMpe2MuQms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYWU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiYKYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5TYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5TZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmgmJgohdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS53ZCgpLGEucGUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuU2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5TZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5uaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlRjLmluZGV4T2YoYSkmJgp0aGlzLlRjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5UYy5sZW5ndGg+PXRoaXMuYWUmJnRoaXMubSgpKX0sb3M6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xOnRoaXMucmU/dGhpcy5yZSsrOnRoaXMucmU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUGgoYS52aWRlb1RhZyk/YS5iYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlNjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMucmU+dGhpcy5zZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnZnKCksYS54ZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ca3x8dGE7KGZ1bmN0aW9uKGMpe2MuRGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy55cSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLkdyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0scXg6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCnlxOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ea3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdzPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzJdfWMuTXc9YjtiLnByb3RvdHlwZT17ZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmdzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgd2E9Yy5Nd3x8d2EsQWM9bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuZnMoNCk7KGZ1bmN0aW9uKGMpe2MuSG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLkpkKGIpfS5iaW5kKHRoaXMpKX0sSmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LERlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpOwppZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxBYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5IbXx8eGE7KGZ1bmN0aW9uKGMpe2MuR209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkVjPXRoaXMuQ2E9dGhpcy5YYz0hMTt0aGlzLkFoPWUuSGIoMTApO3RoaXMuZWk9ITA7dGhpcy50Yz10aGlzLlZnPSExO3RoaXMuQ3MoYi5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLnFoKCksdGhpcy5ZbygpLHRoaXMucWIoKSl9LENzOmZ1bmN0aW9uKGIpe3JldHVybiBlLmZhKCJ0LW9ubGluZS5kZSIpPyExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LEp4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLAoiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuSiwiOyIsdHlwZW9mIGIuSiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLklhP2IuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuSWE/dHlwZW9mIGIuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5ZZDoKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLllkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/CnR5cGVvZiBiLkoucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5oZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmhlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuQWgpfSx5YjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmCih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMueWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnFhPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnFhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnFhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnFhfSxJZzpmdW5jdGlvbigpe2lmKCF0aGlzLkVjKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRWM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkVjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRWN9LEVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVWcpe3ZhciBiPQp0aGlzLnliKCksYT10aGlzLkNyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5VZz0hMCl9cmV0dXJuIHRoaXMuVWd9LENyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5YYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuWGM9ITApO3JldHVybiB0aGlzLlhjfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsaD0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5VdCgpfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxVdDpmdW5jdGlvbigpe3RoaXMudGM9ITA7dmFyIGI9dGhpcy5JZygpO2lmKGJ8fHRoaXMueGEoKSl7dmFyIGE9ImFkRXJyb3IiLGg9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuVmEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnVjPQohMDtpZihlLmZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIisKZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnVjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5nYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LHB4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5uZyYmYi5hZHMmJih0aGlzLm5nPWIuYWRzKTtyZXR1cm4gdGhpcy5uZ30sWW86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7CnRoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlNlKCl9LmJpbmQodGhpcykpfSxmZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuSWcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCkpfSxxaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5FcigpKXt2YXIgYT10aGlzLnliKCksaD10aGlzLlhiKCk7YSYmaCYmKHRoaXMueWIoKSx0aGlzLlhiKCksdGhpcy50Y3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5WZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnliKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5nYSgpKToodGhpcy5nYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuVmc9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xaCgpfS5iaW5kKHRoaXMpLDUwKX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7CmlmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sWm86ZnVuY3Rpb24oKXt0aGlzLnpjfHwodGhpcy56Yz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuemMhPWIuYWRzLnN0YXRlJiYodGhpcy56Yz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09CnRoaXMuemMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy56Yz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWm8oKX0uYmluZCh0aGlzKSwxMCl9LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS5aYihkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpKX0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmVpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmVpLGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKZ3A6ZnVuY3Rpb24oKXt0aGlzLnl4fHwoMTA8dGhpcy5Xdj8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLld2KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuYXUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ3AoKX0uYmluZCh0aGlzKSw1MCkpKX0sYXU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuWHYpe3RoaXMuWHY9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpOwpiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5HbXx8eWE7KGZ1bmN0aW9uKGMpe2MuSW09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlFoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5RaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxRaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLnhlKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpfX0pfSkoYyk7dmFyIHphPWMuSW18fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaj10aGlzLmFbMl07dGhpcy5DdD10aGlzLmFbOV07dGhpcy5vbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs4XX1jLklrPWI7Yi5wcm90b3R5cGU9e1lqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWmo6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkN0OnRoaXMubm8oYSl9LG5vOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMuSWt8fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5Zaig0KTsoZnVuY3Rpb24oYyl7Yy5JbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLlVlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlcoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LER0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQmIsaD10aGlzLmxhKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTsKZCYmYSYmYS5hYyYmKDA8PWguaW5kZXhPZihkKXx8YS53ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxBYTpmdW5jdGlvbigpe3RoaXMuVWUrKztpZigxMDx0aGlzLlVlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLAoiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LEpkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgQ2E9Yy5JbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuSGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXtpZighdGhpcy50ZSlpZih0aGlzLkRifHwKKHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksCjEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKX19LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQ2EoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLmdxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELApmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5tKCl9LmJpbmQodGhpcykpLHRoaXMuZ3E9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5EdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5IbHx8RGE7KGZ1bmN0aW9uKGMpe2MuSmw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYKMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm5hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9CmMuSmx8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ldD10aGlzLmFbNF07dGhpcy5Ldz10aGlzLmFbN107dGhpcy5MdT10aGlzLmFbN107dGhpcy53cj10aGlzLmFbNF07dGhpcy5UbT10aGlzLmFbMTBdO3RoaXMuc249dGhpcy5hWzddO3RoaXMudXI9dGhpcy5hWzFdO3RoaXMuWGo9dGhpcy5hWzEwXTt0aGlzLnF3PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzFdfWMuQWk9YjtiLnByb3RvdHlwZT17ZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmV0OnRoaXMuSncoYSl9LEp3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS3c6dGhpcy5LdShhKX0sS3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkx1OnRoaXMudnIoYSl9LHZyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy53cjp0aGlzLlNtKGEpfSxTbTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLlRtOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbjp0aGlzLnRyKGEpfSx0cjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudXI6dGhpcy5XaihhKX0sV2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Yajp0aGlzLnB3KGEpfSxwdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnF3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgR2E9Yy5BaXx8R2EsQ2M9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Q2MuZHQoNCk7KGZ1bmN0aW9uKGMpe2Mudms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuRmcoYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJgooYT1hLnBhcmVudE5vZGUpfXRoaXMuRnQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLkZ0KXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlcoaCk7dGhpcy5aKGgpOwp0aGlzLmpkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5qZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuamQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxmcDpmdW5jdGlvbigpe2UuYWgodGhpcy5qZCk7ZS5FZSh0aGlzLmpkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sSWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBIYT1jLnZrfHxIYTsoZnVuY3Rpb24oYyl7Yy51az12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy51a3x8SWE7KGZ1bmN0aW9uKGMpe2Mud2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj0KbC5pbnJlYWQsYT1lLkZnKGIsImVsZW1lbnRJRCIpO2lmKGUuYWgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEphPWMud2t8fEphLEthPW5ldyBKYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5iaj10aGlzLmFbOV07dGhpcy5BbD10aGlzLmFbMTBdO3RoaXMuV2w9dGhpcy5hWzZdO3RoaXMuY3Q9dGhpcy5hWzFdO3RoaXMuSWk9dGhpcy5hWzRdO3RoaXMuTXA9dGhpcy5hWzldO3RoaXMuJGk9dGhpcy5hWzFdO3RoaXMuc3M9dGhpcy5hWzddO3RoaXMuUHE9dGhpcy5hWzNdOwp0aGlzLllyPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuU249YjtiLnByb3RvdHlwZT17YWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmJqOnRoaXMuemwoYSl9LHpsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5BbDp0aGlzLlZsKGEpfSxWbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuV2w6dGhpcy5idChhKX0sYnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jdDp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSWk6dGhpcy5McChhKX0sTHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1wOnRoaXMuWmkoYSl9LFppOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kaTp0aGlzLnJzKGEpfSxyczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3M6dGhpcy5PcShhKX0sT3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlBxOnRoaXMuWHIoYSl9LFhyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ZcjoKdGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTGE9Yy5Tbnx8TGEsRGM9bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGMuYWooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmhrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LHR1OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sS246ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5oa3x8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApoLGQsZil7dGhpcy5mYj1hO3RoaXMuQWc9dGhpcy5uaT0hMTt0aGlzLnJoPWQ7dGhpcy5SaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5mYj1uZXcgeihhKSk7dmFyIGM9dGhpcy5zYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5IZSh0aGlzLmZiLnVybCkmJm0uTWQpe3ZhciBlPW5ldyB6KGEudXJsKTtlLnR1KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmCihiPSEwKTtifHxtLmlhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5pYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuaWs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZmIuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuQWcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLlJoP3RoaXMuc2Iub3Blbih0aGlzLmZiLm1ldGhvZCx0aGlzLmZiLnVybCwhMSk6dGhpcy5zYi5vcGVuKHRoaXMuZmIubWV0aG9kLHRoaXMuZmIudXJsLCEwKSx0aGlzLm5pfHwodGhpcy5zYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuc2Iuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLnNiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLnNiLnNlbmQoYSl9Y2F0Y2goZil7bSYmbS5IZSh0aGlzLmZiLnVybCk/bS5NZD9tLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkhlKHRoaXMuZmIudXJsKSx0aGlzLnJoJiZ0aGlzLnJoKCl9cmV0dXJuIHRoaXMuc2J9fX0pKGMpO3ZhciBNYT1jLmlrfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGE9dGhpcy5WZD0hMX1jLmhqPWI7Yi5wcm90b3R5cGU9e3h1OmZ1bmN0aW9uKGEpe3RoaXMuVmQ9YX0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5IYT1hfSxadDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLCJyZWdpc3RlcmluZ3MgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYixhKX0pfXZhciBiPXtQdzoiQWRDbGlja1RocnUiLFJ3OiJBZEVycm9yIixTdzoiQWRTdG9wcGVkIixWdzoiQWRMaW5lYXJDaGFuZ2UiLFd3OiJBZFRhZ1BhcnNlZCIsWnc6IkFkVmlkZW9Db21wbGV0ZSIsYng6IkFkTG9hZGVkIixjeDoiQWRTa2lwcGVkIixkeDoiQWRTdGFydGVkIixUdzoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLFV3OiJBZEltcHJlc3Npb24iLFF3OiJBZENyZWF0aXZlVmlldyIsWHc6IkFkVmlkZW9NaWRwb2ludCIsWXc6IkFkUGF1c2VkIiwkdzoiQWRWaWRlb1N0YXJ0IixheDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGI9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLlZkLGJbZF0pfSxZdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSwKYil7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGIsYSl9KX1pZih0aGlzLkhhJiZ0aGlzLkhhLlVkKWZvcih2YXIgYiBpbiB0aGlzLkhhLlVkKXRoaXMuSGEuVWQuaGFzT3duUHJvcGVydHkoYikmJmEodGhpcy5IYSx0aGlzLkhhLlVkW2JdKTt0aGlzLkhhJiZ0aGlzLkhhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhLmdldEVycm9yKCk7YSYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixhKX0uYmluZCh0aGlzKSwxMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLlZkJiZ0aGlzLlp0KCk7dGhpcy5IYSYmdGhpcy5ZdCgpfX19KShjKTt2YXIgTmE9Yy5oanx8TmE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlVhPSExO3RoaXMud2M9IiI7dGhpcy5pZT0KdGhpcy52Yz10aGlzLndiPW51bGw7dGhpcy54cD10aGlzLkpiPXRoaXMuaWg9ITE7dGhpcy5MYT0iIjt0aGlzLmRoPSExO3RoaXMud2E9dGhpcy5vZD0iIjt0aGlzLlpnPXRoaXMuVj10aGlzLmlzRW5hYmxlZD10aGlzLiRlPSExO3RoaXMucGE9W107dGhpcy5PZz10aGlzLmZjPSIiO3RoaXMucWU9ITE7dGhpcy5xZj0wO3RoaXMuR2Y9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5FZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuUWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMubmM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLmhjPSIiO3RoaXMuaWM9W107dGhpcy5qYz1bXTt0aGlzLklkPVtdO3RoaXMuZ2M9IiI7dGhpcy5yZj0wO3RoaXMudmlkZW9wbGF6YT0Ke307dGhpcy5EYz0hMTt0aGlzLmhwPXRoaXMuT2Q9bnVsbDt0aGlzLkxoPXRoaXMubGM9dGhpcy5zZz10aGlzLnVmPXRoaXMuTWQ9dGhpcy5rZT10aGlzLlJjPSExO3RoaXMuaGI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMucGQ9MDt0aGlzLlFnPSExO3RoaXMuUGc9MUUzO3RoaXMuWmM9ITE7dGhpcy5RYT0xRTM7dGhpcy5PZj0iIn1jLmprPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMud2MsYWR0YWdtb2RpZmllcjp0aGlzLndiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy52YyxhZHRhZ3JlZ2V4OnRoaXMuaWUsYml0cmF0ZTp0aGlzLlFhLGpzcG9wdXBzOnRoaXMuaWgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMueHAsaG9tYWRBbGlhczp0aGlzLkxhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5kaCxnbG9iYWxDb25maWc6dGhpcy5vZCxjbGllbnRDb25maWc6dGhpcy53YSwKaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5WLGlzQmxvY2tlZDp0aGlzLlpnLHNlcnZlcjp0aGlzLnBhLHN2bUNvbmZpZzp0aGlzLmZjLGhvbWFkQWRwYXRoOnRoaXMuT2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5xZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5xZixIT01BRF9WRVJJRklFRDp0aGlzLkdmLEhPTUFEX0JMT0NLRUQ6dGhpcy5FZixIT01BRF9OT0JMT0NLRVI6dGhpcy5RYixIT01BRF9BREJMT0NLRVI6dGhpcy5uYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRmYsdGVzdEhpZGU6dGhpcy5oYyx0ZXN0VGFnczp0aGlzLmljLHRlc3RUYWdzSlM6dGhpcy5qYyx0ZXN0VGFnc1hIUjp0aGlzLklkLHRlc3RDb29raWU6dGhpcy5nYyx0aHJvdHRsZTp0aGlzLnJmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuRGMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5ocCxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlJjLApibG9ja2VkV2FzQ2FsbGVkOnRoaXMua2UsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTWQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudWYsY29uZmlnRmFpbHVyZXM6dGhpcy5oYixzaXRlQ29uZmlnOnRoaXMuRmEsc2VydmVySWQ6dGhpcy5JaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuamIsdnBhaWQ6dGhpcy5sYyxza2lwQWxsb3dlZDp0aGlzLkxoLHZtYXBzOnRoaXMua2ksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLlpjLGFkRmFsbGJhY2tVUkw6dGhpcy5PZn19LFVxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmhiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuaGJbYl0mJjE9PXRoaXMuaGJbYl0mJihhPSEwKTtyZXR1cm4gYX0sZWY6ZnVuY3Rpb24oYSl7dGhpcy5oYlthXT0hMH0senE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltiXSYmMT09dGhpcy5oYltiXSYmYS5wdXNoKGIpOwpyZXR1cm4gYX0sSGQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5MbyhhKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixnPSIiO2lmKCF0aGlzLlVhJiYhYilyZXR1cm4gbmV3IHooYSk7Zj10aGlzLkdlKGEpO2M9dGhpcy56YShhKTtmPyh0aGlzLkZjKCk/ZT1hOmU9Yy5wcm90b2NvbCsKIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5KYygpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLndjfHx0aGlzLndifHx0aGlzLnZjfHx0aGlzLmllKSYmKGc9dGhpcy55cyhnKSk7YT1uZXcgeihlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkFxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGcpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sR2U6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/CmI9ITA6dGhpcy5GYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sRmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMucGEmJnRoaXMucGEubGVuZ3RoJiYwPHRoaXMucGEubGVuZ3RoJiYoYj10aGlzLnBhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEhlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuR2UoYSk7cmV0dXJuIGJ9LEFxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT0KdHlwZW9mIHRoaXMuTGEmJjA8dGhpcy5MYS5sZW5ndGgpcmV0dXJuIHRoaXMuTGE7Zm9yKGQgaW4gdGhpcy5MYSlpZihiPXRoaXMuTGFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5reDtyZXR1cm4ibm9uZSJ9LHFkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFbdGhpcy5JaF19LEpjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5xZCgpLGI9dGhpcy5LaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxvaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx4czpmdW5jdGlvbihhLApiKXt2YXIgZD1lLnphKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxDPTA7QzxnLmxlbmd0aDtDKyspe3ZhciBrPWdbQ10uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5vaChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMub2goZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx5czpmdW5jdGlvbihhKXt0aGlzLndjJiYoYSs9dGhpcy53Yyk7aWYodGhpcy53Yilmb3IodmFyIGIgaW4gdGhpcy53Yil0aGlzLndiLmhhc093blByb3BlcnR5KGIpJiYKKGE9YS5yZXBsYWNlKGIsdGhpcy53YltiXSkpO3RoaXMudmMmJihhPXRoaXMueHMoYSx0aGlzLnZjKSk7cmV0dXJuIGF9LGVwOmZ1bmN0aW9uKCl7dGhpcy5GYSYmdGhpcy5GYS5jbGllbnRBUElzJiZ0aGlzLiRvKHRoaXMuRmEuY2xpZW50QVBJcyl9LCRvOmZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiPW5ldyBOYTthLnB1Ymxpc2hlckFQSSYmYi54dShhLnB1Ymxpc2hlckFQSSk7YS5wbGF5ZXImJmIud3UoYS5wbGF5ZXIpO2IuZygpfX0sbDpmdW5jdGlvbihhLGIsZCxmLGMsZSl7bT10aGlzO3RoaXMuZGg9ITA7dGhpcy5vZD1hO3RoaXMud2E9Yjt0aGlzLiRlPWQ7dGhpcy5PZD1mO3RoaXMuQWM9Yzt0aGlzLkZhPWV8fHt9O3RoaXMuZXAoKTt0aGlzLmtzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLndhKXRoaXMuaHMoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9YigpLHRoaXMueGMoKX1jYXRjaChnKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iLHRoaXMueGMoKX1jYXRjaChrKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfX0scGI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGtzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLm9kK3RoaXMuZmUoImdsb2JhbCIpKSx0aGlzLlFxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMueGMoKX0uYmluZCh0aGlzKSwhMCl9LGhzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLndhK3RoaXMuZmUoImNsaWVudCIsLTEhPXRoaXMud2EuaW5kZXhPZigiPyIpKSksdGhpcy54Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5lZigiY2xpZW50Iik7dGhpcy5pYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLAohMCl9LGZlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5IYigpKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5GYSYmdGhpcy5GYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGlhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmtlKXt0aGlzLmtlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChoKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwphPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkFjPSExKTt0aGlzLkFjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQWM/dGhpcy5BYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5WPXRoaXMuWmc9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkVmKSk7dGhpcy5OYigpO2UuQmMoay51dCk7KGI9ZS5aYih0aGlzLnFkKCkpKXx8KGI9ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sUXE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLndhfHx0aGlzLmZjfHx0aGlzLkxhfHx0aGlzLnhjKCk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLlFiKSksdGhpcy5OYigpKX19LHhjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLndhfWVsc2UgYT10aGlzLndhO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYS5lbmFibGVkKTt0aGlzLlY9IXRoaXMuaXNFbmFibGVkO3RoaXMucGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5mYSgid2ViLmRlIil8fGUuZmEoImdteC5uZXQiKXx8ZS5mYSgiZ214LmF0Iil8fGUuZmEoImdteC5jaCIpfHxlLmZhKCIxdW5kMS5kZSIpKSYmIXRoaXMuRmMoKSlmb3IoYj0wO2I8dGhpcy5wYS5sZW5ndGg7YisrKXRoaXMucGFbYl09dGhpcy5wYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmZjPWEuY29uZmlnfHwiIjt0aGlzLkxhPWEuYWxpYXN8fApudWxsO3RoaXMuT2c9YS5hZHBhdGh8fCIiO3RoaXMucWU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5JaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5wYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmZjJiZ0aGlzLkxhJiZ0aGlzLnBhLmxlbmd0aD90aGlzLkdjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxHYzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkpjKCkpLGQ9dGhpcy56YSh0aGlzLmZjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0KIlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmZjK3RoaXMuZmUoImN1c3RvbWVyIikpO3RoaXMuRGEoYix0aGlzLlZ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJjdXN0b21lciIpO2E/dGhpcy5obT90aGlzLmlhKCJub1NWTUNvbmZpZyIpOih0aGlzLmhtPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5HYyghMCl9LmJpbmQodGhpcyksITApfX0sVnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5EYz0hMDt0aGlzLkdjKCEwKTtyZXR1cm59fXRoaXMuTWQ9dGhpcy5NYihiLnN0cmljdCk7dGhpcy51Zj10aGlzLk1iKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnNnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj0KdGhpcy5NYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYi5lbmFibGVkKTt0aGlzLmhjPWIudGVzdGhpZGV8fCIiO3RoaXMuamM9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5JZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMud2M9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy53Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy52Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuaWU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuaWg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5KYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5sYz1iLnZwYWlkfHwhMTt0aGlzLkZhLnZwYWlkPXRoaXMubGM7dGhpcy5MaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLiRjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5raT1iLnZtYXBzfHwiIjt0aGlzLlpjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fAoxRTM7dGhpcy5PZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5nYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLkhxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5xZSYmKHRoaXMuZ2M9bnVsbCk7dGhpcy5yZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5EYz0hMCx0aGlzLkdjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLm52KCkmJih0aGlzLmhjfHx0aGlzLmpjfHx0aGlzLmljfHx0aGlzLmdjfHx0aGlzLklkKT90aGlzLiRlPyh0aGlzLlVhPXRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5RYikpLHRoaXMubWUoKSx0aGlzLk5iKCkpOnRoaXMuWnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy4kdSgpKX19LFp1OmZ1bmN0aW9uKCl7dGhpcy5ZdSgpOwp0aGlzLmF2KCl9LGF2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksQz1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLAoiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEMpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnhiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPQpkKXt2YXIgYz1lLmhkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkZhJiZ0aGlzLkZhLnBsYXllciYmdGhpcy5GYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sJHU6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LE9jOmZ1bmN0aW9uKGEpe3RoaXMuUmM9ITA7dGhpcy5WfHwodGhpcy5WPXRoaXMuVWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLk5iKCksdGhpcy5tZSgpKX0sWXU6ZnVuY3Rpb24oKXtpZih0aGlzLmhjKXt2YXIgYT1lLmhkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5oaCgpKXRoaXMuT2ModGhpcy5uYywKIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmhjKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaGMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuVmgoKX19ZWxzZSB0aGlzLlZoKCl9LFVoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLmR2KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5uZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmljPXRoaXMuSWQpJiZ0aGlzLmljLmxlbmd0aCl7dmFyIGQ9dGhpcy5pYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLm5mKCl9LGR2OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkRhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxWaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtjPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsCnRoaXMuSGIoKSk7dGhpcy5ldihjLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVWguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLk9jKHRoaXMubmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrYysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuamMmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksYzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuVWgoKX0sZXY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGMoKXtnKCkmJmIoKX1mdW5jdGlvbiBlKCl7ZygpJiZkKCl9ZnVuY3Rpb24gZygpe3JldHVybiBDPyh3aW5kb3cuY2xlYXJUaW1lb3V0KEMpLCEwKTohMX12YXIgQz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2MoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZnKCkmJmUoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTsKay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWM7ay5vbmVycm9yPWU7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlKX1jYXRjaChsKXtjKCl9fSxuZjpmdW5jdGlvbigpe3RoaXMuZ2M/KHRoaXMucWYrKyx0aGlzLkRhKG5ldyB6KHRoaXMuZ2MpLHRoaXMuWHUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMub2YoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5TaCgpfSxvZjpmdW5jdGlvbihhKXt0aGlzLk9jKHRoaXMuRmYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxYdTpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5xZj90aGlzLm5mKCk6dGhpcy5vZigiQkJCIik6CiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlNoKCk6dGhpcy5vZigiQUFBIil9LFNoOmZ1bmN0aW9uKCl7dGhpcy5WPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMubWUoKX0saGg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlJjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS5mYSgidC1vbmxpbmUuZGUiKXx8ZS5mYSgiZ2lnYS5kZSIpfHxlLmZhKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLmhoKCksITApOwpkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5HZikpO3RoaXMuT2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5PZCYmdGhpcy5PZCgpfSxjcDpmdW5jdGlvbigpe2lmKHRoaXMudWYmJnRoaXMuVXEoKSl7dmFyIGE9dGhpcy56cSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sWmg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxEYTpmdW5jdGlvbihhLGIsZCxjLHEsZyl7dGhpcy5wZHx8KHRoaXMucGQ9MCk7dGhpcy5wZCsrO3RoaXMucGQ+dGhpcy5QZyYmIXRoaXMuUWcmJih0aGlzLlFnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5QZywhMCkpO2E9bmV3IE1hKGEsCmIsZCk7YyYmKGEubmk9ITApO3EmJmUuSHIoKSYmKGEuQWc9ITApO2cmJihhLlJoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGFwOmZ1bmN0aW9uKCl7ZS5WYSgpfHxlLmFiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxjPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/CmEuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5GYygpfHwoYT10aGlzLnphKGMpLGM9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Zy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtnLm5ldHdvcmtTdGF0ZT09Zy5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5pYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2cuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2cuc2V0QXR0cmlidXRlKCJzcmMiLGMpfWVsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sV3U6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PQp0aGlzLmtpfSxicDpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuRGEoYSx0aGlzLk92LmJpbmQodGhpcyksdGhpcy5Odi5iaW5kKHRoaXMpKX0sT3Y6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1kfHx0aGlzLmVxKCl9LE52OmZ1bmN0aW9uKCl7fSwKZXE6ZnVuY3Rpb24oKXtlLkJjKGsuY3EpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaWEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LG1lOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuSmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5KYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkpiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgSjt3aW5kb3dbZC5rYSgpXT10aGlzO2UuYWIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sbnY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5yZn0sSHE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgphLmxlbmd0aCldfSxIYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsYyxlLGcsayxsLG09MDttPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSxnPWQ+PjIsZD0oZCYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGMpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LHphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGM9MTQ7Yy0tOylkW2JbY11dPWFbY118fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LEtoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZCxoO2ZvcihkPTc7MDw9ZDtkLS0paD1hPj4+NCpkJjE1LGMrPWgudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGc9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdSx2LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8bi0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZSk7CnN3aXRjaChuJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChuPj4+MjkpO3gucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKylnW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspZ1tjXT1kKGdbYy0zXV5nW2MtOF1eZ1tjLTE0XV5nW2MtMTZdLDEpO2U9aztuPWw7cD1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1kKGUsNSkrKG4mcHx+biZ1KSt2K2dbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWQoZSw1KSsobl5wXnUpK3YrZ1tjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz00MDs1OT49YztjKyspdz1kKGUsNSkrKG4mcHxuJnV8cCZ1KSt2K2dbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihyKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5qa3x8T2EsbT1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxuPXRoaXMuYVs5XTt0aGlzLnh3PXRoaXMuYVsxXTt0aGlzLmxtPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzNdfWMuWm49YjtiLnByb3RvdHlwZT17a246ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxuOnRoaXMud3coYSl9LHd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHc6dGhpcy5rbShhKX0sa206ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgUGE9Yy5abnx8UGEsRWM9bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RWMua24oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5mLlA/dGhpcy5iYj1hLmYuUCgpOgp0aGlzLmJiPSIiO2EuZi5YZyYmYS5mLlhnKHtwYXVzZTp0aGlzLndkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuR2guYmluZCh0aGlzKSxtdXRlOnRoaXMuUGUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy54di5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmliO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuVmI9dGhpcy5ZYz0hMTt0aGlzLkdvPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuRmQ9e307ZS5vYigibmV3QmlnQWRJZCIpO3RoaXMuT289ZS5hYSgxMCk7dGhpcy5sZj0wO3RoaXMuV2M9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5XYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmIuZikmJnRoaXMuYi5mLnMmJihhPXRoaXMuYi5mLnMoKSksdGhpcy5XYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYKKHRoaXMuUm49Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5zaD10aGlzLkVkPSExO3RoaXMubGg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmVlPSExO3RoaXMuYmk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuR2I9ZS5hYSgxMCk7dGhpcy5FYj1lLmFhKDEwKTt0aGlzLk1oPWUuYWEoMTApO3RoaXMuY29uZj17fTt0aGlzLlBkPXRoaXMuT2I9dGhpcy5vZT10aGlzLmVkPXRoaXMuR2Q9dGhpcy5yYj10aGlzLm1jPXRoaXMudWg9dGhpcy5rZD10aGlzLnB2PXRoaXMudWI9dGhpcy5GYj0hMTt0aGlzLnJjPVtdO3RoaXMuY2M9e307dGhpcy5zdD0yMDA7dGhpcy5CZj10aGlzLkNmPXRoaXMuamU9dGhpcy5BZj10aGlzLlplPSExO3RoaXMudmQ9e319Yy5kaz1iO2IucHJvdG90eXBlPXtvdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9CmF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sJGg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk91KCk7ZS52KGsuSG4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sS2U6ZnVuY3Rpb24oYSxiLGMsZil7dGhpcy51Yj1jO3ZhciBnPSExO2YmJmYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihnPSEwKTtpZih0aGlzLkwuVil0aGlzLmxmKyssZS5vYigibmV3U21hbGxBZElkIiksdGhpcy5MLmNwKCksZj1tLmdldENvbmZpZygpLHRoaXMuTC5VYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy4kaCgpLG5ldyBTKHRoaXMsYSx0aGlzLmxoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLApiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubGMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy4kaCgpLG5ldyBTKHRoaXMsYSx0aGlzLmxoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5MLmxjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Zi5RYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUmEoKTtlbHNle3ZhciB0Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0Yy5LZShhLGIsYyl9LDUwKX19LFZlOmZ1bmN0aW9uKGEpe2EuJGEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO3RoaXMuUGQ9dGhpcy5PYj10aGlzLmtkPSExO3RoaXMuYz1hO3RoaXMuQ3UodGhpcy5jKTt0aGlzLnZkPW5ldyBRYSh0aGlzLmMuUXYsdGhpcy52aWRlbyx7fSk7dGhpcy5MZyhhKTt0aGlzLnJjPXRoaXMuQ2coYSk7dGhpcy5rcCgpfSxMZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5GZD10aGlzLktxKGEpKSx0aGlzLkxnKGEucGFyZW50KSl9LENnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5DZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLnVxKGEpKSk7cmV0dXJuIGN9LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5VJiZhLlUuZ2V0QXR0cmlidXRlKXtiPWEuVS5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sS3E6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0iIjtpZihhLlUpe2I9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Zj1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLmtiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuJGEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYj0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGI9YS5lcnJvci5kZXRhaWwuY29kZSksYS5nZCYmYS5nZC5lcnJvciYmYS5nZC5lcnJvci5jb2RlJiYoYj1hLmdkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuUGMuY29kZTpiPT1HLldkLmNvZGU/ZS52KGsua3csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTooZS5MZSgpLGI9PUcuSmYuY29kZSYmZS52KGsuRHMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk7ZS52KGsuYnEsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSk7dGhpcy5QdSgpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS52KGsuUHYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5LZi5jb2RlOmUudihrLm93LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LlhkLmNvZGU6ZS52KGsudHcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy5UZC5jb2RlOmUudihrLkVzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5TZC5jb2RlOmUudihrLkx2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVtbXlhZCIpO2JyZWFrOwpjYXNlIHcuRGYuY29kZTplLnYoay5Ndix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5QYS5sZW5ndGg7KXRyeXt2YXIgYz1hLlBhLnBvcCgpO3RoaXMuSmUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LEN1OmZ1bmN0aW9uKGEpe3RoaXMub2U9ITE7dGhpcy5QYj10aGlzLmIuSzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5QYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTtpZihjJiZjLmVudnZhcnMpdHJ5e2I9Yy5lbnZ2YXJzKCkudmlkZW9TbG90LAp0aGlzLlplPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuS3g9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiZiLnNldEF0dHJpYnV0ZShnLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2ddKTt0aGlzLlJuJiZ0aGlzLnBsYXllci51ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIudWUoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuTy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5PW2NdLnR5cGUpJiYKdGhpcy5MbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuWmUmJmIubG9hZCgpO2lmKHRoaXMuV2goYikpe3RoaXMuTmgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuUG4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLlplP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2goayl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5ucCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSx0aGlzLkF1KCkpOnRoaXMuYy5vcmlnaW4udGcody5UZCl9LEF1OmZ1bmN0aW9uKCl7dGhpcy5BZj0hMDt0aGlzLnJiPXRoaXMubWM9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5sZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMucmI9ITApO2UubmUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4udmEmJmUuUW4odGhpcy5jLm9yaWdpbi52YSk7dGhpcy5OaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9RS5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi52aCgpO3RoaXMuYi5qZigpO2ZvcihhPXRoaXMuYi5LO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpOwphLnBhcmVudHx8dGhpcy5iLmpmKCk7dGhpcy50YT10aGlzLlBiPXRoaXMuYi5LO3RoaXMuZ2koInZwYWlkIik7aWYodGhpcy5yYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLktiKCJtdXRlZCIsImNvbnRlbnQiKTtlLnYoay50ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfXRoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLAoiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYy5OcSgpLGM9dGhpcy5jLkIuT3JpZ2luYWxBZFBhcmFtZXRlcnMsZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5jZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuTCk7dGhpcy5ILnNyYz1hO2UuZ2UoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYi5mLkFhJiYhdGhpcy5HZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsueWMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmIuJGIoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMucmM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdihhKTsKaWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5adigpLHRoaXMuYi4kYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuUGQ9ITA7ZS52KGsuamksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuRmUodGhpcy5PYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLiRiKCEwKSx0aGlzLmN3KCkpOyJBZFZpZGVvU3RhcnQiPT0KYS5kYXRhLm5hbWUmJih0aGlzLmIuJGIoITApLHRoaXMuZ3coKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZXcoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuZncoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5odygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5kdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5saSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5VYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5rZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXt0aGlzLkwuWmMmJihhPSJfYmxhbmsiKTt2YXIgYj13aW5kb3cub3BlbigiIiwKYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJ3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLnYoay5iZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiR2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5DZiYmKHRoaXMuQmY9ITEsdGhpcy5lYygpKSx0aGlzLmF3KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMucmI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLAohMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMucmI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGUudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfX0uYmluZCh0aGlzKSk7ZS5nZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTtlLmdlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7dGhpcy5iLiRmKGZ1bmN0aW9uKGEpe2UubWEodGhpcy5ILCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sJHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTsKdGhpcy50cmFjaygicGF1c2UiKTtlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5tYz0hMH0sYXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubWM9ITF9LGN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuV2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sWnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7CnRoaXMuT2goKTtlLnYoay5TZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxndzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxldzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLmtkPSEwO3RoaXMuWWEoImZpcnN0UXVhcnRpbGUiKTtlLnYoay5QZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxmdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5ZYSgibWlkcG9pbnQiKTtlLnYoay5VZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxodzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIik7ZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSl9LGR3OmZ1bmN0aW9uKCl7dGhpcy53ZigpO3RoaXMuWWEoImNvbXBsZXRlIil9LGxpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2UubmUoKTt0aGlzLkg9ITE7dGhpcy5SYShhKX19LFl2OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2c7IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGIubWF0Y2goYykpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLnYoay5pdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubGkoITApfSwKTG46ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7aWYoYi5VYSYmYi5pc0VuYWJsZWQmJiFiLkZjKCkpe3ZhciBkPWIuemEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWMoYix0aGlzLkwpO2Yub25lcnJvcj10aGlzLlZ2LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGMoYix0aGlzLkwpKX0sV2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFBuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmhpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKdGhpcy5paS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLndmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMueGYuYmluZCh0aGlzKSl9LEFkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmhpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmlpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy54Zi5iaW5kKHRoaXMpKX0saGk6ZnVuY3Rpb24oYSl7dGhpcy5WYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZifHx0aGlzLnlmKGEpfS5iaW5kKHRoaXMpLAp0aGlzLkdvKSl9LHlmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlljJiZ0aGlzLldoKHRoaXMudmlkZW8pJiYhdGhpcy5GYiYmIXRoaXMuVmIpe3RoaXMuWWM9ITA7dHJ5e2lmKCFlLlZhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkZifHwodGhpcy5GYj0hMCx0aGlzLkFkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5aYSgpLCEwKSx0aGlzLkwuc2d8fHRoaXMuTC5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLlJhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5aYSgpLCEwKX10aGlzLlN2KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIuamYoKTt0aGlzLlJ2KCk7dGhpcy5naSgpO3RoaXMuZGcoKTt0aGlzLmIudmgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMubWYoKX19LG1mOmZ1bmN0aW9uKCl7dGhpcy5lZHx8CnRoaXMuUWYoKX0sUWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy52aWRlby5wbGF5KCk7aWYoYiYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5lZHx8KGE/dGhpcy5SYSgpOih0aGlzLlBlKCEwKSx0aGlzLlFmKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmRjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmRjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5lZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubWYoKSl9LmJpbmQodGhpcyk7dGhpcy53ZSgpLkpoKHRoaXMpfSx3ZjpmdW5jdGlvbigpe3RoaXMuTC5qYiYmIXRoaXMuRmImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwKITApLHRoaXMuWWEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS52KGsuRm4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlJhKCl9LEluOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPSExLGY9MDtmPGEubGVuZ3RoO2YrKyljPWUuR2coYVtmXSksYi5wdXNoKGMpO2E9e2hhc2hlczpifTthPWsuVGEoYSx0aGlzLkEoKSk7ZS5NdShhKX0sUmE6ZnVuY3Rpb24oYSl7dGhpcy5jJiZ0aGlzLmMuUWQmJnRoaXMuSW4odGhpcy5jLlFkKTtpZighdGhpcy5vZSlpZih0aGlzLm9lPSEwLHRoaXMuUGR8fChlLnYoay5Icyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy50Ynx8dGhpcy5jLnBjKXtlLm9iKCJuZXdTbWFsbEFkSWQiKTt0aGlzLmxmKys7dGhpcy5WYj10aGlzLlljPSExO3RyeXt0aGlzLkFkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuRWQ9ITE7dHJ5e3RoaXMuYi5kaSgpfWNhdGNoKGcpe310aGlzLkdkPSEwO3RoaXMuYi5BZSgpO3RoaXMuYWM9ITE7dGhpcy53ZSgpLkVoKCk7dGhpcy5jLnRiJiZ0aGlzLmMub3JpZ2luLlFlKCk7dGhpcy5jLnBjJiYoYT90aGlzLmMub3JpZ2luLnBoKCk6dGhpcy5wZSgpKX1lbHNlIHRoaXMucGUoKX0sVnY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5BZCh0aGlzLnZpZGVvKSx0aGlzLnhmKGEpKX0seGY6ZnVuY3Rpb24oYSl7dGhpcy5WYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkwuYXAoKTsKdGhpcy5jLm9yaWdpbi50Zyh3LlRkKX0saWk6ZnVuY3Rpb24oKXtpZih0aGlzLnB2KXRoaXMuUmEoKTtlbHNle3RoaXMuYWM9ITA7dGhpcy5iLmYuQWEmJiF0aGlzLkdkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay55Yyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5zdihhKTtpZighdGhpcy5PYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5QZD0hMDtlLnYoay5qaSx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuRmUodGhpcy5PYil9Yz0iIjt0aGlzLmMua2YmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWgpKSYmKGM9dGhpcy5jLmtmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkVkfHwodGhpcy5FZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5XZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuYy50Yj8odGhpcy5WYj10aGlzLlljPSExLHRoaXMuQWQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuRWQ9ITEsdGhpcy5iLmRpKCksdGhpcy5jLm9yaWdpbi5RZSgpKTp0aGlzLlJhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLldjLnJlcGxhY2UoIlt0aW1lXSIsZS5CZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmVlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxhaTpmdW5jdGlvbigpe3RoaXMudWh8fCh0aGlzLnVoPSEwLHRoaXMua2R8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxzdjpmdW5jdGlvbihhKXtlLnYoay5iZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2E9PXRoaXMuYml8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmFpKCl9LmJpbmQodGhpcykpLHRoaXMuRmJ8fHRoaXMuT2goKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuTC5qYiYmdGhpcy5ZYSgic3RhcnQiKSxlLnYoay5TZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLGUudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMua2Q9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLnYoay5QZix0aGlzLmMuQiwKdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5ZYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5VZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksdGhpcy5iaT1hKX0sTmg6ZnVuY3Rpb24oYSxiKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iK2EsYiwhMCl9LE91OmZ1bmN0aW9uKCl7ZS5LZChbInN0YXRzX2hkX2FkX2NhbGw6IisKdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sT2g6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFB1OmZ1bmN0aW9uKCl7ZS5LZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFhhOmZ1bmN0aW9uKGEpe2UuS2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWWE6ZnVuY3Rpb24oYSl7KHRoaXMuQWZ8fHRoaXMuTC5qYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLlphKCksITApfSxLYjpmdW5jdGlvbihhLGIpe3RoaXMuTC5qYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkZiKXt0aGlzLnZkJiZ0aGlzLnZkLnRyYWNrJiZ0aGlzLnZkLnRyYWNrKGEpO2lmKCJtdXRlIj09CmF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5McSh0aGlzLmMuUGEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmplPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuRmQuaW1wcmVzc2lvbnMmJmUuRnIoZy51cmwsdGhpcy5GZC5pbXByZXNzaW9ucyk/dGhpcy5KZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuR24sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHthZElkOnRoaXMuRmQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkplKGcudXJsLGcudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmMuUGE9CnRoaXMudnAodGhpcy5jLlBhLGEpfWNhdGNoKG0pe319fSxaYTpmdW5jdGlvbigpe3ZhciBhPWUuVmEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLkFmJiYoYj0iX3ZwYWlkIik7dGhpcy5DZiYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxKZTpmdW5jdGlvbihhLGIsYyxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxjJiZiLktuKGMpLGZ8fChmPXRoaXMucmcpLGV8fChlPXRoaXMucmcpLHRoaXMuTW4oYSksdGhpcy5MLkRhKGIsZnVuY3Rpb24oKXt0aGlzLkRoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LE1uOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09Im9wZW4ifSxEaDpmdW5jdGlvbihhKXt0aGlzLmNjW2FdPSJjbG9zZWQifSxrcDpmdW5jdGlvbigpe3RoaXMuY2M9e319LFJ1OmZ1bmN0aW9uKCl7dmFyIGE9MCxiO2ZvcihiIGluIHRoaXMuY2MpdGhpcy5jYy5oYXNPd25Qcm9wZXJ0eShiKSYmCiJvcGVuIj09dGhpcy5jY1tiXSYmYSsrO3JldHVybiBhfSxMcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHZwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFN2OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Udi5iaW5kKHRoaXMpKX0sVHY6ZnVuY3Rpb24oKXtlLlZhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmVjKCk6dGhpcy5jLlViJiYoZS52KGsua2csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLlpjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPQp3aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5VYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuVWIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxSdjpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0KIiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5XYy5yZXBsYWNlKCJbdGltZV0iLGUuQmcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC4kYyYmKGI9dGhpcy5MLiRjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC4kYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sQ2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC4kYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYKKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxnaTpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMucnA7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuR2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWGguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkViO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ydi5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnF2LmJpbmQodGhpcykpOwpnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLk1oO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9CjEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLmtmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlZhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0KImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5CYT10aGlzLnRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi4kZihmdW5jdGlvbihhKXt0aGlzLkJhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5QZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGVjOmZ1bmN0aW9uKCl7dGhpcy5CYSYmImJsb2NrIj09dGhpcy5CYS5zdHlsZS5kaXNwbGF5fHx0aGlzLkJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxYaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuJGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxZaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMubWM/KGUubWEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLm1jPSExKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLm1jPSEwKX0sd2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuJGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEdoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKSl9LHF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxydjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMucmI/KGUubWEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGUudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSx4djpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsudGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGRjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmRjKTt0aGlzLmVkfHx0aGlzLmVlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5tZigpKX0scGU6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUuaGQoKTshdGhpcy5MLmxjfHxlLlZhKCl8fCFjLmlzQ2hyb21lJiYhYy5pc0ZpcmVmb3h8fGMuaXNFZGdlfHwKIShhfHwhdGhpcy5qZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy5zaHx8IXRoaXMuTC5SYyYmInNwaWVnZWwuZGUiIT1lLlpiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwicHJlcm9sbCIhPWUuQ2I/KHRoaXMuZWQ9ITAsdGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy5tZygpKToodGhpcy5zaD10aGlzLkNmPXRoaXMuQmY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5qZT0hMCxhPWUuY2coYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuS2UoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LG1nOmZ1bmN0aW9uKGEpe3RoaXMuUnUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCEwKX0uYmluZCh0aGlzKSx0aGlzLnN0KToodGhpcy5HZD0hMCx0aGlzLmIuQWUoKSx0aGlzLmIuY3UoKSx0aGlzLmFjPSExLAplLnYoay5xcCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMud2UoKS5FaCgpKX0sd2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sZGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZS5FZSh0aGlzLnZpZGVvLGEpP3RoaXMuR2goKTp0aGlzLndkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5yYyYmMDx0aGlzLnJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5yYykpO3RoaXMudmlkZW8mJgp0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuT28rIi0iK3RoaXMubGY7dGhpcy5jJiZ0aGlzLmMuSGcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkhnKCkpO3JldHVybiBhfSxyZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuZGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRqPXRoaXMuYVs0XTt0aGlzLlhzPXRoaXMuYVs3XTt0aGlzLlJtPXRoaXMuYVs5XTt0aGlzLk9yPXRoaXMuYVsxMF07dGhpcy5zbz10aGlzLmFbM107dGhpcy52aj10aGlzLmFbMV07dGhpcy5Ddj10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOF07dGhpcy5ubD10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX0KYy50bz1iO2IucHJvdG90eXBlPXtDajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRGo6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhzOnRoaXMuUW0oYSl9LFFtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5SbTp0aGlzLk5yKGEpfSxOcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuT3I6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNvOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52ajp0aGlzLkJ2KGEpfSxCdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ3Y6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmd0OnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qbDp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy50b3x8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuQ2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnFjPXRoaXMuc2M9ITE7dGhpcy52YT0iIjt0aGlzLnpmPSExO3RoaXMuU2c9IiI7ZCYmZC5lbXB0eT90aGlzLm5zKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRm09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuaGQoKSxiO2I9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKdmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLm9nKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8CiJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkhkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLkRhKGIsdGhpcy5tcy5iaW5kKHRoaXMpLAp0aGlzLmpzLmJpbmQodGhpcykpfSxEZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5LcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5XdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxLcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmCmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LG1zOmZ1bmN0aW9uKGEpe3RoaXMuTXQoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpOwp0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlNnPWEucmVzcG9uc2VVUkw7dGhpcy5ZLmxlbmd0aD90aGlzLkljKCk6dGhpcy5zYSh0aGlzLlNhKHcuUGMse2Vycm9yOnRoaXMuemY/Ry5XZDpHLklmfSkpfSxuczpmdW5jdGlvbihhKXt0cnl7dGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpO3RoaXMucWM9dGhpcy5UaCgpO3RoaXMuWS5sZW5ndGg/dGhpcy5JYygpOnRoaXMuc2EodGhpcy5TYSh3LlBjLHtlcnJvcjp0aGlzLnpmP0cuV2Q6Ry5JZn0pKX0sanM6ZnVuY3Rpb24oKXt0aGlzLnNhKHRoaXMuU2Eody5IZix7ZGVwdGg6YX0pKX0sSWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5NcigpP3RoaXMuZnYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5NZygpLGgse0FkU3lzdGVtOnRoaXMudHEoKSwKdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMuc2EodGhpcy5TYSh3LktmKSk6KGE9MCx0aGlzLkp2KCkmJnRoaXMuVmUodGhpcy5zcCgpKSl9LFFlOmZ1bmN0aW9uKCl7dGhpcy5zYz8odGhpcy5zYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5RZSgpfSxwaDpmdW5jdGlvbigpe3RoaXMucWM/KHRoaXMucWM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSWMoKSk6dGhpcy5wYXJlbnQucGgoKX0sSnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdigpP3RoaXMuYnYoKT8hMDooLTEhPXRoaXMuQ2MoKT90aGlzLnNhKHRoaXMuU2Eody5TZCkpOnRoaXMuc2EodGhpcy5TYSh3LkRmKSksITEpOih0aGlzLnNhKHRoaXMuU2Eody5QYyxHLkpmKSksITEpfSxWZTpmdW5jdGlvbihhKXt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5RZHx8KGEuUWQ9W10pO2EuUWQucHVzaCh0aGlzLlNnKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuTWUoKSk7CmEudGI9YS50Yj9hLnRiOnRoaXMuc2M7YS5wYz1hLnBjP2EucGM6dGhpcy5xYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7dGhpcy5wYXJlbnQuVmUoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLmR1cmF0aW9uPXRoaXMuQ2MoKTthLk89dGhpcy5KZygpO2EuVWI9dGhpcy52cSgpO2EuUXY9W107YS5vcmlnaW49dGhpczthLkI9dGhpcy5zcSgpO2Eua2Y9dGhpcy5KcShhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7cmV0dXJuIGF9LHNhOmZ1bmN0aW9uKGIpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPQp3LlNkLmNvZGU/Yi5QYS5jb25jYXQodGhpcy53cSgpKTpiLlBhLmNvbmNhdCh0aGlzLkVxKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuV2ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5zYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnNhJiZ0aGlzLnBhcmVudC5zYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sdGc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sZnY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxjdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuSmcoKS5sZW5ndGh9LGJ2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5DYygpfSxwZjpmdW5jdGlvbigpe3JldHVybiAxPAp0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxUaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMucGYoKSYmKGE9ITApO3JldHVybiBhfSxNdDpmdW5jdGlvbihhKXt0aGlzLnZhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy52YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuemY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sTXI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLk1nKCkubGVuZ3RofSxNZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LHRxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmUodGhpcy5VLAoiQWRTeXN0ZW0iKX0sTWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy4kZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5rYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LCRnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuJGcoYS5wYXJlbnROb2RlKTohMX0sRXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT0KYS50eXBlfSl9LHdxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx2cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxKZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxseDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5rYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8CjFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sc3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5uZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9CmJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LENjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxKcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkZ1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sdmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD8KdGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0seWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkZtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFyPXRoaXMuYVs2XTt0aGlzLmZvPXRoaXMuYVs2XTt0aGlzLnp3PXRoaXMuYVs5XTt0aGlzLktvPXRoaXMuYVsxMF07dGhpcy5kcz10aGlzLmFbMTBdO3RoaXMuRXA9dGhpcy5hWzVdO3RoaXMuR3A9dGhpcy5hWzZdO3RoaXMuc2o9CnRoaXMuYVsyXTt0aGlzLmNvPXRoaXMuYVs2XTt0aGlzLnFvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLkNwPWI7Yi5wcm90b3R5cGU9e3ByOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5xcjp0aGlzLmVvKGEpfSxlbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZm86dGhpcy55dyhhKX0seXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnp3OnRoaXMuSm8oYSl9LEpvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Lbzp0aGlzLmNzKGEpfSxjczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZHM6dGhpcy5EcChhKX0sRHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkVwOnRoaXMuRnAoYSl9LEZwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HcDp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNqOnRoaXMuYm8oYSl9LGJvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5jbzp0aGlzLnBvKGEpfSxwbzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnFvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5DcHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkI9dGhpcy5wYz10aGlzLnRiPSExO3RoaXMuQmU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkNlPSIifWMuUmw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sQ3E6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkdhKXt2YXIgYT10aGlzLm9yaWdpbi5HYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5CZT1hW2NdKX1yZXR1cm4gdGhpcy5CZX0sSGc6ZnVuY3Rpb24oKXtpZih0aGlzLkNlKXJldHVybiB0aGlzLkNlO3ZhciBhPSIiOyhhPXRoaXMuQ3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkNlPWF9LE5xOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5SbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2k9dGhpcy5hWzFdO3RoaXMuWW09dGhpcy5hWzldO3RoaXMuVnA9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNF19Yy5wdD1iO2IucHJvdG90eXBlPXtGaTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkdpOnRoaXMuWG0oYSl9LFhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ZbTp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLnB0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5GaSg0KTt2YXIgdz17WGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LERmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxQYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCk9hOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApPYToiTE9BRF9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LE53Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxTZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17SWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sT3c6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT209dGhpcy5hWzEwXTt0aGlzLm53PXRoaXMuYVsyXTt0aGlzLnJrPXRoaXMuYVs0XTt0aGlzLkFrPXRoaXMuYVs2XTt0aGlzLlVuPXRoaXMuYVs4XTt0aGlzLlVyPXRoaXMuYVsyXTt0aGlzLlFqPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzVdfWMuUms9YjtiLnByb3RvdHlwZT17Tm06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk9tOnRoaXMubHcoYSl9LGx3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5udzp0aGlzLnFrKGEpfSxxazpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnJrOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Bazp0aGlzLlRuKGEpfSxUbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVW46dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVyOnRoaXMuUGooYSl9LFBqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Rajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuUmt8fFhhLEljPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLk5tKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuZ2Q9Yjt0aGlzLlBhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5Faj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuRWp8fFVhO2M9CmN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5obD10aGlzLmFbNl07dGhpcy5tdD10aGlzLmFbMl07dGhpcy5MdD10aGlzLmFbN107dGhpcy5ndT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy5Hcz1iO2IucHJvdG90eXBlPXtnbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaGw6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm10OnRoaXMuS3QoYSl9LEt0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5MdDp0aGlzLmZ1KGEpfSxmdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZ3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLkdzfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZ2woNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLkZoPWE7dGhpcy52aWRlbz1iO3RoaXMuTmQ9W107dGhpcy5DaD1bXTt0aGlzLlJlPVtdO3RoaXMuVXY9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlhrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuRmgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5GaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LApnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2cuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgaz1nLmNvbnRlbnRXaW5kb3c7ay5HeD17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy4kdC5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5SdC5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuTmQucHVzaCh7c3JjOmMsZnJhbWU6Zyx0dDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LAp0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuUmUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5SZVtiXTtjLnR5cGU9PT1hJiZjLlZvKHRoaXMueHEoYSkpfX0seHE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7UHg6ITAsT3g6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7Q3g6InZpZGVvIixSeDoianNDdXN0b20iLFN4OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsVHg6MSxteDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLAphZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxNcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuTmQubGVuZ3RoO2IrKylpZih0aGlzLk5kW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuTmRbYl0udHQ7cmV0dXJuIiJ9LCR0OmZ1bmN0aW9uKGEsYil7dGhpcy5DaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5NcShiKSx2ZW5kb3I6Yn0pO3RoaXMuTnUoKX0sUnQ6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLlV2Lm1hcChmdW5jdGlvbihhKXt0aGlzLmFnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYWcoYSxiKX0sYWc6ZnVuY3Rpb24oYSxiKXt0aGlzLlJlLnB1c2goe3R5cGU6YSxWbzpiLE14OiExfSl9LE51OmZ1bmN0aW9uKCl7dGhpcy5DaC5tYXAoZnVuY3Rpb24oYSl7YS5Jcnx8CihhLkZ4KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5ReCxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuSXI9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWGt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhpPXRoaXMuYVs1XTt0aGlzLllpPXRoaXMuYVsxXTt0aGlzLlJwPXRoaXMuYVs1XTt0aGlzLkhrPXRoaXMuYVs1XTt0aGlzLmF0PXRoaXMuYVs4XTt0aGlzLml1PXRoaXMuYVszXTt0aGlzLm5rPXRoaXMuYVs0XTt0aGlzLiRxPXRoaXMuYVszXTt0aGlzLmZsPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy5pcj1iO2IucHJvdG90eXBlPXt3aTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueGk6dGhpcy5YaShhKX0sClhpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZaTp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUnA6dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhrOnRoaXMuJHMoYSl9LCRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaXU6dGhpcy5tayhhKX0sbWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5rOnRoaXMuWnEoYSl9LFpxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kcTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmlyfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2Mud2koNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5pYj1hLkVnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuYmc9ITE7dGhpcy5UYj1bXX1jLm9qPWI7Yi5wcm90b3R5cGU9e3JxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZT0wLGI9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUsCnk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnJxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5hcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmCihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sVXU6ZnVuY3Rpb24oKXt0aGlzLmJnPSEwfSxkaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sdmg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay55Yyx0aGlzLmYucygpKX0sY3U6ZnVuY3Rpb24oKXt0aGlzLmJnfHwodGhpcy5mLnBsYXkoKSxlLnYoay5kZCx0aGlzLmYucygpKSl9LGpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9CiJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5pYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuaWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5pYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmliLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaWIpO3RoaXMuZi5MYyYmdGhpcy5mLkxjKCk/dGhpcy5mLkVnKCkuYXBwZW5kQ2hpbGQodGhpcy5LKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy4kYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sCmFyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxqcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LCRiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuanEodGhpcy5pYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmCjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQWUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLkxjKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLksuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5UYi5sZW5ndGg7YSsrKXRoaXMuVGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5QaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLiRiLmJpbmQodGhpcyksMTApfSwkZjpmdW5jdGlvbihhKXt0aGlzLlRifHwKKHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEFlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMub2p8fCRhLEU9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuYWEoMTApO04uY29udHJvbHM9ITA7RS5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCkEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1vPXRoaXMuYVsyXTt0aGlzLmRqPXRoaXMuYVs5XTt0aGlzLkR3PXRoaXMuYVs3XTt0aGlzLmpqPXRoaXMuYVsyXTt0aGlzLkNpPXRoaXMuYVs1XTt0aGlzLlZzPXRoaXMuYVszXTt0aGlzLnBsPXRoaXMuYVs3XTt0aGlzLmJzPXRoaXMuYVsyXTt0aGlzLnZ3PXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuRW09YjtiLnByb3RvdHlwZT17bG86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1vOnRoaXMuY2ooYSl9LGNqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kajp0aGlzLkN3KGEpfSxDdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRHc6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmpqOnRoaXMuQmkoYSl9LEJpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DaTp0aGlzLlVzKGEpfSwKVXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZzOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wbDp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYnM6dGhpcy51dyhhKX0sdXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnZ3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5FbXx8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMubG8oNCk7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLAphPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5CZChiKTt0aGlzLnBnKCl9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LApEZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5DbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuQmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7dGhpcy5TYj10aGlzLlNifHwhMTt0aGlzLlRmPXRoaXMuVmY9dGhpcy5XZz10aGlzLmVhPXRoaXMuc2Y9CiExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuaHEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnNmPSEwO3RoaXMuV2cmJnRoaXMuamcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLmFjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuYmQoKTt0aGlzLldnPSEwO3RoaXMuamcoKX0uYmluZCh0aGlzKSk7dGhpcy5mZygpfSwKamc6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5iZCgpO2lmKCF0aGlzLnNmJiYhdGhpcy5iZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuc2YmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0sYmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLktnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LEtnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGZnOmZ1bmN0aW9uKCl7aWYodGhpcy5iZCgpKXt2YXIgYj10aGlzLktnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdOwp0aGlzLlZmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9Yi5qeH10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LG54OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkF4KCk6ITF9LENjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5DYygpOi0xfSxGcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxocTpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy51KCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwKMTAwKX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5EZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkZxKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuQmx8fGRiOyhmdW5jdGlvbihjKXtjLkRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sSnI6ZnVuY3Rpb24oKXt3aW5kb3cuT08uWGwudm4udG4/d2luZG93Lk9PLlhsLnZuLnRuLmh4KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpyKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9CmRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnhlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMuRGx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaz10aGlzLmFbOV07dGhpcy55az10aGlzLmFbN107dGhpcy5haz10aGlzLmFbMTBdO3RoaXMuZmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5Pcz1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRms6CnRoaXMueGsoYSl9LHhrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy55azp0aGlzLiRqKGEpfSwkajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYWs6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5Pc3x8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuRWsoNCk7KGZ1bmN0aW9uKGMpe2MuU2k9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMTt0aGlzLk5nKCl9LE5nOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTsKYnx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sCk5hOmZ1bmN0aW9uKCl7dGhpcy55aCgpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuU2l8fGhiOyhmdW5jdGlvbihjKXtjLlJpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMucmEoKTp0aGlzLm0oKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmdnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2coYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGliPWMuUml8fGliOyhmdW5jdGlvbihjKXtjLlRpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sQmg6ZnVuY3Rpb24oYil7Yj1uZXcgaGIoYik7Yi5uYT90aGlzLlQoKTp0aGlzLk4oYil8fAooYi5CZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5pcXx8KHRoaXMuaXE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkJoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5CaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGpiPWMuVGl8fGpiLFQ9bmV3IGpiKHIpO1QuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy55bT10aGlzLmFbMl07dGhpcy5jcj10aGlzLmFbMl07dGhpcy56dj10aGlzLmFbNF07dGhpcy5Haj10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLmxsPWI7Yi5wcm90b3R5cGU9e3htOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy55bTp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3I6dGhpcy55dihhKX0seXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnp2OnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR2o6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5sbHx8a2IsTmM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMueG0oNCk7KGZ1bmN0aW9uKGMpe2Mubm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sTGM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ubXx8VTsoZnVuY3Rpb24oYyl7Yy5tbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlZjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eC5WYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLk1zKGEpfS5iaW5kKHRoaXMpKTt4LlZjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3guVmMoIiMiK2IsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTsKeC5UcSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufX10aGlzLnUoImFkZXJyb3IiLGEpO3RoaXMuRygpfX0pfSkoYyk7dmFyIFY9Yy5tbXx8VjsoZnVuY3Rpb24oYyl7Yy5vbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMudWQmJihiPWUud3AoYix0aGlzLnVkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5SKGQpO3ZhciBmPW5ldyBWKGQsdGhpcy5JKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy51ZHx8KHRoaXMudWQ9W10pLHRoaXMudWQucHVzaChiW2FdKSxkPW5ldyBVKGcpLHRoaXMuTihkKXx8KHRoaXMuUihkKSxmPW5ldyBWKGQsdGhpcy5JKSwKZi5nKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxWYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSxndjpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmRhfHx0aGlzLmRhJiYhdGhpcy5kYVthXSl0aGlzLkhjfHwodGhpcy5IYz1bXSksdGhpcy5IYy5wdXNoKGIpLHRoaXMuYnUoKSYmKHRoaXMuYmYoKSx0aGlzLmcoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5kYVthXVtjXSYmMDx0aGlzLmRhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuZGFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmRhW2FdW2NdW2RdKGIpfX0sVHE6ZnVuY3Rpb24oKXtpZih0aGlzLkhjKWZvcih2YXIgYj0KMDtiPHRoaXMuSGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5IY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmRhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5kYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnguZ3YoYil9fSl9KShjKTt2YXIgbGI9Yy5vbXx8bGIseD1uZXcgbGIocik7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ocj10aGlzLmFbOF07dGhpcy5vdD10aGlzLmFbOV07CnRoaXMuWHA9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMuQW49YjtiLnByb3RvdHlwZT17Z3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ocjp0aGlzLm50KGEpfSxudDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub3Q6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5Bbnx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuZ3IoNCk7KGZ1bmN0aW9uKGMpe2MuT2k9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7CnZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLk9pfHxuYjsoZnVuY3Rpb24oYyl7Yy5QaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTsKdmFyIG9iPWMuUGl8fG9iOyhmdW5jdGlvbihjKXtjLlFpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkkpKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuUWl8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy56cj10aGlzLmFbMl07dGhpcy5ObD10aGlzLmFbN107dGhpcy5Ucz10aGlzLmFbMV07dGhpcy5qcD10aGlzLmFbM107dGhpcy5Xbj10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsyXX1jLmptPWI7Yi5wcm90b3R5cGU9e3lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cjp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTmw6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRzOnRoaXMuaXAoYSl9LGlwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qcDp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlduOnRoaXMuaShhKX0sCmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIHJiPWMuam18fHJiLFBjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLnlyKDQpOyhmdW5jdGlvbihjKXtjLnJsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5XKGIpO3RoaXMuWihhKTt0aGlzLlF0KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LApwbGF5OmZ1bmN0aW9uKCl7fSxRdDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnBhdXNlJiZ0aGlzLmphLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnJlc3VtZSYmdGhpcy5qYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEubXV0ZSYmdGhpcy5qYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LApmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS51bm11dGUmJnRoaXMuamEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxYZzpmdW5jdGlvbihiKXt0aGlzLmphPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBzYj1jLnJsfHxzYjsoZnVuY3Rpb24oYyl7Yy5xbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubWk9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMubWkmJih0aGlzLkcoKSx0aGlzLm1pPSEwLHRoaXMub2EoKSk7YS5LYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgdGI9Yy5xbHx8dGI7KGZ1bmN0aW9uKGMpe2Muc2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZzpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYj1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgc2IoYltkXSksdGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgdGIoYyx0aGlzLkkpKS5nKCkpfX1lbHNlIHRoaXMuVCgpfX0pfSkoYyk7dmFyIHViPWMuc2x8fHViLFc9bmV3IHViKHIpO1cuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRvPXRoaXMuYVs0XTt0aGlzLnVsPXRoaXMuYVs2XTt0aGlzLmxrPXRoaXMuYVs4XTt0aGlzLlNxPXRoaXMuYVsxMF07dGhpcy5Uaz10aGlzLmFbN107dGhpcy5Tcj10aGlzLmFbN107dGhpcy5Kcz10aGlzLmFbM107dGhpcy5ucT10aGlzLmFbOF07CnRoaXMuc3I9dGhpcy5hWzEwXTt0aGlzLkJ3PXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy52aT1iO2IucHJvdG90eXBlPXtDbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRG86dGhpcy50bChhKX0sdGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVsOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sazp0aGlzLlJxKGEpfSxScTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU3E6dGhpcy5TayhhKX0sU2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRrOnRoaXMuUnIoYSl9LFJyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Tcjp0aGlzLklzKGEpfSxJczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSnM6dGhpcy5tcShhKX0sbXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm5xOnRoaXMucnIoYSl9LHJyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zcjp0aGlzLkF3KGEpfSxBdzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkJ3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy52aXx8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UWMuQ28oNCk7KGZ1bmN0aW9uKGMpe2MuTG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LAp1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlg/KDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgd2I9Yy5MbXx8d2I7KGZ1bmN0aW9uKGMpe2MuS209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLApiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxPdDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuZWJ8fCh0aGlzLmViPVtdKTt0aGlzLmViLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5yYSgpOnRoaXMudSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTsKdGhpcy5DYT90aGlzLk90KHRoaXMuQ2EpOih0aGlzLkNhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5DYSl7dGhpcy5HKCk7cmV0dXJufWlmKCF0aGlzLnRjKXt0aGlzLkcoKTtyZXR1cm59Yj0hMDtpZih0aGlzLmViJiZ0aGlzLmViLmxlbmd0aCYmMTx0aGlzLmViLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuZWIubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuZWJbYV0mJjMwMyE9dGhpcy5lYlthXSYmNDAzIT10aGlzLmViW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5LbXx8eGI7KGZ1bmN0aW9uKGMpe2MuTW09CnQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgd2IoYi5pdGVtKGEpKTt0aGlzLk4oYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLlIoYyksKG5ldyB4YihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgeWI9Yy5NbXx8eWIsemI9bmV3IHliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZvPXRoaXMuYVsyXTt0aGlzLiRyPXRoaXMuYVs2XTt0aGlzLldyPXRoaXMuYVsxMF07dGhpcy5pdj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5QbT1iO2IucHJvdG90eXBlPXtFbzpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLkZvOnRoaXMuWnIoYSl9LFpyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kcjp0aGlzLlZyKGEpfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3I6dGhpcy5odihhKX0saHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLml2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy5QbXx8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMuRW8oNCk7KGZ1bmN0aW9uKGMpe2MuZG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlcoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pOwp0aGlzLldlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5FdCgpfS5iaW5kKHRoaXMpLDUwMCl9LEV0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuV2UmJgp3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLldlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sUXU6ZnVuY3Rpb24oKXt0aGlzLldlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgQmI9Yy5kbXx8QmI7KGZ1bmN0aW9uKGMpe2MuY209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKTt0aGlzLmtjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLnVzPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5rY3x8KHRoaXMua2M9CjAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8Cih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMua2N8fHRoaXMua2MrKyx0aGlzLmtjPD10aGlzLnVzPyh0aGlzLmtjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5RdSgpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLAoxMDApfX0pfSkoYyk7dmFyIENiPWMuY218fENiOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IEJiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsdGhpcy5JKSkuZygpKSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgRGI9Yy5lbXx8RGIsRWI9bmV3IERiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuTHc9CmI7Yi5wcm90b3R5cGU9e2pyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5rcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEZiPWMuTHd8fEZiLFNjPW5ldyBGYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLmpyKDQpOyhmdW5jdGlvbihjKXtjLlpsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMuWmx8fEdiOyhmdW5jdGlvbihjKXtjLllsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5LYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMub3AoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5tZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMuZXMoKTp0aGlzLmlnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksCjFFMyl9LG9wOmZ1bmN0aW9uKCl7dGhpcy5SZigpfHx0aGlzLm0oITApfSxlczpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWQoKTshYi5xYSYmYi5ZJiZiLmd4JiZiLml4JiYodGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSgpKX0saWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZygpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGgpZm9yKHZhciBiPQpsLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5LYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy50aD1iW2NdKTtyZXR1cm4gdGhpcy50aH0sQng6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubWQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5ZbHx8SGI7KGZ1bmN0aW9uKGMpe2MuJGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0KMDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEdiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBIYihjLHRoaXMuSSkpLmcoKSl9cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBJYj1jLiRsfHxJYixKYj1uZXcgSWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueWw9dGhpcy5hWzRdO3RoaXMubXA9dGhpcy5hWzVdO3RoaXMudXY9dGhpcy5hWzEwXTt0aGlzLldpPXRoaXMuYVszXTt0aGlzLktpPXRoaXMuYVszXTt0aGlzLllxPXRoaXMuYVsyXTt0aGlzLmJuPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzEwXX1jLkF2PWI7Yi5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLm1wOnRoaXMudHYoYSl9LHR2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51djp0aGlzLlZpKGEpfSxWaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuV2k6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktpOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ZcTp0aGlzLmFuKGEpfSxhbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLkF2fHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy54bCg0KTsoZnVuY3Rpb24oYyl7Yy5Waz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7CkgmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sCkFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxMYzpmdW5jdGlvbigpe3JldHVybiEwfSxLYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Wa3x8WDsoZnVuY3Rpb24oYyl7Yy5Vaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5YZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhlPQpiLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlhlJiZiIT10aGlzLlhlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuZmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLkh4KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy51KCJhZGVycm9yIiksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFk9Yy5Va3x8WTsoZnVuY3Rpb24oYyl7Yy5Xaz0KdC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWChiKSxiLm5hP3RoaXMuYmYoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksCmIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuV2t8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWk9dGhpcy5hWzddO3RoaXMuV209dGhpcy5hWzRdO3RoaXMuem49dGhpcy5hWzZdO3RoaXMuTm89dGhpcy5hWzddO3RoaXMuSXc9dGhpcy5hWzFdO3RoaXMua289dGhpcy5hWzhdO3RoaXMubXU9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOV19Yy5KbT1iO2IucHJvdG90eXBlPXtEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRWk6dGhpcy5WbShhKX0sVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldtOnRoaXMueW4oYSl9LHluOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy56bjp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5IdyhhKX0sSHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5Jdzp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmtvOnRoaXMubHUoYSl9LGx1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5tdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLkptfHxOYixVYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5EaSg0KTsoZnVuY3Rpb24oYyl7Yy5Vaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LApudTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sRXg6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgT2I9Yy5Vanx8T2I7KGZ1bmN0aW9uKGMpe2MuVGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGEpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk7Yi5PbigiZmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oInRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5vYSgpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgUGI9Yy5Uanx8UGI7KGZ1bmN0aW9uKGMpe2MuVmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yayYmCndpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycyl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yay5HZXRBbGxQbGF5ZXJzKCk7aWYoYiYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX19dGhpcy5UKCl9fSl9KShjKTt2YXIgUWI9Yy5Wanx8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklwPXRoaXMuYVs3XTt0aGlzLm5uPXRoaXMuYVs5XTt0aGlzLmJtPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzFdfWMuUnM9YjtiLnByb3RvdHlwZT17SHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JcDp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLm5uOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLlJzfHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5IcCg0KTsoZnVuY3Rpb24oYyl7Yy5kbj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSwKTGQ6ZnVuY3Rpb24oYil7dmFyIGE9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LFB0OmZ1bmN0aW9uKCl7dGhpcy5SZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuTGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUmR8fCh0aGlzLlJkPSEwLHRoaXMuTGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LApwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxBYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuZG58fFRiOyhmdW5jdGlvbihjKXtjLmNuPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFR0OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSwKYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWQoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmFkKGEpfS5iaW5kKHRoaXMpKX0sYWQ6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7CmEuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMudSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5tKCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxOZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5hZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTmYuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5UdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLk5mKCk7dGhpcy5TdCgpfSxTdDpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsCnRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuTnQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5OdD0hMH19KX0pKGMpO3ZhciBVYj1jLmNufHxVYjsoZnVuY3Rpb24oYyl7Yy5lbj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLlB0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTsKdmFyIFZiPWMuZW58fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenA9dGhpcy5hWzNdO3RoaXMuemo9dGhpcy5hWzddO3RoaXMuVHA9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMTBdfWMuS2w9YjtiLnByb3RvdHlwZT17eXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpwOnRoaXMueWooYSl9LHlqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56ajp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLktsfHxYYixXYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1XYy55cCg0KTsKKGZ1bmN0aW9uKGMpe2Mudm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy53aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLkJzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxudTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLAphPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQnN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMud2gmJih0aGlzLndoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE89Yy52bXx8TzsoZnVuY3Rpb24oYyl7Yy51bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5EYisrLDE1PHRoaXMuRGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnp1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSwKaGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLnVtfHxQOyhmdW5jdGlvbihjKXtjLndtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuYmYoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLndtfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudGs9CnRoaXMuYVs4XTt0aGlzLm12PXRoaXMuYVs0XTt0aGlzLnhuPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTnM9YjtiLnByb3RvdHlwZT17c2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRrOnRoaXMubHYoYSl9LGx2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tdjp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5Oc3x8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuc2soNCk7KGZ1bmN0aW9uKGMpe2MuS2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpOwp2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5XKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5La3x8WjsoZnVuY3Rpb24oYyl7Yy5Kaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkVjPXRoaXMuQ2E9dGhpcy5YYz0hMTt0aGlzLkFoPWUuSGIoMTApO3RoaXMuYmgoKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiYKYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnFhPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5xYigpLCEwO3RoaXMuVGcrKztpZigxMDx0aGlzLlRnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmguYmluZCh0aGlzKSwxMDApLCExfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT0KYXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITB9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkprfHxhYTsoZnVuY3Rpb24oYyl7Yy5Maz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYKMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLkxrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQm89dGhpcy5hWzhdO3RoaXMuQ249dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMl19Yy5zaT1iO2IucHJvdG90eXBlPXtBbzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkJvOnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGNjPWMuc2l8fGNjLFljPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVljLkFvKDQpOyhmdW5jdGlvbihjKXtjLkxqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBkYz1jLkxqfHxkYzsoZnVuY3Rpb24oYyl7Yy5Laj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5oZygpfSxoZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuS2p8fGVjOyhmdW5jdGlvbihjKXtjLk1qPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmCndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgZGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubmEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7KG5ldyBlYyhiLHRoaXMuSSkpLmcoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGZjPWMuTWp8fGZjLGdjPW5ldyBmYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdz10aGlzLmFbMl07dGhpcy5Zbj10aGlzLmFbOF07dGhpcy5wcT10aGlzLmFbNl07dGhpcy5Caj10aGlzLmFbOF07dGhpcy5Oaz10aGlzLmFbMl07dGhpcy5uaj10aGlzLmFbOF07dGhpcy5pbz10aGlzLmFbM107dGhpcy5ydD10aGlzLmFbOF07dGhpcy5OaT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmt1PWI7Yi5wcm90b3R5cGU9e3J3OmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuc3c6dGhpcy5YbihhKX0sWG46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlluOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5wcTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQmo6dGhpcy5NayhhKX0sTWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk5rOnRoaXMubWooYSl9LG1qOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5uajp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaW86dGhpcy5xdChhKX0scXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnJ0OnRoaXMuTWkoYSl9LE1pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5OaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMua3V8fGhjLFpjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5ydyg0KTsoZnVuY3Rpb24oYyl7Yy5waT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5waXx8aWM7KGZ1bmN0aW9uKGMpe2Mub2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubGUoKTt0aGlzLmVnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmVnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGUuYmluZCh0aGlzKSwxMDApfSxsZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxlLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIGpjPWMub2l8fGpjOyhmdW5jdGlvbihjKXtjLnJpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj0KbmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMucml8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xbT10aGlzLmFbNl07dGhpcy5jaz10aGlzLmFbMV07dGhpcy5acz10aGlzLmFbMTBdO3RoaXMucW49dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5rbD1iOwpiLnByb3RvdHlwZT17cG06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnFtOnRoaXMuYmsoYSl9LGJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5jazp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWnM6dGhpcy5wbihhKX0scG46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5rbHx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMucG0oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZWg9dGhpcy5naD10aGlzLmZoPSExO3RoaXMueGQ9W107dGhpcy5hZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuVGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5HcShhKTpbXSxiO3RoaXMuZ2g9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZmg9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuSGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmFmKXtpZih0aGlzLmVoKWJyZWFrO2I9dGhpcy5hZltjXTt0aGlzLnZmKGIpJiYodGhpcy54ZC5wdXNoKGIpLHRoaXMuSGgoYikpfX0sdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgp0PyEwOiExfSxHcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5hZltjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEhoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSxTdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZmgpZm9yKHRoaXMuZWg9ITAsYT0wO2E8dGhpcy54ZC5sZW5ndGg7YSsrKXRoaXMueGRbYV0uTGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54ZFthXS5MYil9fX0pKGMpO3ZhciBuYz1jLlRsfHxuYyxNPW5ldyBuYztNLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vcj10aGlzLmFbMTBdO3RoaXMuaXQ9dGhpcy5hWzFdO3RoaXMuQXQ9dGhpcy5hWzVdO3RoaXMuR2w9dGhpcy5hWzEwXTsKdGhpcy53cz10aGlzLmFbOV07dGhpcy5Rcz10aGlzLmFbNV07dGhpcy5tcj10aGlzLmFbN107dGhpcy5IdT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs3XX1jLmZxPWI7Yi5wcm90b3R5cGU9e25yOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vcjp0aGlzLmh0KGEpfSxodDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaXQ6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkF0OnRoaXMuRmwoYSl9LEZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HbDp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud3M6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFzOnRoaXMubHIoYSl9LGxyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5tcjp0aGlzLkd1KGEpfSxHdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuajphfX19KShjKTt2YXIgb2M9Yy5mcXx8b2MsYWQ9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9YWQubnIoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuQmMoay5LdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOgotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkJjKGsuRnMpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtGLndpZHRoPTE7Ri5oZWlnaHQ9MTtGLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgYmQ9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgST1uZXcgSixsPSExO0kua2EoKTtJLllnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5rYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuWWcoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTtJLmthKCk7CnZhciBjZD1iZChmdW5jdGlvbigpe2UueWcod2luZG93LEkuQXIoKSx7aWQ6Y2R9KX0sNTAwKSxpYT1lLmFhKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd0PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuTnA9YjtiLnByb3RvdHlwZT17dnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnd0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5OcHx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQudnQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnhoPXRoaXMuY29uZj10aGlzLmxiPXRoaXMucGxheWVyPW51bGw7dGhpcy5zZD0wOwp0aGlzLmJiPSIiO3RoaXMueWQ9W107dGhpcy56ZD0wO3RoaXMuemg9ITE7dGhpcy5ZZT1bXTtlLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy50aT1iO2IucHJvdG90eXBlPXt2dTpmdW5jdGlvbihhKXt0aGlzLnhoPWF9LGdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0scXU6ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSxwdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxNYzpmdW5jdGlvbihhLGIpe2UuZmEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5CcigpKXRoaXMubGIubCh0aGlzLmxiLm9kLHRoaXMubGIud2EsdGhpcy5sYi4kZSxmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmxiLkFjKTtlbHNlIGlmKHRoaXMuVnEoKSl0aGlzLmp1KGZ1bmN0aW9uKCl7dGhpcy5NYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsueWMsdGhpcy5wbGF5ZXIucygpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLlV1KCk7bC5leGl0RnVsbHNjcmVlbigpO2Uub2IoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLmxiLApnKTtsLm91KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy50cyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkllJiYoYz10aGlzLnBsYXllci5JZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5LZShhLGMsZik7dGhpcy5wbGF5ZXIuSmgobCl9fSxCcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnNkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuc2QuZ2V0VGltZSgpLHRoaXMuc2Q9YSwzRTU8Yj8hMDohMTt0aGlzLnNkPWE7cmV0dXJuITF9LEV1OmZ1bmN0aW9uKCl7ZS5vYigicHJlcm9sbCIpO2UuZmYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMudWcoYSkpP3RoaXMuTWMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX0sRHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueGgpe2UuZmYoInBvc3Ryb2xsIik7ZS5vYigicG9zdHJvbGwiKTt0aGlzLnZ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnVnKGMpKT90aGlzLk1jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX19LHVnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxXdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLkJ1KHRoaXMuRHUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5vYigibWlkcm9sbCIpO2UuZmYoIm1pZHJvbGwiKTtpZighdGhpcy5taCl7dGhpcy5taD0hMDt2YXIgYj10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5NYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5taD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5kZCwKdGhpcy5wbGF5ZXIucygpKSl9fSxWdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnV1KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmUoKX0sZzpmdW5jdGlvbigpe3RoaXMuRXUoKTt0aGlzLnBsYXllci5OZSYmdGhpcy5WdCgpO3RoaXMuV3QoKX0sWHQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy55ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuR3coYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnpkPXRoaXMueWQubGVuZ3RofSxWcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy56ZCYmKGE9ITApO3JldHVybiBhfSwKanU6ZnVuY3Rpb24oYSl7dGhpcy56aD1hO2ZvcihhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXVsiZnVuY3Rpb24iXSh0aGlzLkl0LmJpbmQodGhpcykpfSxJdDpmdW5jdGlvbihhKXt0aGlzLnpkLS07YSYmdGhpcy5ZZS5wdXNoKGEpOzA+PXRoaXMuemQmJnRoaXMuemgoKX0sdHM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWWUubGVuZ3RoO2MrKyliPXRoaXMuWWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWms9dGhpcy5hWzhdO3RoaXMuJG09dGhpcy5hWzhdO3RoaXMuUWw9dGhpcy5hWzNdO3RoaXMuYXE9dGhpcy5hWzddO3RoaXMuZXU9dGhpcy5hWzFdO3RoaXMuTHM9dGhpcy5hWzhdO3RoaXMuUGs9CnRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzVdfWMuSW89YjtiLnByb3RvdHlwZT17WWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlprOnRoaXMuWm0oYSl9LFptOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy4kbTp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUWw6dGhpcy4kcChhKX0sJHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFxOnRoaXMuZHUoYSl9LGR1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZXU6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxzOnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuSW98fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Zayg0KX0pLmNhbGwoUGVpZm94b2hPdWNoYW5nYSxQZWlmb3hvaE91Y2hhbmdhKTsK
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
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/74.0.3729.169 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Wed, 02 Oct 2019 09:37:39 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
de4-homad-2
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
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,dmFyIFBlaWZveG9oT3VjaGFuZ2E9UGVpZm94b2hPdWNoYW5nYXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVGV8fCh4LlRlPTApO3guVGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5UZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5UbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay55YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuZ2YoYyk7YS5xdShtKTthLnB1KGwpO2EuWHQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS55dSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5raC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUua2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQW09dGhpcy5hWzhdO3RoaXMuRXY9dGhpcy5hWzddO3RoaXMuU2o9dGhpcy5hWzldO3RoaXMuS3A9dGhpcy5hWzRdO3RoaXMuam49dGhpcy5hWzddO3RoaXMuWG89dGhpcy5hWzNdO3RoaXMucGs9dGhpcy5hWzldO3RoaXMuem89dGhpcy5hWzZdO3RoaXMuUW89dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNl19Yy50bT1iO2IucHJvdG90eXBlPXt6bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQW06dGhpcy5EdihhKX0sRHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkV2OnRoaXMuUmooYSl9LFJqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Tajp0aGlzLkpwKGEpfSxKcDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLktwOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qbjp0aGlzLldvKGEpfSxXbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWG86dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5wazp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpvOnRoaXMuUG8oYSl9LFBvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMudG18fGhhLHNjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLnptKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlRvPSExO3RoaXMuQ2I9InNldHVwIjt0aGlzLk5jPVtdO3RoaXMubmUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuSHQuYmluZCh0aGlzKSk7dGhpcy5uYj17fTt0aGlzLlJnPXt9O3RoaXMuZGY9ITF9Yy5maz1iO2IucHJvdG90eXBlPXtUdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5uYil0aGlzLm5iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm5iW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5kZnx8KHRoaXMuZGY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmRmfSxvYjpmdW5jdGlvbihhKXt0aGlzLm5iW2FdfHwodGhpcy5uYlthXT0wKTt0aGlzLm5iW2FdKz0xOzU8dGhpcy5uYlthXSYmIXRoaXMuUmdbYV0mJih0aGlzLlJnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuVHUoKSwhMCkpfSxuZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LApldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUW46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEh0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLkd0KGEuZGF0YSl9LEd0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCwKZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGdlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LG9nOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR2coYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmpoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxHZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsKaWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sTm46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLnFxKGEpKXJldHVybjsoYj10aGlzLm9nKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0scXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sCndnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxMcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx4ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEZnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxQaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50OwpyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxFZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLHE9MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCoKZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5FZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmUoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHplOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sS2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt5PWs7dT1tO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKHEsNSkrKG5eCnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKG0pK2IobCkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxIcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGhkOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT0KbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17TGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sZnI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sRWw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sVW06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LApRazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LGltOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sSG86ZnVuY3Rpb24oKXtyZXR1cm4gYS5MaSgpfHxhLlVpKCl8fGEuZnIoKXx8YS5FbCgpfHxhLlVtKCl8fGEuUWsoKXx8YS5pbSgpfX07cmV0dXJuIG51bGwhPWEuSG8oKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxaYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxmYTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxJcTpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sd3A6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sRnU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQmc6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmNpKGIpKyI6Iit0aGlzLmNpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5DYj1hfSx5ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkNiO3RoaXMuY2UoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTsKYS5kaXNwYXRjaEV2ZW50KGYpfSxCYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMueWcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5CYyhCKX0sSnQ6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTsKYi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5JcSgpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LE11OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5ZYigpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuY2UoYSl9LGNlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSnQoYSk7aWYoYilpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2UoYil9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLkpjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9bS5KYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYik7Cm0ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxLZDpmdW5jdGlvbihhKXtpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGIsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLkpjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LExlOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLmJwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxlKCl9LmJpbmQodGhpcyksNTAwKX0sdmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmtiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx5ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sa2I6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5uZChhKToiIn0sbmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy55ZShhKTsKYiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxjZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuR2UoYSl8fHRoaXMuTHIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5jZiYmd2luZG93LnNhbmRib3guY2ZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5jZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5jZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy53ZyhhKSlyZXR1cm4gdGhpcy53ZyhhKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5hYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIucWQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuTm4oZSxhKTtyZXR1cm4gZX0sYWI6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyxrKXt2YXIgbD1lfHxtO2U9ITA7ayYmKGU9ITEpO2lmKGwmJmwuVilpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihhLGIsZCxmLGMsbCxnLGspfS5iaW5kKHRoaXMpLDUwMCl9LGpoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxsczpmdW5jdGlvbihhLGIsZCl7dGhpcy5qaChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5OYylmb3IodmFyIGMgaW4gdGhpcy5OYylhPWEuc3BsaXQoYykuam9pbih0aGlzLk5jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS54YihhKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxraDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGEsZi5MYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMubHMoZi5xZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCnl1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk5jPWF9LEd3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5hYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sRnI6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9fX0pKGMpO3ZhciBRPWMuZmt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPQphfHx7fX1jLmVrPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IudXQ9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuRXM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iua3c9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5icT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnR3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWGY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuUGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5VZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5ZZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuRm49e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuU2Y9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5Qdj17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuY3E9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5vdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5rZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnFwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5kZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLnljPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5XZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuSG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5VYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuJGQ9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuYmU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLkduPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5qaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLkhzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5sZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuaXc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTHY9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk12PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Ldj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLkZzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5la3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hbD10aGlzLmFbNl07dGhpcy5xaj10aGlzLmFbNF07dGhpcy5rdD10aGlzLmFbM107dGhpcy54aj10aGlzLmFbMTBdO3RoaXMubHE9dGhpcy5hWzEwXTt0aGlzLmxqPXRoaXMuYVs1XTt0aGlzLkl2PXRoaXMuYVs0XTt0aGlzLkp1PXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuTGw9YjtiLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFsOnRoaXMucGooYSl9LHBqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xajp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMua3Q6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhqOnRoaXMua3EoYSl9LGtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5scTp0aGlzLmtqKGEpfSwKa2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmxqOnRoaXMuSHYoYSl9LEh2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jdjp0aGlzLkl1KGEpfSxJdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSnU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLkxsfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy4kayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmdrPWI7Yi5wcm90b3R5cGU9e3plOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxsYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LERxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LGxkOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5sZChhKwo2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5sZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuemUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmxkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxBcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxZZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnplKHRoaXMuRHEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5sZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIEo9CmMuZ2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ209dGhpcy5hWzldO3RoaXMuRnc9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMuT2w9YjtiLnByb3RvdHlwZT17Zm06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdtOnRoaXMuRXcoYSl9LEV3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gdzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuT2x8fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLmZtKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzoKLy4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5naj1ifSkoYyk7dmFyIEw9Yy5nanx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc209dGhpcy5hWzFdO3RoaXMuemk9dGhpcy5hWzNdO3RoaXMuQ209dGhpcy5hWzldO3RoaXMuT2o9dGhpcy5hWzZdO3RoaXMuZXI9dGhpcy5hWzEwXTt0aGlzLndsPXRoaXMuYVs2XTt0aGlzLnd2PXRoaXMuYVsxXTt0aGlzLlBwPXRoaXMuYVs0XTt0aGlzLkVuPXRoaXMuYVs3XTt0aGlzLkJwPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuRG09YjtiLnByb3RvdHlwZT17cm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNtOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56aTp0aGlzLkJtKGEpfSxCbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ206dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9qOnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5lcjp0aGlzLnZsKGEpfSx2bDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud2w6dGhpcy52dihhKX0sdnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMud3Y6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBwOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbjp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLkRtfHxsYSx4Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5ybSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLlNsPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5LYz0xMDA7dGhpcy5JYj0wO3RoaXMuV2E9MTUwO3RoaXMuTGI9MDt0aGlzLnJ1KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYT8KKHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKX0sYnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxiZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHJ1OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSxCcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmxhKCldPWI7TSYmTS5naCYmTS5TdShiKX0sdHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/CiEwOiExfSxHcjpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEx4OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuU2x8fHQ7KGZ1bmN0aW9uKGMpe2MuVWw9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5LYz0xMDt0aGlzLkliPTA7dGhpcy5XYT01MDt0aGlzLlg9bnVsbDt0aGlzLm5hPSExO3RoaXMucGxheWVyPWI7dGhpcy5CYj0iIjt0aGlzLnFnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuS2EoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD0KaC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxCdTpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sdXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSx1dTpmdW5jdGlvbihiKXt0aGlzLk9lPWJ9LHN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2V9LE5lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLktjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7CmVsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxFZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxCZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LE54OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLldxKCl8fHRoaXMuSm4oKTt0aGlzLkJkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sdng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sSm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sV3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxBYTpmdW5jdGlvbigpe3JldHVybiExfSxEeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hfSxjYTpmdW5jdGlvbigpe3RoaXMubmE9ITB9LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmCmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSmg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxyeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSxFaDpmdW5jdGlvbigpe3RoaXMuQmI9bnVsbH0seHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkJiJiYoYj0hMCk7cmV0dXJuIGJ9LEl4OmZ1bmN0aW9uKCl7dGhpcy5xZ3x8KHRoaXMucWc9ITApfSx1ZTpmdW5jdGlvbigpe3JldHVybiExfSxveDpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5VbHx8cDsoZnVuY3Rpb24oYyl7Yy51aT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLkxmPQoiMSI7dGhpcy5NZj0iMiI7dGhpcy51bj0iMyI7dGhpcy5RYz0wO3RoaXMubmg9MzA7dGhpcy5SYj1bXTt0aGlzLmdiPVtdO3RoaXMub2M9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuWmY9dGhpcy5maT0hMTt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5nZihiKTt0aGlzLnN1KGEpfSxnOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuZml8fCh0aGlzLmZpPSEwLGUuTGUoKSl9LFNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5hYyYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0seHI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2Eua2EoKV18fCh3aW5kb3dbYS5rYSgpXT17fSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXXx8KHdpbmRvd1thLmthKCldW2IubGEoKV09Cnt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWWIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXT0xfSxEcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmthKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldLmluaXRpYXRvciE9ZS5ZYigpJiYodGhpcy5oZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnhhKCkpe3RoaXMueHIoKTtpZighdGhpcy5EcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5oZigpO3JldHVybn10aGlzLmhmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5aaCgpO3RoaXMuWmY9ITA7YSYmImZ1bmN0aW9uIj09CnR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5nYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYodGhpcy5SYj1lLnVuaXF1ZSh0aGlzLlJiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5SYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGg9MDtoPHRoaXMuZ2IubGVuZ3RoO2grKyl0aGlzLm9jW3RoaXMuZ2JbaF0ucmVhc29uXT09dGhpcy5vY1tiXSYmYS5wdXNoKHRoaXMuZ2JbaF0uZGV0YWlsKSx0aGlzLm9jW3RoaXMuZ2JbaF0ucmVhc29uXTx0aGlzLm9jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5nYltoXS5kZXRhaWwpLGI9dGhpcy5nYltoXS5yZWFzb24pO3RoaXMub2NbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSwKYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sd3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGhmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0senU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnVufSxvYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0seGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuUWN9LGdmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sc3U6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sb3M6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIHY9Yy51aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5acD10aGlzLmFbOV07dGhpcy5Rcj10aGlzLmFbNl07dGhpcy5Hdj10aGlzLmFbN107dGhpcy52bz10aGlzLmFbNV07dGhpcy5nbj10aGlzLmFbNV07dGhpcy51cD10aGlzLmFbOF07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy50aj1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY2w6dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpwOnRoaXMuUHIoYSl9LFByOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Rcjp0aGlzLkZ2KGEpfSxGdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuR3Y6dGhpcy51byhhKX0sdW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZvOnRoaXMuZm4oYSl9LApmbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmduOnRoaXMudHAoYSl9LHRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cDp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLnRqfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5ibCg0KTsoZnVuY3Rpb24oYyl7Yy5Iaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ianx8b2E7KGZ1bmN0aW9uKGMpe2MuSWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLmZ4O2E/YS5xYT9hLnFhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7CmYuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuSWp8fHBhOyhmdW5jdGlvbihjKXtjLkpqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiYKd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Kanx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhvPXRoaXMuYVsxMF07dGhpcy5xcz10aGlzLmFbNF07dGhpcy55dD10aGlzLmFbNF07dGhpcy5hbz10aGlzLmFbM107dGhpcy5Bcz10aGlzLmFbNF07dGhpcy5rdj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs2XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueG86dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFzOnRoaXMueHQoYSl9LAp4dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueXQ6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmFvOnRoaXMuenMoYSl9LHpzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Bczp0aGlzLmp2KGEpfSxqdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua3Y6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLlVvfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy53byg0KTsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMudmcoKTt0aGlzLnhnKCk7dGhpcy5wcD0hMX0sdmc6ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKYnx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seGc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpOwphLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk9lJiYoMCx0aGlzLk9lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJgpiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Da3x8c2E7KGZ1bmN0aW9uKGMpe2MuQms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYWU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiYKYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5TYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5TZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmgmJgohdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS53ZCgpLGEucGUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuU2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5TZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5uaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlRjLmluZGV4T2YoYSkmJgp0aGlzLlRjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5UYy5sZW5ndGg+PXRoaXMuYWUmJnRoaXMubSgpKX0sb3M6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xOnRoaXMucmU/dGhpcy5yZSsrOnRoaXMucmU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUGgoYS52aWRlb1RhZyk/YS5iYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlNjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMucmU+dGhpcy5zZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnZnKCksYS54ZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ca3x8dGE7KGZ1bmN0aW9uKGMpe2MuRGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy55cSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLkdyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0scXg6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCnlxOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ea3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdzPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzJdfWMuTXc9YjtiLnByb3RvdHlwZT17ZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmdzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgd2E9Yy5Nd3x8d2EsQWM9bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuZnMoNCk7KGZ1bmN0aW9uKGMpe2MuSG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLkpkKGIpfS5iaW5kKHRoaXMpKX0sSmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LERlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpOwppZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxBYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5IbXx8eGE7KGZ1bmN0aW9uKGMpe2MuR209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkVjPXRoaXMuQ2E9dGhpcy5YYz0hMTt0aGlzLkFoPWUuSGIoMTApO3RoaXMuZWk9ITA7dGhpcy50Yz10aGlzLlZnPSExO3RoaXMuQ3MoYi5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLnFoKCksdGhpcy5ZbygpLHRoaXMucWIoKSl9LENzOmZ1bmN0aW9uKGIpe3JldHVybiBlLmZhKCJ0LW9ubGluZS5kZSIpPyExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LEp4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLAoiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuSiwiOyIsdHlwZW9mIGIuSiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLklhP2IuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuSWE/dHlwZW9mIGIuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5ZZDoKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLllkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/CnR5cGVvZiBiLkoucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5oZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmhlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuQWgpfSx5YjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmCih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMueWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnFhPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnFhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnFhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnFhfSxJZzpmdW5jdGlvbigpe2lmKCF0aGlzLkVjKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRWM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkVjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRWN9LEVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVWcpe3ZhciBiPQp0aGlzLnliKCksYT10aGlzLkNyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5VZz0hMCl9cmV0dXJuIHRoaXMuVWd9LENyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5YYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuWGM9ITApO3JldHVybiB0aGlzLlhjfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsaD0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5VdCgpfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxVdDpmdW5jdGlvbigpe3RoaXMudGM9ITA7dmFyIGI9dGhpcy5JZygpO2lmKGJ8fHRoaXMueGEoKSl7dmFyIGE9ImFkRXJyb3IiLGg9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuVmEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnVjPQohMDtpZihlLmZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIisKZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnVjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5nYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LHB4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5uZyYmYi5hZHMmJih0aGlzLm5nPWIuYWRzKTtyZXR1cm4gdGhpcy5uZ30sWW86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7CnRoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlNlKCl9LmJpbmQodGhpcykpfSxmZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuSWcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCkpfSxxaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5FcigpKXt2YXIgYT10aGlzLnliKCksaD10aGlzLlhiKCk7YSYmaCYmKHRoaXMueWIoKSx0aGlzLlhiKCksdGhpcy50Y3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5WZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnliKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5nYSgpKToodGhpcy5nYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuVmc9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xaCgpfS5iaW5kKHRoaXMpLDUwKX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7CmlmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sWm86ZnVuY3Rpb24oKXt0aGlzLnpjfHwodGhpcy56Yz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuemMhPWIuYWRzLnN0YXRlJiYodGhpcy56Yz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09CnRoaXMuemMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy56Yz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWm8oKX0uYmluZCh0aGlzKSwxMCl9LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS5aYihkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpKX0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmVpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmVpLGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKZ3A6ZnVuY3Rpb24oKXt0aGlzLnl4fHwoMTA8dGhpcy5Xdj8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLld2KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuYXUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ3AoKX0uYmluZCh0aGlzKSw1MCkpKX0sYXU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuWHYpe3RoaXMuWHY9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpOwpiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5HbXx8eWE7KGZ1bmN0aW9uKGMpe2MuSW09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlFoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5RaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxRaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLnhlKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpfX0pfSkoYyk7dmFyIHphPWMuSW18fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaj10aGlzLmFbMl07dGhpcy5DdD10aGlzLmFbOV07dGhpcy5vbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs4XX1jLklrPWI7Yi5wcm90b3R5cGU9e1lqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWmo6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkN0OnRoaXMubm8oYSl9LG5vOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMuSWt8fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5Zaig0KTsoZnVuY3Rpb24oYyl7Yy5JbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLlVlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlcoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LER0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQmIsaD10aGlzLmxhKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTsKZCYmYSYmYS5hYyYmKDA8PWguaW5kZXhPZihkKXx8YS53ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxBYTpmdW5jdGlvbigpe3RoaXMuVWUrKztpZigxMDx0aGlzLlVlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLAoiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LEpkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgQ2E9Yy5JbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuSGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXtpZighdGhpcy50ZSlpZih0aGlzLkRifHwKKHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksCjEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKX19LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQ2EoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLmdxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELApmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5tKCl9LmJpbmQodGhpcykpLHRoaXMuZ3E9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5EdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5IbHx8RGE7KGZ1bmN0aW9uKGMpe2MuSmw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYKMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm5hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9CmMuSmx8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ldD10aGlzLmFbNF07dGhpcy5Ldz10aGlzLmFbN107dGhpcy5MdT10aGlzLmFbN107dGhpcy53cj10aGlzLmFbNF07dGhpcy5UbT10aGlzLmFbMTBdO3RoaXMuc249dGhpcy5hWzddO3RoaXMudXI9dGhpcy5hWzFdO3RoaXMuWGo9dGhpcy5hWzEwXTt0aGlzLnF3PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzFdfWMuQWk9YjtiLnByb3RvdHlwZT17ZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmV0OnRoaXMuSncoYSl9LEp3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS3c6dGhpcy5LdShhKX0sS3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkx1OnRoaXMudnIoYSl9LHZyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy53cjp0aGlzLlNtKGEpfSxTbTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLlRtOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbjp0aGlzLnRyKGEpfSx0cjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudXI6dGhpcy5XaihhKX0sV2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Yajp0aGlzLnB3KGEpfSxwdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnF3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgR2E9Yy5BaXx8R2EsQ2M9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Q2MuZHQoNCk7KGZ1bmN0aW9uKGMpe2Mudms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuRmcoYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJgooYT1hLnBhcmVudE5vZGUpfXRoaXMuRnQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLkZ0KXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlcoaCk7dGhpcy5aKGgpOwp0aGlzLmpkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5qZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuamQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxmcDpmdW5jdGlvbigpe2UuYWgodGhpcy5qZCk7ZS5FZSh0aGlzLmpkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sSWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBIYT1jLnZrfHxIYTsoZnVuY3Rpb24oYyl7Yy51az12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy51a3x8SWE7KGZ1bmN0aW9uKGMpe2Mud2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj0KbC5pbnJlYWQsYT1lLkZnKGIsImVsZW1lbnRJRCIpO2lmKGUuYWgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEphPWMud2t8fEphLEthPW5ldyBKYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5iaj10aGlzLmFbOV07dGhpcy5BbD10aGlzLmFbMTBdO3RoaXMuV2w9dGhpcy5hWzZdO3RoaXMuY3Q9dGhpcy5hWzFdO3RoaXMuSWk9dGhpcy5hWzRdO3RoaXMuTXA9dGhpcy5hWzldO3RoaXMuJGk9dGhpcy5hWzFdO3RoaXMuc3M9dGhpcy5hWzddO3RoaXMuUHE9dGhpcy5hWzNdOwp0aGlzLllyPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuU249YjtiLnByb3RvdHlwZT17YWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmJqOnRoaXMuemwoYSl9LHpsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5BbDp0aGlzLlZsKGEpfSxWbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuV2w6dGhpcy5idChhKX0sYnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jdDp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSWk6dGhpcy5McChhKX0sTHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1wOnRoaXMuWmkoYSl9LFppOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kaTp0aGlzLnJzKGEpfSxyczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3M6dGhpcy5PcShhKX0sT3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlBxOnRoaXMuWHIoYSl9LFhyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ZcjoKdGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTGE9Yy5Tbnx8TGEsRGM9bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGMuYWooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmhrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LHR1OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sS246ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5oa3x8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApoLGQsZil7dGhpcy5mYj1hO3RoaXMuQWc9dGhpcy5uaT0hMTt0aGlzLnJoPWQ7dGhpcy5SaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5mYj1uZXcgeihhKSk7dmFyIGM9dGhpcy5zYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5IZSh0aGlzLmZiLnVybCkmJm0uTWQpe3ZhciBlPW5ldyB6KGEudXJsKTtlLnR1KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmCihiPSEwKTtifHxtLmlhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5pYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuaWs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZmIuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuQWcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLlJoP3RoaXMuc2Iub3Blbih0aGlzLmZiLm1ldGhvZCx0aGlzLmZiLnVybCwhMSk6dGhpcy5zYi5vcGVuKHRoaXMuZmIubWV0aG9kLHRoaXMuZmIudXJsLCEwKSx0aGlzLm5pfHwodGhpcy5zYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuc2Iuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLnNiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLnNiLnNlbmQoYSl9Y2F0Y2goZil7bSYmbS5IZSh0aGlzLmZiLnVybCk/bS5NZD9tLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkhlKHRoaXMuZmIudXJsKSx0aGlzLnJoJiZ0aGlzLnJoKCl9cmV0dXJuIHRoaXMuc2J9fX0pKGMpO3ZhciBNYT1jLmlrfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGE9dGhpcy5WZD0hMX1jLmhqPWI7Yi5wcm90b3R5cGU9e3h1OmZ1bmN0aW9uKGEpe3RoaXMuVmQ9YX0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5IYT1hfSxadDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLCJyZWdpc3RlcmluZ3MgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYixhKX0pfXZhciBiPXtQdzoiQWRDbGlja1RocnUiLFJ3OiJBZEVycm9yIixTdzoiQWRTdG9wcGVkIixWdzoiQWRMaW5lYXJDaGFuZ2UiLFd3OiJBZFRhZ1BhcnNlZCIsWnc6IkFkVmlkZW9Db21wbGV0ZSIsYng6IkFkTG9hZGVkIixjeDoiQWRTa2lwcGVkIixkeDoiQWRTdGFydGVkIixUdzoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLFV3OiJBZEltcHJlc3Npb24iLFF3OiJBZENyZWF0aXZlVmlldyIsWHc6IkFkVmlkZW9NaWRwb2ludCIsWXc6IkFkUGF1c2VkIiwkdzoiQWRWaWRlb1N0YXJ0IixheDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGI9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLlZkLGJbZF0pfSxZdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSwKYil7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGIsYSl9KX1pZih0aGlzLkhhJiZ0aGlzLkhhLlVkKWZvcih2YXIgYiBpbiB0aGlzLkhhLlVkKXRoaXMuSGEuVWQuaGFzT3duUHJvcGVydHkoYikmJmEodGhpcy5IYSx0aGlzLkhhLlVkW2JdKTt0aGlzLkhhJiZ0aGlzLkhhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhLmdldEVycm9yKCk7YSYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixhKX0uYmluZCh0aGlzKSwxMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLlZkJiZ0aGlzLlp0KCk7dGhpcy5IYSYmdGhpcy5ZdCgpfX19KShjKTt2YXIgTmE9Yy5oanx8TmE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlVhPSExO3RoaXMud2M9IiI7dGhpcy5pZT0KdGhpcy52Yz10aGlzLndiPW51bGw7dGhpcy54cD10aGlzLkpiPXRoaXMuaWg9ITE7dGhpcy5MYT0iIjt0aGlzLmRoPSExO3RoaXMud2E9dGhpcy5vZD0iIjt0aGlzLlpnPXRoaXMuVj10aGlzLmlzRW5hYmxlZD10aGlzLiRlPSExO3RoaXMucGE9W107dGhpcy5PZz10aGlzLmZjPSIiO3RoaXMucWU9ITE7dGhpcy5xZj0wO3RoaXMuR2Y9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5FZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuUWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMubmM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLmhjPSIiO3RoaXMuaWM9W107dGhpcy5qYz1bXTt0aGlzLklkPVtdO3RoaXMuZ2M9IiI7dGhpcy5yZj0wO3RoaXMudmlkZW9wbGF6YT0Ke307dGhpcy5EYz0hMTt0aGlzLmhwPXRoaXMuT2Q9bnVsbDt0aGlzLkxoPXRoaXMubGM9dGhpcy5zZz10aGlzLnVmPXRoaXMuTWQ9dGhpcy5rZT10aGlzLlJjPSExO3RoaXMuaGI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMucGQ9MDt0aGlzLlFnPSExO3RoaXMuUGc9MUUzO3RoaXMuWmM9ITE7dGhpcy5RYT0xRTM7dGhpcy5PZj0iIn1jLmprPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMud2MsYWR0YWdtb2RpZmllcjp0aGlzLndiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy52YyxhZHRhZ3JlZ2V4OnRoaXMuaWUsYml0cmF0ZTp0aGlzLlFhLGpzcG9wdXBzOnRoaXMuaWgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMueHAsaG9tYWRBbGlhczp0aGlzLkxhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5kaCxnbG9iYWxDb25maWc6dGhpcy5vZCxjbGllbnRDb25maWc6dGhpcy53YSwKaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5WLGlzQmxvY2tlZDp0aGlzLlpnLHNlcnZlcjp0aGlzLnBhLHN2bUNvbmZpZzp0aGlzLmZjLGhvbWFkQWRwYXRoOnRoaXMuT2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5xZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5xZixIT01BRF9WRVJJRklFRDp0aGlzLkdmLEhPTUFEX0JMT0NLRUQ6dGhpcy5FZixIT01BRF9OT0JMT0NLRVI6dGhpcy5RYixIT01BRF9BREJMT0NLRVI6dGhpcy5uYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRmYsdGVzdEhpZGU6dGhpcy5oYyx0ZXN0VGFnczp0aGlzLmljLHRlc3RUYWdzSlM6dGhpcy5qYyx0ZXN0VGFnc1hIUjp0aGlzLklkLHRlc3RDb29raWU6dGhpcy5nYyx0aHJvdHRsZTp0aGlzLnJmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuRGMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5ocCxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlJjLApibG9ja2VkV2FzQ2FsbGVkOnRoaXMua2UsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTWQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudWYsY29uZmlnRmFpbHVyZXM6dGhpcy5oYixzaXRlQ29uZmlnOnRoaXMuRmEsc2VydmVySWQ6dGhpcy5JaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuamIsdnBhaWQ6dGhpcy5sYyxza2lwQWxsb3dlZDp0aGlzLkxoLHZtYXBzOnRoaXMua2ksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLlpjLGFkRmFsbGJhY2tVUkw6dGhpcy5PZn19LFVxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmhiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuaGJbYl0mJjE9PXRoaXMuaGJbYl0mJihhPSEwKTtyZXR1cm4gYX0sZWY6ZnVuY3Rpb24oYSl7dGhpcy5oYlthXT0hMH0senE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltiXSYmMT09dGhpcy5oYltiXSYmYS5wdXNoKGIpOwpyZXR1cm4gYX0sSGQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5MbyhhKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixnPSIiO2lmKCF0aGlzLlVhJiYhYilyZXR1cm4gbmV3IHooYSk7Zj10aGlzLkdlKGEpO2M9dGhpcy56YShhKTtmPyh0aGlzLkZjKCk/ZT1hOmU9Yy5wcm90b2NvbCsKIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5KYygpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLndjfHx0aGlzLndifHx0aGlzLnZjfHx0aGlzLmllKSYmKGc9dGhpcy55cyhnKSk7YT1uZXcgeihlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkFxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGcpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sR2U6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/CmI9ITA6dGhpcy5GYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sRmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMucGEmJnRoaXMucGEubGVuZ3RoJiYwPHRoaXMucGEubGVuZ3RoJiYoYj10aGlzLnBhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEhlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuR2UoYSk7cmV0dXJuIGJ9LEFxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT0KdHlwZW9mIHRoaXMuTGEmJjA8dGhpcy5MYS5sZW5ndGgpcmV0dXJuIHRoaXMuTGE7Zm9yKGQgaW4gdGhpcy5MYSlpZihiPXRoaXMuTGFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5reDtyZXR1cm4ibm9uZSJ9LHFkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFbdGhpcy5JaF19LEpjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5xZCgpLGI9dGhpcy5LaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxvaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx4czpmdW5jdGlvbihhLApiKXt2YXIgZD1lLnphKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxDPTA7QzxnLmxlbmd0aDtDKyspe3ZhciBrPWdbQ10uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5vaChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMub2goZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx5czpmdW5jdGlvbihhKXt0aGlzLndjJiYoYSs9dGhpcy53Yyk7aWYodGhpcy53Yilmb3IodmFyIGIgaW4gdGhpcy53Yil0aGlzLndiLmhhc093blByb3BlcnR5KGIpJiYKKGE9YS5yZXBsYWNlKGIsdGhpcy53YltiXSkpO3RoaXMudmMmJihhPXRoaXMueHMoYSx0aGlzLnZjKSk7cmV0dXJuIGF9LGVwOmZ1bmN0aW9uKCl7dGhpcy5GYSYmdGhpcy5GYS5jbGllbnRBUElzJiZ0aGlzLiRvKHRoaXMuRmEuY2xpZW50QVBJcyl9LCRvOmZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiPW5ldyBOYTthLnB1Ymxpc2hlckFQSSYmYi54dShhLnB1Ymxpc2hlckFQSSk7YS5wbGF5ZXImJmIud3UoYS5wbGF5ZXIpO2IuZygpfX0sbDpmdW5jdGlvbihhLGIsZCxmLGMsZSl7bT10aGlzO3RoaXMuZGg9ITA7dGhpcy5vZD1hO3RoaXMud2E9Yjt0aGlzLiRlPWQ7dGhpcy5PZD1mO3RoaXMuQWM9Yzt0aGlzLkZhPWV8fHt9O3RoaXMuZXAoKTt0aGlzLmtzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLndhKXRoaXMuaHMoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9YigpLHRoaXMueGMoKX1jYXRjaChnKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iLHRoaXMueGMoKX1jYXRjaChrKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfX0scGI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGtzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLm9kK3RoaXMuZmUoImdsb2JhbCIpKSx0aGlzLlFxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMueGMoKX0uYmluZCh0aGlzKSwhMCl9LGhzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLndhK3RoaXMuZmUoImNsaWVudCIsLTEhPXRoaXMud2EuaW5kZXhPZigiPyIpKSksdGhpcy54Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5lZigiY2xpZW50Iik7dGhpcy5pYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLAohMCl9LGZlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5IYigpKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5GYSYmdGhpcy5GYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGlhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmtlKXt0aGlzLmtlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChoKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwphPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkFjPSExKTt0aGlzLkFjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQWM/dGhpcy5BYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5WPXRoaXMuWmc9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkVmKSk7dGhpcy5OYigpO2UuQmMoay51dCk7KGI9ZS5aYih0aGlzLnFkKCkpKXx8KGI9ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sUXE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLndhfHx0aGlzLmZjfHx0aGlzLkxhfHx0aGlzLnhjKCk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLlFiKSksdGhpcy5OYigpKX19LHhjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLndhfWVsc2UgYT10aGlzLndhO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYS5lbmFibGVkKTt0aGlzLlY9IXRoaXMuaXNFbmFibGVkO3RoaXMucGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5mYSgid2ViLmRlIil8fGUuZmEoImdteC5uZXQiKXx8ZS5mYSgiZ214LmF0Iil8fGUuZmEoImdteC5jaCIpfHxlLmZhKCIxdW5kMS5kZSIpKSYmIXRoaXMuRmMoKSlmb3IoYj0wO2I8dGhpcy5wYS5sZW5ndGg7YisrKXRoaXMucGFbYl09dGhpcy5wYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmZjPWEuY29uZmlnfHwiIjt0aGlzLkxhPWEuYWxpYXN8fApudWxsO3RoaXMuT2c9YS5hZHBhdGh8fCIiO3RoaXMucWU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5JaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5wYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmZjJiZ0aGlzLkxhJiZ0aGlzLnBhLmxlbmd0aD90aGlzLkdjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxHYzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkpjKCkpLGQ9dGhpcy56YSh0aGlzLmZjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0KIlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmZjK3RoaXMuZmUoImN1c3RvbWVyIikpO3RoaXMuRGEoYix0aGlzLlZ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJjdXN0b21lciIpO2E/dGhpcy5obT90aGlzLmlhKCJub1NWTUNvbmZpZyIpOih0aGlzLmhtPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5HYyghMCl9LmJpbmQodGhpcyksITApfX0sVnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5EYz0hMDt0aGlzLkdjKCEwKTtyZXR1cm59fXRoaXMuTWQ9dGhpcy5NYihiLnN0cmljdCk7dGhpcy51Zj10aGlzLk1iKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnNnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj0KdGhpcy5NYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYi5lbmFibGVkKTt0aGlzLmhjPWIudGVzdGhpZGV8fCIiO3RoaXMuamM9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5JZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMud2M9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy53Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy52Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuaWU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuaWg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5KYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5sYz1iLnZwYWlkfHwhMTt0aGlzLkZhLnZwYWlkPXRoaXMubGM7dGhpcy5MaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLiRjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5raT1iLnZtYXBzfHwiIjt0aGlzLlpjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fAoxRTM7dGhpcy5PZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5nYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLkhxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5xZSYmKHRoaXMuZ2M9bnVsbCk7dGhpcy5yZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5EYz0hMCx0aGlzLkdjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLm52KCkmJih0aGlzLmhjfHx0aGlzLmpjfHx0aGlzLmljfHx0aGlzLmdjfHx0aGlzLklkKT90aGlzLiRlPyh0aGlzLlVhPXRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5RYikpLHRoaXMubWUoKSx0aGlzLk5iKCkpOnRoaXMuWnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy4kdSgpKX19LFp1OmZ1bmN0aW9uKCl7dGhpcy5ZdSgpOwp0aGlzLmF2KCl9LGF2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksQz1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLAoiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEMpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnhiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPQpkKXt2YXIgYz1lLmhkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkZhJiZ0aGlzLkZhLnBsYXllciYmdGhpcy5GYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sJHU6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LE9jOmZ1bmN0aW9uKGEpe3RoaXMuUmM9ITA7dGhpcy5WfHwodGhpcy5WPXRoaXMuVWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLk5iKCksdGhpcy5tZSgpKX0sWXU6ZnVuY3Rpb24oKXtpZih0aGlzLmhjKXt2YXIgYT1lLmhkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5oaCgpKXRoaXMuT2ModGhpcy5uYywKIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmhjKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaGMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuVmgoKX19ZWxzZSB0aGlzLlZoKCl9LFVoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLmR2KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5uZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmljPXRoaXMuSWQpJiZ0aGlzLmljLmxlbmd0aCl7dmFyIGQ9dGhpcy5pYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLm5mKCl9LGR2OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkRhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxWaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtjPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsCnRoaXMuSGIoKSk7dGhpcy5ldihjLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVWguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLk9jKHRoaXMubmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrYysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuamMmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksYzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuVWgoKX0sZXY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGMoKXtnKCkmJmIoKX1mdW5jdGlvbiBlKCl7ZygpJiZkKCl9ZnVuY3Rpb24gZygpe3JldHVybiBDPyh3aW5kb3cuY2xlYXJUaW1lb3V0KEMpLCEwKTohMX12YXIgQz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2MoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZnKCkmJmUoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTsKay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWM7ay5vbmVycm9yPWU7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlKX1jYXRjaChsKXtjKCl9fSxuZjpmdW5jdGlvbigpe3RoaXMuZ2M/KHRoaXMucWYrKyx0aGlzLkRhKG5ldyB6KHRoaXMuZ2MpLHRoaXMuWHUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMub2YoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5TaCgpfSxvZjpmdW5jdGlvbihhKXt0aGlzLk9jKHRoaXMuRmYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxYdTpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5xZj90aGlzLm5mKCk6dGhpcy5vZigiQkJCIik6CiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlNoKCk6dGhpcy5vZigiQUFBIil9LFNoOmZ1bmN0aW9uKCl7dGhpcy5WPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMubWUoKX0saGg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlJjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS5mYSgidC1vbmxpbmUuZGUiKXx8ZS5mYSgiZ2lnYS5kZSIpfHxlLmZhKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLmhoKCksITApOwpkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5HZikpO3RoaXMuT2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5PZCYmdGhpcy5PZCgpfSxjcDpmdW5jdGlvbigpe2lmKHRoaXMudWYmJnRoaXMuVXEoKSl7dmFyIGE9dGhpcy56cSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sWmg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxEYTpmdW5jdGlvbihhLGIsZCxjLHEsZyl7dGhpcy5wZHx8KHRoaXMucGQ9MCk7dGhpcy5wZCsrO3RoaXMucGQ+dGhpcy5QZyYmIXRoaXMuUWcmJih0aGlzLlFnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5QZywhMCkpO2E9bmV3IE1hKGEsCmIsZCk7YyYmKGEubmk9ITApO3EmJmUuSHIoKSYmKGEuQWc9ITApO2cmJihhLlJoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGFwOmZ1bmN0aW9uKCl7ZS5WYSgpfHxlLmFiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxjPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/CmEuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5GYygpfHwoYT10aGlzLnphKGMpLGM9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Zy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtnLm5ldHdvcmtTdGF0ZT09Zy5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5pYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2cuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2cuc2V0QXR0cmlidXRlKCJzcmMiLGMpfWVsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sV3U6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PQp0aGlzLmtpfSxicDpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuRGEoYSx0aGlzLk92LmJpbmQodGhpcyksdGhpcy5Odi5iaW5kKHRoaXMpKX0sT3Y6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1kfHx0aGlzLmVxKCl9LE52OmZ1bmN0aW9uKCl7fSwKZXE6ZnVuY3Rpb24oKXtlLkJjKGsuY3EpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaWEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LG1lOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuSmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5KYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkpiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgSjt3aW5kb3dbZC5rYSgpXT10aGlzO2UuYWIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sbnY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5yZn0sSHE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgphLmxlbmd0aCldfSxIYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsYyxlLGcsayxsLG09MDttPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSxnPWQ+PjIsZD0oZCYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGMpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LHphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGM9MTQ7Yy0tOylkW2JbY11dPWFbY118fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LEtoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZCxoO2ZvcihkPTc7MDw9ZDtkLS0paD1hPj4+NCpkJjE1LGMrPWgudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGc9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdSx2LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8bi0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZSk7CnN3aXRjaChuJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChuPj4+MjkpO3gucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKylnW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspZ1tjXT1kKGdbYy0zXV5nW2MtOF1eZ1tjLTE0XV5nW2MtMTZdLDEpO2U9aztuPWw7cD1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1kKGUsNSkrKG4mcHx+biZ1KSt2K2dbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWQoZSw1KSsobl5wXnUpK3YrZ1tjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz00MDs1OT49YztjKyspdz1kKGUsNSkrKG4mcHxuJnV8cCZ1KSt2K2dbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihyKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5qa3x8T2EsbT1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxuPXRoaXMuYVs5XTt0aGlzLnh3PXRoaXMuYVsxXTt0aGlzLmxtPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzNdfWMuWm49YjtiLnByb3RvdHlwZT17a246ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxuOnRoaXMud3coYSl9LHd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHc6dGhpcy5rbShhKX0sa206ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgUGE9Yy5abnx8UGEsRWM9bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RWMua24oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5mLlA/dGhpcy5iYj1hLmYuUCgpOgp0aGlzLmJiPSIiO2EuZi5YZyYmYS5mLlhnKHtwYXVzZTp0aGlzLndkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuR2guYmluZCh0aGlzKSxtdXRlOnRoaXMuUGUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy54di5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmliO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuVmI9dGhpcy5ZYz0hMTt0aGlzLkdvPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuRmQ9e307ZS5vYigibmV3QmlnQWRJZCIpO3RoaXMuT289ZS5hYSgxMCk7dGhpcy5sZj0wO3RoaXMuV2M9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5XYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmIuZikmJnRoaXMuYi5mLnMmJihhPXRoaXMuYi5mLnMoKSksdGhpcy5XYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYKKHRoaXMuUm49Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5zaD10aGlzLkVkPSExO3RoaXMubGg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmVlPSExO3RoaXMuYmk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuR2I9ZS5hYSgxMCk7dGhpcy5FYj1lLmFhKDEwKTt0aGlzLk1oPWUuYWEoMTApO3RoaXMuY29uZj17fTt0aGlzLlBkPXRoaXMuT2I9dGhpcy5vZT10aGlzLmVkPXRoaXMuR2Q9dGhpcy5yYj10aGlzLm1jPXRoaXMudWg9dGhpcy5rZD10aGlzLnB2PXRoaXMudWI9dGhpcy5GYj0hMTt0aGlzLnJjPVtdO3RoaXMuY2M9e307dGhpcy5zdD0yMDA7dGhpcy5CZj10aGlzLkNmPXRoaXMuamU9dGhpcy5BZj10aGlzLlplPSExO3RoaXMudmQ9e319Yy5kaz1iO2IucHJvdG90eXBlPXtvdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9CmF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sJGg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk91KCk7ZS52KGsuSG4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sS2U6ZnVuY3Rpb24oYSxiLGMsZil7dGhpcy51Yj1jO3ZhciBnPSExO2YmJmYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihnPSEwKTtpZih0aGlzLkwuVil0aGlzLmxmKyssZS5vYigibmV3U21hbGxBZElkIiksdGhpcy5MLmNwKCksZj1tLmdldENvbmZpZygpLHRoaXMuTC5VYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy4kaCgpLG5ldyBTKHRoaXMsYSx0aGlzLmxoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLApiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubGMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy4kaCgpLG5ldyBTKHRoaXMsYSx0aGlzLmxoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5MLmxjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Zi5RYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUmEoKTtlbHNle3ZhciB0Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0Yy5LZShhLGIsYyl9LDUwKX19LFZlOmZ1bmN0aW9uKGEpe2EuJGEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO3RoaXMuUGQ9dGhpcy5PYj10aGlzLmtkPSExO3RoaXMuYz1hO3RoaXMuQ3UodGhpcy5jKTt0aGlzLnZkPW5ldyBRYSh0aGlzLmMuUXYsdGhpcy52aWRlbyx7fSk7dGhpcy5MZyhhKTt0aGlzLnJjPXRoaXMuQ2coYSk7dGhpcy5rcCgpfSxMZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5GZD10aGlzLktxKGEpKSx0aGlzLkxnKGEucGFyZW50KSl9LENnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5DZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLnVxKGEpKSk7cmV0dXJuIGN9LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5VJiZhLlUuZ2V0QXR0cmlidXRlKXtiPWEuVS5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sS3E6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0iIjtpZihhLlUpe2I9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Zj1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLmtiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuJGEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYj0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGI9YS5lcnJvci5kZXRhaWwuY29kZSksYS5nZCYmYS5nZC5lcnJvciYmYS5nZC5lcnJvci5jb2RlJiYoYj1hLmdkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuUGMuY29kZTpiPT1HLldkLmNvZGU/ZS52KGsua3csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTooZS5MZSgpLGI9PUcuSmYuY29kZSYmZS52KGsuRHMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk7ZS52KGsuYnEsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSk7dGhpcy5QdSgpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS52KGsuUHYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5LZi5jb2RlOmUudihrLm93LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LlhkLmNvZGU6ZS52KGsudHcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy5UZC5jb2RlOmUudihrLkVzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5TZC5jb2RlOmUudihrLkx2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVtbXlhZCIpO2JyZWFrOwpjYXNlIHcuRGYuY29kZTplLnYoay5Ndix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5QYS5sZW5ndGg7KXRyeXt2YXIgYz1hLlBhLnBvcCgpO3RoaXMuSmUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LEN1OmZ1bmN0aW9uKGEpe3RoaXMub2U9ITE7dGhpcy5QYj10aGlzLmIuSzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5QYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTtpZihjJiZjLmVudnZhcnMpdHJ5e2I9Yy5lbnZ2YXJzKCkudmlkZW9TbG90LAp0aGlzLlplPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuS3g9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiZiLnNldEF0dHJpYnV0ZShnLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2ddKTt0aGlzLlJuJiZ0aGlzLnBsYXllci51ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIudWUoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuTy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5PW2NdLnR5cGUpJiYKdGhpcy5MbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuWmUmJmIubG9hZCgpO2lmKHRoaXMuV2goYikpe3RoaXMuTmgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuUG4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLlplP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2goayl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5ucCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSx0aGlzLkF1KCkpOnRoaXMuYy5vcmlnaW4udGcody5UZCl9LEF1OmZ1bmN0aW9uKCl7dGhpcy5BZj0hMDt0aGlzLnJiPXRoaXMubWM9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5sZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMucmI9ITApO2UubmUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4udmEmJmUuUW4odGhpcy5jLm9yaWdpbi52YSk7dGhpcy5OaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9RS5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi52aCgpO3RoaXMuYi5qZigpO2ZvcihhPXRoaXMuYi5LO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpOwphLnBhcmVudHx8dGhpcy5iLmpmKCk7dGhpcy50YT10aGlzLlBiPXRoaXMuYi5LO3RoaXMuZ2koInZwYWlkIik7aWYodGhpcy5yYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLktiKCJtdXRlZCIsImNvbnRlbnQiKTtlLnYoay50ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfXRoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLAoiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYy5OcSgpLGM9dGhpcy5jLkIuT3JpZ2luYWxBZFBhcmFtZXRlcnMsZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5jZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuTCk7dGhpcy5ILnNyYz1hO2UuZ2UoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYi5mLkFhJiYhdGhpcy5HZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsueWMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmIuJGIoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMucmM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdihhKTsKaWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5adigpLHRoaXMuYi4kYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuUGQ9ITA7ZS52KGsuamksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuRmUodGhpcy5PYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLiRiKCEwKSx0aGlzLmN3KCkpOyJBZFZpZGVvU3RhcnQiPT0KYS5kYXRhLm5hbWUmJih0aGlzLmIuJGIoITApLHRoaXMuZ3coKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZXcoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuZncoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5odygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5kdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5saSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5VYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5rZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXt0aGlzLkwuWmMmJihhPSJfYmxhbmsiKTt2YXIgYj13aW5kb3cub3BlbigiIiwKYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJ3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLnYoay5iZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiR2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5DZiYmKHRoaXMuQmY9ITEsdGhpcy5lYygpKSx0aGlzLmF3KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMucmI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLAohMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMucmI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGUudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfX0uYmluZCh0aGlzKSk7ZS5nZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTtlLmdlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7dGhpcy5iLiRmKGZ1bmN0aW9uKGEpe2UubWEodGhpcy5ILCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sJHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTsKdGhpcy50cmFjaygicGF1c2UiKTtlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5tYz0hMH0sYXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubWM9ITF9LGN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuV2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sWnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7CnRoaXMuT2goKTtlLnYoay5TZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxndzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxldzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLmtkPSEwO3RoaXMuWWEoImZpcnN0UXVhcnRpbGUiKTtlLnYoay5QZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxmdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5ZYSgibWlkcG9pbnQiKTtlLnYoay5VZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxodzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIik7ZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSl9LGR3OmZ1bmN0aW9uKCl7dGhpcy53ZigpO3RoaXMuWWEoImNvbXBsZXRlIil9LGxpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2UubmUoKTt0aGlzLkg9ITE7dGhpcy5SYShhKX19LFl2OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2c7IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGIubWF0Y2goYykpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLnYoay5pdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubGkoITApfSwKTG46ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7aWYoYi5VYSYmYi5pc0VuYWJsZWQmJiFiLkZjKCkpe3ZhciBkPWIuemEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWMoYix0aGlzLkwpO2Yub25lcnJvcj10aGlzLlZ2LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGMoYix0aGlzLkwpKX0sV2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFBuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmhpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKdGhpcy5paS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLndmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMueGYuYmluZCh0aGlzKSl9LEFkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmhpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmlpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy54Zi5iaW5kKHRoaXMpKX0saGk6ZnVuY3Rpb24oYSl7dGhpcy5WYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZifHx0aGlzLnlmKGEpfS5iaW5kKHRoaXMpLAp0aGlzLkdvKSl9LHlmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlljJiZ0aGlzLldoKHRoaXMudmlkZW8pJiYhdGhpcy5GYiYmIXRoaXMuVmIpe3RoaXMuWWM9ITA7dHJ5e2lmKCFlLlZhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkZifHwodGhpcy5GYj0hMCx0aGlzLkFkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5aYSgpLCEwKSx0aGlzLkwuc2d8fHRoaXMuTC5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLlJhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5aYSgpLCEwKX10aGlzLlN2KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIuamYoKTt0aGlzLlJ2KCk7dGhpcy5naSgpO3RoaXMuZGcoKTt0aGlzLmIudmgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMubWYoKX19LG1mOmZ1bmN0aW9uKCl7dGhpcy5lZHx8CnRoaXMuUWYoKX0sUWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy52aWRlby5wbGF5KCk7aWYoYiYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5lZHx8KGE/dGhpcy5SYSgpOih0aGlzLlBlKCEwKSx0aGlzLlFmKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmRjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmRjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5lZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubWYoKSl9LmJpbmQodGhpcyk7dGhpcy53ZSgpLkpoKHRoaXMpfSx3ZjpmdW5jdGlvbigpe3RoaXMuTC5qYiYmIXRoaXMuRmImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwKITApLHRoaXMuWWEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS52KGsuRm4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlJhKCl9LEluOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPSExLGY9MDtmPGEubGVuZ3RoO2YrKyljPWUuR2coYVtmXSksYi5wdXNoKGMpO2E9e2hhc2hlczpifTthPWsuVGEoYSx0aGlzLkEoKSk7ZS5NdShhKX0sUmE6ZnVuY3Rpb24oYSl7dGhpcy5jJiZ0aGlzLmMuUWQmJnRoaXMuSW4odGhpcy5jLlFkKTtpZighdGhpcy5vZSlpZih0aGlzLm9lPSEwLHRoaXMuUGR8fChlLnYoay5Icyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy50Ynx8dGhpcy5jLnBjKXtlLm9iKCJuZXdTbWFsbEFkSWQiKTt0aGlzLmxmKys7dGhpcy5WYj10aGlzLlljPSExO3RyeXt0aGlzLkFkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuRWQ9ITE7dHJ5e3RoaXMuYi5kaSgpfWNhdGNoKGcpe310aGlzLkdkPSEwO3RoaXMuYi5BZSgpO3RoaXMuYWM9ITE7dGhpcy53ZSgpLkVoKCk7dGhpcy5jLnRiJiZ0aGlzLmMub3JpZ2luLlFlKCk7dGhpcy5jLnBjJiYoYT90aGlzLmMub3JpZ2luLnBoKCk6dGhpcy5wZSgpKX1lbHNlIHRoaXMucGUoKX0sVnY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5BZCh0aGlzLnZpZGVvKSx0aGlzLnhmKGEpKX0seGY6ZnVuY3Rpb24oYSl7dGhpcy5WYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkwuYXAoKTsKdGhpcy5jLm9yaWdpbi50Zyh3LlRkKX0saWk6ZnVuY3Rpb24oKXtpZih0aGlzLnB2KXRoaXMuUmEoKTtlbHNle3RoaXMuYWM9ITA7dGhpcy5iLmYuQWEmJiF0aGlzLkdkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay55Yyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5zdihhKTtpZighdGhpcy5PYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5QZD0hMDtlLnYoay5qaSx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuRmUodGhpcy5PYil9Yz0iIjt0aGlzLmMua2YmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWgpKSYmKGM9dGhpcy5jLmtmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkVkfHwodGhpcy5FZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5XZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuYy50Yj8odGhpcy5WYj10aGlzLlljPSExLHRoaXMuQWQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuRWQ9ITEsdGhpcy5iLmRpKCksdGhpcy5jLm9yaWdpbi5RZSgpKTp0aGlzLlJhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLldjLnJlcGxhY2UoIlt0aW1lXSIsZS5CZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmVlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxhaTpmdW5jdGlvbigpe3RoaXMudWh8fCh0aGlzLnVoPSEwLHRoaXMua2R8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxzdjpmdW5jdGlvbihhKXtlLnYoay5iZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2E9PXRoaXMuYml8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmFpKCl9LmJpbmQodGhpcykpLHRoaXMuRmJ8fHRoaXMuT2goKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuTC5qYiYmdGhpcy5ZYSgic3RhcnQiKSxlLnYoay5TZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLGUudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMua2Q9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLnYoay5QZix0aGlzLmMuQiwKdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5ZYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5VZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksdGhpcy5iaT1hKX0sTmg6ZnVuY3Rpb24oYSxiKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iK2EsYiwhMCl9LE91OmZ1bmN0aW9uKCl7ZS5LZChbInN0YXRzX2hkX2FkX2NhbGw6IisKdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sT2g6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFB1OmZ1bmN0aW9uKCl7ZS5LZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFhhOmZ1bmN0aW9uKGEpe2UuS2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWWE6ZnVuY3Rpb24oYSl7KHRoaXMuQWZ8fHRoaXMuTC5qYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLlphKCksITApfSxLYjpmdW5jdGlvbihhLGIpe3RoaXMuTC5qYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkZiKXt0aGlzLnZkJiZ0aGlzLnZkLnRyYWNrJiZ0aGlzLnZkLnRyYWNrKGEpO2lmKCJtdXRlIj09CmF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5McSh0aGlzLmMuUGEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmplPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuRmQuaW1wcmVzc2lvbnMmJmUuRnIoZy51cmwsdGhpcy5GZC5pbXByZXNzaW9ucyk/dGhpcy5KZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuR24sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHthZElkOnRoaXMuRmQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkplKGcudXJsLGcudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmMuUGE9CnRoaXMudnAodGhpcy5jLlBhLGEpfWNhdGNoKG0pe319fSxaYTpmdW5jdGlvbigpe3ZhciBhPWUuVmEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLkFmJiYoYj0iX3ZwYWlkIik7dGhpcy5DZiYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxKZTpmdW5jdGlvbihhLGIsYyxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxjJiZiLktuKGMpLGZ8fChmPXRoaXMucmcpLGV8fChlPXRoaXMucmcpLHRoaXMuTW4oYSksdGhpcy5MLkRhKGIsZnVuY3Rpb24oKXt0aGlzLkRoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LE1uOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09Im9wZW4ifSxEaDpmdW5jdGlvbihhKXt0aGlzLmNjW2FdPSJjbG9zZWQifSxrcDpmdW5jdGlvbigpe3RoaXMuY2M9e319LFJ1OmZ1bmN0aW9uKCl7dmFyIGE9MCxiO2ZvcihiIGluIHRoaXMuY2MpdGhpcy5jYy5oYXNPd25Qcm9wZXJ0eShiKSYmCiJvcGVuIj09dGhpcy5jY1tiXSYmYSsrO3JldHVybiBhfSxMcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHZwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFN2OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Udi5iaW5kKHRoaXMpKX0sVHY6ZnVuY3Rpb24oKXtlLlZhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmVjKCk6dGhpcy5jLlViJiYoZS52KGsua2csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLlpjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPQp3aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5VYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuVWIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxSdjpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0KIiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5XYy5yZXBsYWNlKCJbdGltZV0iLGUuQmcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC4kYyYmKGI9dGhpcy5MLiRjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC4kYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sQ2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC4kYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYKKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxnaTpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMucnA7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuR2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWGguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkViO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ydi5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnF2LmJpbmQodGhpcykpOwpnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLk1oO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9CjEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLmtmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlZhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0KImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5CYT10aGlzLnRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi4kZihmdW5jdGlvbihhKXt0aGlzLkJhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5QZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGVjOmZ1bmN0aW9uKCl7dGhpcy5CYSYmImJsb2NrIj09dGhpcy5CYS5zdHlsZS5kaXNwbGF5fHx0aGlzLkJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxYaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuJGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxZaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMubWM/KGUubWEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLm1jPSExKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLm1jPSEwKX0sd2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuJGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEdoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKSl9LHF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxydjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMucmI/KGUubWEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGUudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSx4djpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsudGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGRjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmRjKTt0aGlzLmVkfHx0aGlzLmVlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5tZigpKX0scGU6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUuaGQoKTshdGhpcy5MLmxjfHxlLlZhKCl8fCFjLmlzQ2hyb21lJiYhYy5pc0ZpcmVmb3h8fGMuaXNFZGdlfHwKIShhfHwhdGhpcy5qZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy5zaHx8IXRoaXMuTC5SYyYmInNwaWVnZWwuZGUiIT1lLlpiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwicHJlcm9sbCIhPWUuQ2I/KHRoaXMuZWQ9ITAsdGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy5tZygpKToodGhpcy5zaD10aGlzLkNmPXRoaXMuQmY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5qZT0hMCxhPWUuY2coYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuS2UoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LG1nOmZ1bmN0aW9uKGEpe3RoaXMuUnUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCEwKX0uYmluZCh0aGlzKSx0aGlzLnN0KToodGhpcy5HZD0hMCx0aGlzLmIuQWUoKSx0aGlzLmIuY3UoKSx0aGlzLmFjPSExLAplLnYoay5xcCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMud2UoKS5FaCgpKX0sd2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sZGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZS5FZSh0aGlzLnZpZGVvLGEpP3RoaXMuR2goKTp0aGlzLndkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5yYyYmMDx0aGlzLnJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5yYykpO3RoaXMudmlkZW8mJgp0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuT28rIi0iK3RoaXMubGY7dGhpcy5jJiZ0aGlzLmMuSGcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkhnKCkpO3JldHVybiBhfSxyZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuZGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRqPXRoaXMuYVs0XTt0aGlzLlhzPXRoaXMuYVs3XTt0aGlzLlJtPXRoaXMuYVs5XTt0aGlzLk9yPXRoaXMuYVsxMF07dGhpcy5zbz10aGlzLmFbM107dGhpcy52aj10aGlzLmFbMV07dGhpcy5Ddj10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOF07dGhpcy5ubD10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX0KYy50bz1iO2IucHJvdG90eXBlPXtDajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRGo6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhzOnRoaXMuUW0oYSl9LFFtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5SbTp0aGlzLk5yKGEpfSxOcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuT3I6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNvOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52ajp0aGlzLkJ2KGEpfSxCdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ3Y6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmd0OnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qbDp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy50b3x8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuQ2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnFjPXRoaXMuc2M9ITE7dGhpcy52YT0iIjt0aGlzLnpmPSExO3RoaXMuU2c9IiI7ZCYmZC5lbXB0eT90aGlzLm5zKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRm09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuaGQoKSxiO2I9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKdmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLm9nKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8CiJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkhkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLkRhKGIsdGhpcy5tcy5iaW5kKHRoaXMpLAp0aGlzLmpzLmJpbmQodGhpcykpfSxEZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5LcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5XdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxLcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmCmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LG1zOmZ1bmN0aW9uKGEpe3RoaXMuTXQoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpOwp0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlNnPWEucmVzcG9uc2VVUkw7dGhpcy5ZLmxlbmd0aD90aGlzLkljKCk6dGhpcy5zYSh0aGlzLlNhKHcuUGMse2Vycm9yOnRoaXMuemY/Ry5XZDpHLklmfSkpfSxuczpmdW5jdGlvbihhKXt0cnl7dGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpO3RoaXMucWM9dGhpcy5UaCgpO3RoaXMuWS5sZW5ndGg/dGhpcy5JYygpOnRoaXMuc2EodGhpcy5TYSh3LlBjLHtlcnJvcjp0aGlzLnpmP0cuV2Q6Ry5JZn0pKX0sanM6ZnVuY3Rpb24oKXt0aGlzLnNhKHRoaXMuU2Eody5IZix7ZGVwdGg6YX0pKX0sSWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5NcigpP3RoaXMuZnYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5NZygpLGgse0FkU3lzdGVtOnRoaXMudHEoKSwKdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMuc2EodGhpcy5TYSh3LktmKSk6KGE9MCx0aGlzLkp2KCkmJnRoaXMuVmUodGhpcy5zcCgpKSl9LFFlOmZ1bmN0aW9uKCl7dGhpcy5zYz8odGhpcy5zYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5RZSgpfSxwaDpmdW5jdGlvbigpe3RoaXMucWM/KHRoaXMucWM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSWMoKSk6dGhpcy5wYXJlbnQucGgoKX0sSnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdigpP3RoaXMuYnYoKT8hMDooLTEhPXRoaXMuQ2MoKT90aGlzLnNhKHRoaXMuU2Eody5TZCkpOnRoaXMuc2EodGhpcy5TYSh3LkRmKSksITEpOih0aGlzLnNhKHRoaXMuU2Eody5QYyxHLkpmKSksITEpfSxWZTpmdW5jdGlvbihhKXt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5RZHx8KGEuUWQ9W10pO2EuUWQucHVzaCh0aGlzLlNnKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuTWUoKSk7CmEudGI9YS50Yj9hLnRiOnRoaXMuc2M7YS5wYz1hLnBjP2EucGM6dGhpcy5xYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7dGhpcy5wYXJlbnQuVmUoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLmR1cmF0aW9uPXRoaXMuQ2MoKTthLk89dGhpcy5KZygpO2EuVWI9dGhpcy52cSgpO2EuUXY9W107YS5vcmlnaW49dGhpczthLkI9dGhpcy5zcSgpO2Eua2Y9dGhpcy5KcShhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7cmV0dXJuIGF9LHNhOmZ1bmN0aW9uKGIpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPQp3LlNkLmNvZGU/Yi5QYS5jb25jYXQodGhpcy53cSgpKTpiLlBhLmNvbmNhdCh0aGlzLkVxKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuV2ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5zYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnNhJiZ0aGlzLnBhcmVudC5zYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sdGc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sZnY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxjdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuSmcoKS5sZW5ndGh9LGJ2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5DYygpfSxwZjpmdW5jdGlvbigpe3JldHVybiAxPAp0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxUaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMucGYoKSYmKGE9ITApO3JldHVybiBhfSxNdDpmdW5jdGlvbihhKXt0aGlzLnZhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy52YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuemY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sTXI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLk1nKCkubGVuZ3RofSxNZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LHRxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmUodGhpcy5VLAoiQWRTeXN0ZW0iKX0sTWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy4kZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5rYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LCRnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuJGcoYS5wYXJlbnROb2RlKTohMX0sRXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT0KYS50eXBlfSl9LHdxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx2cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxKZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxseDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5rYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8CjFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sc3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5uZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9CmJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LENjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxKcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkZ1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sdmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD8KdGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0seWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkZtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFyPXRoaXMuYVs2XTt0aGlzLmZvPXRoaXMuYVs2XTt0aGlzLnp3PXRoaXMuYVs5XTt0aGlzLktvPXRoaXMuYVsxMF07dGhpcy5kcz10aGlzLmFbMTBdO3RoaXMuRXA9dGhpcy5hWzVdO3RoaXMuR3A9dGhpcy5hWzZdO3RoaXMuc2o9CnRoaXMuYVsyXTt0aGlzLmNvPXRoaXMuYVs2XTt0aGlzLnFvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLkNwPWI7Yi5wcm90b3R5cGU9e3ByOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5xcjp0aGlzLmVvKGEpfSxlbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZm86dGhpcy55dyhhKX0seXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnp3OnRoaXMuSm8oYSl9LEpvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Lbzp0aGlzLmNzKGEpfSxjczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZHM6dGhpcy5EcChhKX0sRHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkVwOnRoaXMuRnAoYSl9LEZwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HcDp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNqOnRoaXMuYm8oYSl9LGJvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5jbzp0aGlzLnBvKGEpfSxwbzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnFvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5DcHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkI9dGhpcy5wYz10aGlzLnRiPSExO3RoaXMuQmU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkNlPSIifWMuUmw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sQ3E6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkdhKXt2YXIgYT10aGlzLm9yaWdpbi5HYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5CZT1hW2NdKX1yZXR1cm4gdGhpcy5CZX0sSGc6ZnVuY3Rpb24oKXtpZih0aGlzLkNlKXJldHVybiB0aGlzLkNlO3ZhciBhPSIiOyhhPXRoaXMuQ3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkNlPWF9LE5xOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5SbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2k9dGhpcy5hWzFdO3RoaXMuWW09dGhpcy5hWzldO3RoaXMuVnA9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNF19Yy5wdD1iO2IucHJvdG90eXBlPXtGaTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkdpOnRoaXMuWG0oYSl9LFhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ZbTp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLnB0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5GaSg0KTt2YXIgdz17WGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LERmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxQYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCk9hOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApPYToiTE9BRF9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LE53Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxTZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17SWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sT3c6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT209dGhpcy5hWzEwXTt0aGlzLm53PXRoaXMuYVsyXTt0aGlzLnJrPXRoaXMuYVs0XTt0aGlzLkFrPXRoaXMuYVs2XTt0aGlzLlVuPXRoaXMuYVs4XTt0aGlzLlVyPXRoaXMuYVsyXTt0aGlzLlFqPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzVdfWMuUms9YjtiLnByb3RvdHlwZT17Tm06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk9tOnRoaXMubHcoYSl9LGx3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5udzp0aGlzLnFrKGEpfSxxazpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnJrOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Bazp0aGlzLlRuKGEpfSxUbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVW46dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVyOnRoaXMuUGooYSl9LFBqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Rajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuUmt8fFhhLEljPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLk5tKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuZ2Q9Yjt0aGlzLlBhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5Faj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuRWp8fFVhO2M9CmN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5obD10aGlzLmFbNl07dGhpcy5tdD10aGlzLmFbMl07dGhpcy5MdD10aGlzLmFbN107dGhpcy5ndT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy5Hcz1iO2IucHJvdG90eXBlPXtnbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaGw6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm10OnRoaXMuS3QoYSl9LEt0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5MdDp0aGlzLmZ1KGEpfSxmdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZ3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLkdzfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZ2woNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLkZoPWE7dGhpcy52aWRlbz1iO3RoaXMuTmQ9W107dGhpcy5DaD1bXTt0aGlzLlJlPVtdO3RoaXMuVXY9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlhrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuRmgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5GaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LApnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2cuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgaz1nLmNvbnRlbnRXaW5kb3c7ay5HeD17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy4kdC5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5SdC5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuTmQucHVzaCh7c3JjOmMsZnJhbWU6Zyx0dDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LAp0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuUmUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5SZVtiXTtjLnR5cGU9PT1hJiZjLlZvKHRoaXMueHEoYSkpfX0seHE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7UHg6ITAsT3g6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7Q3g6InZpZGVvIixSeDoianNDdXN0b20iLFN4OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsVHg6MSxteDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLAphZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxNcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuTmQubGVuZ3RoO2IrKylpZih0aGlzLk5kW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuTmRbYl0udHQ7cmV0dXJuIiJ9LCR0OmZ1bmN0aW9uKGEsYil7dGhpcy5DaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5NcShiKSx2ZW5kb3I6Yn0pO3RoaXMuTnUoKX0sUnQ6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLlV2Lm1hcChmdW5jdGlvbihhKXt0aGlzLmFnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYWcoYSxiKX0sYWc6ZnVuY3Rpb24oYSxiKXt0aGlzLlJlLnB1c2goe3R5cGU6YSxWbzpiLE14OiExfSl9LE51OmZ1bmN0aW9uKCl7dGhpcy5DaC5tYXAoZnVuY3Rpb24oYSl7YS5Jcnx8CihhLkZ4KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5ReCxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuSXI9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWGt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhpPXRoaXMuYVs1XTt0aGlzLllpPXRoaXMuYVsxXTt0aGlzLlJwPXRoaXMuYVs1XTt0aGlzLkhrPXRoaXMuYVs1XTt0aGlzLmF0PXRoaXMuYVs4XTt0aGlzLml1PXRoaXMuYVszXTt0aGlzLm5rPXRoaXMuYVs0XTt0aGlzLiRxPXRoaXMuYVszXTt0aGlzLmZsPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy5pcj1iO2IucHJvdG90eXBlPXt3aTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueGk6dGhpcy5YaShhKX0sClhpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZaTp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUnA6dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhrOnRoaXMuJHMoYSl9LCRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaXU6dGhpcy5tayhhKX0sbWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5rOnRoaXMuWnEoYSl9LFpxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kcTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmlyfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2Mud2koNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5pYj1hLkVnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuYmc9ITE7dGhpcy5UYj1bXX1jLm9qPWI7Yi5wcm90b3R5cGU9e3JxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZT0wLGI9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUsCnk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnJxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5hcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmCihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sVXU6ZnVuY3Rpb24oKXt0aGlzLmJnPSEwfSxkaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sdmg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay55Yyx0aGlzLmYucygpKX0sY3U6ZnVuY3Rpb24oKXt0aGlzLmJnfHwodGhpcy5mLnBsYXkoKSxlLnYoay5kZCx0aGlzLmYucygpKSl9LGpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9CiJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5pYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuaWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5pYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmliLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaWIpO3RoaXMuZi5MYyYmdGhpcy5mLkxjKCk/dGhpcy5mLkVnKCkuYXBwZW5kQ2hpbGQodGhpcy5LKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy4kYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sCmFyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxqcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LCRiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuanEodGhpcy5pYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmCjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQWUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLkxjKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLksuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5UYi5sZW5ndGg7YSsrKXRoaXMuVGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5QaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLiRiLmJpbmQodGhpcyksMTApfSwkZjpmdW5jdGlvbihhKXt0aGlzLlRifHwKKHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEFlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMub2p8fCRhLEU9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuYWEoMTApO04uY29udHJvbHM9ITA7RS5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCkEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1vPXRoaXMuYVsyXTt0aGlzLmRqPXRoaXMuYVs5XTt0aGlzLkR3PXRoaXMuYVs3XTt0aGlzLmpqPXRoaXMuYVsyXTt0aGlzLkNpPXRoaXMuYVs1XTt0aGlzLlZzPXRoaXMuYVszXTt0aGlzLnBsPXRoaXMuYVs3XTt0aGlzLmJzPXRoaXMuYVsyXTt0aGlzLnZ3PXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuRW09YjtiLnByb3RvdHlwZT17bG86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1vOnRoaXMuY2ooYSl9LGNqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kajp0aGlzLkN3KGEpfSxDdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRHc6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmpqOnRoaXMuQmkoYSl9LEJpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DaTp0aGlzLlVzKGEpfSwKVXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZzOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wbDp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYnM6dGhpcy51dyhhKX0sdXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnZ3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5FbXx8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMubG8oNCk7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLAphPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5CZChiKTt0aGlzLnBnKCl9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LApEZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5DbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuQmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7dGhpcy5TYj10aGlzLlNifHwhMTt0aGlzLlRmPXRoaXMuVmY9dGhpcy5XZz10aGlzLmVhPXRoaXMuc2Y9CiExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuaHEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnNmPSEwO3RoaXMuV2cmJnRoaXMuamcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLmFjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuYmQoKTt0aGlzLldnPSEwO3RoaXMuamcoKX0uYmluZCh0aGlzKSk7dGhpcy5mZygpfSwKamc6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5iZCgpO2lmKCF0aGlzLnNmJiYhdGhpcy5iZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuc2YmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0sYmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLktnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LEtnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGZnOmZ1bmN0aW9uKCl7aWYodGhpcy5iZCgpKXt2YXIgYj10aGlzLktnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdOwp0aGlzLlZmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9Yi5qeH10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LG54OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkF4KCk6ITF9LENjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5DYygpOi0xfSxGcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxocTpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy51KCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwKMTAwKX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5EZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkZxKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuQmx8fGRiOyhmdW5jdGlvbihjKXtjLkRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sSnI6ZnVuY3Rpb24oKXt3aW5kb3cuT08uWGwudm4udG4/d2luZG93Lk9PLlhsLnZuLnRuLmh4KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpyKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9CmRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnhlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMuRGx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaz10aGlzLmFbOV07dGhpcy55az10aGlzLmFbN107dGhpcy5haz10aGlzLmFbMTBdO3RoaXMuZmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5Pcz1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRms6CnRoaXMueGsoYSl9LHhrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy55azp0aGlzLiRqKGEpfSwkajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYWs6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5Pc3x8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuRWsoNCk7KGZ1bmN0aW9uKGMpe2MuU2k9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMTt0aGlzLk5nKCl9LE5nOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTsKYnx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sCk5hOmZ1bmN0aW9uKCl7dGhpcy55aCgpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuU2l8fGhiOyhmdW5jdGlvbihjKXtjLlJpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMucmEoKTp0aGlzLm0oKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmdnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2coYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGliPWMuUml8fGliOyhmdW5jdGlvbihjKXtjLlRpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sQmg6ZnVuY3Rpb24oYil7Yj1uZXcgaGIoYik7Yi5uYT90aGlzLlQoKTp0aGlzLk4oYil8fAooYi5CZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5pcXx8KHRoaXMuaXE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkJoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5CaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGpiPWMuVGl8fGpiLFQ9bmV3IGpiKHIpO1QuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy55bT10aGlzLmFbMl07dGhpcy5jcj10aGlzLmFbMl07dGhpcy56dj10aGlzLmFbNF07dGhpcy5Haj10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLmxsPWI7Yi5wcm90b3R5cGU9e3htOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy55bTp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3I6dGhpcy55dihhKX0seXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnp2OnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR2o6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5sbHx8a2IsTmM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMueG0oNCk7KGZ1bmN0aW9uKGMpe2Mubm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sTGM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ubXx8VTsoZnVuY3Rpb24oYyl7Yy5tbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlZjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eC5WYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLk1zKGEpfS5iaW5kKHRoaXMpKTt4LlZjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3guVmMoIiMiK2IsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTsKeC5UcSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufX10aGlzLnUoImFkZXJyb3IiLGEpO3RoaXMuRygpfX0pfSkoYyk7dmFyIFY9Yy5tbXx8VjsoZnVuY3Rpb24oYyl7Yy5vbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMudWQmJihiPWUud3AoYix0aGlzLnVkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5SKGQpO3ZhciBmPW5ldyBWKGQsdGhpcy5JKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy51ZHx8KHRoaXMudWQ9W10pLHRoaXMudWQucHVzaChiW2FdKSxkPW5ldyBVKGcpLHRoaXMuTihkKXx8KHRoaXMuUihkKSxmPW5ldyBWKGQsdGhpcy5JKSwKZi5nKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxWYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSxndjpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmRhfHx0aGlzLmRhJiYhdGhpcy5kYVthXSl0aGlzLkhjfHwodGhpcy5IYz1bXSksdGhpcy5IYy5wdXNoKGIpLHRoaXMuYnUoKSYmKHRoaXMuYmYoKSx0aGlzLmcoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5kYVthXVtjXSYmMDx0aGlzLmRhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuZGFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmRhW2FdW2NdW2RdKGIpfX0sVHE6ZnVuY3Rpb24oKXtpZih0aGlzLkhjKWZvcih2YXIgYj0KMDtiPHRoaXMuSGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5IY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmRhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5kYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnguZ3YoYil9fSl9KShjKTt2YXIgbGI9Yy5vbXx8bGIseD1uZXcgbGIocik7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ocj10aGlzLmFbOF07dGhpcy5vdD10aGlzLmFbOV07CnRoaXMuWHA9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMuQW49YjtiLnByb3RvdHlwZT17Z3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ocjp0aGlzLm50KGEpfSxudDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub3Q6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5Bbnx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuZ3IoNCk7KGZ1bmN0aW9uKGMpe2MuT2k9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7CnZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLk9pfHxuYjsoZnVuY3Rpb24oYyl7Yy5QaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTsKdmFyIG9iPWMuUGl8fG9iOyhmdW5jdGlvbihjKXtjLlFpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkkpKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuUWl8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy56cj10aGlzLmFbMl07dGhpcy5ObD10aGlzLmFbN107dGhpcy5Ucz10aGlzLmFbMV07dGhpcy5qcD10aGlzLmFbM107dGhpcy5Xbj10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsyXX1jLmptPWI7Yi5wcm90b3R5cGU9e3lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cjp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTmw6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRzOnRoaXMuaXAoYSl9LGlwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qcDp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlduOnRoaXMuaShhKX0sCmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIHJiPWMuam18fHJiLFBjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLnlyKDQpOyhmdW5jdGlvbihjKXtjLnJsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5XKGIpO3RoaXMuWihhKTt0aGlzLlF0KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LApwbGF5OmZ1bmN0aW9uKCl7fSxRdDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnBhdXNlJiZ0aGlzLmphLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnJlc3VtZSYmdGhpcy5qYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEubXV0ZSYmdGhpcy5qYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LApmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS51bm11dGUmJnRoaXMuamEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxYZzpmdW5jdGlvbihiKXt0aGlzLmphPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBzYj1jLnJsfHxzYjsoZnVuY3Rpb24oYyl7Yy5xbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubWk9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMubWkmJih0aGlzLkcoKSx0aGlzLm1pPSEwLHRoaXMub2EoKSk7YS5LYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgdGI9Yy5xbHx8dGI7KGZ1bmN0aW9uKGMpe2Muc2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZzpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYj1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgc2IoYltkXSksdGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgdGIoYyx0aGlzLkkpKS5nKCkpfX1lbHNlIHRoaXMuVCgpfX0pfSkoYyk7dmFyIHViPWMuc2x8fHViLFc9bmV3IHViKHIpO1cuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRvPXRoaXMuYVs0XTt0aGlzLnVsPXRoaXMuYVs2XTt0aGlzLmxrPXRoaXMuYVs4XTt0aGlzLlNxPXRoaXMuYVsxMF07dGhpcy5Uaz10aGlzLmFbN107dGhpcy5Tcj10aGlzLmFbN107dGhpcy5Kcz10aGlzLmFbM107dGhpcy5ucT10aGlzLmFbOF07CnRoaXMuc3I9dGhpcy5hWzEwXTt0aGlzLkJ3PXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy52aT1iO2IucHJvdG90eXBlPXtDbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRG86dGhpcy50bChhKX0sdGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVsOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sazp0aGlzLlJxKGEpfSxScTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU3E6dGhpcy5TayhhKX0sU2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRrOnRoaXMuUnIoYSl9LFJyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Tcjp0aGlzLklzKGEpfSxJczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSnM6dGhpcy5tcShhKX0sbXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm5xOnRoaXMucnIoYSl9LHJyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zcjp0aGlzLkF3KGEpfSxBdzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkJ3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy52aXx8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UWMuQ28oNCk7KGZ1bmN0aW9uKGMpe2MuTG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LAp1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlg/KDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgd2I9Yy5MbXx8d2I7KGZ1bmN0aW9uKGMpe2MuS209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLApiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxPdDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuZWJ8fCh0aGlzLmViPVtdKTt0aGlzLmViLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5yYSgpOnRoaXMudSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTsKdGhpcy5DYT90aGlzLk90KHRoaXMuQ2EpOih0aGlzLkNhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5DYSl7dGhpcy5HKCk7cmV0dXJufWlmKCF0aGlzLnRjKXt0aGlzLkcoKTtyZXR1cm59Yj0hMDtpZih0aGlzLmViJiZ0aGlzLmViLmxlbmd0aCYmMTx0aGlzLmViLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuZWIubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuZWJbYV0mJjMwMyE9dGhpcy5lYlthXSYmNDAzIT10aGlzLmViW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5LbXx8eGI7KGZ1bmN0aW9uKGMpe2MuTW09CnQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgd2IoYi5pdGVtKGEpKTt0aGlzLk4oYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLlIoYyksKG5ldyB4YihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgeWI9Yy5NbXx8eWIsemI9bmV3IHliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZvPXRoaXMuYVsyXTt0aGlzLiRyPXRoaXMuYVs2XTt0aGlzLldyPXRoaXMuYVsxMF07dGhpcy5pdj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5QbT1iO2IucHJvdG90eXBlPXtFbzpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLkZvOnRoaXMuWnIoYSl9LFpyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kcjp0aGlzLlZyKGEpfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3I6dGhpcy5odihhKX0saHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLml2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy5QbXx8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMuRW8oNCk7KGZ1bmN0aW9uKGMpe2MuZG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlcoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pOwp0aGlzLldlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5FdCgpfS5iaW5kKHRoaXMpLDUwMCl9LEV0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuV2UmJgp3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLldlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sUXU6ZnVuY3Rpb24oKXt0aGlzLldlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgQmI9Yy5kbXx8QmI7KGZ1bmN0aW9uKGMpe2MuY209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKTt0aGlzLmtjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLnVzPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5rY3x8KHRoaXMua2M9CjAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8Cih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMua2N8fHRoaXMua2MrKyx0aGlzLmtjPD10aGlzLnVzPyh0aGlzLmtjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5RdSgpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLAoxMDApfX0pfSkoYyk7dmFyIENiPWMuY218fENiOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IEJiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsdGhpcy5JKSkuZygpKSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgRGI9Yy5lbXx8RGIsRWI9bmV3IERiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuTHc9CmI7Yi5wcm90b3R5cGU9e2pyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5rcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEZiPWMuTHd8fEZiLFNjPW5ldyBGYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLmpyKDQpOyhmdW5jdGlvbihjKXtjLlpsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMuWmx8fEdiOyhmdW5jdGlvbihjKXtjLllsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5LYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMub3AoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5tZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMuZXMoKTp0aGlzLmlnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksCjFFMyl9LG9wOmZ1bmN0aW9uKCl7dGhpcy5SZigpfHx0aGlzLm0oITApfSxlczpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWQoKTshYi5xYSYmYi5ZJiZiLmd4JiZiLml4JiYodGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSgpKX0saWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZygpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGgpZm9yKHZhciBiPQpsLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5LYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy50aD1iW2NdKTtyZXR1cm4gdGhpcy50aH0sQng6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubWQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5ZbHx8SGI7KGZ1bmN0aW9uKGMpe2MuJGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0KMDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEdiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBIYihjLHRoaXMuSSkpLmcoKSl9cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBJYj1jLiRsfHxJYixKYj1uZXcgSWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueWw9dGhpcy5hWzRdO3RoaXMubXA9dGhpcy5hWzVdO3RoaXMudXY9dGhpcy5hWzEwXTt0aGlzLldpPXRoaXMuYVszXTt0aGlzLktpPXRoaXMuYVszXTt0aGlzLllxPXRoaXMuYVsyXTt0aGlzLmJuPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzEwXX1jLkF2PWI7Yi5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLm1wOnRoaXMudHYoYSl9LHR2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51djp0aGlzLlZpKGEpfSxWaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuV2k6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktpOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ZcTp0aGlzLmFuKGEpfSxhbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLkF2fHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy54bCg0KTsoZnVuY3Rpb24oYyl7Yy5Waz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7CkgmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sCkFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxMYzpmdW5jdGlvbigpe3JldHVybiEwfSxLYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Wa3x8WDsoZnVuY3Rpb24oYyl7Yy5Vaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5YZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhlPQpiLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlhlJiZiIT10aGlzLlhlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuZmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLkh4KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy51KCJhZGVycm9yIiksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFk9Yy5Va3x8WTsoZnVuY3Rpb24oYyl7Yy5Xaz0KdC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWChiKSxiLm5hP3RoaXMuYmYoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksCmIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuV2t8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWk9dGhpcy5hWzddO3RoaXMuV209dGhpcy5hWzRdO3RoaXMuem49dGhpcy5hWzZdO3RoaXMuTm89dGhpcy5hWzddO3RoaXMuSXc9dGhpcy5hWzFdO3RoaXMua289dGhpcy5hWzhdO3RoaXMubXU9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOV19Yy5KbT1iO2IucHJvdG90eXBlPXtEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRWk6dGhpcy5WbShhKX0sVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldtOnRoaXMueW4oYSl9LHluOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy56bjp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5IdyhhKX0sSHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5Jdzp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmtvOnRoaXMubHUoYSl9LGx1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5tdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLkptfHxOYixVYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5EaSg0KTsoZnVuY3Rpb24oYyl7Yy5Vaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LApudTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sRXg6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgT2I9Yy5Vanx8T2I7KGZ1bmN0aW9uKGMpe2MuVGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGEpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk7Yi5PbigiZmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oInRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5vYSgpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgUGI9Yy5Uanx8UGI7KGZ1bmN0aW9uKGMpe2MuVmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yayYmCndpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycyl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yay5HZXRBbGxQbGF5ZXJzKCk7aWYoYiYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX19dGhpcy5UKCl9fSl9KShjKTt2YXIgUWI9Yy5Wanx8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklwPXRoaXMuYVs3XTt0aGlzLm5uPXRoaXMuYVs5XTt0aGlzLmJtPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzFdfWMuUnM9YjtiLnByb3RvdHlwZT17SHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JcDp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLm5uOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLlJzfHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5IcCg0KTsoZnVuY3Rpb24oYyl7Yy5kbj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSwKTGQ6ZnVuY3Rpb24oYil7dmFyIGE9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LFB0OmZ1bmN0aW9uKCl7dGhpcy5SZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuTGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUmR8fCh0aGlzLlJkPSEwLHRoaXMuTGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LApwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxBYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuZG58fFRiOyhmdW5jdGlvbihjKXtjLmNuPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFR0OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSwKYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWQoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmFkKGEpfS5iaW5kKHRoaXMpKX0sYWQ6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7CmEuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMudSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5tKCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxOZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5hZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTmYuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5UdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLk5mKCk7dGhpcy5TdCgpfSxTdDpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsCnRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuTnQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5OdD0hMH19KX0pKGMpO3ZhciBVYj1jLmNufHxVYjsoZnVuY3Rpb24oYyl7Yy5lbj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLlB0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTsKdmFyIFZiPWMuZW58fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenA9dGhpcy5hWzNdO3RoaXMuemo9dGhpcy5hWzddO3RoaXMuVHA9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMTBdfWMuS2w9YjtiLnByb3RvdHlwZT17eXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpwOnRoaXMueWooYSl9LHlqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56ajp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLktsfHxYYixXYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1XYy55cCg0KTsKKGZ1bmN0aW9uKGMpe2Mudm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy53aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLkJzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxudTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLAphPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQnN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMud2gmJih0aGlzLndoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE89Yy52bXx8TzsoZnVuY3Rpb24oYyl7Yy51bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5EYisrLDE1PHRoaXMuRGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnp1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSwKaGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLnVtfHxQOyhmdW5jdGlvbihjKXtjLndtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuYmYoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLndtfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudGs9CnRoaXMuYVs4XTt0aGlzLm12PXRoaXMuYVs0XTt0aGlzLnhuPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTnM9YjtiLnByb3RvdHlwZT17c2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRrOnRoaXMubHYoYSl9LGx2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tdjp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5Oc3x8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuc2soNCk7KGZ1bmN0aW9uKGMpe2MuS2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpOwp2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5XKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5La3x8WjsoZnVuY3Rpb24oYyl7Yy5Kaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkVjPXRoaXMuQ2E9dGhpcy5YYz0hMTt0aGlzLkFoPWUuSGIoMTApO3RoaXMuYmgoKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiYKYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnFhPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5xYigpLCEwO3RoaXMuVGcrKztpZigxMDx0aGlzLlRnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmguYmluZCh0aGlzKSwxMDApLCExfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT0KYXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITB9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkprfHxhYTsoZnVuY3Rpb24oYyl7Yy5Maz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYKMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLkxrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQm89dGhpcy5hWzhdO3RoaXMuQ249dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMl19Yy5zaT1iO2IucHJvdG90eXBlPXtBbzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkJvOnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGNjPWMuc2l8fGNjLFljPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVljLkFvKDQpOyhmdW5jdGlvbihjKXtjLkxqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBkYz1jLkxqfHxkYzsoZnVuY3Rpb24oYyl7Yy5Laj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5oZygpfSxoZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuS2p8fGVjOyhmdW5jdGlvbihjKXtjLk1qPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmCndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgZGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubmEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7KG5ldyBlYyhiLHRoaXMuSSkpLmcoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGZjPWMuTWp8fGZjLGdjPW5ldyBmYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdz10aGlzLmFbMl07dGhpcy5Zbj10aGlzLmFbOF07dGhpcy5wcT10aGlzLmFbNl07dGhpcy5Caj10aGlzLmFbOF07dGhpcy5Oaz10aGlzLmFbMl07dGhpcy5uaj10aGlzLmFbOF07dGhpcy5pbz10aGlzLmFbM107dGhpcy5ydD10aGlzLmFbOF07dGhpcy5OaT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmt1PWI7Yi5wcm90b3R5cGU9e3J3OmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuc3c6dGhpcy5YbihhKX0sWG46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlluOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5wcTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQmo6dGhpcy5NayhhKX0sTWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk5rOnRoaXMubWooYSl9LG1qOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5uajp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaW86dGhpcy5xdChhKX0scXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnJ0OnRoaXMuTWkoYSl9LE1pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5OaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMua3V8fGhjLFpjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5ydyg0KTsoZnVuY3Rpb24oYyl7Yy5waT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5waXx8aWM7KGZ1bmN0aW9uKGMpe2Mub2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubGUoKTt0aGlzLmVnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmVnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGUuYmluZCh0aGlzKSwxMDApfSxsZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxlLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIGpjPWMub2l8fGpjOyhmdW5jdGlvbihjKXtjLnJpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj0KbmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMucml8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xbT10aGlzLmFbNl07dGhpcy5jaz10aGlzLmFbMV07dGhpcy5acz10aGlzLmFbMTBdO3RoaXMucW49dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5rbD1iOwpiLnByb3RvdHlwZT17cG06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnFtOnRoaXMuYmsoYSl9LGJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5jazp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWnM6dGhpcy5wbihhKX0scG46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5rbHx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMucG0oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZWg9dGhpcy5naD10aGlzLmZoPSExO3RoaXMueGQ9W107dGhpcy5hZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuVGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5HcShhKTpbXSxiO3RoaXMuZ2g9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZmg9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuSGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmFmKXtpZih0aGlzLmVoKWJyZWFrO2I9dGhpcy5hZltjXTt0aGlzLnZmKGIpJiYodGhpcy54ZC5wdXNoKGIpLHRoaXMuSGgoYikpfX0sdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgp0PyEwOiExfSxHcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5hZltjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEhoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSxTdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZmgpZm9yKHRoaXMuZWg9ITAsYT0wO2E8dGhpcy54ZC5sZW5ndGg7YSsrKXRoaXMueGRbYV0uTGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54ZFthXS5MYil9fX0pKGMpO3ZhciBuYz1jLlRsfHxuYyxNPW5ldyBuYztNLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vcj10aGlzLmFbMTBdO3RoaXMuaXQ9dGhpcy5hWzFdO3RoaXMuQXQ9dGhpcy5hWzVdO3RoaXMuR2w9dGhpcy5hWzEwXTsKdGhpcy53cz10aGlzLmFbOV07dGhpcy5Rcz10aGlzLmFbNV07dGhpcy5tcj10aGlzLmFbN107dGhpcy5IdT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs3XX1jLmZxPWI7Yi5wcm90b3R5cGU9e25yOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vcjp0aGlzLmh0KGEpfSxodDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaXQ6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkF0OnRoaXMuRmwoYSl9LEZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HbDp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud3M6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFzOnRoaXMubHIoYSl9LGxyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5tcjp0aGlzLkd1KGEpfSxHdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuajphfX19KShjKTt2YXIgb2M9Yy5mcXx8b2MsYWQ9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9YWQubnIoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuQmMoay5LdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOgotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkJjKGsuRnMpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtGLndpZHRoPTE7Ri5oZWlnaHQ9MTtGLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgYmQ9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgST1uZXcgSixsPSExO0kua2EoKTtJLllnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5rYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuWWcoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTtJLmthKCk7CnZhciBjZD1iZChmdW5jdGlvbigpe2UueWcod2luZG93LEkuQXIoKSx7aWQ6Y2R9KX0sNTAwKSxpYT1lLmFhKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd0PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuTnA9YjtiLnByb3RvdHlwZT17dnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnd0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5OcHx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQudnQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnhoPXRoaXMuY29uZj10aGlzLmxiPXRoaXMucGxheWVyPW51bGw7dGhpcy5zZD0wOwp0aGlzLmJiPSIiO3RoaXMueWQ9W107dGhpcy56ZD0wO3RoaXMuemg9ITE7dGhpcy5ZZT1bXTtlLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy50aT1iO2IucHJvdG90eXBlPXt2dTpmdW5jdGlvbihhKXt0aGlzLnhoPWF9LGdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0scXU6ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSxwdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxNYzpmdW5jdGlvbihhLGIpe2UuZmEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5CcigpKXRoaXMubGIubCh0aGlzLmxiLm9kLHRoaXMubGIud2EsdGhpcy5sYi4kZSxmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmxiLkFjKTtlbHNlIGlmKHRoaXMuVnEoKSl0aGlzLmp1KGZ1bmN0aW9uKCl7dGhpcy5NYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsueWMsdGhpcy5wbGF5ZXIucygpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLlV1KCk7bC5leGl0RnVsbHNjcmVlbigpO2Uub2IoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLmxiLApnKTtsLm91KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy50cyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkllJiYoYz10aGlzLnBsYXllci5JZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5LZShhLGMsZik7dGhpcy5wbGF5ZXIuSmgobCl9fSxCcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnNkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuc2QuZ2V0VGltZSgpLHRoaXMuc2Q9YSwzRTU8Yj8hMDohMTt0aGlzLnNkPWE7cmV0dXJuITF9LEV1OmZ1bmN0aW9uKCl7ZS5vYigicHJlcm9sbCIpO2UuZmYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMudWcoYSkpP3RoaXMuTWMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX0sRHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueGgpe2UuZmYoInBvc3Ryb2xsIik7ZS5vYigicG9zdHJvbGwiKTt0aGlzLnZ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnVnKGMpKT90aGlzLk1jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX19LHVnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxXdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLkJ1KHRoaXMuRHUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5vYigibWlkcm9sbCIpO2UuZmYoIm1pZHJvbGwiKTtpZighdGhpcy5taCl7dGhpcy5taD0hMDt2YXIgYj10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5NYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5taD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5kZCwKdGhpcy5wbGF5ZXIucygpKSl9fSxWdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnV1KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmUoKX0sZzpmdW5jdGlvbigpe3RoaXMuRXUoKTt0aGlzLnBsYXllci5OZSYmdGhpcy5WdCgpO3RoaXMuV3QoKX0sWHQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy55ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuR3coYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnpkPXRoaXMueWQubGVuZ3RofSxWcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy56ZCYmKGE9ITApO3JldHVybiBhfSwKanU6ZnVuY3Rpb24oYSl7dGhpcy56aD1hO2ZvcihhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXVsiZnVuY3Rpb24iXSh0aGlzLkl0LmJpbmQodGhpcykpfSxJdDpmdW5jdGlvbihhKXt0aGlzLnpkLS07YSYmdGhpcy5ZZS5wdXNoKGEpOzA+PXRoaXMuemQmJnRoaXMuemgoKX0sdHM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWWUubGVuZ3RoO2MrKyliPXRoaXMuWWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWms9dGhpcy5hWzhdO3RoaXMuJG09dGhpcy5hWzhdO3RoaXMuUWw9dGhpcy5hWzNdO3RoaXMuYXE9dGhpcy5hWzddO3RoaXMuZXU9dGhpcy5hWzFdO3RoaXMuTHM9dGhpcy5hWzhdO3RoaXMuUGs9CnRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzVdfWMuSW89YjtiLnByb3RvdHlwZT17WWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlprOnRoaXMuWm0oYSl9LFptOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy4kbTp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUWw6dGhpcy4kcChhKX0sJHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFxOnRoaXMuZHUoYSl9LGR1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZXU6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxzOnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuSW98fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Zayg0KX0pLmNhbGwoUGVpZm94b2hPdWNoYW5nYSxQZWlmb3hvaE91Y2hhbmdhKTsK
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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:39 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 8C3D
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
c12c2600516e4ca81ed7034be75232105099b434129a57209b6fd49cd2af153e

Request headers

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

Response headers

Content-Type
text/javascript
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.3, , AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
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/74.0.3729.169 Safari/537.36

Response headers

Date
Wed, 02 Oct 2019 09:37:39 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Length
44
Content-Type
image/gif
/
ssl.1.damoh.golem.de/4449b802d8912c3cd03daa5bfc6760e7b14d397b/
110 B
670 B
XHR
General
Full URL
https://ssl.1.damoh.golem.de/4449b802d8912c3cd03daa5bfc6760e7b14d397b/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBlaWZveG9oT3VjaGFuZ2E9UGVpZm94b2hPdWNoYW5nYXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVGV8fCh4LlRlPTApO3guVGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5UZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5UbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay55YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuZ2YoYyk7YS5xdShtKTthLnB1KGwpO2EuWHQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS55dSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5raC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUua2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQW09dGhpcy5hWzhdO3RoaXMuRXY9dGhpcy5hWzddO3RoaXMuU2o9dGhpcy5hWzldO3RoaXMuS3A9dGhpcy5hWzRdO3RoaXMuam49dGhpcy5hWzddO3RoaXMuWG89dGhpcy5hWzNdO3RoaXMucGs9dGhpcy5hWzldO3RoaXMuem89dGhpcy5hWzZdO3RoaXMuUW89dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNl19Yy50bT1iO2IucHJvdG90eXBlPXt6bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQW06dGhpcy5EdihhKX0sRHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkV2OnRoaXMuUmooYSl9LFJqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Tajp0aGlzLkpwKGEpfSxKcDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLktwOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qbjp0aGlzLldvKGEpfSxXbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWG86dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5wazp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpvOnRoaXMuUG8oYSl9LFBvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMudG18fGhhLHNjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLnptKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlRvPSExO3RoaXMuQ2I9InNldHVwIjt0aGlzLk5jPVtdO3RoaXMubmUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuSHQuYmluZCh0aGlzKSk7dGhpcy5uYj17fTt0aGlzLlJnPXt9O3RoaXMuZGY9ITF9Yy5maz1iO2IucHJvdG90eXBlPXtUdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5uYil0aGlzLm5iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm5iW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5kZnx8KHRoaXMuZGY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmRmfSxvYjpmdW5jdGlvbihhKXt0aGlzLm5iW2FdfHwodGhpcy5uYlthXT0wKTt0aGlzLm5iW2FdKz0xOzU8dGhpcy5uYlthXSYmIXRoaXMuUmdbYV0mJih0aGlzLlJnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuVHUoKSwhMCkpfSxuZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LApldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUW46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEh0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLkd0KGEuZGF0YSl9LEd0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCwKZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGdlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LG9nOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR2coYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmpoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxHZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsKaWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sTm46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLnFxKGEpKXJldHVybjsoYj10aGlzLm9nKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0scXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sCndnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxMcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx4ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEZnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxQaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50OwpyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxFZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLHE9MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCoKZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5FZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmUoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHplOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sS2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt5PWs7dT1tO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKHEsNSkrKG5eCnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKG0pK2IobCkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxIcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGhkOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT0KbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17TGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sZnI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sRWw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sVW06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LApRazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LGltOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sSG86ZnVuY3Rpb24oKXtyZXR1cm4gYS5MaSgpfHxhLlVpKCl8fGEuZnIoKXx8YS5FbCgpfHxhLlVtKCl8fGEuUWsoKXx8YS5pbSgpfX07cmV0dXJuIG51bGwhPWEuSG8oKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxaYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxmYTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxJcTpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sd3A6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sRnU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQmc6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmNpKGIpKyI6Iit0aGlzLmNpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5DYj1hfSx5ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkNiO3RoaXMuY2UoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTsKYS5kaXNwYXRjaEV2ZW50KGYpfSxCYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMueWcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5CYyhCKX0sSnQ6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTsKYi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5JcSgpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LE11OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5ZYigpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuY2UoYSl9LGNlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSnQoYSk7aWYoYilpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2UoYil9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLkpjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9bS5KYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYik7Cm0ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxLZDpmdW5jdGlvbihhKXtpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGIsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLkpjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LExlOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLmJwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxlKCl9LmJpbmQodGhpcyksNTAwKX0sdmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmtiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx5ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sa2I6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5uZChhKToiIn0sbmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy55ZShhKTsKYiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxjZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuR2UoYSl8fHRoaXMuTHIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5jZiYmd2luZG93LnNhbmRib3guY2ZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5jZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5jZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy53ZyhhKSlyZXR1cm4gdGhpcy53ZyhhKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5hYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIucWQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuTm4oZSxhKTtyZXR1cm4gZX0sYWI6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyxrKXt2YXIgbD1lfHxtO2U9ITA7ayYmKGU9ITEpO2lmKGwmJmwuVilpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihhLGIsZCxmLGMsbCxnLGspfS5iaW5kKHRoaXMpLDUwMCl9LGpoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxsczpmdW5jdGlvbihhLGIsZCl7dGhpcy5qaChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5OYylmb3IodmFyIGMgaW4gdGhpcy5OYylhPWEuc3BsaXQoYykuam9pbih0aGlzLk5jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS54YihhKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxraDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGEsZi5MYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMubHMoZi5xZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCnl1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk5jPWF9LEd3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5hYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sRnI6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9fX0pKGMpO3ZhciBRPWMuZmt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPQphfHx7fX1jLmVrPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IudXQ9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuRXM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iua3c9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5icT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnR3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWGY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuUGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5VZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5ZZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuRm49e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuU2Y9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5Qdj17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuY3E9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5vdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5rZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnFwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5kZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLnljPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5XZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuSG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5VYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuJGQ9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuYmU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLkduPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5qaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLkhzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5sZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuaXc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTHY9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk12PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Ldj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLkZzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5la3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hbD10aGlzLmFbNl07dGhpcy5xaj10aGlzLmFbNF07dGhpcy5rdD10aGlzLmFbM107dGhpcy54aj10aGlzLmFbMTBdO3RoaXMubHE9dGhpcy5hWzEwXTt0aGlzLmxqPXRoaXMuYVs1XTt0aGlzLkl2PXRoaXMuYVs0XTt0aGlzLkp1PXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuTGw9YjtiLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFsOnRoaXMucGooYSl9LHBqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xajp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMua3Q6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhqOnRoaXMua3EoYSl9LGtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5scTp0aGlzLmtqKGEpfSwKa2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmxqOnRoaXMuSHYoYSl9LEh2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jdjp0aGlzLkl1KGEpfSxJdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSnU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLkxsfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy4kayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmdrPWI7Yi5wcm90b3R5cGU9e3plOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxsYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LERxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LGxkOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5sZChhKwo2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5sZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuemUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmxkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxBcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxZZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnplKHRoaXMuRHEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5sZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIEo9CmMuZ2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ209dGhpcy5hWzldO3RoaXMuRnc9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMuT2w9YjtiLnByb3RvdHlwZT17Zm06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdtOnRoaXMuRXcoYSl9LEV3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gdzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuT2x8fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLmZtKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzoKLy4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5naj1ifSkoYyk7dmFyIEw9Yy5nanx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc209dGhpcy5hWzFdO3RoaXMuemk9dGhpcy5hWzNdO3RoaXMuQ209dGhpcy5hWzldO3RoaXMuT2o9dGhpcy5hWzZdO3RoaXMuZXI9dGhpcy5hWzEwXTt0aGlzLndsPXRoaXMuYVs2XTt0aGlzLnd2PXRoaXMuYVsxXTt0aGlzLlBwPXRoaXMuYVs0XTt0aGlzLkVuPXRoaXMuYVs3XTt0aGlzLkJwPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuRG09YjtiLnByb3RvdHlwZT17cm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNtOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56aTp0aGlzLkJtKGEpfSxCbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ206dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9qOnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5lcjp0aGlzLnZsKGEpfSx2bDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud2w6dGhpcy52dihhKX0sdnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMud3Y6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBwOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbjp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLkRtfHxsYSx4Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5ybSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLlNsPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5LYz0xMDA7dGhpcy5JYj0wO3RoaXMuV2E9MTUwO3RoaXMuTGI9MDt0aGlzLnJ1KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYT8KKHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKX0sYnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxiZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHJ1OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSxCcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmxhKCldPWI7TSYmTS5naCYmTS5TdShiKX0sdHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/CiEwOiExfSxHcjpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEx4OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuU2x8fHQ7KGZ1bmN0aW9uKGMpe2MuVWw9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5LYz0xMDt0aGlzLkliPTA7dGhpcy5XYT01MDt0aGlzLlg9bnVsbDt0aGlzLm5hPSExO3RoaXMucGxheWVyPWI7dGhpcy5CYj0iIjt0aGlzLnFnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuS2EoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD0KaC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxCdTpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sdXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSx1dTpmdW5jdGlvbihiKXt0aGlzLk9lPWJ9LHN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2V9LE5lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLktjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7CmVsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxFZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxCZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LE54OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLldxKCl8fHRoaXMuSm4oKTt0aGlzLkJkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sdng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sSm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sV3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxBYTpmdW5jdGlvbigpe3JldHVybiExfSxEeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hfSxjYTpmdW5jdGlvbigpe3RoaXMubmE9ITB9LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmCmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSmg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxyeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSxFaDpmdW5jdGlvbigpe3RoaXMuQmI9bnVsbH0seHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkJiJiYoYj0hMCk7cmV0dXJuIGJ9LEl4OmZ1bmN0aW9uKCl7dGhpcy5xZ3x8KHRoaXMucWc9ITApfSx1ZTpmdW5jdGlvbigpe3JldHVybiExfSxveDpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5VbHx8cDsoZnVuY3Rpb24oYyl7Yy51aT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLkxmPQoiMSI7dGhpcy5NZj0iMiI7dGhpcy51bj0iMyI7dGhpcy5RYz0wO3RoaXMubmg9MzA7dGhpcy5SYj1bXTt0aGlzLmdiPVtdO3RoaXMub2M9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuWmY9dGhpcy5maT0hMTt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5nZihiKTt0aGlzLnN1KGEpfSxnOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuZml8fCh0aGlzLmZpPSEwLGUuTGUoKSl9LFNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5hYyYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0seHI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2Eua2EoKV18fCh3aW5kb3dbYS5rYSgpXT17fSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXXx8KHdpbmRvd1thLmthKCldW2IubGEoKV09Cnt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWWIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXT0xfSxEcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmthKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldLmluaXRpYXRvciE9ZS5ZYigpJiYodGhpcy5oZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnhhKCkpe3RoaXMueHIoKTtpZighdGhpcy5EcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5oZigpO3JldHVybn10aGlzLmhmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5aaCgpO3RoaXMuWmY9ITA7YSYmImZ1bmN0aW9uIj09CnR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5nYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYodGhpcy5SYj1lLnVuaXF1ZSh0aGlzLlJiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5SYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGg9MDtoPHRoaXMuZ2IubGVuZ3RoO2grKyl0aGlzLm9jW3RoaXMuZ2JbaF0ucmVhc29uXT09dGhpcy5vY1tiXSYmYS5wdXNoKHRoaXMuZ2JbaF0uZGV0YWlsKSx0aGlzLm9jW3RoaXMuZ2JbaF0ucmVhc29uXTx0aGlzLm9jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5nYltoXS5kZXRhaWwpLGI9dGhpcy5nYltoXS5yZWFzb24pO3RoaXMub2NbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSwKYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sd3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGhmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0senU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnVufSxvYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0seGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuUWN9LGdmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sc3U6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sb3M6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIHY9Yy51aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5acD10aGlzLmFbOV07dGhpcy5Rcj10aGlzLmFbNl07dGhpcy5Hdj10aGlzLmFbN107dGhpcy52bz10aGlzLmFbNV07dGhpcy5nbj10aGlzLmFbNV07dGhpcy51cD10aGlzLmFbOF07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy50aj1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY2w6dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpwOnRoaXMuUHIoYSl9LFByOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Rcjp0aGlzLkZ2KGEpfSxGdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuR3Y6dGhpcy51byhhKX0sdW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZvOnRoaXMuZm4oYSl9LApmbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmduOnRoaXMudHAoYSl9LHRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cDp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLnRqfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5ibCg0KTsoZnVuY3Rpb24oYyl7Yy5Iaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ianx8b2E7KGZ1bmN0aW9uKGMpe2MuSWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLmZ4O2E/YS5xYT9hLnFhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7CmYuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuSWp8fHBhOyhmdW5jdGlvbihjKXtjLkpqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiYKd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Kanx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhvPXRoaXMuYVsxMF07dGhpcy5xcz10aGlzLmFbNF07dGhpcy55dD10aGlzLmFbNF07dGhpcy5hbz10aGlzLmFbM107dGhpcy5Bcz10aGlzLmFbNF07dGhpcy5rdj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs2XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueG86dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFzOnRoaXMueHQoYSl9LAp4dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueXQ6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmFvOnRoaXMuenMoYSl9LHpzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Bczp0aGlzLmp2KGEpfSxqdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua3Y6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLlVvfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy53byg0KTsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMudmcoKTt0aGlzLnhnKCk7dGhpcy5wcD0hMX0sdmc6ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKYnx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seGc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpOwphLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk9lJiYoMCx0aGlzLk9lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJgpiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Da3x8c2E7KGZ1bmN0aW9uKGMpe2MuQms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYWU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiYKYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5TYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5TZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmgmJgohdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS53ZCgpLGEucGUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuU2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5TZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5uaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlRjLmluZGV4T2YoYSkmJgp0aGlzLlRjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5UYy5sZW5ndGg+PXRoaXMuYWUmJnRoaXMubSgpKX0sb3M6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xOnRoaXMucmU/dGhpcy5yZSsrOnRoaXMucmU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUGgoYS52aWRlb1RhZyk/YS5iYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlNjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMucmU+dGhpcy5zZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnZnKCksYS54ZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ca3x8dGE7KGZ1bmN0aW9uKGMpe2MuRGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy55cSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLkdyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0scXg6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCnlxOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ea3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdzPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzJdfWMuTXc9YjtiLnByb3RvdHlwZT17ZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmdzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgd2E9Yy5Nd3x8d2EsQWM9bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuZnMoNCk7KGZ1bmN0aW9uKGMpe2MuSG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLkpkKGIpfS5iaW5kKHRoaXMpKX0sSmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LERlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpOwppZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxBYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5IbXx8eGE7KGZ1bmN0aW9uKGMpe2MuR209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkVjPXRoaXMuQ2E9dGhpcy5YYz0hMTt0aGlzLkFoPWUuSGIoMTApO3RoaXMuZWk9ITA7dGhpcy50Yz10aGlzLlZnPSExO3RoaXMuQ3MoYi5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLnFoKCksdGhpcy5ZbygpLHRoaXMucWIoKSl9LENzOmZ1bmN0aW9uKGIpe3JldHVybiBlLmZhKCJ0LW9ubGluZS5kZSIpPyExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LEp4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLAoiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuSiwiOyIsdHlwZW9mIGIuSiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLklhP2IuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuSWE/dHlwZW9mIGIuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5ZZDoKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLllkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/CnR5cGVvZiBiLkoucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5oZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmhlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuQWgpfSx5YjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmCih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMueWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnFhPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnFhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnFhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnFhfSxJZzpmdW5jdGlvbigpe2lmKCF0aGlzLkVjKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRWM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkVjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRWN9LEVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVWcpe3ZhciBiPQp0aGlzLnliKCksYT10aGlzLkNyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5VZz0hMCl9cmV0dXJuIHRoaXMuVWd9LENyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5YYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuWGM9ITApO3JldHVybiB0aGlzLlhjfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsaD0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5VdCgpfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxVdDpmdW5jdGlvbigpe3RoaXMudGM9ITA7dmFyIGI9dGhpcy5JZygpO2lmKGJ8fHRoaXMueGEoKSl7dmFyIGE9ImFkRXJyb3IiLGg9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuVmEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnVjPQohMDtpZihlLmZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIisKZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnVjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5nYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LHB4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5uZyYmYi5hZHMmJih0aGlzLm5nPWIuYWRzKTtyZXR1cm4gdGhpcy5uZ30sWW86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7CnRoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlNlKCl9LmJpbmQodGhpcykpfSxmZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuSWcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCkpfSxxaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5FcigpKXt2YXIgYT10aGlzLnliKCksaD10aGlzLlhiKCk7YSYmaCYmKHRoaXMueWIoKSx0aGlzLlhiKCksdGhpcy50Y3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5WZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnliKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5nYSgpKToodGhpcy5nYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuVmc9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xaCgpfS5iaW5kKHRoaXMpLDUwKX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7CmlmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sWm86ZnVuY3Rpb24oKXt0aGlzLnpjfHwodGhpcy56Yz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuemMhPWIuYWRzLnN0YXRlJiYodGhpcy56Yz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09CnRoaXMuemMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy56Yz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWm8oKX0uYmluZCh0aGlzKSwxMCl9LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS5aYihkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpKX0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmVpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmVpLGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKZ3A6ZnVuY3Rpb24oKXt0aGlzLnl4fHwoMTA8dGhpcy5Xdj8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLld2KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuYXUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ3AoKX0uYmluZCh0aGlzKSw1MCkpKX0sYXU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuWHYpe3RoaXMuWHY9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpOwpiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5HbXx8eWE7KGZ1bmN0aW9uKGMpe2MuSW09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlFoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5RaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxRaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLnhlKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpfX0pfSkoYyk7dmFyIHphPWMuSW18fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaj10aGlzLmFbMl07dGhpcy5DdD10aGlzLmFbOV07dGhpcy5vbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs4XX1jLklrPWI7Yi5wcm90b3R5cGU9e1lqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWmo6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkN0OnRoaXMubm8oYSl9LG5vOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMuSWt8fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5Zaig0KTsoZnVuY3Rpb24oYyl7Yy5JbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLlVlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlcoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LER0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQmIsaD10aGlzLmxhKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTsKZCYmYSYmYS5hYyYmKDA8PWguaW5kZXhPZihkKXx8YS53ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxBYTpmdW5jdGlvbigpe3RoaXMuVWUrKztpZigxMDx0aGlzLlVlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLAoiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LEpkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgQ2E9Yy5JbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuSGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXtpZighdGhpcy50ZSlpZih0aGlzLkRifHwKKHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksCjEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKX19LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQ2EoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLmdxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELApmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5tKCl9LmJpbmQodGhpcykpLHRoaXMuZ3E9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5EdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5IbHx8RGE7KGZ1bmN0aW9uKGMpe2MuSmw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYKMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm5hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9CmMuSmx8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ldD10aGlzLmFbNF07dGhpcy5Ldz10aGlzLmFbN107dGhpcy5MdT10aGlzLmFbN107dGhpcy53cj10aGlzLmFbNF07dGhpcy5UbT10aGlzLmFbMTBdO3RoaXMuc249dGhpcy5hWzddO3RoaXMudXI9dGhpcy5hWzFdO3RoaXMuWGo9dGhpcy5hWzEwXTt0aGlzLnF3PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzFdfWMuQWk9YjtiLnByb3RvdHlwZT17ZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmV0OnRoaXMuSncoYSl9LEp3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS3c6dGhpcy5LdShhKX0sS3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkx1OnRoaXMudnIoYSl9LHZyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy53cjp0aGlzLlNtKGEpfSxTbTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLlRtOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbjp0aGlzLnRyKGEpfSx0cjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudXI6dGhpcy5XaihhKX0sV2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Yajp0aGlzLnB3KGEpfSxwdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnF3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgR2E9Yy5BaXx8R2EsQ2M9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Q2MuZHQoNCk7KGZ1bmN0aW9uKGMpe2Mudms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuRmcoYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJgooYT1hLnBhcmVudE5vZGUpfXRoaXMuRnQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLkZ0KXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlcoaCk7dGhpcy5aKGgpOwp0aGlzLmpkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5qZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuamQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxmcDpmdW5jdGlvbigpe2UuYWgodGhpcy5qZCk7ZS5FZSh0aGlzLmpkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sSWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBIYT1jLnZrfHxIYTsoZnVuY3Rpb24oYyl7Yy51az12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy51a3x8SWE7KGZ1bmN0aW9uKGMpe2Mud2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj0KbC5pbnJlYWQsYT1lLkZnKGIsImVsZW1lbnRJRCIpO2lmKGUuYWgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEphPWMud2t8fEphLEthPW5ldyBKYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5iaj10aGlzLmFbOV07dGhpcy5BbD10aGlzLmFbMTBdO3RoaXMuV2w9dGhpcy5hWzZdO3RoaXMuY3Q9dGhpcy5hWzFdO3RoaXMuSWk9dGhpcy5hWzRdO3RoaXMuTXA9dGhpcy5hWzldO3RoaXMuJGk9dGhpcy5hWzFdO3RoaXMuc3M9dGhpcy5hWzddO3RoaXMuUHE9dGhpcy5hWzNdOwp0aGlzLllyPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuU249YjtiLnByb3RvdHlwZT17YWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmJqOnRoaXMuemwoYSl9LHpsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5BbDp0aGlzLlZsKGEpfSxWbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuV2w6dGhpcy5idChhKX0sYnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jdDp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSWk6dGhpcy5McChhKX0sTHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1wOnRoaXMuWmkoYSl9LFppOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kaTp0aGlzLnJzKGEpfSxyczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3M6dGhpcy5PcShhKX0sT3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlBxOnRoaXMuWHIoYSl9LFhyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ZcjoKdGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTGE9Yy5Tbnx8TGEsRGM9bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGMuYWooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmhrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LHR1OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sS246ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5oa3x8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApoLGQsZil7dGhpcy5mYj1hO3RoaXMuQWc9dGhpcy5uaT0hMTt0aGlzLnJoPWQ7dGhpcy5SaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5mYj1uZXcgeihhKSk7dmFyIGM9dGhpcy5zYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5IZSh0aGlzLmZiLnVybCkmJm0uTWQpe3ZhciBlPW5ldyB6KGEudXJsKTtlLnR1KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmCihiPSEwKTtifHxtLmlhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5pYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuaWs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZmIuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuQWcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLlJoP3RoaXMuc2Iub3Blbih0aGlzLmZiLm1ldGhvZCx0aGlzLmZiLnVybCwhMSk6dGhpcy5zYi5vcGVuKHRoaXMuZmIubWV0aG9kLHRoaXMuZmIudXJsLCEwKSx0aGlzLm5pfHwodGhpcy5zYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuc2Iuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLnNiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLnNiLnNlbmQoYSl9Y2F0Y2goZil7bSYmbS5IZSh0aGlzLmZiLnVybCk/bS5NZD9tLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkhlKHRoaXMuZmIudXJsKSx0aGlzLnJoJiZ0aGlzLnJoKCl9cmV0dXJuIHRoaXMuc2J9fX0pKGMpO3ZhciBNYT1jLmlrfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGE9dGhpcy5WZD0hMX1jLmhqPWI7Yi5wcm90b3R5cGU9e3h1OmZ1bmN0aW9uKGEpe3RoaXMuVmQ9YX0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5IYT1hfSxadDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLCJyZWdpc3RlcmluZ3MgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYixhKX0pfXZhciBiPXtQdzoiQWRDbGlja1RocnUiLFJ3OiJBZEVycm9yIixTdzoiQWRTdG9wcGVkIixWdzoiQWRMaW5lYXJDaGFuZ2UiLFd3OiJBZFRhZ1BhcnNlZCIsWnc6IkFkVmlkZW9Db21wbGV0ZSIsYng6IkFkTG9hZGVkIixjeDoiQWRTa2lwcGVkIixkeDoiQWRTdGFydGVkIixUdzoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLFV3OiJBZEltcHJlc3Npb24iLFF3OiJBZENyZWF0aXZlVmlldyIsWHc6IkFkVmlkZW9NaWRwb2ludCIsWXc6IkFkUGF1c2VkIiwkdzoiQWRWaWRlb1N0YXJ0IixheDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGI9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLlZkLGJbZF0pfSxZdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSwKYil7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGIsYSl9KX1pZih0aGlzLkhhJiZ0aGlzLkhhLlVkKWZvcih2YXIgYiBpbiB0aGlzLkhhLlVkKXRoaXMuSGEuVWQuaGFzT3duUHJvcGVydHkoYikmJmEodGhpcy5IYSx0aGlzLkhhLlVkW2JdKTt0aGlzLkhhJiZ0aGlzLkhhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhLmdldEVycm9yKCk7YSYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixhKX0uYmluZCh0aGlzKSwxMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLlZkJiZ0aGlzLlp0KCk7dGhpcy5IYSYmdGhpcy5ZdCgpfX19KShjKTt2YXIgTmE9Yy5oanx8TmE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlVhPSExO3RoaXMud2M9IiI7dGhpcy5pZT0KdGhpcy52Yz10aGlzLndiPW51bGw7dGhpcy54cD10aGlzLkpiPXRoaXMuaWg9ITE7dGhpcy5MYT0iIjt0aGlzLmRoPSExO3RoaXMud2E9dGhpcy5vZD0iIjt0aGlzLlpnPXRoaXMuVj10aGlzLmlzRW5hYmxlZD10aGlzLiRlPSExO3RoaXMucGE9W107dGhpcy5PZz10aGlzLmZjPSIiO3RoaXMucWU9ITE7dGhpcy5xZj0wO3RoaXMuR2Y9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5FZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuUWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMubmM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLmhjPSIiO3RoaXMuaWM9W107dGhpcy5qYz1bXTt0aGlzLklkPVtdO3RoaXMuZ2M9IiI7dGhpcy5yZj0wO3RoaXMudmlkZW9wbGF6YT0Ke307dGhpcy5EYz0hMTt0aGlzLmhwPXRoaXMuT2Q9bnVsbDt0aGlzLkxoPXRoaXMubGM9dGhpcy5zZz10aGlzLnVmPXRoaXMuTWQ9dGhpcy5rZT10aGlzLlJjPSExO3RoaXMuaGI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMucGQ9MDt0aGlzLlFnPSExO3RoaXMuUGc9MUUzO3RoaXMuWmM9ITE7dGhpcy5RYT0xRTM7dGhpcy5PZj0iIn1jLmprPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMud2MsYWR0YWdtb2RpZmllcjp0aGlzLndiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy52YyxhZHRhZ3JlZ2V4OnRoaXMuaWUsYml0cmF0ZTp0aGlzLlFhLGpzcG9wdXBzOnRoaXMuaWgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMueHAsaG9tYWRBbGlhczp0aGlzLkxhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5kaCxnbG9iYWxDb25maWc6dGhpcy5vZCxjbGllbnRDb25maWc6dGhpcy53YSwKaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5WLGlzQmxvY2tlZDp0aGlzLlpnLHNlcnZlcjp0aGlzLnBhLHN2bUNvbmZpZzp0aGlzLmZjLGhvbWFkQWRwYXRoOnRoaXMuT2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5xZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5xZixIT01BRF9WRVJJRklFRDp0aGlzLkdmLEhPTUFEX0JMT0NLRUQ6dGhpcy5FZixIT01BRF9OT0JMT0NLRVI6dGhpcy5RYixIT01BRF9BREJMT0NLRVI6dGhpcy5uYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRmYsdGVzdEhpZGU6dGhpcy5oYyx0ZXN0VGFnczp0aGlzLmljLHRlc3RUYWdzSlM6dGhpcy5qYyx0ZXN0VGFnc1hIUjp0aGlzLklkLHRlc3RDb29raWU6dGhpcy5nYyx0aHJvdHRsZTp0aGlzLnJmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuRGMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5ocCxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlJjLApibG9ja2VkV2FzQ2FsbGVkOnRoaXMua2UsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTWQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudWYsY29uZmlnRmFpbHVyZXM6dGhpcy5oYixzaXRlQ29uZmlnOnRoaXMuRmEsc2VydmVySWQ6dGhpcy5JaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuamIsdnBhaWQ6dGhpcy5sYyxza2lwQWxsb3dlZDp0aGlzLkxoLHZtYXBzOnRoaXMua2ksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLlpjLGFkRmFsbGJhY2tVUkw6dGhpcy5PZn19LFVxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmhiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuaGJbYl0mJjE9PXRoaXMuaGJbYl0mJihhPSEwKTtyZXR1cm4gYX0sZWY6ZnVuY3Rpb24oYSl7dGhpcy5oYlthXT0hMH0senE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltiXSYmMT09dGhpcy5oYltiXSYmYS5wdXNoKGIpOwpyZXR1cm4gYX0sSGQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5MbyhhKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixnPSIiO2lmKCF0aGlzLlVhJiYhYilyZXR1cm4gbmV3IHooYSk7Zj10aGlzLkdlKGEpO2M9dGhpcy56YShhKTtmPyh0aGlzLkZjKCk/ZT1hOmU9Yy5wcm90b2NvbCsKIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5KYygpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLndjfHx0aGlzLndifHx0aGlzLnZjfHx0aGlzLmllKSYmKGc9dGhpcy55cyhnKSk7YT1uZXcgeihlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkFxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGcpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sR2U6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/CmI9ITA6dGhpcy5GYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sRmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMucGEmJnRoaXMucGEubGVuZ3RoJiYwPHRoaXMucGEubGVuZ3RoJiYoYj10aGlzLnBhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEhlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuR2UoYSk7cmV0dXJuIGJ9LEFxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT0KdHlwZW9mIHRoaXMuTGEmJjA8dGhpcy5MYS5sZW5ndGgpcmV0dXJuIHRoaXMuTGE7Zm9yKGQgaW4gdGhpcy5MYSlpZihiPXRoaXMuTGFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5reDtyZXR1cm4ibm9uZSJ9LHFkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFbdGhpcy5JaF19LEpjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5xZCgpLGI9dGhpcy5LaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxvaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx4czpmdW5jdGlvbihhLApiKXt2YXIgZD1lLnphKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxDPTA7QzxnLmxlbmd0aDtDKyspe3ZhciBrPWdbQ10uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5vaChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMub2goZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx5czpmdW5jdGlvbihhKXt0aGlzLndjJiYoYSs9dGhpcy53Yyk7aWYodGhpcy53Yilmb3IodmFyIGIgaW4gdGhpcy53Yil0aGlzLndiLmhhc093blByb3BlcnR5KGIpJiYKKGE9YS5yZXBsYWNlKGIsdGhpcy53YltiXSkpO3RoaXMudmMmJihhPXRoaXMueHMoYSx0aGlzLnZjKSk7cmV0dXJuIGF9LGVwOmZ1bmN0aW9uKCl7dGhpcy5GYSYmdGhpcy5GYS5jbGllbnRBUElzJiZ0aGlzLiRvKHRoaXMuRmEuY2xpZW50QVBJcyl9LCRvOmZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiPW5ldyBOYTthLnB1Ymxpc2hlckFQSSYmYi54dShhLnB1Ymxpc2hlckFQSSk7YS5wbGF5ZXImJmIud3UoYS5wbGF5ZXIpO2IuZygpfX0sbDpmdW5jdGlvbihhLGIsZCxmLGMsZSl7bT10aGlzO3RoaXMuZGg9ITA7dGhpcy5vZD1hO3RoaXMud2E9Yjt0aGlzLiRlPWQ7dGhpcy5PZD1mO3RoaXMuQWM9Yzt0aGlzLkZhPWV8fHt9O3RoaXMuZXAoKTt0aGlzLmtzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLndhKXRoaXMuaHMoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9YigpLHRoaXMueGMoKX1jYXRjaChnKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iLHRoaXMueGMoKX1jYXRjaChrKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfX0scGI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGtzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLm9kK3RoaXMuZmUoImdsb2JhbCIpKSx0aGlzLlFxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMueGMoKX0uYmluZCh0aGlzKSwhMCl9LGhzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLndhK3RoaXMuZmUoImNsaWVudCIsLTEhPXRoaXMud2EuaW5kZXhPZigiPyIpKSksdGhpcy54Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5lZigiY2xpZW50Iik7dGhpcy5pYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLAohMCl9LGZlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5IYigpKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5GYSYmdGhpcy5GYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGlhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmtlKXt0aGlzLmtlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChoKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwphPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkFjPSExKTt0aGlzLkFjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQWM/dGhpcy5BYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5WPXRoaXMuWmc9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkVmKSk7dGhpcy5OYigpO2UuQmMoay51dCk7KGI9ZS5aYih0aGlzLnFkKCkpKXx8KGI9ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sUXE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLndhfHx0aGlzLmZjfHx0aGlzLkxhfHx0aGlzLnhjKCk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLlFiKSksdGhpcy5OYigpKX19LHhjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLndhfWVsc2UgYT10aGlzLndhO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYS5lbmFibGVkKTt0aGlzLlY9IXRoaXMuaXNFbmFibGVkO3RoaXMucGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5mYSgid2ViLmRlIil8fGUuZmEoImdteC5uZXQiKXx8ZS5mYSgiZ214LmF0Iil8fGUuZmEoImdteC5jaCIpfHxlLmZhKCIxdW5kMS5kZSIpKSYmIXRoaXMuRmMoKSlmb3IoYj0wO2I8dGhpcy5wYS5sZW5ndGg7YisrKXRoaXMucGFbYl09dGhpcy5wYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmZjPWEuY29uZmlnfHwiIjt0aGlzLkxhPWEuYWxpYXN8fApudWxsO3RoaXMuT2c9YS5hZHBhdGh8fCIiO3RoaXMucWU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5JaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5wYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmZjJiZ0aGlzLkxhJiZ0aGlzLnBhLmxlbmd0aD90aGlzLkdjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxHYzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkpjKCkpLGQ9dGhpcy56YSh0aGlzLmZjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0KIlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmZjK3RoaXMuZmUoImN1c3RvbWVyIikpO3RoaXMuRGEoYix0aGlzLlZ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJjdXN0b21lciIpO2E/dGhpcy5obT90aGlzLmlhKCJub1NWTUNvbmZpZyIpOih0aGlzLmhtPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5HYyghMCl9LmJpbmQodGhpcyksITApfX0sVnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5EYz0hMDt0aGlzLkdjKCEwKTtyZXR1cm59fXRoaXMuTWQ9dGhpcy5NYihiLnN0cmljdCk7dGhpcy51Zj10aGlzLk1iKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnNnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj0KdGhpcy5NYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYi5lbmFibGVkKTt0aGlzLmhjPWIudGVzdGhpZGV8fCIiO3RoaXMuamM9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5JZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMud2M9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy53Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy52Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuaWU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuaWg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5KYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5sYz1iLnZwYWlkfHwhMTt0aGlzLkZhLnZwYWlkPXRoaXMubGM7dGhpcy5MaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLiRjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5raT1iLnZtYXBzfHwiIjt0aGlzLlpjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fAoxRTM7dGhpcy5PZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5nYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLkhxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5xZSYmKHRoaXMuZ2M9bnVsbCk7dGhpcy5yZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5EYz0hMCx0aGlzLkdjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLm52KCkmJih0aGlzLmhjfHx0aGlzLmpjfHx0aGlzLmljfHx0aGlzLmdjfHx0aGlzLklkKT90aGlzLiRlPyh0aGlzLlVhPXRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5RYikpLHRoaXMubWUoKSx0aGlzLk5iKCkpOnRoaXMuWnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy4kdSgpKX19LFp1OmZ1bmN0aW9uKCl7dGhpcy5ZdSgpOwp0aGlzLmF2KCl9LGF2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksQz1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLAoiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEMpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnhiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPQpkKXt2YXIgYz1lLmhkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkZhJiZ0aGlzLkZhLnBsYXllciYmdGhpcy5GYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sJHU6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LE9jOmZ1bmN0aW9uKGEpe3RoaXMuUmM9ITA7dGhpcy5WfHwodGhpcy5WPXRoaXMuVWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLk5iKCksdGhpcy5tZSgpKX0sWXU6ZnVuY3Rpb24oKXtpZih0aGlzLmhjKXt2YXIgYT1lLmhkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5oaCgpKXRoaXMuT2ModGhpcy5uYywKIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmhjKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaGMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuVmgoKX19ZWxzZSB0aGlzLlZoKCl9LFVoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLmR2KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5uZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmljPXRoaXMuSWQpJiZ0aGlzLmljLmxlbmd0aCl7dmFyIGQ9dGhpcy5pYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLm5mKCl9LGR2OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkRhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxWaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtjPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsCnRoaXMuSGIoKSk7dGhpcy5ldihjLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVWguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLk9jKHRoaXMubmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrYysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuamMmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksYzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuVWgoKX0sZXY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGMoKXtnKCkmJmIoKX1mdW5jdGlvbiBlKCl7ZygpJiZkKCl9ZnVuY3Rpb24gZygpe3JldHVybiBDPyh3aW5kb3cuY2xlYXJUaW1lb3V0KEMpLCEwKTohMX12YXIgQz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2MoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZnKCkmJmUoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTsKay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWM7ay5vbmVycm9yPWU7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlKX1jYXRjaChsKXtjKCl9fSxuZjpmdW5jdGlvbigpe3RoaXMuZ2M/KHRoaXMucWYrKyx0aGlzLkRhKG5ldyB6KHRoaXMuZ2MpLHRoaXMuWHUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMub2YoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5TaCgpfSxvZjpmdW5jdGlvbihhKXt0aGlzLk9jKHRoaXMuRmYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxYdTpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5xZj90aGlzLm5mKCk6dGhpcy5vZigiQkJCIik6CiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlNoKCk6dGhpcy5vZigiQUFBIil9LFNoOmZ1bmN0aW9uKCl7dGhpcy5WPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMubWUoKX0saGg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlJjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS5mYSgidC1vbmxpbmUuZGUiKXx8ZS5mYSgiZ2lnYS5kZSIpfHxlLmZhKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLmhoKCksITApOwpkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5HZikpO3RoaXMuT2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5PZCYmdGhpcy5PZCgpfSxjcDpmdW5jdGlvbigpe2lmKHRoaXMudWYmJnRoaXMuVXEoKSl7dmFyIGE9dGhpcy56cSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sWmg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxEYTpmdW5jdGlvbihhLGIsZCxjLHEsZyl7dGhpcy5wZHx8KHRoaXMucGQ9MCk7dGhpcy5wZCsrO3RoaXMucGQ+dGhpcy5QZyYmIXRoaXMuUWcmJih0aGlzLlFnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5QZywhMCkpO2E9bmV3IE1hKGEsCmIsZCk7YyYmKGEubmk9ITApO3EmJmUuSHIoKSYmKGEuQWc9ITApO2cmJihhLlJoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGFwOmZ1bmN0aW9uKCl7ZS5WYSgpfHxlLmFiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxjPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/CmEuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5GYygpfHwoYT10aGlzLnphKGMpLGM9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Zy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtnLm5ldHdvcmtTdGF0ZT09Zy5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5pYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2cuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2cuc2V0QXR0cmlidXRlKCJzcmMiLGMpfWVsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sV3U6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PQp0aGlzLmtpfSxicDpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuRGEoYSx0aGlzLk92LmJpbmQodGhpcyksdGhpcy5Odi5iaW5kKHRoaXMpKX0sT3Y6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1kfHx0aGlzLmVxKCl9LE52OmZ1bmN0aW9uKCl7fSwKZXE6ZnVuY3Rpb24oKXtlLkJjKGsuY3EpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaWEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LG1lOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuSmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5KYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkpiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgSjt3aW5kb3dbZC5rYSgpXT10aGlzO2UuYWIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sbnY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5yZn0sSHE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgphLmxlbmd0aCldfSxIYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsYyxlLGcsayxsLG09MDttPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSxnPWQ+PjIsZD0oZCYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGMpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LHphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGM9MTQ7Yy0tOylkW2JbY11dPWFbY118fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LEtoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZCxoO2ZvcihkPTc7MDw9ZDtkLS0paD1hPj4+NCpkJjE1LGMrPWgudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGc9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdSx2LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8bi0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZSk7CnN3aXRjaChuJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChuPj4+MjkpO3gucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKylnW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspZ1tjXT1kKGdbYy0zXV5nW2MtOF1eZ1tjLTE0XV5nW2MtMTZdLDEpO2U9aztuPWw7cD1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1kKGUsNSkrKG4mcHx+biZ1KSt2K2dbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWQoZSw1KSsobl5wXnUpK3YrZ1tjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz00MDs1OT49YztjKyspdz1kKGUsNSkrKG4mcHxuJnV8cCZ1KSt2K2dbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihyKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5qa3x8T2EsbT1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxuPXRoaXMuYVs5XTt0aGlzLnh3PXRoaXMuYVsxXTt0aGlzLmxtPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzNdfWMuWm49YjtiLnByb3RvdHlwZT17a246ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxuOnRoaXMud3coYSl9LHd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHc6dGhpcy5rbShhKX0sa206ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgUGE9Yy5abnx8UGEsRWM9bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RWMua24oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5mLlA/dGhpcy5iYj1hLmYuUCgpOgp0aGlzLmJiPSIiO2EuZi5YZyYmYS5mLlhnKHtwYXVzZTp0aGlzLndkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuR2guYmluZCh0aGlzKSxtdXRlOnRoaXMuUGUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy54di5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmliO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuVmI9dGhpcy5ZYz0hMTt0aGlzLkdvPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuRmQ9e307ZS5vYigibmV3QmlnQWRJZCIpO3RoaXMuT289ZS5hYSgxMCk7dGhpcy5sZj0wO3RoaXMuV2M9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5XYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmIuZikmJnRoaXMuYi5mLnMmJihhPXRoaXMuYi5mLnMoKSksdGhpcy5XYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYKKHRoaXMuUm49Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5zaD10aGlzLkVkPSExO3RoaXMubGg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmVlPSExO3RoaXMuYmk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuR2I9ZS5hYSgxMCk7dGhpcy5FYj1lLmFhKDEwKTt0aGlzLk1oPWUuYWEoMTApO3RoaXMuY29uZj17fTt0aGlzLlBkPXRoaXMuT2I9dGhpcy5vZT10aGlzLmVkPXRoaXMuR2Q9dGhpcy5yYj10aGlzLm1jPXRoaXMudWg9dGhpcy5rZD10aGlzLnB2PXRoaXMudWI9dGhpcy5GYj0hMTt0aGlzLnJjPVtdO3RoaXMuY2M9e307dGhpcy5zdD0yMDA7dGhpcy5CZj10aGlzLkNmPXRoaXMuamU9dGhpcy5BZj10aGlzLlplPSExO3RoaXMudmQ9e319Yy5kaz1iO2IucHJvdG90eXBlPXtvdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9CmF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sJGg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk91KCk7ZS52KGsuSG4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sS2U6ZnVuY3Rpb24oYSxiLGMsZil7dGhpcy51Yj1jO3ZhciBnPSExO2YmJmYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihnPSEwKTtpZih0aGlzLkwuVil0aGlzLmxmKyssZS5vYigibmV3U21hbGxBZElkIiksdGhpcy5MLmNwKCksZj1tLmdldENvbmZpZygpLHRoaXMuTC5VYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy4kaCgpLG5ldyBTKHRoaXMsYSx0aGlzLmxoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLApiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubGMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy4kaCgpLG5ldyBTKHRoaXMsYSx0aGlzLmxoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5MLmxjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Zi5RYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUmEoKTtlbHNle3ZhciB0Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0Yy5LZShhLGIsYyl9LDUwKX19LFZlOmZ1bmN0aW9uKGEpe2EuJGEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO3RoaXMuUGQ9dGhpcy5PYj10aGlzLmtkPSExO3RoaXMuYz1hO3RoaXMuQ3UodGhpcy5jKTt0aGlzLnZkPW5ldyBRYSh0aGlzLmMuUXYsdGhpcy52aWRlbyx7fSk7dGhpcy5MZyhhKTt0aGlzLnJjPXRoaXMuQ2coYSk7dGhpcy5rcCgpfSxMZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5GZD10aGlzLktxKGEpKSx0aGlzLkxnKGEucGFyZW50KSl9LENnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5DZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLnVxKGEpKSk7cmV0dXJuIGN9LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5VJiZhLlUuZ2V0QXR0cmlidXRlKXtiPWEuVS5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sS3E6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0iIjtpZihhLlUpe2I9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Zj1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLmtiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuJGEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYj0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGI9YS5lcnJvci5kZXRhaWwuY29kZSksYS5nZCYmYS5nZC5lcnJvciYmYS5nZC5lcnJvci5jb2RlJiYoYj1hLmdkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuUGMuY29kZTpiPT1HLldkLmNvZGU/ZS52KGsua3csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTooZS5MZSgpLGI9PUcuSmYuY29kZSYmZS52KGsuRHMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk7ZS52KGsuYnEsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSk7dGhpcy5QdSgpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS52KGsuUHYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5LZi5jb2RlOmUudihrLm93LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LlhkLmNvZGU6ZS52KGsudHcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy5UZC5jb2RlOmUudihrLkVzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5TZC5jb2RlOmUudihrLkx2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVtbXlhZCIpO2JyZWFrOwpjYXNlIHcuRGYuY29kZTplLnYoay5Ndix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5QYS5sZW5ndGg7KXRyeXt2YXIgYz1hLlBhLnBvcCgpO3RoaXMuSmUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LEN1OmZ1bmN0aW9uKGEpe3RoaXMub2U9ITE7dGhpcy5QYj10aGlzLmIuSzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5QYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTtpZihjJiZjLmVudnZhcnMpdHJ5e2I9Yy5lbnZ2YXJzKCkudmlkZW9TbG90LAp0aGlzLlplPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuS3g9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiZiLnNldEF0dHJpYnV0ZShnLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2ddKTt0aGlzLlJuJiZ0aGlzLnBsYXllci51ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIudWUoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuTy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5PW2NdLnR5cGUpJiYKdGhpcy5MbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuWmUmJmIubG9hZCgpO2lmKHRoaXMuV2goYikpe3RoaXMuTmgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuUG4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLlplP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2goayl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5ucCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSx0aGlzLkF1KCkpOnRoaXMuYy5vcmlnaW4udGcody5UZCl9LEF1OmZ1bmN0aW9uKCl7dGhpcy5BZj0hMDt0aGlzLnJiPXRoaXMubWM9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5sZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMucmI9ITApO2UubmUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4udmEmJmUuUW4odGhpcy5jLm9yaWdpbi52YSk7dGhpcy5OaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9RS5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi52aCgpO3RoaXMuYi5qZigpO2ZvcihhPXRoaXMuYi5LO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpOwphLnBhcmVudHx8dGhpcy5iLmpmKCk7dGhpcy50YT10aGlzLlBiPXRoaXMuYi5LO3RoaXMuZ2koInZwYWlkIik7aWYodGhpcy5yYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLktiKCJtdXRlZCIsImNvbnRlbnQiKTtlLnYoay50ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfXRoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLAoiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYy5OcSgpLGM9dGhpcy5jLkIuT3JpZ2luYWxBZFBhcmFtZXRlcnMsZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5jZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuTCk7dGhpcy5ILnNyYz1hO2UuZ2UoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYi5mLkFhJiYhdGhpcy5HZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsueWMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmIuJGIoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMucmM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdihhKTsKaWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5adigpLHRoaXMuYi4kYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuUGQ9ITA7ZS52KGsuamksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuRmUodGhpcy5PYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLiRiKCEwKSx0aGlzLmN3KCkpOyJBZFZpZGVvU3RhcnQiPT0KYS5kYXRhLm5hbWUmJih0aGlzLmIuJGIoITApLHRoaXMuZ3coKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZXcoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuZncoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5odygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5kdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5saSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5VYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5rZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXt0aGlzLkwuWmMmJihhPSJfYmxhbmsiKTt2YXIgYj13aW5kb3cub3BlbigiIiwKYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJ3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLnYoay5iZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiR2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5DZiYmKHRoaXMuQmY9ITEsdGhpcy5lYygpKSx0aGlzLmF3KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMucmI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLAohMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMucmI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGUudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfX0uYmluZCh0aGlzKSk7ZS5nZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTtlLmdlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7dGhpcy5iLiRmKGZ1bmN0aW9uKGEpe2UubWEodGhpcy5ILCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sJHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTsKdGhpcy50cmFjaygicGF1c2UiKTtlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5tYz0hMH0sYXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubWM9ITF9LGN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuV2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sWnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7CnRoaXMuT2goKTtlLnYoay5TZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxndzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxldzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLmtkPSEwO3RoaXMuWWEoImZpcnN0UXVhcnRpbGUiKTtlLnYoay5QZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxmdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5ZYSgibWlkcG9pbnQiKTtlLnYoay5VZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxodzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIik7ZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSl9LGR3OmZ1bmN0aW9uKCl7dGhpcy53ZigpO3RoaXMuWWEoImNvbXBsZXRlIil9LGxpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2UubmUoKTt0aGlzLkg9ITE7dGhpcy5SYShhKX19LFl2OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2c7IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGIubWF0Y2goYykpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLnYoay5pdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubGkoITApfSwKTG46ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7aWYoYi5VYSYmYi5pc0VuYWJsZWQmJiFiLkZjKCkpe3ZhciBkPWIuemEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWMoYix0aGlzLkwpO2Yub25lcnJvcj10aGlzLlZ2LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGMoYix0aGlzLkwpKX0sV2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFBuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmhpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKdGhpcy5paS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLndmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMueGYuYmluZCh0aGlzKSl9LEFkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmhpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmlpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy54Zi5iaW5kKHRoaXMpKX0saGk6ZnVuY3Rpb24oYSl7dGhpcy5WYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZifHx0aGlzLnlmKGEpfS5iaW5kKHRoaXMpLAp0aGlzLkdvKSl9LHlmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlljJiZ0aGlzLldoKHRoaXMudmlkZW8pJiYhdGhpcy5GYiYmIXRoaXMuVmIpe3RoaXMuWWM9ITA7dHJ5e2lmKCFlLlZhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkZifHwodGhpcy5GYj0hMCx0aGlzLkFkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5aYSgpLCEwKSx0aGlzLkwuc2d8fHRoaXMuTC5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLlJhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5aYSgpLCEwKX10aGlzLlN2KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIuamYoKTt0aGlzLlJ2KCk7dGhpcy5naSgpO3RoaXMuZGcoKTt0aGlzLmIudmgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMubWYoKX19LG1mOmZ1bmN0aW9uKCl7dGhpcy5lZHx8CnRoaXMuUWYoKX0sUWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy52aWRlby5wbGF5KCk7aWYoYiYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5lZHx8KGE/dGhpcy5SYSgpOih0aGlzLlBlKCEwKSx0aGlzLlFmKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmRjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmRjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5lZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubWYoKSl9LmJpbmQodGhpcyk7dGhpcy53ZSgpLkpoKHRoaXMpfSx3ZjpmdW5jdGlvbigpe3RoaXMuTC5qYiYmIXRoaXMuRmImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwKITApLHRoaXMuWWEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS52KGsuRm4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlJhKCl9LEluOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPSExLGY9MDtmPGEubGVuZ3RoO2YrKyljPWUuR2coYVtmXSksYi5wdXNoKGMpO2E9e2hhc2hlczpifTthPWsuVGEoYSx0aGlzLkEoKSk7ZS5NdShhKX0sUmE6ZnVuY3Rpb24oYSl7dGhpcy5jJiZ0aGlzLmMuUWQmJnRoaXMuSW4odGhpcy5jLlFkKTtpZighdGhpcy5vZSlpZih0aGlzLm9lPSEwLHRoaXMuUGR8fChlLnYoay5Icyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy50Ynx8dGhpcy5jLnBjKXtlLm9iKCJuZXdTbWFsbEFkSWQiKTt0aGlzLmxmKys7dGhpcy5WYj10aGlzLlljPSExO3RyeXt0aGlzLkFkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuRWQ9ITE7dHJ5e3RoaXMuYi5kaSgpfWNhdGNoKGcpe310aGlzLkdkPSEwO3RoaXMuYi5BZSgpO3RoaXMuYWM9ITE7dGhpcy53ZSgpLkVoKCk7dGhpcy5jLnRiJiZ0aGlzLmMub3JpZ2luLlFlKCk7dGhpcy5jLnBjJiYoYT90aGlzLmMub3JpZ2luLnBoKCk6dGhpcy5wZSgpKX1lbHNlIHRoaXMucGUoKX0sVnY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5BZCh0aGlzLnZpZGVvKSx0aGlzLnhmKGEpKX0seGY6ZnVuY3Rpb24oYSl7dGhpcy5WYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkwuYXAoKTsKdGhpcy5jLm9yaWdpbi50Zyh3LlRkKX0saWk6ZnVuY3Rpb24oKXtpZih0aGlzLnB2KXRoaXMuUmEoKTtlbHNle3RoaXMuYWM9ITA7dGhpcy5iLmYuQWEmJiF0aGlzLkdkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay55Yyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5zdihhKTtpZighdGhpcy5PYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5QZD0hMDtlLnYoay5qaSx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuRmUodGhpcy5PYil9Yz0iIjt0aGlzLmMua2YmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWgpKSYmKGM9dGhpcy5jLmtmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkVkfHwodGhpcy5FZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5XZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuYy50Yj8odGhpcy5WYj10aGlzLlljPSExLHRoaXMuQWQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuRWQ9ITEsdGhpcy5iLmRpKCksdGhpcy5jLm9yaWdpbi5RZSgpKTp0aGlzLlJhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLldjLnJlcGxhY2UoIlt0aW1lXSIsZS5CZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmVlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxhaTpmdW5jdGlvbigpe3RoaXMudWh8fCh0aGlzLnVoPSEwLHRoaXMua2R8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxzdjpmdW5jdGlvbihhKXtlLnYoay5iZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2E9PXRoaXMuYml8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmFpKCl9LmJpbmQodGhpcykpLHRoaXMuRmJ8fHRoaXMuT2goKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuTC5qYiYmdGhpcy5ZYSgic3RhcnQiKSxlLnYoay5TZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLGUudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMua2Q9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLnYoay5QZix0aGlzLmMuQiwKdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5ZYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5VZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksdGhpcy5iaT1hKX0sTmg6ZnVuY3Rpb24oYSxiKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iK2EsYiwhMCl9LE91OmZ1bmN0aW9uKCl7ZS5LZChbInN0YXRzX2hkX2FkX2NhbGw6IisKdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sT2g6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFB1OmZ1bmN0aW9uKCl7ZS5LZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFhhOmZ1bmN0aW9uKGEpe2UuS2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWWE6ZnVuY3Rpb24oYSl7KHRoaXMuQWZ8fHRoaXMuTC5qYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLlphKCksITApfSxLYjpmdW5jdGlvbihhLGIpe3RoaXMuTC5qYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkZiKXt0aGlzLnZkJiZ0aGlzLnZkLnRyYWNrJiZ0aGlzLnZkLnRyYWNrKGEpO2lmKCJtdXRlIj09CmF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5McSh0aGlzLmMuUGEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmplPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuRmQuaW1wcmVzc2lvbnMmJmUuRnIoZy51cmwsdGhpcy5GZC5pbXByZXNzaW9ucyk/dGhpcy5KZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuR24sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHthZElkOnRoaXMuRmQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkplKGcudXJsLGcudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmMuUGE9CnRoaXMudnAodGhpcy5jLlBhLGEpfWNhdGNoKG0pe319fSxaYTpmdW5jdGlvbigpe3ZhciBhPWUuVmEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLkFmJiYoYj0iX3ZwYWlkIik7dGhpcy5DZiYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxKZTpmdW5jdGlvbihhLGIsYyxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxjJiZiLktuKGMpLGZ8fChmPXRoaXMucmcpLGV8fChlPXRoaXMucmcpLHRoaXMuTW4oYSksdGhpcy5MLkRhKGIsZnVuY3Rpb24oKXt0aGlzLkRoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LE1uOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09Im9wZW4ifSxEaDpmdW5jdGlvbihhKXt0aGlzLmNjW2FdPSJjbG9zZWQifSxrcDpmdW5jdGlvbigpe3RoaXMuY2M9e319LFJ1OmZ1bmN0aW9uKCl7dmFyIGE9MCxiO2ZvcihiIGluIHRoaXMuY2MpdGhpcy5jYy5oYXNPd25Qcm9wZXJ0eShiKSYmCiJvcGVuIj09dGhpcy5jY1tiXSYmYSsrO3JldHVybiBhfSxMcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHZwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFN2OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Udi5iaW5kKHRoaXMpKX0sVHY6ZnVuY3Rpb24oKXtlLlZhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmVjKCk6dGhpcy5jLlViJiYoZS52KGsua2csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLlpjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPQp3aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5VYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuVWIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxSdjpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0KIiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5XYy5yZXBsYWNlKCJbdGltZV0iLGUuQmcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC4kYyYmKGI9dGhpcy5MLiRjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC4kYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sQ2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC4kYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYKKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxnaTpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMucnA7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuR2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWGguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkViO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ydi5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnF2LmJpbmQodGhpcykpOwpnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLk1oO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9CjEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLmtmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlZhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0KImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5CYT10aGlzLnRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi4kZihmdW5jdGlvbihhKXt0aGlzLkJhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5QZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGVjOmZ1bmN0aW9uKCl7dGhpcy5CYSYmImJsb2NrIj09dGhpcy5CYS5zdHlsZS5kaXNwbGF5fHx0aGlzLkJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxYaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuJGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxZaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMubWM/KGUubWEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLm1jPSExKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLm1jPSEwKX0sd2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuJGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEdoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKSl9LHF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxydjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMucmI/KGUubWEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGUudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSx4djpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsudGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGRjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmRjKTt0aGlzLmVkfHx0aGlzLmVlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5tZigpKX0scGU6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUuaGQoKTshdGhpcy5MLmxjfHxlLlZhKCl8fCFjLmlzQ2hyb21lJiYhYy5pc0ZpcmVmb3h8fGMuaXNFZGdlfHwKIShhfHwhdGhpcy5qZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy5zaHx8IXRoaXMuTC5SYyYmInNwaWVnZWwuZGUiIT1lLlpiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwicHJlcm9sbCIhPWUuQ2I/KHRoaXMuZWQ9ITAsdGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy5tZygpKToodGhpcy5zaD10aGlzLkNmPXRoaXMuQmY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5qZT0hMCxhPWUuY2coYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuS2UoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LG1nOmZ1bmN0aW9uKGEpe3RoaXMuUnUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCEwKX0uYmluZCh0aGlzKSx0aGlzLnN0KToodGhpcy5HZD0hMCx0aGlzLmIuQWUoKSx0aGlzLmIuY3UoKSx0aGlzLmFjPSExLAplLnYoay5xcCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMud2UoKS5FaCgpKX0sd2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sZGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZS5FZSh0aGlzLnZpZGVvLGEpP3RoaXMuR2goKTp0aGlzLndkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5yYyYmMDx0aGlzLnJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5yYykpO3RoaXMudmlkZW8mJgp0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuT28rIi0iK3RoaXMubGY7dGhpcy5jJiZ0aGlzLmMuSGcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkhnKCkpO3JldHVybiBhfSxyZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuZGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRqPXRoaXMuYVs0XTt0aGlzLlhzPXRoaXMuYVs3XTt0aGlzLlJtPXRoaXMuYVs5XTt0aGlzLk9yPXRoaXMuYVsxMF07dGhpcy5zbz10aGlzLmFbM107dGhpcy52aj10aGlzLmFbMV07dGhpcy5Ddj10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOF07dGhpcy5ubD10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX0KYy50bz1iO2IucHJvdG90eXBlPXtDajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRGo6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhzOnRoaXMuUW0oYSl9LFFtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5SbTp0aGlzLk5yKGEpfSxOcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuT3I6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNvOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52ajp0aGlzLkJ2KGEpfSxCdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ3Y6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmd0OnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qbDp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy50b3x8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuQ2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnFjPXRoaXMuc2M9ITE7dGhpcy52YT0iIjt0aGlzLnpmPSExO3RoaXMuU2c9IiI7ZCYmZC5lbXB0eT90aGlzLm5zKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRm09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuaGQoKSxiO2I9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKdmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLm9nKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8CiJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkhkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLkRhKGIsdGhpcy5tcy5iaW5kKHRoaXMpLAp0aGlzLmpzLmJpbmQodGhpcykpfSxEZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5LcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5XdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxLcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmCmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LG1zOmZ1bmN0aW9uKGEpe3RoaXMuTXQoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpOwp0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlNnPWEucmVzcG9uc2VVUkw7dGhpcy5ZLmxlbmd0aD90aGlzLkljKCk6dGhpcy5zYSh0aGlzLlNhKHcuUGMse2Vycm9yOnRoaXMuemY/Ry5XZDpHLklmfSkpfSxuczpmdW5jdGlvbihhKXt0cnl7dGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpO3RoaXMucWM9dGhpcy5UaCgpO3RoaXMuWS5sZW5ndGg/dGhpcy5JYygpOnRoaXMuc2EodGhpcy5TYSh3LlBjLHtlcnJvcjp0aGlzLnpmP0cuV2Q6Ry5JZn0pKX0sanM6ZnVuY3Rpb24oKXt0aGlzLnNhKHRoaXMuU2Eody5IZix7ZGVwdGg6YX0pKX0sSWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5NcigpP3RoaXMuZnYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5NZygpLGgse0FkU3lzdGVtOnRoaXMudHEoKSwKdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMuc2EodGhpcy5TYSh3LktmKSk6KGE9MCx0aGlzLkp2KCkmJnRoaXMuVmUodGhpcy5zcCgpKSl9LFFlOmZ1bmN0aW9uKCl7dGhpcy5zYz8odGhpcy5zYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5RZSgpfSxwaDpmdW5jdGlvbigpe3RoaXMucWM/KHRoaXMucWM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSWMoKSk6dGhpcy5wYXJlbnQucGgoKX0sSnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdigpP3RoaXMuYnYoKT8hMDooLTEhPXRoaXMuQ2MoKT90aGlzLnNhKHRoaXMuU2Eody5TZCkpOnRoaXMuc2EodGhpcy5TYSh3LkRmKSksITEpOih0aGlzLnNhKHRoaXMuU2Eody5QYyxHLkpmKSksITEpfSxWZTpmdW5jdGlvbihhKXt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5RZHx8KGEuUWQ9W10pO2EuUWQucHVzaCh0aGlzLlNnKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuTWUoKSk7CmEudGI9YS50Yj9hLnRiOnRoaXMuc2M7YS5wYz1hLnBjP2EucGM6dGhpcy5xYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7dGhpcy5wYXJlbnQuVmUoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLmR1cmF0aW9uPXRoaXMuQ2MoKTthLk89dGhpcy5KZygpO2EuVWI9dGhpcy52cSgpO2EuUXY9W107YS5vcmlnaW49dGhpczthLkI9dGhpcy5zcSgpO2Eua2Y9dGhpcy5KcShhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7cmV0dXJuIGF9LHNhOmZ1bmN0aW9uKGIpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPQp3LlNkLmNvZGU/Yi5QYS5jb25jYXQodGhpcy53cSgpKTpiLlBhLmNvbmNhdCh0aGlzLkVxKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuV2ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5zYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnNhJiZ0aGlzLnBhcmVudC5zYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sdGc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sZnY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxjdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuSmcoKS5sZW5ndGh9LGJ2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5DYygpfSxwZjpmdW5jdGlvbigpe3JldHVybiAxPAp0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxUaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMucGYoKSYmKGE9ITApO3JldHVybiBhfSxNdDpmdW5jdGlvbihhKXt0aGlzLnZhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy52YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuemY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sTXI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLk1nKCkubGVuZ3RofSxNZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LHRxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmUodGhpcy5VLAoiQWRTeXN0ZW0iKX0sTWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy4kZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5rYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LCRnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuJGcoYS5wYXJlbnROb2RlKTohMX0sRXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT0KYS50eXBlfSl9LHdxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx2cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxKZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxseDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5rYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8CjFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sc3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5uZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9CmJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LENjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxKcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkZ1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sdmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD8KdGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0seWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkZtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFyPXRoaXMuYVs2XTt0aGlzLmZvPXRoaXMuYVs2XTt0aGlzLnp3PXRoaXMuYVs5XTt0aGlzLktvPXRoaXMuYVsxMF07dGhpcy5kcz10aGlzLmFbMTBdO3RoaXMuRXA9dGhpcy5hWzVdO3RoaXMuR3A9dGhpcy5hWzZdO3RoaXMuc2o9CnRoaXMuYVsyXTt0aGlzLmNvPXRoaXMuYVs2XTt0aGlzLnFvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLkNwPWI7Yi5wcm90b3R5cGU9e3ByOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5xcjp0aGlzLmVvKGEpfSxlbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZm86dGhpcy55dyhhKX0seXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnp3OnRoaXMuSm8oYSl9LEpvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Lbzp0aGlzLmNzKGEpfSxjczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZHM6dGhpcy5EcChhKX0sRHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkVwOnRoaXMuRnAoYSl9LEZwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HcDp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNqOnRoaXMuYm8oYSl9LGJvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5jbzp0aGlzLnBvKGEpfSxwbzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnFvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5DcHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkI9dGhpcy5wYz10aGlzLnRiPSExO3RoaXMuQmU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkNlPSIifWMuUmw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sQ3E6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkdhKXt2YXIgYT10aGlzLm9yaWdpbi5HYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5CZT1hW2NdKX1yZXR1cm4gdGhpcy5CZX0sSGc6ZnVuY3Rpb24oKXtpZih0aGlzLkNlKXJldHVybiB0aGlzLkNlO3ZhciBhPSIiOyhhPXRoaXMuQ3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkNlPWF9LE5xOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5SbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2k9dGhpcy5hWzFdO3RoaXMuWW09dGhpcy5hWzldO3RoaXMuVnA9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNF19Yy5wdD1iO2IucHJvdG90eXBlPXtGaTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkdpOnRoaXMuWG0oYSl9LFhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ZbTp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLnB0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5GaSg0KTt2YXIgdz17WGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LERmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxQYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCk9hOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApPYToiTE9BRF9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LE53Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxTZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17SWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sT3c6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT209dGhpcy5hWzEwXTt0aGlzLm53PXRoaXMuYVsyXTt0aGlzLnJrPXRoaXMuYVs0XTt0aGlzLkFrPXRoaXMuYVs2XTt0aGlzLlVuPXRoaXMuYVs4XTt0aGlzLlVyPXRoaXMuYVsyXTt0aGlzLlFqPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzVdfWMuUms9YjtiLnByb3RvdHlwZT17Tm06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk9tOnRoaXMubHcoYSl9LGx3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5udzp0aGlzLnFrKGEpfSxxazpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnJrOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Bazp0aGlzLlRuKGEpfSxUbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVW46dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVyOnRoaXMuUGooYSl9LFBqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Rajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuUmt8fFhhLEljPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLk5tKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuZ2Q9Yjt0aGlzLlBhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5Faj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuRWp8fFVhO2M9CmN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5obD10aGlzLmFbNl07dGhpcy5tdD10aGlzLmFbMl07dGhpcy5MdD10aGlzLmFbN107dGhpcy5ndT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy5Hcz1iO2IucHJvdG90eXBlPXtnbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaGw6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm10OnRoaXMuS3QoYSl9LEt0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5MdDp0aGlzLmZ1KGEpfSxmdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZ3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLkdzfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZ2woNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLkZoPWE7dGhpcy52aWRlbz1iO3RoaXMuTmQ9W107dGhpcy5DaD1bXTt0aGlzLlJlPVtdO3RoaXMuVXY9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlhrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuRmgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5GaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LApnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2cuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgaz1nLmNvbnRlbnRXaW5kb3c7ay5HeD17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy4kdC5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5SdC5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuTmQucHVzaCh7c3JjOmMsZnJhbWU6Zyx0dDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LAp0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuUmUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5SZVtiXTtjLnR5cGU9PT1hJiZjLlZvKHRoaXMueHEoYSkpfX0seHE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7UHg6ITAsT3g6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7Q3g6InZpZGVvIixSeDoianNDdXN0b20iLFN4OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsVHg6MSxteDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLAphZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxNcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuTmQubGVuZ3RoO2IrKylpZih0aGlzLk5kW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuTmRbYl0udHQ7cmV0dXJuIiJ9LCR0OmZ1bmN0aW9uKGEsYil7dGhpcy5DaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5NcShiKSx2ZW5kb3I6Yn0pO3RoaXMuTnUoKX0sUnQ6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLlV2Lm1hcChmdW5jdGlvbihhKXt0aGlzLmFnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYWcoYSxiKX0sYWc6ZnVuY3Rpb24oYSxiKXt0aGlzLlJlLnB1c2goe3R5cGU6YSxWbzpiLE14OiExfSl9LE51OmZ1bmN0aW9uKCl7dGhpcy5DaC5tYXAoZnVuY3Rpb24oYSl7YS5Jcnx8CihhLkZ4KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5ReCxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuSXI9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWGt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhpPXRoaXMuYVs1XTt0aGlzLllpPXRoaXMuYVsxXTt0aGlzLlJwPXRoaXMuYVs1XTt0aGlzLkhrPXRoaXMuYVs1XTt0aGlzLmF0PXRoaXMuYVs4XTt0aGlzLml1PXRoaXMuYVszXTt0aGlzLm5rPXRoaXMuYVs0XTt0aGlzLiRxPXRoaXMuYVszXTt0aGlzLmZsPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy5pcj1iO2IucHJvdG90eXBlPXt3aTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueGk6dGhpcy5YaShhKX0sClhpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZaTp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUnA6dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhrOnRoaXMuJHMoYSl9LCRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaXU6dGhpcy5tayhhKX0sbWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5rOnRoaXMuWnEoYSl9LFpxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kcTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmlyfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2Mud2koNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5pYj1hLkVnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuYmc9ITE7dGhpcy5UYj1bXX1jLm9qPWI7Yi5wcm90b3R5cGU9e3JxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZT0wLGI9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUsCnk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnJxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5hcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmCihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sVXU6ZnVuY3Rpb24oKXt0aGlzLmJnPSEwfSxkaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sdmg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay55Yyx0aGlzLmYucygpKX0sY3U6ZnVuY3Rpb24oKXt0aGlzLmJnfHwodGhpcy5mLnBsYXkoKSxlLnYoay5kZCx0aGlzLmYucygpKSl9LGpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9CiJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5pYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuaWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5pYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmliLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaWIpO3RoaXMuZi5MYyYmdGhpcy5mLkxjKCk/dGhpcy5mLkVnKCkuYXBwZW5kQ2hpbGQodGhpcy5LKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy4kYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sCmFyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxqcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LCRiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuanEodGhpcy5pYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmCjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQWUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLkxjKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLksuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5UYi5sZW5ndGg7YSsrKXRoaXMuVGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5QaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLiRiLmJpbmQodGhpcyksMTApfSwkZjpmdW5jdGlvbihhKXt0aGlzLlRifHwKKHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEFlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMub2p8fCRhLEU9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuYWEoMTApO04uY29udHJvbHM9ITA7RS5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCkEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1vPXRoaXMuYVsyXTt0aGlzLmRqPXRoaXMuYVs5XTt0aGlzLkR3PXRoaXMuYVs3XTt0aGlzLmpqPXRoaXMuYVsyXTt0aGlzLkNpPXRoaXMuYVs1XTt0aGlzLlZzPXRoaXMuYVszXTt0aGlzLnBsPXRoaXMuYVs3XTt0aGlzLmJzPXRoaXMuYVsyXTt0aGlzLnZ3PXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuRW09YjtiLnByb3RvdHlwZT17bG86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1vOnRoaXMuY2ooYSl9LGNqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kajp0aGlzLkN3KGEpfSxDdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRHc6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmpqOnRoaXMuQmkoYSl9LEJpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DaTp0aGlzLlVzKGEpfSwKVXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZzOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wbDp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYnM6dGhpcy51dyhhKX0sdXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnZ3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5FbXx8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMubG8oNCk7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLAphPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5CZChiKTt0aGlzLnBnKCl9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LApEZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5DbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuQmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7dGhpcy5TYj10aGlzLlNifHwhMTt0aGlzLlRmPXRoaXMuVmY9dGhpcy5XZz10aGlzLmVhPXRoaXMuc2Y9CiExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuaHEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnNmPSEwO3RoaXMuV2cmJnRoaXMuamcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLmFjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuYmQoKTt0aGlzLldnPSEwO3RoaXMuamcoKX0uYmluZCh0aGlzKSk7dGhpcy5mZygpfSwKamc6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5iZCgpO2lmKCF0aGlzLnNmJiYhdGhpcy5iZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuc2YmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0sYmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLktnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LEtnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGZnOmZ1bmN0aW9uKCl7aWYodGhpcy5iZCgpKXt2YXIgYj10aGlzLktnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdOwp0aGlzLlZmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9Yi5qeH10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LG54OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkF4KCk6ITF9LENjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5DYygpOi0xfSxGcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxocTpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy51KCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwKMTAwKX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5EZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkZxKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuQmx8fGRiOyhmdW5jdGlvbihjKXtjLkRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sSnI6ZnVuY3Rpb24oKXt3aW5kb3cuT08uWGwudm4udG4/d2luZG93Lk9PLlhsLnZuLnRuLmh4KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpyKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9CmRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnhlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMuRGx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaz10aGlzLmFbOV07dGhpcy55az10aGlzLmFbN107dGhpcy5haz10aGlzLmFbMTBdO3RoaXMuZmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5Pcz1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRms6CnRoaXMueGsoYSl9LHhrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy55azp0aGlzLiRqKGEpfSwkajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYWs6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5Pc3x8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuRWsoNCk7KGZ1bmN0aW9uKGMpe2MuU2k9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMTt0aGlzLk5nKCl9LE5nOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTsKYnx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sCk5hOmZ1bmN0aW9uKCl7dGhpcy55aCgpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuU2l8fGhiOyhmdW5jdGlvbihjKXtjLlJpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMucmEoKTp0aGlzLm0oKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmdnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2coYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGliPWMuUml8fGliOyhmdW5jdGlvbihjKXtjLlRpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sQmg6ZnVuY3Rpb24oYil7Yj1uZXcgaGIoYik7Yi5uYT90aGlzLlQoKTp0aGlzLk4oYil8fAooYi5CZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5pcXx8KHRoaXMuaXE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkJoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5CaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGpiPWMuVGl8fGpiLFQ9bmV3IGpiKHIpO1QuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy55bT10aGlzLmFbMl07dGhpcy5jcj10aGlzLmFbMl07dGhpcy56dj10aGlzLmFbNF07dGhpcy5Haj10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLmxsPWI7Yi5wcm90b3R5cGU9e3htOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy55bTp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3I6dGhpcy55dihhKX0seXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnp2OnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR2o6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5sbHx8a2IsTmM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMueG0oNCk7KGZ1bmN0aW9uKGMpe2Mubm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sTGM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ubXx8VTsoZnVuY3Rpb24oYyl7Yy5tbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlZjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eC5WYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLk1zKGEpfS5iaW5kKHRoaXMpKTt4LlZjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3guVmMoIiMiK2IsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTsKeC5UcSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufX10aGlzLnUoImFkZXJyb3IiLGEpO3RoaXMuRygpfX0pfSkoYyk7dmFyIFY9Yy5tbXx8VjsoZnVuY3Rpb24oYyl7Yy5vbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMudWQmJihiPWUud3AoYix0aGlzLnVkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5SKGQpO3ZhciBmPW5ldyBWKGQsdGhpcy5JKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy51ZHx8KHRoaXMudWQ9W10pLHRoaXMudWQucHVzaChiW2FdKSxkPW5ldyBVKGcpLHRoaXMuTihkKXx8KHRoaXMuUihkKSxmPW5ldyBWKGQsdGhpcy5JKSwKZi5nKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxWYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSxndjpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmRhfHx0aGlzLmRhJiYhdGhpcy5kYVthXSl0aGlzLkhjfHwodGhpcy5IYz1bXSksdGhpcy5IYy5wdXNoKGIpLHRoaXMuYnUoKSYmKHRoaXMuYmYoKSx0aGlzLmcoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5kYVthXVtjXSYmMDx0aGlzLmRhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuZGFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmRhW2FdW2NdW2RdKGIpfX0sVHE6ZnVuY3Rpb24oKXtpZih0aGlzLkhjKWZvcih2YXIgYj0KMDtiPHRoaXMuSGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5IY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmRhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5kYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnguZ3YoYil9fSl9KShjKTt2YXIgbGI9Yy5vbXx8bGIseD1uZXcgbGIocik7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ocj10aGlzLmFbOF07dGhpcy5vdD10aGlzLmFbOV07CnRoaXMuWHA9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMuQW49YjtiLnByb3RvdHlwZT17Z3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ocjp0aGlzLm50KGEpfSxudDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub3Q6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5Bbnx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuZ3IoNCk7KGZ1bmN0aW9uKGMpe2MuT2k9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7CnZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLk9pfHxuYjsoZnVuY3Rpb24oYyl7Yy5QaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTsKdmFyIG9iPWMuUGl8fG9iOyhmdW5jdGlvbihjKXtjLlFpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkkpKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuUWl8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy56cj10aGlzLmFbMl07dGhpcy5ObD10aGlzLmFbN107dGhpcy5Ucz10aGlzLmFbMV07dGhpcy5qcD10aGlzLmFbM107dGhpcy5Xbj10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsyXX1jLmptPWI7Yi5wcm90b3R5cGU9e3lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cjp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTmw6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRzOnRoaXMuaXAoYSl9LGlwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qcDp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlduOnRoaXMuaShhKX0sCmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIHJiPWMuam18fHJiLFBjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLnlyKDQpOyhmdW5jdGlvbihjKXtjLnJsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5XKGIpO3RoaXMuWihhKTt0aGlzLlF0KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LApwbGF5OmZ1bmN0aW9uKCl7fSxRdDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnBhdXNlJiZ0aGlzLmphLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnJlc3VtZSYmdGhpcy5qYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEubXV0ZSYmdGhpcy5qYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LApmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS51bm11dGUmJnRoaXMuamEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxYZzpmdW5jdGlvbihiKXt0aGlzLmphPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBzYj1jLnJsfHxzYjsoZnVuY3Rpb24oYyl7Yy5xbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubWk9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMubWkmJih0aGlzLkcoKSx0aGlzLm1pPSEwLHRoaXMub2EoKSk7YS5LYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgdGI9Yy5xbHx8dGI7KGZ1bmN0aW9uKGMpe2Muc2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZzpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYj1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgc2IoYltkXSksdGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgdGIoYyx0aGlzLkkpKS5nKCkpfX1lbHNlIHRoaXMuVCgpfX0pfSkoYyk7dmFyIHViPWMuc2x8fHViLFc9bmV3IHViKHIpO1cuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRvPXRoaXMuYVs0XTt0aGlzLnVsPXRoaXMuYVs2XTt0aGlzLmxrPXRoaXMuYVs4XTt0aGlzLlNxPXRoaXMuYVsxMF07dGhpcy5Uaz10aGlzLmFbN107dGhpcy5Tcj10aGlzLmFbN107dGhpcy5Kcz10aGlzLmFbM107dGhpcy5ucT10aGlzLmFbOF07CnRoaXMuc3I9dGhpcy5hWzEwXTt0aGlzLkJ3PXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy52aT1iO2IucHJvdG90eXBlPXtDbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRG86dGhpcy50bChhKX0sdGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVsOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sazp0aGlzLlJxKGEpfSxScTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU3E6dGhpcy5TayhhKX0sU2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRrOnRoaXMuUnIoYSl9LFJyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Tcjp0aGlzLklzKGEpfSxJczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSnM6dGhpcy5tcShhKX0sbXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm5xOnRoaXMucnIoYSl9LHJyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zcjp0aGlzLkF3KGEpfSxBdzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkJ3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy52aXx8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UWMuQ28oNCk7KGZ1bmN0aW9uKGMpe2MuTG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LAp1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlg/KDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgd2I9Yy5MbXx8d2I7KGZ1bmN0aW9uKGMpe2MuS209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLApiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxPdDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuZWJ8fCh0aGlzLmViPVtdKTt0aGlzLmViLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5yYSgpOnRoaXMudSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTsKdGhpcy5DYT90aGlzLk90KHRoaXMuQ2EpOih0aGlzLkNhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5DYSl7dGhpcy5HKCk7cmV0dXJufWlmKCF0aGlzLnRjKXt0aGlzLkcoKTtyZXR1cm59Yj0hMDtpZih0aGlzLmViJiZ0aGlzLmViLmxlbmd0aCYmMTx0aGlzLmViLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuZWIubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuZWJbYV0mJjMwMyE9dGhpcy5lYlthXSYmNDAzIT10aGlzLmViW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5LbXx8eGI7KGZ1bmN0aW9uKGMpe2MuTW09CnQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgd2IoYi5pdGVtKGEpKTt0aGlzLk4oYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLlIoYyksKG5ldyB4YihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgeWI9Yy5NbXx8eWIsemI9bmV3IHliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZvPXRoaXMuYVsyXTt0aGlzLiRyPXRoaXMuYVs2XTt0aGlzLldyPXRoaXMuYVsxMF07dGhpcy5pdj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5QbT1iO2IucHJvdG90eXBlPXtFbzpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLkZvOnRoaXMuWnIoYSl9LFpyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kcjp0aGlzLlZyKGEpfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3I6dGhpcy5odihhKX0saHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLml2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy5QbXx8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMuRW8oNCk7KGZ1bmN0aW9uKGMpe2MuZG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlcoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pOwp0aGlzLldlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5FdCgpfS5iaW5kKHRoaXMpLDUwMCl9LEV0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuV2UmJgp3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLldlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sUXU6ZnVuY3Rpb24oKXt0aGlzLldlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgQmI9Yy5kbXx8QmI7KGZ1bmN0aW9uKGMpe2MuY209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKTt0aGlzLmtjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLnVzPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5rY3x8KHRoaXMua2M9CjAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8Cih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMua2N8fHRoaXMua2MrKyx0aGlzLmtjPD10aGlzLnVzPyh0aGlzLmtjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5RdSgpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLAoxMDApfX0pfSkoYyk7dmFyIENiPWMuY218fENiOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IEJiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsdGhpcy5JKSkuZygpKSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgRGI9Yy5lbXx8RGIsRWI9bmV3IERiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuTHc9CmI7Yi5wcm90b3R5cGU9e2pyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5rcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEZiPWMuTHd8fEZiLFNjPW5ldyBGYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLmpyKDQpOyhmdW5jdGlvbihjKXtjLlpsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMuWmx8fEdiOyhmdW5jdGlvbihjKXtjLllsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5LYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMub3AoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5tZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMuZXMoKTp0aGlzLmlnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksCjFFMyl9LG9wOmZ1bmN0aW9uKCl7dGhpcy5SZigpfHx0aGlzLm0oITApfSxlczpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWQoKTshYi5xYSYmYi5ZJiZiLmd4JiZiLml4JiYodGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSgpKX0saWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZygpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGgpZm9yKHZhciBiPQpsLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5LYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy50aD1iW2NdKTtyZXR1cm4gdGhpcy50aH0sQng6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubWQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5ZbHx8SGI7KGZ1bmN0aW9uKGMpe2MuJGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0KMDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEdiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBIYihjLHRoaXMuSSkpLmcoKSl9cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBJYj1jLiRsfHxJYixKYj1uZXcgSWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueWw9dGhpcy5hWzRdO3RoaXMubXA9dGhpcy5hWzVdO3RoaXMudXY9dGhpcy5hWzEwXTt0aGlzLldpPXRoaXMuYVszXTt0aGlzLktpPXRoaXMuYVszXTt0aGlzLllxPXRoaXMuYVsyXTt0aGlzLmJuPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzEwXX1jLkF2PWI7Yi5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLm1wOnRoaXMudHYoYSl9LHR2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51djp0aGlzLlZpKGEpfSxWaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuV2k6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktpOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ZcTp0aGlzLmFuKGEpfSxhbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLkF2fHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy54bCg0KTsoZnVuY3Rpb24oYyl7Yy5Waz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7CkgmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sCkFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxMYzpmdW5jdGlvbigpe3JldHVybiEwfSxLYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Wa3x8WDsoZnVuY3Rpb24oYyl7Yy5Vaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5YZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhlPQpiLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlhlJiZiIT10aGlzLlhlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuZmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLkh4KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy51KCJhZGVycm9yIiksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFk9Yy5Va3x8WTsoZnVuY3Rpb24oYyl7Yy5Xaz0KdC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWChiKSxiLm5hP3RoaXMuYmYoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksCmIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuV2t8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWk9dGhpcy5hWzddO3RoaXMuV209dGhpcy5hWzRdO3RoaXMuem49dGhpcy5hWzZdO3RoaXMuTm89dGhpcy5hWzddO3RoaXMuSXc9dGhpcy5hWzFdO3RoaXMua289dGhpcy5hWzhdO3RoaXMubXU9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOV19Yy5KbT1iO2IucHJvdG90eXBlPXtEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRWk6dGhpcy5WbShhKX0sVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldtOnRoaXMueW4oYSl9LHluOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy56bjp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5IdyhhKX0sSHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5Jdzp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmtvOnRoaXMubHUoYSl9LGx1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5tdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLkptfHxOYixVYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5EaSg0KTsoZnVuY3Rpb24oYyl7Yy5Vaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LApudTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sRXg6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgT2I9Yy5Vanx8T2I7KGZ1bmN0aW9uKGMpe2MuVGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGEpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk7Yi5PbigiZmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oInRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5vYSgpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgUGI9Yy5Uanx8UGI7KGZ1bmN0aW9uKGMpe2MuVmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yayYmCndpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycyl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yay5HZXRBbGxQbGF5ZXJzKCk7aWYoYiYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX19dGhpcy5UKCl9fSl9KShjKTt2YXIgUWI9Yy5Wanx8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklwPXRoaXMuYVs3XTt0aGlzLm5uPXRoaXMuYVs5XTt0aGlzLmJtPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzFdfWMuUnM9YjtiLnByb3RvdHlwZT17SHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JcDp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLm5uOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLlJzfHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5IcCg0KTsoZnVuY3Rpb24oYyl7Yy5kbj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSwKTGQ6ZnVuY3Rpb24oYil7dmFyIGE9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LFB0OmZ1bmN0aW9uKCl7dGhpcy5SZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuTGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUmR8fCh0aGlzLlJkPSEwLHRoaXMuTGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LApwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxBYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuZG58fFRiOyhmdW5jdGlvbihjKXtjLmNuPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFR0OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSwKYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWQoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmFkKGEpfS5iaW5kKHRoaXMpKX0sYWQ6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7CmEuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMudSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5tKCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxOZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5hZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTmYuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5UdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLk5mKCk7dGhpcy5TdCgpfSxTdDpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsCnRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuTnQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5OdD0hMH19KX0pKGMpO3ZhciBVYj1jLmNufHxVYjsoZnVuY3Rpb24oYyl7Yy5lbj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLlB0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTsKdmFyIFZiPWMuZW58fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenA9dGhpcy5hWzNdO3RoaXMuemo9dGhpcy5hWzddO3RoaXMuVHA9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMTBdfWMuS2w9YjtiLnByb3RvdHlwZT17eXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpwOnRoaXMueWooYSl9LHlqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56ajp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLktsfHxYYixXYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1XYy55cCg0KTsKKGZ1bmN0aW9uKGMpe2Mudm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy53aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLkJzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxudTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLAphPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQnN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMud2gmJih0aGlzLndoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE89Yy52bXx8TzsoZnVuY3Rpb24oYyl7Yy51bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5EYisrLDE1PHRoaXMuRGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnp1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSwKaGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLnVtfHxQOyhmdW5jdGlvbihjKXtjLndtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuYmYoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLndtfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudGs9CnRoaXMuYVs4XTt0aGlzLm12PXRoaXMuYVs0XTt0aGlzLnhuPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTnM9YjtiLnByb3RvdHlwZT17c2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRrOnRoaXMubHYoYSl9LGx2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tdjp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5Oc3x8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuc2soNCk7KGZ1bmN0aW9uKGMpe2MuS2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpOwp2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5XKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5La3x8WjsoZnVuY3Rpb24oYyl7Yy5Kaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkVjPXRoaXMuQ2E9dGhpcy5YYz0hMTt0aGlzLkFoPWUuSGIoMTApO3RoaXMuYmgoKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiYKYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnFhPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5xYigpLCEwO3RoaXMuVGcrKztpZigxMDx0aGlzLlRnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmguYmluZCh0aGlzKSwxMDApLCExfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT0KYXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITB9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkprfHxhYTsoZnVuY3Rpb24oYyl7Yy5Maz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYKMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLkxrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQm89dGhpcy5hWzhdO3RoaXMuQ249dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMl19Yy5zaT1iO2IucHJvdG90eXBlPXtBbzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkJvOnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGNjPWMuc2l8fGNjLFljPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVljLkFvKDQpOyhmdW5jdGlvbihjKXtjLkxqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBkYz1jLkxqfHxkYzsoZnVuY3Rpb24oYyl7Yy5Laj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5oZygpfSxoZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuS2p8fGVjOyhmdW5jdGlvbihjKXtjLk1qPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmCndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgZGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubmEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7KG5ldyBlYyhiLHRoaXMuSSkpLmcoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGZjPWMuTWp8fGZjLGdjPW5ldyBmYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdz10aGlzLmFbMl07dGhpcy5Zbj10aGlzLmFbOF07dGhpcy5wcT10aGlzLmFbNl07dGhpcy5Caj10aGlzLmFbOF07dGhpcy5Oaz10aGlzLmFbMl07dGhpcy5uaj10aGlzLmFbOF07dGhpcy5pbz10aGlzLmFbM107dGhpcy5ydD10aGlzLmFbOF07dGhpcy5OaT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmt1PWI7Yi5wcm90b3R5cGU9e3J3OmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuc3c6dGhpcy5YbihhKX0sWG46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlluOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5wcTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQmo6dGhpcy5NayhhKX0sTWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk5rOnRoaXMubWooYSl9LG1qOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5uajp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaW86dGhpcy5xdChhKX0scXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnJ0OnRoaXMuTWkoYSl9LE1pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5OaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMua3V8fGhjLFpjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5ydyg0KTsoZnVuY3Rpb24oYyl7Yy5waT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5waXx8aWM7KGZ1bmN0aW9uKGMpe2Mub2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubGUoKTt0aGlzLmVnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmVnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGUuYmluZCh0aGlzKSwxMDApfSxsZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxlLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIGpjPWMub2l8fGpjOyhmdW5jdGlvbihjKXtjLnJpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj0KbmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMucml8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xbT10aGlzLmFbNl07dGhpcy5jaz10aGlzLmFbMV07dGhpcy5acz10aGlzLmFbMTBdO3RoaXMucW49dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5rbD1iOwpiLnByb3RvdHlwZT17cG06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnFtOnRoaXMuYmsoYSl9LGJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5jazp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWnM6dGhpcy5wbihhKX0scG46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5rbHx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMucG0oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZWg9dGhpcy5naD10aGlzLmZoPSExO3RoaXMueGQ9W107dGhpcy5hZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuVGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5HcShhKTpbXSxiO3RoaXMuZ2g9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZmg9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuSGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmFmKXtpZih0aGlzLmVoKWJyZWFrO2I9dGhpcy5hZltjXTt0aGlzLnZmKGIpJiYodGhpcy54ZC5wdXNoKGIpLHRoaXMuSGgoYikpfX0sdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgp0PyEwOiExfSxHcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5hZltjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEhoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSxTdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZmgpZm9yKHRoaXMuZWg9ITAsYT0wO2E8dGhpcy54ZC5sZW5ndGg7YSsrKXRoaXMueGRbYV0uTGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54ZFthXS5MYil9fX0pKGMpO3ZhciBuYz1jLlRsfHxuYyxNPW5ldyBuYztNLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vcj10aGlzLmFbMTBdO3RoaXMuaXQ9dGhpcy5hWzFdO3RoaXMuQXQ9dGhpcy5hWzVdO3RoaXMuR2w9dGhpcy5hWzEwXTsKdGhpcy53cz10aGlzLmFbOV07dGhpcy5Rcz10aGlzLmFbNV07dGhpcy5tcj10aGlzLmFbN107dGhpcy5IdT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs3XX1jLmZxPWI7Yi5wcm90b3R5cGU9e25yOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vcjp0aGlzLmh0KGEpfSxodDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaXQ6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkF0OnRoaXMuRmwoYSl9LEZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HbDp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud3M6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFzOnRoaXMubHIoYSl9LGxyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5tcjp0aGlzLkd1KGEpfSxHdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuajphfX19KShjKTt2YXIgb2M9Yy5mcXx8b2MsYWQ9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9YWQubnIoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuQmMoay5LdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOgotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkJjKGsuRnMpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtGLndpZHRoPTE7Ri5oZWlnaHQ9MTtGLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgYmQ9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgST1uZXcgSixsPSExO0kua2EoKTtJLllnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5rYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuWWcoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTtJLmthKCk7CnZhciBjZD1iZChmdW5jdGlvbigpe2UueWcod2luZG93LEkuQXIoKSx7aWQ6Y2R9KX0sNTAwKSxpYT1lLmFhKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd0PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuTnA9YjtiLnByb3RvdHlwZT17dnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnd0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5OcHx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQudnQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnhoPXRoaXMuY29uZj10aGlzLmxiPXRoaXMucGxheWVyPW51bGw7dGhpcy5zZD0wOwp0aGlzLmJiPSIiO3RoaXMueWQ9W107dGhpcy56ZD0wO3RoaXMuemg9ITE7dGhpcy5ZZT1bXTtlLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy50aT1iO2IucHJvdG90eXBlPXt2dTpmdW5jdGlvbihhKXt0aGlzLnhoPWF9LGdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0scXU6ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSxwdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxNYzpmdW5jdGlvbihhLGIpe2UuZmEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5CcigpKXRoaXMubGIubCh0aGlzLmxiLm9kLHRoaXMubGIud2EsdGhpcy5sYi4kZSxmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmxiLkFjKTtlbHNlIGlmKHRoaXMuVnEoKSl0aGlzLmp1KGZ1bmN0aW9uKCl7dGhpcy5NYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsueWMsdGhpcy5wbGF5ZXIucygpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLlV1KCk7bC5leGl0RnVsbHNjcmVlbigpO2Uub2IoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLmxiLApnKTtsLm91KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy50cyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkllJiYoYz10aGlzLnBsYXllci5JZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5LZShhLGMsZik7dGhpcy5wbGF5ZXIuSmgobCl9fSxCcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnNkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuc2QuZ2V0VGltZSgpLHRoaXMuc2Q9YSwzRTU8Yj8hMDohMTt0aGlzLnNkPWE7cmV0dXJuITF9LEV1OmZ1bmN0aW9uKCl7ZS5vYigicHJlcm9sbCIpO2UuZmYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMudWcoYSkpP3RoaXMuTWMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX0sRHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueGgpe2UuZmYoInBvc3Ryb2xsIik7ZS5vYigicG9zdHJvbGwiKTt0aGlzLnZ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnVnKGMpKT90aGlzLk1jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX19LHVnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxXdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLkJ1KHRoaXMuRHUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5vYigibWlkcm9sbCIpO2UuZmYoIm1pZHJvbGwiKTtpZighdGhpcy5taCl7dGhpcy5taD0hMDt2YXIgYj10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5NYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5taD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5kZCwKdGhpcy5wbGF5ZXIucygpKSl9fSxWdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnV1KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmUoKX0sZzpmdW5jdGlvbigpe3RoaXMuRXUoKTt0aGlzLnBsYXllci5OZSYmdGhpcy5WdCgpO3RoaXMuV3QoKX0sWHQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy55ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuR3coYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnpkPXRoaXMueWQubGVuZ3RofSxWcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy56ZCYmKGE9ITApO3JldHVybiBhfSwKanU6ZnVuY3Rpb24oYSl7dGhpcy56aD1hO2ZvcihhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXVsiZnVuY3Rpb24iXSh0aGlzLkl0LmJpbmQodGhpcykpfSxJdDpmdW5jdGlvbihhKXt0aGlzLnpkLS07YSYmdGhpcy5ZZS5wdXNoKGEpOzA+PXRoaXMuemQmJnRoaXMuemgoKX0sdHM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWWUubGVuZ3RoO2MrKyliPXRoaXMuWWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWms9dGhpcy5hWzhdO3RoaXMuJG09dGhpcy5hWzhdO3RoaXMuUWw9dGhpcy5hWzNdO3RoaXMuYXE9dGhpcy5hWzddO3RoaXMuZXU9dGhpcy5hWzFdO3RoaXMuTHM9dGhpcy5hWzhdO3RoaXMuUGs9CnRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzVdfWMuSW89YjtiLnByb3RvdHlwZT17WWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlprOnRoaXMuWm0oYSl9LFptOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy4kbTp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUWw6dGhpcy4kcChhKX0sJHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFxOnRoaXMuZHUoYSl9LGR1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZXU6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxzOnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuSW98fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Zayg0KX0pLmNhbGwoUGVpZm94b2hPdWNoYW5nYSxQZWlmb3hvaE91Y2hhbmdhKTsK
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
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/74.0.3729.169 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Wed, 02 Oct 2019 09:37:39 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
/
ssl.1.damoh.golem.de/d0ec0daafabe3738a04bb7f5203749520bc13ead/
111 B
671 B
XHR
General
Full URL
https://ssl.1.damoh.golem.de/d0ec0daafabe3738a04bb7f5203749520bc13ead/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBlaWZveG9oT3VjaGFuZ2E9UGVpZm94b2hPdWNoYW5nYXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3guVGV8fCh4LlRlPTApO3guVGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5UZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxFLmxlbmd0aDtjKyspRVtjXS5sb2FkKCk7CmZvcihjPTA7YzxFLmxlbmd0aDtjKyspe3ZhciBiPUVbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLG0pfSl9bS5sKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bC5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5UbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay55YyxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuZ2YoYyk7YS5xdShtKTthLnB1KGwpO2EuWHQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihtLkpiLmxlbmd0aCl7dmFyIGE9bS5KYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS55dSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5raC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKWxbaF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUua2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQW09dGhpcy5hWzhdO3RoaXMuRXY9dGhpcy5hWzddO3RoaXMuU2o9dGhpcy5hWzldO3RoaXMuS3A9dGhpcy5hWzRdO3RoaXMuam49dGhpcy5hWzddO3RoaXMuWG89dGhpcy5hWzNdO3RoaXMucGs9dGhpcy5hWzldO3RoaXMuem89dGhpcy5hWzZdO3RoaXMuUW89dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNl19Yy50bT1iO2IucHJvdG90eXBlPXt6bTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQW06dGhpcy5EdihhKX0sRHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkV2OnRoaXMuUmooYSl9LFJqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Tajp0aGlzLkpwKGEpfSxKcDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLktwOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qbjp0aGlzLldvKGEpfSxXbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWG86dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5wazp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnpvOnRoaXMuUG8oYSl9LFBvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMudG18fGhhLHNjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXNjLnptKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlRvPSExO3RoaXMuQ2I9InNldHVwIjt0aGlzLk5jPVtdO3RoaXMubmUoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuSHQuYmluZCh0aGlzKSk7dGhpcy5uYj17fTt0aGlzLlJnPXt9O3RoaXMuZGY9ITF9Yy5maz1iO2IucHJvdG90eXBlPXtUdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5uYil0aGlzLm5iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm5iW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5kZnx8KHRoaXMuZGY9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmRmfSxvYjpmdW5jdGlvbihhKXt0aGlzLm5iW2FdfHwodGhpcy5uYlthXT0wKTt0aGlzLm5iW2FdKz0xOzU8dGhpcy5uYlthXSYmIXRoaXMuUmdbYV0mJih0aGlzLlJnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuVHUoKSwhMCkpfSxuZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LApldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sUW46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEh0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLkd0KGEuZGF0YSl9LEd0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCwKZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGdlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LG9nOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR2coYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmpoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxHZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsKaWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sTm46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy56YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLnFxKGEpKXJldHVybjsoYj10aGlzLm9nKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0scXE6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sCndnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxMcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSx4ZTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LEZnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxQaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50OwpyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sYWg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxFZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLHE9MCxjPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCoKZy53aWR0aDtkPWcud2lkdGg7Zj1nLmhlaWdodDswPmcudG9wJiYoZis9Zy50b3ApO2cuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09Zy5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+Zy5sZWZ0JiYoZCs9Zy5sZWZ0KTtnLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPWcucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5FZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmUoYSl9LmJpbmQodGhpcyksMTAwKX0sSGI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHplOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sS2g6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgaD0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsaCs9Zi50b1N0cmluZygxNik7cmV0dXJuIGh9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLHEsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGc9NDAyMzIzMzQxNyxrPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4seSx1LHIsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyljW2ZdPWQoY1tmLTNdXmNbZi04XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt5PWs7dT1tO3I9bDtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKHEsNSkrKG5eCnledSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT15LHk9ZChuLDMwKSxuPXEscT10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocSw1KSsobiZ5fG4mdXx5JnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9eSx5PWQobiwzMCksbj1xLHE9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHEsNSkrKG5eeV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PXkseT1kKG4sMzApLG49cSxxPXQ7ZT1lK3EmNDI5NDk2NzI5NTtnPWcrbiY0Mjk0OTY3Mjk1O2s9ayt5JjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtsPWwrciY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IoZykrYihrKStiKG0pK2IobCkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cT4+NixnPXEmNjMsaXNOYU4oZik/ZT1nPTY0OmlzTmFOKHEpJiYoZz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpO3JldHVybiBifSxIcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGhkOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLHE9ITEsYz0hMSxlPSExLGc9ITEsaz0hMSxtPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuVGI/ITA6ITF9Y2F0Y2godSl7fXRyeXtxPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxnPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxtPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT0KbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0obXx8cSkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9cTthLmlzRmlyZWZveD1jO2EuaXNTYWZhcmk9ZTthLmlzSUU9ZzthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bTthLmlzQmxpbms9bDtyZXR1cm4gYX0sVmE6ZnVuY3Rpb24oKXt2YXIgYT17TGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sVWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sZnI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sRWw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sVW06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LApRazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LGltOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sSG86ZnVuY3Rpb24oKXtyZXR1cm4gYS5MaSgpfHxhLlVpKCl8fGEuZnIoKXx8YS5FbCgpfHxhLlVtKCl8fGEuUWsoKXx8YS5pbSgpfX07cmV0dXJuIG51bGwhPWEuSG8oKX0semE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsaCl7YiYmKGQucXVlcnlLZXlbYl09aCl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxxPWEubGVuZ3RoO2Y8cTsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxaYjpmdW5jdGlvbihhKXthPXRoaXMuemEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxmYTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxJcTpmdW5jdGlvbigpe3ZhciBhPSIiLGI9IiIsZD0iIjt0cnl7YT13aW5kb3cubG9jYXRpb24uaG9zdCxiPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSx3aW5kb3chPXdpbmRvdy50b3AmJihhPXdpbmRvdy50b3AubG9jYXRpb24uaG9zdCxiPXdpbmRvdy50b3AubG9jYXRpb24ucGF0aG5hbWUpfWNhdGNoKGYpe2RvY3VtZW50LnJlZmVycmVyJiYoZD10aGlzLnphKGRvY3VtZW50LnJlZmVycmVyKSxhPWQuaG9zdCxiPWQucGF0aCl9cmV0dXJuIGErYn0sd3A6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sRnU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLApkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocSl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sQmc6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLmNpKGIpKyI6Iit0aGlzLmNpKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZmY6ZnVuY3Rpb24oYSl7dGhpcy5DYj1hfSx5ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkNiO3RoaXMuY2UoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTsKYS5kaXNwYXRjaEV2ZW50KGYpfSxCYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMueWcoZCxiLGEpfSx2OmZ1bmN0aW9uKGEsYixkLGYscSxjLGcpe3ZhciBCPWE7ZCYmYiYmKGI9ay5UYShiLGQpKTtiJiYoQj1rLlRhKGEsYikpO2YmJihCPWsuVGEoQixmKSk7cSYmKEI9ay5UYShCLHEpKTtjJiYoQj1rLlRhKEIsYykpO2cmJihCPWsuVGEoQixjKSk7ZS5CYyhCKX0sSnQ6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLnNwZWNpYWxfdHJhY2spYj1hO2Vsc2UgaWYoIShhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTsKYi5ldmVudD1hLmNvZGU7Yi5zaXRlX2hyZWY9dGhpcy5JcSgpO2lmKGEuc3RhdGUpc3dpdGNoKGEuc3RhdGUpe2Nhc2UgInByZXJvbGwiOmIucG9zaXRpb249MTticmVhaztjYXNlICJtaWRyb2xsIjpiLnBvc2l0aW9uPTI7YnJlYWs7Y2FzZSAicG9zdHJvbGwiOmIucG9zaXRpb249MzticmVhaztkZWZhdWx0OmIucG9zaXRpb249MH1hLnZpZGVvX2R1cmF0aW9uJiYoYi52aWRlb19kdXJhdGlvbj1hLnZpZGVvX2R1cmF0aW9uKX1jYXRjaChkKXt9cmV0dXJuIGJ9LE11OmZ1bmN0aW9uKGEpe2Euc3BlY2lhbF90cmFjaz0hMDthLnNlc3Npb25faWQ9dGhpcy5ZYigpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuY2UoYSl9LGNlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSnQoYSk7aWYoYilpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2UoYil9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7aWYoIm9iamVjdCI9PXR5cGVvZiBiKXRyeXtiPUpTT04uc3RyaW5naWZ5KGIpfWNhdGNoKGQpe2I9Yi50b1N0cmluZz9iLnRvU3RyaW5nKCk6IiJ9YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YT1tLkpjKCk7bS55YShhLCEwKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7YS5kYXRhLmhvbWFkX2F0PWI7bS5EYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSxiLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7dmFyIGY9bS5KYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYik7Cm0ueWEoZiwhMCk7Zj1tLnlhKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRGEoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxLZDpmdW5jdGlvbihhKXtpZighbXx8IW0uVil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGIsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksCjUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7dmFyIGI9YS5qb2luKCIsIik7YT1tLkpjKCkrIj9ob21hZF90cmFjaz0iK2VuY29kZVVSSUNvbXBvbmVudChiKTthPW0ueWEoYSwhMCk7YS5kYXRhLmhvbWFkX3RyYWNrPWI7bS5EYShhKX19LExlOmZ1bmN0aW9uKCl7bSYmbS5WP20uaXNFbmFibGVkJiZtLmJwKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxlKCl9LmJpbmQodGhpcyksNTAwKX0sdmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLmtiKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSx5ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sa2I6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5uZChhKToiIn0sbmQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy55ZShhKTsKYiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSxjZzpmdW5jdGlvbihhLGIsZCxmKXtkPSExO2lmKGIuR2UoYSl8fHRoaXMuTHIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5jZiYmd2luZG93LnNhbmRib3guY2ZbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdJiYoMDw9c2FuZGJveC5jZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiZXJyb3IiKXx8c2FuZGJveC5jZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy53ZyhhKSlyZXR1cm4gdGhpcy53ZyhhKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9CiJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZiYmZi5wb3N0JiYoY1siWC1Ib21hZC1Qb3N0Il09InRydWUiKTtkJiYoYy5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtjLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2MuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjtmJiZmLm9ubHlVUkwmJihjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYUZpbGUiKTt2YXIgZT0hMTtkPSExO2Q9dGhpcy5hYihhLGIuTGEsYyxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChnKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIucWQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuTm4oZSxhKTtyZXR1cm4gZX0sYWI6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyxrKXt2YXIgbD1lfHxtO2U9ITA7ayYmKGU9ITEpO2lmKGwmJmwuVilpZihsLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09CnR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaCh1Yyl7Yyh1Yyl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2wueWEoYSxlKTtlPWwueWEoYSxlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBsLkRhKGUsZixjLCIiLCIiLGcpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihhLGIsZCxmLGMsbCxnLGspfS5iaW5kKHRoaXMpLDUwMCl9LGpoOmZ1bmN0aW9uKGEsYixkLGYsYyxlLGcpe3ZhciBrPSEwO2cmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2c9ZDtkPSIiO2Zvcih2YXIgbSBpbiBnKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoZ1ttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSxsczpmdW5jdGlvbihhLGIsZCl7dGhpcy5qaChhLCJHRVQiLCIiLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7aWYodGhpcy5OYylmb3IodmFyIGMgaW4gdGhpcy5OYylhPWEuc3BsaXQoYykuam9pbih0aGlzLk5jW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS54YihhKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxraDpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YTtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueGIoYSk7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGEsZi5MYSxjLGZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dHJ5e2E9SlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMubHMoZi5xZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCnl1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk5jPWF9LEd3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5hYihhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGI9Yi5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYj1iLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYj1iLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYj1iLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxiPWIucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxMbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLGE9YS5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYX0sRnI6ZnVuY3Rpb24oYSxiKXt2YXIgZD0hMTtpZihiKWZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKWlmKGJbZl09PWEpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LE1iOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9fX0pKGMpO3ZhciBRPWMuZmt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPQphfHx7fX1jLmVrPWI7Yi5UYT1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IudXQ9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuRXM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iua3c9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07Yi5icT17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnR3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuWGY9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuUGY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5VZj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5ZZj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuRm49e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2IuU2Y9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07Yi5Qdj17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuY3E9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5vdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5rZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnFwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5kZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTtiLnljPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5XZj17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IuSG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5VYz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuJGQ9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuYmU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLkduPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5qaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTtiLkhzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IudGQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IudGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYi5sZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2IuaXc9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTHY9e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk12PXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Ldj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLkZzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5la3x8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hbD10aGlzLmFbNl07dGhpcy5xaj10aGlzLmFbNF07dGhpcy5rdD10aGlzLmFbM107dGhpcy54aj10aGlzLmFbMTBdO3RoaXMubHE9dGhpcy5hWzEwXTt0aGlzLmxqPXRoaXMuYVs1XTt0aGlzLkl2PXRoaXMuYVs0XTt0aGlzLkp1PXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzVdfWMuTGw9YjtiLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFsOnRoaXMucGooYSl9LHBqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xajp0aGlzLmp0KGEpfSxqdDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMua3Q6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhqOnRoaXMua3EoYSl9LGtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5scTp0aGlzLmtqKGEpfSwKa2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmxqOnRoaXMuSHYoYSl9LEh2OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jdjp0aGlzLkl1KGEpfSxJdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSnU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLkxsfHxqYSx2Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy4kayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLmdrPWI7Yi5wcm90b3R5cGU9e3plOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxsYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LERxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5EfHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LGxkOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5sZChhKwo2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5sZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGthOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuemUodGhpcy5sYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmxkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxBcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmthKCkrIjIifSxZZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLnplKHRoaXMuRHEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5sZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIEo9CmMuZ2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ209dGhpcy5hWzldO3RoaXMuRnc9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMuT2w9YjtiLnByb3RvdHlwZT17Zm06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdtOnRoaXMuRXcoYSl9LEV3OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gdzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuT2x8fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLmZtKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzoKLy4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy5naj1ifSkoYyk7dmFyIEw9Yy5nanx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc209dGhpcy5hWzFdO3RoaXMuemk9dGhpcy5hWzNdO3RoaXMuQ209dGhpcy5hWzldO3RoaXMuT2o9dGhpcy5hWzZdO3RoaXMuZXI9dGhpcy5hWzEwXTt0aGlzLndsPXRoaXMuYVs2XTt0aGlzLnd2PXRoaXMuYVsxXTt0aGlzLlBwPXRoaXMuYVs0XTt0aGlzLkVuPXRoaXMuYVs3XTt0aGlzLkJwPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuRG09YjtiLnByb3RvdHlwZT17cm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNtOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56aTp0aGlzLkJtKGEpfSxCbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ206dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9qOnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5lcjp0aGlzLnZsKGEpfSx2bDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud2w6dGhpcy52dihhKX0sdnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMud3Y6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBwOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbjp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLkRtfHxsYSx4Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5ybSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLlNsPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5LYz0xMDA7dGhpcy5JYj0wO3RoaXMuV2E9MTUwO3RoaXMuTGI9MDt0aGlzLnJ1KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYT8KKHRoaXMuSWIrKyx0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKTowPnRoaXMuV2EmJih0aGlzLkxiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpKX0sYnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5JYj50aGlzLldhPyEwOiExfSxiZjpmdW5jdGlvbigpe3RoaXMuSWI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHJ1OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSxCcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5NYVtiLmxhKCldPWI7TSYmTS5naCYmTS5TdShiKX0sdHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS54ZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2IubGEoKV0/CiEwOiExfSxHcjpmdW5jdGlvbihiKXtiPWIuS2EoKTtmb3IodmFyIGEgaW4gdGhpcy5NYSlpZihiLmlkPT10aGlzLk1hW2FdLkthKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEx4OmZ1bmN0aW9uKGIpe3RoaXMuTWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuU2x8fHQ7KGZ1bmN0aW9uKGMpe2MuVWw9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5LYz0xMDt0aGlzLkliPTA7dGhpcy5XYT01MDt0aGlzLlg9bnVsbDt0aGlzLm5hPSExO3RoaXMucGxheWVyPWI7dGhpcy5CYj0iIjt0aGlzLnFnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuS2EoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD0KaC5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LE5hOmZ1bmN0aW9uKCl7fSxCdTpmdW5jdGlvbihiKXt0aGlzLlg9Yn0sdXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YfSx1dTpmdW5jdGlvbihiKXt0aGlzLk9lPWJ9LHN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2V9LE5lOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5JYjw9dGhpcy5XYSYmKHRoaXMuSWIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLktjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7CmVsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7ZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxFZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkthKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxCZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LE54OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLldxKCl8fHRoaXMuSm4oKTt0aGlzLkJkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sdng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sSm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sV3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxXOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEthOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LERlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxBYTpmdW5jdGlvbigpe3JldHVybiExfSxEeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hfSxjYTpmdW5jdGlvbigpe3RoaXMubmE9ITB9LExjOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmCmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sSWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSmg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxyeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSxFaDpmdW5jdGlvbigpe3RoaXMuQmI9bnVsbH0seHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkJiJiYoYj0hMCk7cmV0dXJuIGJ9LEl4OmZ1bmN0aW9uKCl7dGhpcy5xZ3x8KHRoaXMucWc9ITApfSx1ZTpmdW5jdGlvbigpe3JldHVybiExfSxveDpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5VbHx8cDsoZnVuY3Rpb24oYyl7Yy51aT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLkxmPQoiMSI7dGhpcy5NZj0iMiI7dGhpcy51bj0iMyI7dGhpcy5RYz0wO3RoaXMubmg9MzA7dGhpcy5SYj1bXTt0aGlzLmdiPVtdO3RoaXMub2M9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuWmY9dGhpcy5maT0hMTt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5nZihiKTt0aGlzLnN1KGEpfSxnOmZ1bmN0aW9uKCl7fSxyYTpmdW5jdGlvbigpe3RoaXMuZml8fCh0aGlzLmZpPSEwLGUuTGUoKSl9LFNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5hYyYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0seHI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2Eua2EoKV18fCh3aW5kb3dbYS5rYSgpXT17fSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXXx8KHdpbmRvd1thLmthKCldW2IubGEoKV09Cnt9LHdpbmRvd1thLmthKCldW2IubGEoKV0uaW5pdGlhdG9yPWUuWWIoKSk7d2luZG93W2Eua2EoKV1bYi5sYSgpXVtlLlliKCldP3dpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXSsrOndpbmRvd1thLmthKCldW2IubGEoKV1bZS5ZYigpXT0xfSxEcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmthKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldJiZ3aW5kb3dbaC5rYSgpXVtiLmxhKCldLmluaXRpYXRvciE9ZS5ZYigpJiYodGhpcy5oZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnhhKCkpe3RoaXMueHIoKTtpZighdGhpcy5EcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5oZigpO3JldHVybn10aGlzLmhmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5aaCgpO3RoaXMuWmY9ITA7YSYmImZ1bmN0aW9uIj09CnR5cGVvZiBhJiZhKCk7cmV0dXJuITB9cmV0dXJuITF9LHU6ZnVuY3Rpb24oYixhKXt0aGlzLnhhKCl8fCh0aGlzLlJiLnB1c2goYiksdGhpcy5nYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sWmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlJiJiYwPHRoaXMuUmIubGVuZ3RoJiYodGhpcy5SYj1lLnVuaXF1ZSh0aGlzLlJiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5SYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGg9MDtoPHRoaXMuZ2IubGVuZ3RoO2grKyl0aGlzLm9jW3RoaXMuZ2JbaF0ucmVhc29uXT09dGhpcy5vY1tiXSYmYS5wdXNoKHRoaXMuZ2JbaF0uZGV0YWlsKSx0aGlzLm9jW3RoaXMuZ2JbaF0ucmVhc29uXTx0aGlzLm9jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5nYltoXS5kZXRhaWwpLGI9dGhpcy5nYltoXS5yZWFzb24pO3RoaXMub2NbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSwKYj1iKyItIitoLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sd3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuTGZ9LGhmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5NZn0senU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnVufSxvYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuUWN9LFJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxmfSxleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZn0seGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuUWN9LGdmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sc3U6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sb3M6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIHY9Yy51aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5acD10aGlzLmFbOV07dGhpcy5Rcj10aGlzLmFbNl07dGhpcy5Hdj10aGlzLmFbN107dGhpcy52bz10aGlzLmFbNV07dGhpcy5nbj10aGlzLmFbNV07dGhpcy51cD10aGlzLmFbOF07dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy50aj1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY2w6dGhpcy5ZcChhKX0sWXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlpwOnRoaXMuUHIoYSl9LFByOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Rcjp0aGlzLkZ2KGEpfSxGdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuR3Y6dGhpcy51byhhKX0sdW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZvOnRoaXMuZm4oYSl9LApmbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmduOnRoaXMudHAoYSl9LHRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy51cDp0aGlzLlJvKGEpfSxSbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU286dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLnRqfHxuYSx5Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5ibCg0KTsoZnVuY3Rpb24oYyl7Yy5Iaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ianx8b2E7KGZ1bmN0aW9uKGMpe2MuSWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLmZ4O2E/YS5xYT9hLnFhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7CmYuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMuSWp8fHBhOyhmdW5jdGlvbihjKXtjLkpqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiYKd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Kanx8cWE7KG5ldyBxYShyKSkuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhvPXRoaXMuYVsxMF07dGhpcy5xcz10aGlzLmFbNF07dGhpcy55dD10aGlzLmFbNF07dGhpcy5hbz10aGlzLmFbM107dGhpcy5Bcz10aGlzLmFbNF07dGhpcy5rdj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs2XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueG86dGhpcy5wcyhhKX0scHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFzOnRoaXMueHQoYSl9LAp4dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueXQ6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmFvOnRoaXMuenMoYSl9LHpzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Bczp0aGlzLmp2KGEpfSxqdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua3Y6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLlVvfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy53byg0KTsoZnVuY3Rpb24oYyl7Yy5Daz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMudmcoKTt0aGlzLnhnKCk7dGhpcy5wcD0hMX0sdmc6ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKYnx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVyhiKX0seGc6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5LYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlgmJigwLHRoaXMuWCkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuWCYmKDAsdGhpcy5YKSgpfS5iaW5kKHRoaXMpKX0sTmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpOwphLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLk9lJiYoMCx0aGlzLk9lKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sQWE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJgpiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHVhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Da3x8c2E7KGZ1bmN0aW9uKGMpe2MuQms9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlFjO3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuU2M9ITE7dGhpcy5hZT0xO3RoaXMuVGM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuYWU9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiYKYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5TYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5TZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmgmJgohdGhpcy54YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMueGEoKSYmKHRoaXMub2EoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS53ZCgpLGEucGUoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuU2M9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5TZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5uaCYmIXRoaXMueGEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlRjLmluZGV4T2YoYSkmJgp0aGlzLlRjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMucmEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5UYy5sZW5ndGg+PXRoaXMuYWUmJnRoaXMubSgpKX0sb3M6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5zZT90aGlzLnNlKys6dGhpcy5zZT0xOnRoaXMucmU/dGhpcy5yZSsrOnRoaXMucmU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuUGgoYS52aWRlb1RhZyk/YS5iYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlNjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMucmU+dGhpcy5zZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnZnKCksYS54ZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ca3x8dGE7KGZ1bmN0aW9uKGMpe2MuRGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy55cSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLkdyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0scXg6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCnlxOmZ1bmN0aW9uKCl7dmFyIGI9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ea3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdzPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzJdfWMuTXc9YjtiLnByb3RvdHlwZT17ZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmdzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgd2E9Yy5Nd3x8d2EsQWM9bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuZnMoNCk7KGZ1bmN0aW9uKGMpe2MuSG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlcoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLkpkKGIpfS5iaW5kKHRoaXMpKX0sSmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuWCYmdGhpcy5YKCl9LERlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpOwppZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxBYTpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5IbXx8eGE7KGZ1bmN0aW9uKGMpe2MuR209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkVjPXRoaXMuQ2E9dGhpcy5YYz0hMTt0aGlzLkFoPWUuSGIoMTApO3RoaXMuZWk9ITA7dGhpcy50Yz10aGlzLlZnPSExO3RoaXMuQ3MoYi5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLnFoKCksdGhpcy5ZbygpLHRoaXMucWIoKSl9LENzOmZ1bmN0aW9uKGIpe3JldHVybiBlLmZhKCJ0LW9ubGluZS5kZSIpPyExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LEp4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5sYSgpLCI7Iiwid2luZG93LmltYToiLAoiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWSwiOyIsdHlwZW9mIGIuWSwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5ZP2IuWS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWT90eXBlb2YgYi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuSiwiOyIsdHlwZW9mIGIuSiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLklhOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouSWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLklhP2IuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuSWE/dHlwZW9mIGIuaW1hLklhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuSiYmYi5KLklhP2IuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouSWE/dHlwZW9mIGIuSi5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5ZZDoKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuWWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLllkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5aZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLlpkOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouWmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoucWE6InVuZGVmaW5lZFgiLCI7IixiLko/CnR5cGVvZiBiLkoucWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5oZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmhlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuQWgpfSx5YjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmCih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMucWEpe3ZhciBiPXRoaXMueWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLnFhPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLnFhPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnFhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnFhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnFhfSxJZzpmdW5jdGlvbigpe2lmKCF0aGlzLkVjKXt2YXIgYj10aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRWM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkVjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRWN9LEVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuVWcpe3ZhciBiPQp0aGlzLnliKCksYT10aGlzLkNyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5VZz0hMCl9cmV0dXJuIHRoaXMuVWd9LENyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5YYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuWGM9ITApO3JldHVybiB0aGlzLlhjfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsaD0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5VdCgpfS5iaW5kKHRoaXMpKSwKYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMueGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApfSxVdDpmdW5jdGlvbigpe3RoaXMudGM9ITA7dmFyIGI9dGhpcy5JZygpO2lmKGJ8fHRoaXMueGEoKSl7dmFyIGE9ImFkRXJyb3IiLGg9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5oYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5oYShhLCEwKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5nYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuVmEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnVjPQohMDtpZihlLmZhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy51Yz0hMDtlLmZhKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIisKZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnVjfHwodGhpcy51KCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5nYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LHB4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5uZyYmYi5hZHMmJih0aGlzLm5nPWIuYWRzKTtyZXR1cm4gdGhpcy5uZ30sWW86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nYSghMCk7CnRoaXMudSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5oYShhKTt0aGlzLmdhKCk7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhKGEpO3RoaXMuZ2EoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLlNlKCl9LmJpbmQodGhpcykpfSxmZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlYpaG9tYWRVdGlscy5VYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZkKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuSWcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmQoKX0uYmluZCh0aGlzKSw1MCkpfSxxaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5FcigpKXt2YXIgYT10aGlzLnliKCksaD10aGlzLlhiKCk7YSYmaCYmKHRoaXMueWIoKSx0aGlzLlhiKCksdGhpcy50Y3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRjP3RoaXMudygpOih0aGlzLmdhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5WZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLnliKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5nYSgpKToodGhpcy5nYSghMCksdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuVmc9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xaCgpfS5iaW5kKHRoaXMpLDUwKX0saGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWg9ITA7aHx8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7CmlmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO2JyZWFrfX0sWm86ZnVuY3Rpb24oKXt0aGlzLnpjfHwodGhpcy56Yz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMuemMhPWIuYWRzLnN0YXRlJiYodGhpcy56Yz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09CnRoaXMuemMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy56Yz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWm8oKX0uYmluZCh0aGlzKSwxMCl9LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7MDw9ZS5aYihkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpKX0sZ2E6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLncoKSx0aGlzLnJhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMueGEoKXx8KGJ8fCh0aGlzLmVpPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLmVpLGZ1bmN0aW9uKCl7dGhpcy5mZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKZ3A6ZnVuY3Rpb24oKXt0aGlzLnl4fHwoMTA8dGhpcy5Xdj8odGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLld2KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuYXUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ3AoKX0uYmluZCh0aGlzKSw1MCkpKX0sYXU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuWHYpe3RoaXMuWHY9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5nYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpOwpiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZ2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5HbXx8eWE7KGZ1bmN0aW9uKGMpe2MuSW09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZzpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlFoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5RaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxRaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLnhlKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubmF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuTGI9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuS2MpfX0pfSkoYyk7dmFyIHphPWMuSW18fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5aaj10aGlzLmFbMl07dGhpcy5DdD10aGlzLmFbOV07dGhpcy5vbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs4XX1jLklrPWI7Yi5wcm90b3R5cGU9e1lqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWmo6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkN0OnRoaXMubm8oYSl9LG5vOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMuSWt8fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1CYy5Zaig0KTsoZnVuY3Rpb24oYyl7Yy5JbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLlVlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlcoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LER0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuQmIsaD10aGlzLmxhKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTsKZCYmYSYmYS5hYyYmKDA8PWguaW5kZXhPZihkKXx8YS53ZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxBYTpmdW5jdGlvbigpe3RoaXMuVWUrKztpZigxMDx0aGlzLlVlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLAoiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LEpkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9fSl9KShjKTt2YXIgQ2E9Yy5JbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuSGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQ2E6ZnVuY3Rpb24oKXtpZighdGhpcy50ZSlpZih0aGlzLkRifHwKKHRoaXMuRGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5EYisrLDE1PHRoaXMuRGIpdGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksCjEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpLDEwKX19LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQ2EoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLmdxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5vYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELApmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSksYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5tKCl9LmJpbmQodGhpcykpLHRoaXMuZ3E9ITAsYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5EdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5IbHx8RGE7KGZ1bmN0aW9uKGMpe2MuSmw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYKMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm5hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9CmMuSmx8fEVhLEZhPW5ldyBFYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ldD10aGlzLmFbNF07dGhpcy5Ldz10aGlzLmFbN107dGhpcy5MdT10aGlzLmFbN107dGhpcy53cj10aGlzLmFbNF07dGhpcy5UbT10aGlzLmFbMTBdO3RoaXMuc249dGhpcy5hWzddO3RoaXMudXI9dGhpcy5hWzFdO3RoaXMuWGo9dGhpcy5hWzEwXTt0aGlzLnF3PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzFdfWMuQWk9YjtiLnByb3RvdHlwZT17ZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmV0OnRoaXMuSncoYSl9LEp3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS3c6dGhpcy5LdShhKX0sS3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkx1OnRoaXMudnIoYSl9LHZyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy53cjp0aGlzLlNtKGEpfSxTbTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLlRtOnRoaXMucm4oYSl9LHJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zbjp0aGlzLnRyKGEpfSx0cjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudXI6dGhpcy5XaihhKX0sV2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Yajp0aGlzLnB3KGEpfSxwdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnF3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgR2E9Yy5BaXx8R2EsQ2M9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9Q2MuZHQoNCk7KGZ1bmN0aW9uKGMpe2Mudms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuRmcoYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJgooYT1hLnBhcmVudE5vZGUpfXRoaXMuRnQ9Yi5wb3NpdGlvbmluZzt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLndpZHRoPWIud2lkdGg7aC5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2guc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtoLnN0eWxlLmhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLkZ0KXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlcoaCk7dGhpcy5aKGgpOwp0aGlzLmpkPWh9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5qZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuamQpfSx1YTpmdW5jdGlvbigpe3JldHVybiEwfSxmcDpmdW5jdGlvbigpe2UuYWgodGhpcy5qZCk7ZS5FZSh0aGlzLmpkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSw1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sSWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBIYT1jLnZrfHxIYTsoZnVuY3Rpb24oYyl7Yy51az12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy51a3x8SWE7KGZ1bmN0aW9uKGMpe2Mud2s9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj0KbC5pbnJlYWQsYT1lLkZnKGIsImVsZW1lbnRJRCIpO2lmKGUuYWgoYSkmJihiPW5ldyBIYShiKSwhdGhpcy5OKGIpKSl7dGhpcy5SKGIpOyhuZXcgSWEoYix0aGlzLkkpKS5nKCk7cmV0dXJufXRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuTGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEphPWMud2t8fEphLEthPW5ldyBKYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5iaj10aGlzLmFbOV07dGhpcy5BbD10aGlzLmFbMTBdO3RoaXMuV2w9dGhpcy5hWzZdO3RoaXMuY3Q9dGhpcy5hWzFdO3RoaXMuSWk9dGhpcy5hWzRdO3RoaXMuTXA9dGhpcy5hWzldO3RoaXMuJGk9dGhpcy5hWzFdO3RoaXMuc3M9dGhpcy5hWzddO3RoaXMuUHE9dGhpcy5hWzNdOwp0aGlzLllyPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuU249YjtiLnByb3RvdHlwZT17YWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmJqOnRoaXMuemwoYSl9LHpsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5BbDp0aGlzLlZsKGEpfSxWbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuV2w6dGhpcy5idChhKX0sYnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jdDp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuSWk6dGhpcy5McChhKX0sTHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1wOnRoaXMuWmkoYSl9LFppOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kaTp0aGlzLnJzKGEpfSxyczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3M6dGhpcy5PcShhKX0sT3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlBxOnRoaXMuWHIoYSl9LFhyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ZcjoKdGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTGE9Yy5Tbnx8TGEsRGM9bmV3IExhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RGMuYWooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLmhrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LHR1OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sS246ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5oa3x8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApoLGQsZil7dGhpcy5mYj1hO3RoaXMuQWc9dGhpcy5uaT0hMTt0aGlzLnJoPWQ7dGhpcy5SaD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5mYj1uZXcgeihhKSk7dmFyIGM9dGhpcy5zYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshaHx8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxoKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmMjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1cylkKGMpO2Vsc2UgaWYoND09Yy5yZWFkeVN0YXRlJiYwPT1jLnN0YXR1cyYmbSYmbS5IZSh0aGlzLmZiLnVybCkmJm0uTWQpe3ZhciBlPW5ldyB6KGEudXJsKTtlLnR1KCJQT1NUIik7ZS5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihlLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGgpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmCihiPSEwKTtifHxtLmlhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5pYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuaWs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZmIuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuQWcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLlJoP3RoaXMuc2Iub3Blbih0aGlzLmZiLm1ldGhvZCx0aGlzLmZiLnVybCwhMSk6dGhpcy5zYi5vcGVuKHRoaXMuZmIubWV0aG9kLHRoaXMuZmIudXJsLCEwKSx0aGlzLm5pfHwodGhpcy5zYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuc2Iuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLnNiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLnNiLnNlbmQoYSl9Y2F0Y2goZil7bSYmbS5IZSh0aGlzLmZiLnVybCk/bS5NZD9tLmlhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkhlKHRoaXMuZmIudXJsKSx0aGlzLnJoJiZ0aGlzLnJoKCl9cmV0dXJuIHRoaXMuc2J9fX0pKGMpO3ZhciBNYT1jLmlrfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGE9dGhpcy5WZD0hMX1jLmhqPWI7Yi5wcm90b3R5cGU9e3h1OmZ1bmN0aW9uKGEpe3RoaXMuVmQ9YX0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5IYT1hfSxadDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJwdWJsaXNoZXJBUEkiLCJyZWdpc3RlcmluZ3MgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYixhKX0pfXZhciBiPXtQdzoiQWRDbGlja1RocnUiLFJ3OiJBZEVycm9yIixTdzoiQWRTdG9wcGVkIixWdzoiQWRMaW5lYXJDaGFuZ2UiLFd3OiJBZFRhZ1BhcnNlZCIsWnc6IkFkVmlkZW9Db21wbGV0ZSIsYng6IkFkTG9hZGVkIixjeDoiQWRTa2lwcGVkIixkeDoiQWRTdGFydGVkIixUdzoiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLFV3OiJBZEltcHJlc3Npb24iLFF3OiJBZENyZWF0aXZlVmlldyIsWHc6IkFkVmlkZW9NaWRwb2ludCIsWXc6IkFkUGF1c2VkIiwkdzoiQWRWaWRlb1N0YXJ0IixheDoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGI9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmYSh0aGlzLlZkLGJbZF0pfSxZdDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSwKYil7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixiKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGIsYSl9KX1pZih0aGlzLkhhJiZ0aGlzLkhhLlVkKWZvcih2YXIgYiBpbiB0aGlzLkhhLlVkKXRoaXMuSGEuVWQuaGFzT3duUHJvcGVydHkoYikmJmEodGhpcy5IYSx0aGlzLkhhLlVkW2JdKTt0aGlzLkhhJiZ0aGlzLkhhLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhLmdldEVycm9yKCk7YSYmY29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwiZ290IGVycm9yIixhKX0uYmluZCh0aGlzKSwxMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLlZkJiZ0aGlzLlp0KCk7dGhpcy5IYSYmdGhpcy5ZdCgpfX19KShjKTt2YXIgTmE9Yy5oanx8TmE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlVhPSExO3RoaXMud2M9IiI7dGhpcy5pZT0KdGhpcy52Yz10aGlzLndiPW51bGw7dGhpcy54cD10aGlzLkpiPXRoaXMuaWg9ITE7dGhpcy5MYT0iIjt0aGlzLmRoPSExO3RoaXMud2E9dGhpcy5vZD0iIjt0aGlzLlpnPXRoaXMuVj10aGlzLmlzRW5hYmxlZD10aGlzLiRlPSExO3RoaXMucGE9W107dGhpcy5PZz10aGlzLmZjPSIiO3RoaXMucWU9ITE7dGhpcy5xZj0wO3RoaXMuR2Y9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5FZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuUWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMubmM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLmhjPSIiO3RoaXMuaWM9W107dGhpcy5qYz1bXTt0aGlzLklkPVtdO3RoaXMuZ2M9IiI7dGhpcy5yZj0wO3RoaXMudmlkZW9wbGF6YT0Ke307dGhpcy5EYz0hMTt0aGlzLmhwPXRoaXMuT2Q9bnVsbDt0aGlzLkxoPXRoaXMubGM9dGhpcy5zZz10aGlzLnVmPXRoaXMuTWQ9dGhpcy5rZT10aGlzLlJjPSExO3RoaXMuaGI9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9O3RoaXMucGQ9MDt0aGlzLlFnPSExO3RoaXMuUGc9MUUzO3RoaXMuWmM9ITE7dGhpcy5RYT0xRTM7dGhpcy5PZj0iIn1jLmprPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLlVhLGFkdGFncGFyYW1ldGVyOnRoaXMud2MsYWR0YWdtb2RpZmllcjp0aGlzLndiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy52YyxhZHRhZ3JlZ2V4OnRoaXMuaWUsYml0cmF0ZTp0aGlzLlFhLGpzcG9wdXBzOnRoaXMuaWgsc2lkZWxvYWRzOnRoaXMuSmIsZGlzYWJsZXRlc3RzOnRoaXMueHAsaG9tYWRBbGlhczp0aGlzLkxhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5kaCxnbG9iYWxDb25maWc6dGhpcy5vZCxjbGllbnRDb25maWc6dGhpcy53YSwKaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5WLGlzQmxvY2tlZDp0aGlzLlpnLHNlcnZlcjp0aGlzLnBhLHN2bUNvbmZpZzp0aGlzLmZjLGhvbWFkQWRwYXRoOnRoaXMuT2csZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5xZSx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5xZixIT01BRF9WRVJJRklFRDp0aGlzLkdmLEhPTUFEX0JMT0NLRUQ6dGhpcy5FZixIT01BRF9OT0JMT0NLRVI6dGhpcy5RYixIT01BRF9BREJMT0NLRVI6dGhpcy5uYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRmYsdGVzdEhpZGU6dGhpcy5oYyx0ZXN0VGFnczp0aGlzLmljLHRlc3RUYWdzSlM6dGhpcy5qYyx0ZXN0VGFnc1hIUjp0aGlzLklkLHRlc3RDb29raWU6dGhpcy5nYyx0aHJvdHRsZTp0aGlzLnJmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuRGMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5ocCxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlJjLApibG9ja2VkV2FzQ2FsbGVkOnRoaXMua2UsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuTWQsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMudWYsY29uZmlnRmFpbHVyZXM6dGhpcy5oYixzaXRlQ29uZmlnOnRoaXMuRmEsc2VydmVySWQ6dGhpcy5JaCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuamIsdnBhaWQ6dGhpcy5sYyxza2lwQWxsb3dlZDp0aGlzLkxoLHZtYXBzOnRoaXMua2ksYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLlpjLGFkRmFsbGJhY2tVUkw6dGhpcy5PZn19LFVxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmhiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuaGJbYl0mJjE9PXRoaXMuaGJbYl0mJihhPSEwKTtyZXR1cm4gYX0sZWY6ZnVuY3Rpb24oYSl7dGhpcy5oYlthXT0hMH0senE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltiXSYmMT09dGhpcy5oYltiXSYmYS5wdXNoKGIpOwpyZXR1cm4gYX0sSGQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5MbyhhKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixnPSIiO2lmKCF0aGlzLlVhJiYhYilyZXR1cm4gbmV3IHooYSk7Zj10aGlzLkdlKGEpO2M9dGhpcy56YShhKTtmPyh0aGlzLkZjKCk/ZT1hOmU9Yy5wcm90b2NvbCsKIjovLyIrYy5hdXRob3JpdHkrIi8iLGc9Yy5wYXRoLnN1YnN0cigxKSk6KGU9dGhpcy5KYygpLGc9Yy5wYXRoLnN1YnN0cigxKSsoYy5xdWVyeT8iPyIrYy5xdWVyeToiIikpO2QmJih0aGlzLndjfHx0aGlzLndifHx0aGlzLnZjfHx0aGlzLmllKSYmKGc9dGhpcy55cyhnKSk7YT1uZXcgeihlKTthLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkFxKGMuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1nO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGcpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sR2U6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/CmI9ITA6dGhpcy5GYygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sRmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMucGEmJnRoaXMucGEubGVuZ3RoJiYwPHRoaXMucGEubGVuZ3RoJiYoYj10aGlzLnBhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEhlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuR2UoYSk7cmV0dXJuIGJ9LEFxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT0KdHlwZW9mIHRoaXMuTGEmJjA8dGhpcy5MYS5sZW5ndGgpcmV0dXJuIHRoaXMuTGE7Zm9yKGQgaW4gdGhpcy5MYSlpZihiPXRoaXMuTGFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5reDtyZXR1cm4ibm9uZSJ9LHFkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFbdGhpcy5JaF19LEpjOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5xZCgpLGI9dGhpcy5LaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxvaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx4czpmdW5jdGlvbihhLApiKXt2YXIgZD1lLnphKGEpLGY9IiIsZj0iIixjO2ZvcihjIGluIGIpe2lmKGJbY10uc3VidmFsdWVzKXtmb3IodmFyIGc9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbY10pLnNwbGl0KCImIiksZj17fSxDPTA7QzxnLmxlbmd0aDtDKyspe3ZhciBrPWdbQ10uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGJbY10uc3VidmFsdWVzKWZbbF09dGhpcy5vaChmW2xdLGwsYltjXS5zdWJ2YWx1ZXNbbF0pO2c9W107Zm9yKGwgaW4gZilnLnB1c2gobCsiPSIrZltsXSk7Zj1nPWVuY29kZVVSSUNvbXBvbmVudChnLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMub2goZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx5czpmdW5jdGlvbihhKXt0aGlzLndjJiYoYSs9dGhpcy53Yyk7aWYodGhpcy53Yilmb3IodmFyIGIgaW4gdGhpcy53Yil0aGlzLndiLmhhc093blByb3BlcnR5KGIpJiYKKGE9YS5yZXBsYWNlKGIsdGhpcy53YltiXSkpO3RoaXMudmMmJihhPXRoaXMueHMoYSx0aGlzLnZjKSk7cmV0dXJuIGF9LGVwOmZ1bmN0aW9uKCl7dGhpcy5GYSYmdGhpcy5GYS5jbGllbnRBUElzJiZ0aGlzLiRvKHRoaXMuRmEuY2xpZW50QVBJcyl9LCRvOmZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBiPW5ldyBOYTthLnB1Ymxpc2hlckFQSSYmYi54dShhLnB1Ymxpc2hlckFQSSk7YS5wbGF5ZXImJmIud3UoYS5wbGF5ZXIpO2IuZygpfX0sbDpmdW5jdGlvbihhLGIsZCxmLGMsZSl7bT10aGlzO3RoaXMuZGg9ITA7dGhpcy5vZD1hO3RoaXMud2E9Yjt0aGlzLiRlPWQ7dGhpcy5PZD1mO3RoaXMuQWM9Yzt0aGlzLkZhPWV8fHt9O3RoaXMuZXAoKTt0aGlzLmtzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLndhKXRoaXMuaHMoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMud2EpdHJ5e3RoaXMud2E9YigpLHRoaXMueGMoKX1jYXRjaChnKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PQp0eXBlb2YgdGhpcy53YSl0cnl7dGhpcy53YT1iLHRoaXMueGMoKX1jYXRjaChrKXt0aGlzLmlhKCJub0NsaWVudENvbmZpZyIpfX0scGI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGtzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLm9kK3RoaXMuZmUoImdsb2JhbCIpKSx0aGlzLlFxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMueGMoKX0uYmluZCh0aGlzKSwhMCl9LGhzOmZ1bmN0aW9uKCl7dGhpcy5EYShuZXcgeih0aGlzLndhK3RoaXMuZmUoImNsaWVudCIsLTEhPXRoaXMud2EuaW5kZXhPZigiPyIpKSksdGhpcy54Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5lZigiY2xpZW50Iik7dGhpcy5pYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLAohMCl9LGZlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5IYigpKTt0aGlzLkZhJiZ0aGlzLkZhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5GYSYmdGhpcy5GYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGlhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmtlKXt0aGlzLmtlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChoKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwphPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkFjPSExKTt0aGlzLkFjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQWM/dGhpcy5BYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5WPXRoaXMuWmc9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkVmKSk7dGhpcy5OYigpO2UuQmMoay51dCk7KGI9ZS5aYih0aGlzLnFkKCkpKXx8KGI9ZS5aYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sUXE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuVj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLndhfHx0aGlzLmZjfHx0aGlzLkxhfHx0aGlzLnhjKCk6KHRoaXMuVWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5WPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLlFiKSksdGhpcy5OYigpKX19LHhjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLndhfWVsc2UgYT10aGlzLndhO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYS5lbmFibGVkKTt0aGlzLlY9IXRoaXMuaXNFbmFibGVkO3RoaXMucGE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLnBhLmxlbmd0aDtiKyspdGhpcy5wYVtiXT10aGlzLnBhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5mYSgid2ViLmRlIil8fGUuZmEoImdteC5uZXQiKXx8ZS5mYSgiZ214LmF0Iil8fGUuZmEoImdteC5jaCIpfHxlLmZhKCIxdW5kMS5kZSIpKSYmIXRoaXMuRmMoKSlmb3IoYj0wO2I8dGhpcy5wYS5sZW5ndGg7YisrKXRoaXMucGFbYl09dGhpcy5wYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLmZjPWEuY29uZmlnfHwiIjt0aGlzLkxhPWEuYWxpYXN8fApudWxsO3RoaXMuT2c9YS5hZHBhdGh8fCIiO3RoaXMucWU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5JaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5wYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmZjJiZ0aGlzLkxhJiZ0aGlzLnBhLmxlbmd0aD90aGlzLkdjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlY9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxHYzpmdW5jdGlvbihhKXtpZighdGhpcy5WKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkpjKCkpLGQ9dGhpcy56YSh0aGlzLmZjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0KIlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmZjK3RoaXMuZmUoImN1c3RvbWVyIikpO3RoaXMuRGEoYix0aGlzLlZ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJjdXN0b21lciIpO2E/dGhpcy5obT90aGlzLmlhKCJub1NWTUNvbmZpZyIpOih0aGlzLmhtPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5HYyghMCl9LmJpbmQodGhpcyksITApfX0sVnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuVil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5EYz0hMDt0aGlzLkdjKCEwKTtyZXR1cm59fXRoaXMuTWQ9dGhpcy5NYihiLnN0cmljdCk7dGhpcy51Zj10aGlzLk1iKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnNnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj0KdGhpcy5NYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuTWIoYi5lbmFibGVkKTt0aGlzLmhjPWIudGVzdGhpZGV8fCIiO3RoaXMuamM9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5JZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMud2M9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy53Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy52Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuaWU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuaWg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5KYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5sYz1iLnZwYWlkfHwhMTt0aGlzLkZhLnZwYWlkPXRoaXMubGM7dGhpcy5MaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLiRjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5raT1iLnZtYXBzfHwiIjt0aGlzLlpjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT1iLmJpdHJhdGV8fAoxRTM7dGhpcy5PZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5nYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLkhxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5xZSYmKHRoaXMuZ2M9bnVsbCk7dGhpcy5yZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkRjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5EYz0hMCx0aGlzLkdjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLm52KCkmJih0aGlzLmhjfHx0aGlzLmpjfHx0aGlzLmljfHx0aGlzLmdjfHx0aGlzLklkKT90aGlzLiRlPyh0aGlzLlVhPXRoaXMuVj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5RYikpLHRoaXMubWUoKSx0aGlzLk5iKCkpOnRoaXMuWnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy4kdSgpKX19LFp1OmZ1bmN0aW9uKCl7dGhpcy5ZdSgpOwp0aGlzLmF2KCl9LGF2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksQz1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLAoiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEMpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnhiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPQpkKXt2YXIgYz1lLmhkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkZhJiZ0aGlzLkZhLnBsYXllciYmdGhpcy5GYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5pYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sJHU6ZnVuY3Rpb24oKXt0aGlzLlY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LE9jOmZ1bmN0aW9uKGEpe3RoaXMuUmM9ITA7dGhpcy5WfHwodGhpcy5WPXRoaXMuVWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLk5iKCksdGhpcy5tZSgpKX0sWXU6ZnVuY3Rpb24oKXtpZih0aGlzLmhjKXt2YXIgYT1lLmhkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5oaCgpKXRoaXMuT2ModGhpcy5uYywKIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmhjKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaGMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuVmgoKX19ZWxzZSB0aGlzLlZoKCl9LFVoOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5IYigpKTt0aGlzLmR2KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5uZi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuT2ModGhpcy5uYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmljPXRoaXMuSWQpJiZ0aGlzLmljLmxlbmd0aCl7dmFyIGQ9dGhpcy5pYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLm5mKCl9LGR2OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLkRhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxWaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtjPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsCnRoaXMuSGIoKSk7dGhpcy5ldihjLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVWguYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLk9jKHRoaXMubmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrYysiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuamMmJnRoaXMuamMubGVuZ3RoKXt2YXIgZD10aGlzLmpjLnNsaWNlKCksYzthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuVWgoKX0sZXY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGMoKXtnKCkmJmIoKX1mdW5jdGlvbiBlKCl7ZygpJiZkKCl9ZnVuY3Rpb24gZygpe3JldHVybiBDPyh3aW5kb3cuY2xlYXJUaW1lb3V0KEMpLCEwKTohMX12YXIgQz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2MoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZnKCkmJmUoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTsKay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWM7ay5vbmVycm9yPWU7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlKX1jYXRjaChsKXtjKCl9fSxuZjpmdW5jdGlvbigpe3RoaXMuZ2M/KHRoaXMucWYrKyx0aGlzLkRhKG5ldyB6KHRoaXMuZ2MpLHRoaXMuWHUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMub2YoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5TaCgpfSxvZjpmdW5jdGlvbihhKXt0aGlzLk9jKHRoaXMuRmYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxYdTpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5xZj90aGlzLm5mKCk6dGhpcy5vZigiQkJCIik6CiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlNoKCk6dGhpcy5vZigiQUFBIil9LFNoOmZ1bmN0aW9uKCl7dGhpcy5WPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMubWUoKX0saGg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlJjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS5mYSgidC1vbmxpbmUuZGUiKXx8ZS5mYSgiZ2lnYS5kZSIpfHxlLmZhKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLmhoKCksITApOwpkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5HZikpO3RoaXMuT2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5PZCYmdGhpcy5PZCgpfSxjcDpmdW5jdGlvbigpe2lmKHRoaXMudWYmJnRoaXMuVXEoKSl7dmFyIGE9dGhpcy56cSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sWmg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxEYTpmdW5jdGlvbihhLGIsZCxjLHEsZyl7dGhpcy5wZHx8KHRoaXMucGQ9MCk7dGhpcy5wZCsrO3RoaXMucGQ+dGhpcy5QZyYmIXRoaXMuUWcmJih0aGlzLlFnPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5QZywhMCkpO2E9bmV3IE1hKGEsCmIsZCk7YyYmKGEubmk9ITApO3EmJmUuSHIoKSYmKGEuQWc9ITApO2cmJihhLlJoPSEwKTtyZXR1cm4gYS5sb2FkKCl9LGFwOmZ1bmN0aW9uKCl7ZS5WYSgpfHxlLmFiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxjPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmlhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2M9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/CmEuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy5GYygpfHwoYT10aGlzLnphKGMpLGM9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7Zy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtnLm5ldHdvcmtTdGF0ZT09Zy5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5pYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2cuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2cuc2V0QXR0cmlidXRlKCJzcmMiLGMpfWVsc2UgdGhpcy5pYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaWEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmlhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5pYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sV3U6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PQp0aGlzLmtpfSxicDpmdW5jdGlvbigpe3RoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMueWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuRGEoYSx0aGlzLk92LmJpbmQodGhpcyksdGhpcy5Odi5iaW5kKHRoaXMpKX0sT3Y6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3JldHVybn1kfHx0aGlzLmVxKCl9LE52OmZ1bmN0aW9uKCl7fSwKZXE6ZnVuY3Rpb24oKXtlLkJjKGsuY3EpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuaWEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LG1lOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuSmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5KYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLkpiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgSjt3aW5kb3dbZC5rYSgpXT10aGlzO2UuYWIoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sbnY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5yZn0sSHE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKgphLmxlbmd0aCldfSxIYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sTWI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsYyxlLGcsayxsLG09MDttPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChtKyspLGM9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSxnPWQ+PjIsZD0oZCYzKTw8NHxjPj40LGs9KGMmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGMpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LHphOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGM9MTQ7Yy0tOylkW2JbY11dPWFbY118fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LEtoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZCxoO2ZvcihkPTc7MDw9ZDtkLS0paD1hPj4+NCpkJjE1LGMrPWgudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGc9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdSx2LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8bi0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZSk7CnN3aXRjaChuJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChuPj4+MjkpO3gucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKylnW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspZ1tjXT1kKGdbYy0zXV5nW2MtOF1eZ1tjLTE0XV5nW2MtMTZdLDEpO2U9aztuPWw7cD1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1kKGUsNSkrKG4mcHx+biZ1KSt2K2dbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWQoZSw1KSsobl5wXnUpK3YrZ1tjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cCxwPWQobiwzMCksbj1lLGU9dztmb3IoYz00MDs1OT49YztjKyspdz1kKGUsNSkrKG4mcHxuJnV8cCZ1KSt2K2dbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXAscD1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZChlLDUpKyhuXnBedSkrditnW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1wLHA9ZChuLDMwKSxuPWUsZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihyKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgT2E9Yy5qa3x8T2EsbT1uZXcgT2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxuPXRoaXMuYVs5XTt0aGlzLnh3PXRoaXMuYVsxXTt0aGlzLmxtPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzNdfWMuWm49YjtiLnByb3RvdHlwZT17a246ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxuOnRoaXMud3coYSl9LHd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHc6dGhpcy5rbShhKX0sa206ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmxtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgUGE9Yy5abnx8UGEsRWM9bmV3IFBhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RWMua24oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5mLlA/dGhpcy5iYj1hLmYuUCgpOgp0aGlzLmJiPSIiO2EuZi5YZyYmYS5mLlhnKHtwYXVzZTp0aGlzLndkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuR2guYmluZCh0aGlzKSxtdXRlOnRoaXMuUGUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy54di5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmliO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuVmI9dGhpcy5ZYz0hMTt0aGlzLkdvPTFFMzt0aGlzLnRhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuRmQ9e307ZS5vYigibmV3QmlnQWRJZCIpO3RoaXMuT289ZS5hYSgxMCk7dGhpcy5sZj0wO3RoaXMuV2M9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5XYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmIuZikmJnRoaXMuYi5mLnMmJihhPXRoaXMuYi5mLnMoKSksdGhpcy5XYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYKKHRoaXMuUm49Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5zaD10aGlzLkVkPSExO3RoaXMubGg9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmVlPSExO3RoaXMuYmk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuR2I9ZS5hYSgxMCk7dGhpcy5FYj1lLmFhKDEwKTt0aGlzLk1oPWUuYWEoMTApO3RoaXMuY29uZj17fTt0aGlzLlBkPXRoaXMuT2I9dGhpcy5vZT10aGlzLmVkPXRoaXMuR2Q9dGhpcy5yYj10aGlzLm1jPXRoaXMudWg9dGhpcy5rZD10aGlzLnB2PXRoaXMudWI9dGhpcy5GYj0hMTt0aGlzLnJjPVtdO3RoaXMuY2M9e307dGhpcy5zdD0yMDA7dGhpcy5CZj10aGlzLkNmPXRoaXMuamU9dGhpcy5BZj10aGlzLlplPSExO3RoaXMudmQ9e319Yy5kaz1iO2IucHJvdG90eXBlPXtvdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9CmF9LEphOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sJGg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuQ2ImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk91KCk7ZS52KGsuSG4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sS2U6ZnVuY3Rpb24oYSxiLGMsZil7dGhpcy51Yj1jO3ZhciBnPSExO2YmJmYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihnPSEwKTtpZih0aGlzLkwuVil0aGlzLmxmKyssZS5vYigibmV3U21hbGxBZElkIiksdGhpcy5MLmNwKCksZj1tLmdldENvbmZpZygpLHRoaXMuTC5VYSYmdGhpcy5MLmlzRW5hYmxlZD8odGhpcy4kaCgpLG5ldyBTKHRoaXMsYSx0aGlzLmxoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpiLApiaXRyYXRlOmYuUWEsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLkwubGMsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5mLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmYuZ2V0Q3VycmVudFRpbWUoKX19KSk6Yj8odGhpcy4kaCgpLG5ldyBTKHRoaXMsYSx0aGlzLmxoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5MLmxjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Zi5RYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUmEoKTtlbHNle3ZhciB0Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0Yy5LZShhLGIsYyl9LDUwKX19LFZlOmZ1bmN0aW9uKGEpe2EuJGEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsCiJhZCIsITApO3RoaXMuUGQ9dGhpcy5PYj10aGlzLmtkPSExO3RoaXMuYz1hO3RoaXMuQ3UodGhpcy5jKTt0aGlzLnZkPW5ldyBRYSh0aGlzLmMuUXYsdGhpcy52aWRlbyx7fSk7dGhpcy5MZyhhKTt0aGlzLnJjPXRoaXMuQ2coYSk7dGhpcy5rcCgpfSxMZzpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5GZD10aGlzLktxKGEpKSx0aGlzLkxnKGEucGFyZW50KSl9LENnOmZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5DZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLnVxKGEpKSk7cmV0dXJuIGN9LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5VJiZhLlUuZ2V0QXR0cmlidXRlKXtiPWEuVS5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7CmZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWMucHVzaChhW2ZdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09Yy5sZW5ndGgmJihjPWNbMF0pfXJldHVybnthZElEOmIsY3JlYXRpdmVJRDpjfX0sS3E6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxmPVtdLGU9W10sZz0iIjtpZihhLlUpe2I9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Zj1hLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goZykpO2EuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSwKZS5wdXNoKGcpKTtmb3Ioaz0wO2s8Yi5sZW5ndGg7aysrKWMucHVzaChhLmtiKGJba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6YyxhZElkczplLGFkSWQ6Z319LHNhOmZ1bmN0aW9uKGEpe2EuJGEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgYj0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGI9YS5lcnJvci5kZXRhaWwuY29kZSksYS5nZCYmYS5nZC5lcnJvciYmYS5nZC5lcnJvci5jb2RlJiYoYj1hLmdkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuUGMuY29kZTpiPT1HLldkLmNvZGU/ZS52KGsua3csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTooZS5MZSgpLGI9PUcuSmYuY29kZSYmZS52KGsuRHMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk7ZS52KGsuYnEsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSk7dGhpcy5QdSgpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LkhmLmNvZGU6ZS52KGsuUHYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5LZi5jb2RlOmUudihrLm93LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LlhkLmNvZGU6ZS52KGsudHcsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlhhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy5UZC5jb2RlOmUudihrLkVzLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5TZC5jb2RlOmUudihrLkx2LHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSk7dGhpcy5YYSgiZHVtbXlhZCIpO2JyZWFrOwpjYXNlIHcuRGYuY29kZTplLnYoay5Ndix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5QYS5sZW5ndGg7KXRyeXt2YXIgYz1hLlBhLnBvcCgpO3RoaXMuSmUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LEN1OmZ1bmN0aW9uKGEpe3RoaXMub2U9ITE7dGhpcy5QYj10aGlzLmIuSzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5QYi56SW5kZXg9YjtiPXRoaXMuYi5GO3RyeXt2YXIgYz10aGlzLmIuZi5nZXRSYXdQbGF5ZXIoKTtpZihjJiZjLmVudnZhcnMpdHJ5e2I9Yy5lbnZ2YXJzKCkudmlkZW9TbG90LAp0aGlzLlplPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuS3g9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiZiLnNldEF0dHJpYnV0ZShnLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2ddKTt0aGlzLlJuJiZ0aGlzLnBsYXllci51ZSgpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIudWUoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuTy5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5PW2NdLnR5cGUpJiYKdGhpcy5MbihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuWmUmJmIubG9hZCgpO2lmKHRoaXMuV2goYikpe3RoaXMuTmgoInNldHVwIix0aGlzLlphKCkpO3RoaXMuUG4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLlplP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoYil9Y2F0Y2goayl7dGhpcy52aWRlbz1ifX1lbHNlIHRoaXMuYy5ucCgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy50YT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChiKSx0aGlzLkF1KCkpOnRoaXMuYy5vcmlnaW4udGcody5UZCl9LEF1OmZ1bmN0aW9uKCl7dGhpcy5BZj0hMDt0aGlzLnJiPXRoaXMubWM9ITE7dGhpcy5iLmYudWEmJnRoaXMuYi5mLnVhKCkmJihlLnYoay5sZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMucmI9ITApO2UubmUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4udmEmJmUuUW4odGhpcy5jLm9yaWdpbi52YSk7dGhpcy5OaCgic2V0dXAiLHRoaXMuWmEoKSk7dmFyIGE9dGhpcy5iLkY7dGhpcy5iLkY9RS5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYi5GLGEpO3RoaXMuYi52aCgpO3RoaXMuYi5qZigpO2ZvcihhPXRoaXMuYi5LO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpOwphLnBhcmVudHx8dGhpcy5iLmpmKCk7dGhpcy50YT10aGlzLlBiPXRoaXMuYi5LO3RoaXMuZ2koInZwYWlkIik7aWYodGhpcy5yYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLktiKCJtdXRlZCIsImNvbnRlbnQiKTtlLnYoay50ZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfXRoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkguc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5ILnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgic3R5bGUiLAoiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSy5hcHBlbmRDaGlsZCh0aGlzLkgpO3RoaXMuSC5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYy5OcSgpLGM9dGhpcy5jLkIuT3JpZ2luYWxBZFBhcmFtZXRlcnMsZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyk7CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubWEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5tYSh0aGlzLkgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm1hKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5jZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuTCk7dGhpcy5ILnNyYz1hO2UuZ2UoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYi5mLkFhJiYhdGhpcy5HZCYmdGhpcy5iLmYuQWEoKSYmZS52KGsueWMsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmIuJGIoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMucmM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdihhKTsKaWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5adigpLHRoaXMuYi4kYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuUGQ9ITA7ZS52KGsuamksdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuRmUodGhpcy5PYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLiRiKCEwKSx0aGlzLmN3KCkpOyJBZFZpZGVvU3RhcnQiPT0KYS5kYXRhLm5hbWUmJih0aGlzLmIuJGIoITApLHRoaXMuZ3coKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuZXcoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuZncoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5odygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5kdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5saSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5VYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5rZyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXt0aGlzLkwuWmMmJihhPSJfYmxhbmsiKTt2YXIgYj13aW5kb3cub3BlbigiIiwKYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJ3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLnYoay5iZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLiR2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5DZiYmKHRoaXMuQmY9ITEsdGhpcy5lYygpKSx0aGlzLmF3KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMucmI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLAohMCksdGhpcy5LYigibXV0ZWQiLCJ1c2VyIiksZS52KGsudGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMucmI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLktiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnRmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGUudihrLmJlLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfX0uYmluZCh0aGlzKSk7ZS5nZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpKTtlLmdlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7dGhpcy5iLiRmKGZ1bmN0aW9uKGEpe2UubWEodGhpcy5ILCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sJHY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTsKdGhpcy50cmFjaygicGF1c2UiKTtlLnYoay4kZCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5tYz0hMH0sYXc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubWM9ITF9LGN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuWGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuV2YsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKX0sWnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7CnRoaXMuT2goKTtlLnYoay5TZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxndzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxldzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLmtkPSEwO3RoaXMuWWEoImZpcnN0UXVhcnRpbGUiKTtlLnYoay5QZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxmdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5ZYSgibWlkcG9pbnQiKTtlLnYoay5VZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpfSxodzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIik7ZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLAp0aGlzLkEoKSl9LGR3OmZ1bmN0aW9uKCl7dGhpcy53ZigpO3RoaXMuWWEoImNvbXBsZXRlIil9LGxpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2UubmUoKTt0aGlzLkg9ITE7dGhpcy5SYShhKX19LFl2OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2c7IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGIubWF0Y2goYykpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLnYoay5pdyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMubGkoITApfSwKTG46ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7aWYoYi5VYSYmYi5pc0VuYWJsZWQmJiFiLkZjKCkpe3ZhciBkPWIuemEoYSk7cmV0dXJuIGQucHJvdG9jb2wrIjovLyIrZC5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWMoYix0aGlzLkwpO2Yub25lcnJvcj10aGlzLlZ2LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGMoYix0aGlzLkwpKX0sV2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFBuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmhpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKdGhpcy5paS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLndmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMueGYuYmluZCh0aGlzKSl9LEFkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmhpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLmlpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy54Zi5iaW5kKHRoaXMpKX0saGk6ZnVuY3Rpb24oYSl7dGhpcy5WYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZifHx0aGlzLnlmKGEpfS5iaW5kKHRoaXMpLAp0aGlzLkdvKSl9LHlmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlljJiZ0aGlzLldoKHRoaXMudmlkZW8pJiYhdGhpcy5GYiYmIXRoaXMuVmIpe3RoaXMuWWM9ITA7dHJ5e2lmKCFlLlZhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkZifHwodGhpcy5GYj0hMCx0aGlzLkFkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5aYSgpLCEwKSx0aGlzLkwuc2d8fHRoaXMuTC5pYSgidmlkZW8tbm9vcCIpKTt0aGlzLlJhKCk7cmV0dXJufX1jYXRjaChiKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5aYSgpLCEwKX10aGlzLlN2KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIuamYoKTt0aGlzLlJ2KCk7dGhpcy5naSgpO3RoaXMuZGcoKTt0aGlzLmIudmgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMubWYoKX19LG1mOmZ1bmN0aW9uKCl7dGhpcy5lZHx8CnRoaXMuUWYoKX0sUWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy52aWRlby5wbGF5KCk7aWYoYiYmYlsiY2F0Y2giXSliWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5lZHx8KGE/dGhpcy5SYSgpOih0aGlzLlBlKCEwKSx0aGlzLlFmKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5kYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLmRjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmRjLmJpbmQodGhpcykpKTpLPWZ1bmN0aW9uKCl7dGhpcy5lZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubWYoKSl9LmJpbmQodGhpcyk7dGhpcy53ZSgpLkpoKHRoaXMpfSx3ZjpmdW5jdGlvbigpe3RoaXMuTC5qYiYmIXRoaXMuRmImJihlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwKITApLHRoaXMuWWEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS52KGsuRm4sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLlJhKCl9LEluOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPSExLGY9MDtmPGEubGVuZ3RoO2YrKyljPWUuR2coYVtmXSksYi5wdXNoKGMpO2E9e2hhc2hlczpifTthPWsuVGEoYSx0aGlzLkEoKSk7ZS5NdShhKX0sUmE6ZnVuY3Rpb24oYSl7dGhpcy5jJiZ0aGlzLmMuUWQmJnRoaXMuSW4odGhpcy5jLlFkKTtpZighdGhpcy5vZSlpZih0aGlzLm9lPSEwLHRoaXMuUGR8fChlLnYoay5Icyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYy50Ynx8dGhpcy5jLnBjKXtlLm9iKCJuZXdTbWFsbEFkSWQiKTt0aGlzLmxmKys7dGhpcy5WYj10aGlzLlljPSExO3RyeXt0aGlzLkFkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj0KdGhpcy5jb250cm9scz1udWxsO3RoaXMuRWQ9ITE7dHJ5e3RoaXMuYi5kaSgpfWNhdGNoKGcpe310aGlzLkdkPSEwO3RoaXMuYi5BZSgpO3RoaXMuYWM9ITE7dGhpcy53ZSgpLkVoKCk7dGhpcy5jLnRiJiZ0aGlzLmMub3JpZ2luLlFlKCk7dGhpcy5jLnBjJiYoYT90aGlzLmMub3JpZ2luLnBoKCk6dGhpcy5wZSgpKX1lbHNlIHRoaXMucGUoKX0sVnY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5BZCh0aGlzLnZpZGVvKSx0aGlzLnhmKGEpKX0seGY6ZnVuY3Rpb24oYSl7dGhpcy5WYj0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkwuYXAoKTsKdGhpcy5jLm9yaWdpbi50Zyh3LlRkKX0saWk6ZnVuY3Rpb24oKXtpZih0aGlzLnB2KXRoaXMuUmEoKTtlbHNle3RoaXMuYWM9ITA7dGhpcy5iLmYuQWEmJiF0aGlzLkdkJiZ0aGlzLmIuZi5BYSgpJiZlLnYoay55Yyx0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5zdihhKTtpZighdGhpcy5PYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLk9iPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5QZD0hMDtlLnYoay5qaSx0aGlzLmMuQix0aGlzLmIuZi5zKCksCnRoaXMuQygpLHRoaXMuQSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuRmUodGhpcy5PYil9Yz0iIjt0aGlzLmMua2YmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWgpKSYmKGM9dGhpcy5jLmtmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkVkfHwodGhpcy5FZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLnYoay5XZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO3RoaXMuYy50Yj8odGhpcy5WYj10aGlzLlljPSExLHRoaXMuQWQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLlBiLnJlbW92ZUNoaWxkKHRoaXMudGEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuRWQ9ITEsdGhpcy5iLmRpKCksdGhpcy5jLm9yaWdpbi5RZSgpKTp0aGlzLlJhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLldjLnJlcGxhY2UoIlt0aW1lXSIsZS5CZyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLmVlPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxhaTpmdW5jdGlvbigpe3RoaXMudWh8fCh0aGlzLnVoPSEwLHRoaXMua2R8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxzdjpmdW5jdGlvbihhKXtlLnYoay5iZSx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpO2E9PXRoaXMuYml8fHRoaXMuRmJ8fCgwPT1hJiYodGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLAp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuYWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmFpKCl9LmJpbmQodGhpcykpLHRoaXMuRmJ8fHRoaXMuT2goKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuTC5qYiYmdGhpcy5ZYSgic3RhcnQiKSxlLnYoay5TZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLGUudihrLlhmLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMua2Q9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLnYoay5QZix0aGlzLmMuQiwKdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5ZYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5VZix0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5ZYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS52KGsuWWYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSksdGhpcy5iaT1hKX0sTmg6ZnVuY3Rpb24oYSxiKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iK2EsYiwhMCl9LE91OmZ1bmN0aW9uKCl7ZS5LZChbInN0YXRzX2hkX2FkX2NhbGw6IisKdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sT2g6ZnVuY3Rpb24oKXtlLktkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuWmEoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFB1OmZ1bmN0aW9uKCl7ZS5LZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5aYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFhhOmZ1bmN0aW9uKGEpe2UuS2QoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWWE6ZnVuY3Rpb24oYSl7KHRoaXMuQWZ8fHRoaXMuTC5qYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLlphKCksITApfSxLYjpmdW5jdGlvbihhLGIpe3RoaXMuTC5qYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkZiKXt0aGlzLnZkJiZ0aGlzLnZkLnRyYWNrJiZ0aGlzLnZkLnRyYWNrKGEpO2lmKCJtdXRlIj09CmF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5McSh0aGlzLmMuUGEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmplPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuRmQuaW1wcmVzc2lvbnMmJmUuRnIoZy51cmwsdGhpcy5GZC5pbXByZXNzaW9ucyk/dGhpcy5KZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuR24sdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHthZElkOnRoaXMuRmQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQSgpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkplKGcudXJsLGcudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmMuUGE9CnRoaXMudnAodGhpcy5jLlBhLGEpfWNhdGNoKG0pe319fSxaYTpmdW5jdGlvbigpe3ZhciBhPWUuVmEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLkFmJiYoYj0iX3ZwYWlkIik7dGhpcy5DZiYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxKZTpmdW5jdGlvbihhLGIsYyxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC55YShhKSxjJiZiLktuKGMpLGZ8fChmPXRoaXMucmcpLGV8fChlPXRoaXMucmcpLHRoaXMuTW4oYSksdGhpcy5MLkRhKGIsZnVuY3Rpb24oKXt0aGlzLkRoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuRGgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LE1uOmZ1bmN0aW9uKGEpe3RoaXMuY2NbYV09Im9wZW4ifSxEaDpmdW5jdGlvbihhKXt0aGlzLmNjW2FdPSJjbG9zZWQifSxrcDpmdW5jdGlvbigpe3RoaXMuY2M9e319LFJ1OmZ1bmN0aW9uKCl7dmFyIGE9MCxiO2ZvcihiIGluIHRoaXMuY2MpdGhpcy5jYy5oYXNPd25Qcm9wZXJ0eShiKSYmCiJvcGVuIj09dGhpcy5jY1tiXSYmYSsrO3JldHVybiBhfSxMcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHZwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LFN2OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Udi5iaW5kKHRoaXMpKX0sVHY6ZnVuY3Rpb24oKXtlLlZhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmVjKCk6dGhpcy5jLlViJiYoZS52KGsua2csdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7dGhpcy5MLlpjJiYoYT0iX2JsYW5rIik7dHJ5e3ZhciBiPQp3aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5VYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuVWIsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxSdjpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0KIiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5XYy5yZXBsYWNlKCJbdGltZV0iLGUuQmcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC4kYyYmKGI9dGhpcy5MLiRjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC4kYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sQ2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC4kYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYKKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxnaTpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMucnA7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5lYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuR2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWWguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ZaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuWGguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5YaC5iaW5kKHRoaXMpKSk7CmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuZWMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkViO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ydi5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnF2LmJpbmQodGhpcykpOwpnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLk1oO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9CjEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLmtmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlZhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmVjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYi5zdHlsZS5wb3NpdGlvbj0KImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5CYT10aGlzLnRhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi4kZihmdW5jdGlvbihhKXt0aGlzLkJhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi51YSYmdGhpcy5iLmYudWEoKSYmKGUudihrLmxnLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSksdGhpcy5QZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGVjOmZ1bmN0aW9uKCl7dGhpcy5CYSYmImJsb2NrIj09dGhpcy5CYS5zdHlsZS5kaXNwbGF5fHx0aGlzLkJmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxYaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuVWMsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuJGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxZaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuR2IpO3RoaXMubWM/KGUubWEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMuQmEmJih0aGlzLkJhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLm1jPSExKTooZS5tYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLkJhJiYodGhpcy5CYS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLm1jPSEwKX0sd2Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkdiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuJGQsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LEdoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5HYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5VYyx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksCnRoaXMuQSgpKSl9LHF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5FYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuS2IoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsudGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwidXNlciIpLGUudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSxydjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMucmI/KGUubWEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubWEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sUGU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkViKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuS2IoIm11dGVkIiwiY29udGVudCIpLGUudihrLnRkLHRoaXMuYy5CLHRoaXMuYi5mLnMoKSx0aGlzLkMoKSx0aGlzLkEoKSkpfSx4djpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRWIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5LYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsudGYsdGhpcy5jLkIsdGhpcy5iLmYucygpLHRoaXMuQygpLHRoaXMuQSgpKSl9LGRjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuZGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZGMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmRjKTt0aGlzLmVkfHx0aGlzLmVlfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5tZigpKX0scGU6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUuaGQoKTshdGhpcy5MLmxjfHxlLlZhKCl8fCFjLmlzQ2hyb21lJiYhYy5pc0ZpcmVmb3h8fGMuaXNFZGdlfHwKIShhfHwhdGhpcy5qZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy5zaHx8IXRoaXMuTC5SYyYmInNwaWVnZWwuZGUiIT1lLlpiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpfHwicHJlcm9sbCIhPWUuQ2I/KHRoaXMuZWQ9ITAsdGhpcy51YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy51YiksdGhpcy51Yj0hMSksdGhpcy5tZygpKToodGhpcy5zaD10aGlzLkNmPXRoaXMuQmY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5qZT0hMCxhPWUuY2coYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuS2UoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LG1nOmZ1bmN0aW9uKGEpe3RoaXMuUnUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCEwKX0uYmluZCh0aGlzKSx0aGlzLnN0KToodGhpcy5HZD0hMCx0aGlzLmIuQWUoKSx0aGlzLmIuY3UoKSx0aGlzLmFjPSExLAplLnYoay5xcCx0aGlzLmMuQix0aGlzLmIuZi5zKCksdGhpcy5DKCksdGhpcy5BKCkpLHRoaXMud2UoKS5FaCgpKX0sd2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmYmJihhPXRoaXMuYi5mKTtyZXR1cm4gYX0sZGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkphKCJtaW5WaXMiKTthJiYoZS5FZSh0aGlzLnZpZGVvLGEpP3RoaXMuR2goKTp0aGlzLndkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy5yYyYmMDx0aGlzLnJjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy5yYykpO3RoaXMudmlkZW8mJgp0aGlzLnZpZGVvLmR1cmF0aW9uJiYoYS52aWRlb19kdXJhdGlvbj10aGlzLnZpZGVvLmR1cmF0aW9uKTtyZXR1cm4gYX0sQTpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuT28rIi0iK3RoaXMubGY7dGhpcy5jJiZ0aGlzLmMuSGcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLkhnKCkpO3JldHVybiBhfSxyZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuZGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRqPXRoaXMuYVs0XTt0aGlzLlhzPXRoaXMuYVs3XTt0aGlzLlJtPXRoaXMuYVs5XTt0aGlzLk9yPXRoaXMuYVsxMF07dGhpcy5zbz10aGlzLmFbM107dGhpcy52aj10aGlzLmFbMV07dGhpcy5Ddj10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOF07dGhpcy5ubD10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX0KYy50bz1iO2IucHJvdG90eXBlPXtDajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRGo6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhzOnRoaXMuUW0oYSl9LFFtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5SbTp0aGlzLk5yKGEpfSxOcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuT3I6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNvOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy52ajp0aGlzLkJ2KGEpfSxCdjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQ3Y6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmd0OnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qbDp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuajphfX19KShjKTt2YXIgU2E9Yy50b3x8U2EsRmM9bmV3IFNhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9RmMuQ2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5HYT1udWxsO3RoaXMuWT1bXTt0aGlzLlU9bnVsbDt0aGlzLnFjPXRoaXMuc2M9ITE7dGhpcy52YT0iIjt0aGlzLnpmPSExO3RoaXMuU2c9IiI7ZCYmZC5lbXB0eT90aGlzLm5zKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRm09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuaGQoKSxiO2I9ZS56YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsKdmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOm0ueWEobS5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLm9nKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8CiJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLkhkKGEpKSsiJnR5cGU9anMiLGI9bS55YShtLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1tLnlhKG0uSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLkRhKGIsdGhpcy5tcy5iaW5kKHRoaXMpLAp0aGlzLmpzLmJpbmQodGhpcykpfSxEZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5HYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuQ2IpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5HYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuR2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkNifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5DYnx8dGhpcy5LcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bS5XdSgpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxLcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmCmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LG1zOmZ1bmN0aW9uKGEpe3RoaXMuTXQoYSk7dHJ5e3RoaXMuR2E9YS5yZXNwb25zZVhNTCx0aGlzLkdhfHwodGhpcy5HYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpOwp0aGlzLnFjPXRoaXMuVGgoKTt0aGlzLlNnPWEucmVzcG9uc2VVUkw7dGhpcy5ZLmxlbmd0aD90aGlzLkljKCk6dGhpcy5zYSh0aGlzLlNhKHcuUGMse2Vycm9yOnRoaXMuemY/Ry5XZDpHLklmfSkpfSxuczpmdW5jdGlvbihhKXt0cnl7dGhpcy5HYXx8KHRoaXMuR2E9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5zYSh0aGlzLlNhKHcuWGQpKX10aGlzLlk9dGhpcy5EZygpO3RoaXMuc2M9dGhpcy5wZigpO3RoaXMucWM9dGhpcy5UaCgpO3RoaXMuWS5sZW5ndGg/dGhpcy5JYygpOnRoaXMuc2EodGhpcy5TYSh3LlBjLHtlcnJvcjp0aGlzLnpmP0cuV2Q6Ry5JZn0pKX0sanM6ZnVuY3Rpb24oKXt0aGlzLnNhKHRoaXMuU2Eody5IZix7ZGVwdGg6YX0pKX0sSWM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5ZLnNoaWZ0KCk7dGhpcy5NcigpP3RoaXMuZnYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5NZygpLGgse0FkU3lzdGVtOnRoaXMudHEoKSwKdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMuc2EodGhpcy5TYSh3LktmKSk6KGE9MCx0aGlzLkp2KCkmJnRoaXMuVmUodGhpcy5zcCgpKSl9LFFlOmZ1bmN0aW9uKCl7dGhpcy5zYz8odGhpcy5zYz0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy5JYygpKTp0aGlzLnBhcmVudC5RZSgpfSxwaDpmdW5jdGlvbigpe3RoaXMucWM/KHRoaXMucWM9MTx0aGlzLlkubGVuZ3RoLHRoaXMuWS5sZW5ndGgmJnRoaXMuSWMoKSk6dGhpcy5wYXJlbnQucGgoKX0sSnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdigpP3RoaXMuYnYoKT8hMDooLTEhPXRoaXMuQ2MoKT90aGlzLnNhKHRoaXMuU2Eody5TZCkpOnRoaXMuc2EodGhpcy5TYSh3LkRmKSksITEpOih0aGlzLnNhKHRoaXMuU2Eody5QYyxHLkpmKSksITEpfSxWZTpmdW5jdGlvbihhKXt0aGlzLnZhfHwodGhpcy52YT0iIik7YS5RZHx8KGEuUWQ9W10pO2EuUWQucHVzaCh0aGlzLlNnKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuTWUoKSk7CmEudGI9YS50Yj9hLnRiOnRoaXMuc2M7YS5wYz1hLnBjP2EucGM6dGhpcy5xYzthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7dGhpcy5wYXJlbnQuVmUoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudmF8fCh0aGlzLnZhPSIiKTthLmR1cmF0aW9uPXRoaXMuQ2MoKTthLk89dGhpcy5KZygpO2EuVWI9dGhpcy52cSgpO2EuUXY9W107YS5vcmlnaW49dGhpczthLkI9dGhpcy5zcSgpO2Eua2Y9dGhpcy5KcShhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7cmV0dXJuIGF9LHNhOmZ1bmN0aW9uKGIpe3RoaXMudmF8fCh0aGlzLnZhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy52YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuemc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPQp3LlNkLmNvZGU/Yi5QYS5jb25jYXQodGhpcy53cSgpKTpiLlBhLmNvbmNhdCh0aGlzLkVxKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuV2ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuSWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5zYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnNhJiZ0aGlzLnBhcmVudC5zYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sdGc6ZnVuY3Rpb24oYSxiKXt0aGlzLnNhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sZnY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxjdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuSmcoKS5sZW5ndGh9LGJ2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5DYygpfSxwZjpmdW5jdGlvbigpe3JldHVybiAxPAp0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxUaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMucGYoKSYmKGE9ITApO3JldHVybiBhfSxNdDpmdW5jdGlvbihhKXt0aGlzLnZhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudmE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy52YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuemY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sTXI6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLk1nKCkubGVuZ3RofSxNZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LHRxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmUodGhpcy5VLAoiQWRTeXN0ZW0iKX0sTWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy4kZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5rYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LCRnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuJGcoYS5wYXJlbnROb2RlKTohMX0sRXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1lKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT0KYS50eXBlfSl9LHdxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx2cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxKZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxseDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5rYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8CjFFMzt0cnl7dmFyIGg9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLlFhKS1NYXRoLmFicyhkLWIuUWEpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sc3E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5uZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9CmJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LENjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxKcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkZ1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sdmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD8KdGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0seWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubmQoYSk6IiJ9LG5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMueWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkZtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFyPXRoaXMuYVs2XTt0aGlzLmZvPXRoaXMuYVs2XTt0aGlzLnp3PXRoaXMuYVs5XTt0aGlzLktvPXRoaXMuYVsxMF07dGhpcy5kcz10aGlzLmFbMTBdO3RoaXMuRXA9dGhpcy5hWzVdO3RoaXMuR3A9dGhpcy5hWzZdO3RoaXMuc2o9CnRoaXMuYVsyXTt0aGlzLmNvPXRoaXMuYVs2XTt0aGlzLnFvPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLkNwPWI7Yi5wcm90b3R5cGU9e3ByOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5xcjp0aGlzLmVvKGEpfSxlbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZm86dGhpcy55dyhhKX0seXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnp3OnRoaXMuSm8oYSl9LEpvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Lbzp0aGlzLmNzKGEpfSxjczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZHM6dGhpcy5EcChhKX0sRHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkVwOnRoaXMuRnAoYSl9LEZwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5HcDp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNqOnRoaXMuYm8oYSl9LGJvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5jbzp0aGlzLnBvKGEpfSxwbzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnFvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5DcHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkI9dGhpcy5wYz10aGlzLnRiPSExO3RoaXMuQmU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkNlPSIifWMuUmw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sQ3E6ZnVuY3Rpb24oKXtpZighdGhpcy5CZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkdhKXt2YXIgYT10aGlzLm9yaWdpbi5HYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5CZT1hW2NdKX1yZXR1cm4gdGhpcy5CZX0sSGc6ZnVuY3Rpb24oKXtpZih0aGlzLkNlKXJldHVybiB0aGlzLkNlO3ZhciBhPSIiOyhhPXRoaXMuQ3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkNlPWF9LE5xOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5SbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2k9dGhpcy5hWzFdO3RoaXMuWW09dGhpcy5hWzldO3RoaXMuVnA9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNF19Yy5wdD1iO2IucHJvdG90eXBlPXtGaTpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkdpOnRoaXMuWG0oYSl9LFhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ZbTp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVnA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBXYT1jLnB0fHxXYSxIYz1uZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1IYy5GaSg0KTt2YXIgdz17WGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsT2E6IlhNTF9QQVJTRV9FUlJPUiJ9LERmOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixPYToiRFVSQVRJT05fRVJST1IifSxQYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCk9hOiJFTVBUWV9WQVNUIn0sS2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsT2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApPYToiTE9BRF9FUlJPUiJ9LFRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixPYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LE53Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLE9hOiJNRURJQUZJTEVfRVJST1IifSxTZDp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixPYToiRFVNTVlfQUQifX0sRz17SWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixPYToiTk9fQURTIn0sSmY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLE9hOiJOT19NRURJQUZJTEVTIn0sT3c6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE9hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sV2Q6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsT2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT209dGhpcy5hWzEwXTt0aGlzLm53PXRoaXMuYVsyXTt0aGlzLnJrPXRoaXMuYVs0XTt0aGlzLkFrPXRoaXMuYVs2XTt0aGlzLlVuPXRoaXMuYVs4XTt0aGlzLlVyPXRoaXMuYVsyXTt0aGlzLlFqPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzVdfWMuUms9YjtiLnByb3RvdHlwZT17Tm06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk9tOnRoaXMubHcoYSl9LGx3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5udzp0aGlzLnFrKGEpfSxxazpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnJrOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Bazp0aGlzLlRuKGEpfSxUbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVW46dGhpcy5UcihhKX0sVHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVyOnRoaXMuUGooYSl9LFBqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Rajp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhhPWMuUmt8fFhhLEljPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUljLk5tKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuZ2Q9Yjt0aGlzLlBhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5Faj1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIFVhPWMuRWp8fFVhO2M9CmN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5obD10aGlzLmFbNl07dGhpcy5tdD10aGlzLmFbMl07dGhpcy5MdD10aGlzLmFbN107dGhpcy5ndT10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNV19Yy5Hcz1iO2IucHJvdG90eXBlPXtnbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaGw6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm10OnRoaXMuS3QoYSl9LEt0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5MdDp0aGlzLmZ1KGEpfSxmdTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZ3U6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLkdzfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZ2woNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLkZoPWE7dGhpcy52aWRlbz1iO3RoaXMuTmQ9W107dGhpcy5DaD1bXTt0aGlzLlJlPVtdO3RoaXMuVXY9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlhrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuRmgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5GaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LApnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2cuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChnKTt2YXIgaz1nLmNvbnRlbnRXaW5kb3c7ay5HeD17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy4kdC5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5SdC5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuTmQucHVzaCh7c3JjOmMsZnJhbWU6Zyx0dDplLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LAp0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuUmUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5SZVtiXTtjLnR5cGU9PT1hJiZjLlZvKHRoaXMueHEoYSkpfX0seHE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7UHg6ITAsT3g6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7Q3g6InZpZGVvIixSeDoianNDdXN0b20iLFN4OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsVHg6MSxteDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLAphZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxNcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuTmQubGVuZ3RoO2IrKylpZih0aGlzLk5kW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuTmRbYl0udHQ7cmV0dXJuIiJ9LCR0OmZ1bmN0aW9uKGEsYil7dGhpcy5DaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5NcShiKSx2ZW5kb3I6Yn0pO3RoaXMuTnUoKX0sUnQ6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLlV2Lm1hcChmdW5jdGlvbihhKXt0aGlzLmFnKGEsYil9LmJpbmQodGhpcykpOnRoaXMuYWcoYSxiKX0sYWc6ZnVuY3Rpb24oYSxiKXt0aGlzLlJlLnB1c2goe3R5cGU6YSxWbzpiLE14OiExfSl9LE51OmZ1bmN0aW9uKCl7dGhpcy5DaC5tYXAoZnVuY3Rpb24oYSl7YS5Jcnx8CihhLkZ4KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5ReCxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuSXI9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWGt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnhpPXRoaXMuYVs1XTt0aGlzLllpPXRoaXMuYVsxXTt0aGlzLlJwPXRoaXMuYVs1XTt0aGlzLkhrPXRoaXMuYVs1XTt0aGlzLmF0PXRoaXMuYVs4XTt0aGlzLml1PXRoaXMuYVszXTt0aGlzLm5rPXRoaXMuYVs0XTt0aGlzLiRxPXRoaXMuYVszXTt0aGlzLmZsPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy5pcj1iO2IucHJvdG90eXBlPXt3aTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueGk6dGhpcy5YaShhKX0sClhpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZaTp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUnA6dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkhrOnRoaXMuJHMoYSl9LCRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaXU6dGhpcy5tayhhKX0sbWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm5rOnRoaXMuWnEoYSl9LFpxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kcTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmlyfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2Mud2koNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5mPWE7dGhpcy5pYj1hLkVnKCk7dGhpcy5LPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuSy5pZD1lLmFhKDEwKTt0aGlzLkY9RS5wb3AoKTt0aGlzLkZ8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuYmc9ITE7dGhpcy5UYj1bXX1jLm9qPWI7Yi5wcm90b3R5cGU9e3JxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZT0wLGI9MCxnPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixlPWIubGVmdCxiPWIudG9wKTtnPXt4OmUsCnk6Yn07Zy5wb3NpdGlvbj1jO3JldHVybiBnfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnJxKGEpO2Zvcih2YXIgYj0wLGM9MCxlPSExLGc9dGhpcy5hcihhKSxrPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtnJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmCihlPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtrPXt4OmIseTpjfTtlJiYoay5wb3NpdGlvbj1lKTtyZXR1cm4ga30sVXU6ZnVuY3Rpb24oKXt0aGlzLmJnPSEwfSxkaTpmdW5jdGlvbigpe3RoaXMuRj1FLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sdmg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay55Yyx0aGlzLmYucygpKX0sY3U6ZnVuY3Rpb24oKXt0aGlzLmJnfHwodGhpcy5mLnBsYXkoKSxlLnYoay5kZCx0aGlzLmYucygpKSl9LGpmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9CiJhdXRvIjt0aGlzLksuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuSy5zdHlsZS5ib3hTaXppbmc9dGhpcy5pYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5LLnN0eWxlLndpZHRoPXRoaXMuaWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9dGhpcy5pYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuRi5zdHlsZS53aWR0aD10aGlzLmliLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaWIpO3RoaXMuZi5MYyYmdGhpcy5mLkxjKCk/dGhpcy5mLkVnKCkuYXBwZW5kQ2hpbGQodGhpcy5LKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy4kYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sCmFyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxqcTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LCRiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuanEodGhpcy5pYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmCjA8dGhpcy5ELmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQWUoKTtyZXR1cm59dGhpcy5EPWI7dGhpcy5mLkxjKCk/KHRoaXMuSy5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSy5zdHlsZS50b3A9IjBweCIpOih0aGlzLksuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLksuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLksuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLksuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5UYi5sZW5ndGg7YSsrKXRoaXMuVGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5QaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLiRiLmJpbmQodGhpcyksMTApfSwkZjpmdW5jdGlvbihhKXt0aGlzLlRifHwKKHRoaXMuVGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlRiLnB1c2goYSl9LEFlOmZ1bmN0aW9uKCl7dGhpcy5LJiZ0aGlzLksucGFyZW50Tm9kZSYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSyk7dGhpcy5GJiZ0aGlzLkYucGF1c2UmJnRoaXMuRi5wYXVzZSgpfX19KShjKTtmb3IodmFyICRhPWMub2p8fCRhLEU9W10sYWI9MDsxMDA+YWI7YWIrKyl7dmFyIE49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuYWEoMTApO04uY29udHJvbHM9ITA7RS5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsCkEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1vPXRoaXMuYVsyXTt0aGlzLmRqPXRoaXMuYVs5XTt0aGlzLkR3PXRoaXMuYVs3XTt0aGlzLmpqPXRoaXMuYVsyXTt0aGlzLkNpPXRoaXMuYVs1XTt0aGlzLlZzPXRoaXMuYVszXTt0aGlzLnBsPXRoaXMuYVs3XTt0aGlzLmJzPXRoaXMuYVsyXTt0aGlzLnZ3PXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzVdfWMuRW09YjtiLnByb3RvdHlwZT17bG86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1vOnRoaXMuY2ooYSl9LGNqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kajp0aGlzLkN3KGEpfSxDdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRHc6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmpqOnRoaXMuQmkoYSl9LEJpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DaTp0aGlzLlVzKGEpfSwKVXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZzOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wbDp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYnM6dGhpcy51dyhhKX0sdXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnZ3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgYmI9Yy5FbXx8YmIsTGM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMubG8oNCk7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLAphPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlcoYSk7dGhpcy5CZChiKTt0aGlzLnBnKCl9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LApEZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkthKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgY2I9Yy5DbHx8Y2I7KGZ1bmN0aW9uKGMpe2MuQmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7dGhpcy5TYj10aGlzLlNifHwhMTt0aGlzLlRmPXRoaXMuVmY9dGhpcy5XZz10aGlzLmVhPXRoaXMuc2Y9CiExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuaHEoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnNmPSEwO3RoaXMuV2cmJnRoaXMuamcoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLmFjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuYmQoKTt0aGlzLldnPSEwO3RoaXMuamcoKX0uYmluZCh0aGlzKSk7dGhpcy5mZygpfSwKamc6ZnVuY3Rpb24oKXtpZighdGhpcy5TYil7dGhpcy5iZCgpO2lmKCF0aGlzLnNmJiYhdGhpcy5iZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuc2YmJnRoaXMuVGYmJiF0aGlzLlZmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0sYmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLktnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LEtnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LGZnOmZ1bmN0aW9uKCl7aWYodGhpcy5iZCgpKXt2YXIgYj10aGlzLktnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdOwp0aGlzLlZmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuVGY9Yi5qeH10aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mZygpfS5iaW5kKHRoaXMpLDEwMCl9LG54OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkF4KCk6ITF9LENjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5DYygpOi0xfSxGcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxocTpmdW5jdGlvbihiLGEpe3RoaXMuU2I9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy51KCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwKMTAwKX0sY2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMucmEoKSk6Yi5EZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLkZxKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2QoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGRiPWMuQmx8fGRiOyhmdW5jdGlvbihjKXtjLkRsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sSnI6ZnVuY3Rpb24oKXt3aW5kb3cuT08uWGwudm4udG4/d2luZG93Lk9PLlhsLnZuLnRuLmh4KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpyKCl9LDEwMCl9LGc6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9CmRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnhlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBjYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgZGIoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGViPWMuRGx8fGViLGZiPW5ldyBlYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaz10aGlzLmFbOV07dGhpcy55az10aGlzLmFbN107dGhpcy5haz10aGlzLmFbMTBdO3RoaXMuZmo9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNV19Yy5Pcz1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRms6CnRoaXMueGsoYSl9LHhrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy55azp0aGlzLiRqKGEpfSwkajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYWs6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgZ2I9Yy5Pc3x8Z2IsTWM9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TWMuRWsoNCk7KGZ1bmN0aW9uKGMpe2MuU2k9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5uYT0hMTt0aGlzLk5nKCl9LE5nOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTsKYnx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVyhiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sCk5hOmZ1bmN0aW9uKCl7dGhpcy55aCgpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuWCYmKDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGhiPWMuU2l8fGhiOyhmdW5jdGlvbihjKXtjLlJpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGdnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLnJhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hP3RoaXMucmEoKTp0aGlzLm0oKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmdnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2coYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGliPWMuUml8fGliOyhmdW5jdGlvbihjKXtjLlRpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sQmg6ZnVuY3Rpb24oYil7Yj1uZXcgaGIoYik7Yi5uYT90aGlzLlQoKTp0aGlzLk4oYil8fAooYi5CZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaWIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5pcXx8KHRoaXMuaXE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLkJoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5CaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGpiPWMuVGl8fGpiLFQ9bmV3IGpiKHIpO1QuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy55bT10aGlzLmFbMl07dGhpcy5jcj10aGlzLmFbMl07dGhpcy56dj10aGlzLmFbNF07dGhpcy5Haj10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs4XX1jLmxsPWI7Yi5wcm90b3R5cGU9e3htOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy55bTp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY3I6dGhpcy55dihhKX0seXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnp2OnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR2o6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIga2I9Yy5sbHx8a2IsTmM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMueG0oNCk7KGZ1bmN0aW9uKGMpe2Mubm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVyhiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYil7fX0scGxheTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfWNhdGNoKGIpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGxheSIpfX0sTGM6ZnVuY3Rpb24oKXt2YXIgYj1sO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5ubXx8VTsoZnVuY3Rpb24oYyl7Yy5tbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LlZjKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7eC5WYygiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLk1zKGEpfS5iaW5kKHRoaXMpKTt4LlZjKCIjIitiLCJhZHNMb2FkZXJGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3guVmMoIiMiK2IsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTsKeC5UcSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLncoKTt0aGlzLnJhKCk7cmV0dXJufX10aGlzLnUoImFkZXJyb3IiLGEpO3RoaXMuRygpfX0pfSkoYyk7dmFyIFY9Yy5tbXx8VjsoZnVuY3Rpb24oYyl7Yy5vbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMudWQmJihiPWUud3AoYix0aGlzLnVkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFUoZCk7aWYoIXRoaXMuTihkKSl7dGhpcy5SKGQpO3ZhciBmPW5ldyBWKGQsdGhpcy5JKTtmLmcoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxnPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGcpdHJ5e3RmbXN1aXRlKCIjIitnKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy51ZHx8KHRoaXMudWQ9W10pLHRoaXMudWQucHVzaChiW2FdKSxkPW5ldyBVKGcpLHRoaXMuTihkKXx8KHRoaXMuUihkKSxmPW5ldyBWKGQsdGhpcy5JKSwKZi5nKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxWYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwodGhpcy5kYVtiXVthXT1bXSk7dGhpcy5kYVtiXVthXS5wdXNoKGMpfSxndjpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmRhfHx0aGlzLmRhJiYhdGhpcy5kYVthXSl0aGlzLkhjfHwodGhpcy5IYz1bXSksdGhpcy5IYy5wdXNoKGIpLHRoaXMuYnUoKSYmKHRoaXMuYmYoKSx0aGlzLmcoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5kYVthXVtjXSYmMDx0aGlzLmRhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuZGFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmRhW2FdW2NdW2RdKGIpfX0sVHE6ZnVuY3Rpb24oKXtpZih0aGlzLkhjKWZvcih2YXIgYj0KMDtiPHRoaXMuSGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5IY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbY11bZF0mJjA8dGhpcy5kYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmRhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5kYVtjXVtkXVtlXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnguZ3YoYil9fSl9KShjKTt2YXIgbGI9Yy5vbXx8bGIseD1uZXcgbGIocik7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ocj10aGlzLmFbOF07dGhpcy5vdD10aGlzLmFbOV07CnRoaXMuWHA9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbMTBdfWMuQW49YjtiLnByb3RvdHlwZT17Z3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ocjp0aGlzLm50KGEpfSxudDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub3Q6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5Bbnx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuZ3IoNCk7KGZ1bmN0aW9uKGMpe2MuT2k9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlcoYik7CnZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sQWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBuYj1jLk9pfHxuYjsoZnVuY3Rpb24oYyl7Yy5QaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLAphKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTsKdmFyIG9iPWMuUGl8fG9iOyhmdW5jdGlvbihjKXtjLlFpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZz1uZXcgbmIoZCk7dGhpcy5OKGcpfHwodGhpcy5SKGcpLChuZXcgb2IoZyx0aGlzLkkpKS5nKCkpfWNhdGNoKGspe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5NYVtiLmxhKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuUWl8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy56cj10aGlzLmFbMl07dGhpcy5ObD10aGlzLmFbN107dGhpcy5Ucz10aGlzLmFbMV07dGhpcy5qcD10aGlzLmFbM107dGhpcy5Xbj10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVsyXX1jLmptPWI7Yi5wcm90b3R5cGU9e3lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cjp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTmw6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRzOnRoaXMuaXAoYSl9LGlwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qcDp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlduOnRoaXMuaShhKX0sCmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmo6YX19fSkoYyk7dmFyIHJiPWMuam18fHJiLFBjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVBjLnlyKDQpOyhmdW5jdGlvbihjKXtjLnJsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5XKGIpO3RoaXMuWihhKTt0aGlzLlF0KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LApwbGF5OmZ1bmN0aW9uKCl7fSxRdDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnBhdXNlJiZ0aGlzLmphLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5qYSYmdGhpcy5qYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmphLnJlc3VtZSYmdGhpcy5qYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuamEubXV0ZSYmdGhpcy5qYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LApmdW5jdGlvbigpe3RoaXMuamEmJnRoaXMuamEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5qYS51bm11dGUmJnRoaXMuamEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxYZzpmdW5jdGlvbihiKXt0aGlzLmphPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBzYj1jLnJsfHxzYjsoZnVuY3Rpb24oYyl7Yy5xbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpO3RoaXMubWk9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMubWkmJih0aGlzLkcoKSx0aGlzLm1pPSEwLHRoaXMub2EoKSk7YS5LYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgdGI9Yy5xbHx8dGI7KGZ1bmN0aW9uKGMpe2Muc2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKZzpmdW5jdGlvbigpe2lmKGwpe2lmKGwucGxheWVyKXt2YXIgYj1sLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgc2IoYltkXSksdGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgdGIoYyx0aGlzLkkpKS5nKCkpfX1lbHNlIHRoaXMuVCgpfX0pfSkoYyk7dmFyIHViPWMuc2x8fHViLFc9bmV3IHViKHIpO1cuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRvPXRoaXMuYVs0XTt0aGlzLnVsPXRoaXMuYVs2XTt0aGlzLmxrPXRoaXMuYVs4XTt0aGlzLlNxPXRoaXMuYVsxMF07dGhpcy5Uaz10aGlzLmFbN107dGhpcy5Tcj10aGlzLmFbN107dGhpcy5Kcz10aGlzLmFbM107dGhpcy5ucT10aGlzLmFbOF07CnRoaXMuc3I9dGhpcy5hWzEwXTt0aGlzLkJ3PXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVsxMF19Yy52aT1iO2IucHJvdG90eXBlPXtDbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRG86dGhpcy50bChhKX0sdGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVsOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sazp0aGlzLlJxKGEpfSxScTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU3E6dGhpcy5TayhhKX0sU2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRrOnRoaXMuUnIoYSl9LFJyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Tcjp0aGlzLklzKGEpfSxJczpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSnM6dGhpcy5tcShhKX0sbXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm5xOnRoaXMucnIoYSl9LHJyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zcjp0aGlzLkF3KGEpfSxBdzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkJ3OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy52aXx8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UWMuQ28oNCk7KGZ1bmN0aW9uKGMpe2MuTG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LAp1YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sTmE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLlg/KDAsdGhpcy5YKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgd2I9Yy5MbXx8d2I7KGZ1bmN0aW9uKGMpe2MuS209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sWGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLApiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxPdDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuZWJ8fCh0aGlzLmViPVtdKTt0aGlzLmViLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy5yYSgpOnRoaXMudSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnRjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTsKdGhpcy5DYT90aGlzLk90KHRoaXMuQ2EpOih0aGlzLkNhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5DYSl7dGhpcy5HKCk7cmV0dXJufWlmKCF0aGlzLnRjKXt0aGlzLkcoKTtyZXR1cm59Yj0hMDtpZih0aGlzLmViJiZ0aGlzLmViLmxlbmd0aCYmMTx0aGlzLmViLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuZWIubGVuZ3RoLTE7YSsrKTEwMDkhPXRoaXMuZWJbYV0mJjMwMyE9dGhpcy5lYlthXSYmNDAzIT10aGlzLmViW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy5yYSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgeGI9Yy5LbXx8eGI7KGZ1bmN0aW9uKGMpe2MuTW09CnQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgd2IoYi5pdGVtKGEpKTt0aGlzLk4oYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLlIoYyksKG5ldyB4YihjLHRoaXMuSSkpLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgeWI9Yy5NbXx8eWIsemI9bmV3IHliKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZvPXRoaXMuYVsyXTt0aGlzLiRyPXRoaXMuYVs2XTt0aGlzLldyPXRoaXMuYVsxMF07dGhpcy5pdj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbNF19Yy5QbT1iO2IucHJvdG90eXBlPXtFbzpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLkZvOnRoaXMuWnIoYSl9LFpyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy4kcjp0aGlzLlZyKGEpfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3I6dGhpcy5odihhKX0saHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLml2OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgQWI9Yy5QbXx8QWIsUmM9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMuRW8oNCk7KGZ1bmN0aW9uKGMpe2MuZG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlcoYik7dGhpcy5aKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pOwp0aGlzLldlPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5FdCgpfS5iaW5kKHRoaXMpLDUwMCl9LEV0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuWCYmdGhpcy5YKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuV2UmJgp3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLldlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGIucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sUXU6ZnVuY3Rpb24oKXt0aGlzLldlPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgQmI9Yy5kbXx8QmI7KGZ1bmN0aW9uKGMpe2MuY209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKTt0aGlzLmtjPTB9LGc6ZnVuY3Rpb24oKXt0aGlzLnVzPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5rY3x8KHRoaXMua2M9CjAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8Cih0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMua2N8fHRoaXMua2MrKyx0aGlzLmtjPD10aGlzLnVzPyh0aGlzLmtjKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpfSxtOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5RdSgpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLAoxMDApfX0pfSkoYyk7dmFyIENiPWMuY218fENiOyhmdW5jdGlvbihjKXtjLmVtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYT0hMTtiJiZiWzBdJiYoYT1iWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IEJiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IENiKGIsdGhpcy5JKSkuZygpKSk7dGhpcy5UKCl9fSl9KShjKTt2YXIgRGI9Yy5lbXx8RGIsRWI9bmV3IERiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuTHc9CmI7Yi5wcm90b3R5cGU9e2pyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5rcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIEZiPWMuTHd8fEZiLFNjPW5ldyBGYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVNjLmpyKDQpOyhmdW5jdGlvbihjKXtjLlpsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sTmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmYSYmMT5hLWI/dGhpcy5YKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEdiPWMuWmx8fEdiOyhmdW5jdGlvbihjKXtjLllsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5LYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm9hKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMub3AoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2I9dGhpcy5tZCgpOzA8Yi5nZXRDdXJyZW50VGltZSgpP3RoaXMuZXMoKTp0aGlzLmlnKCk7Yi5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl8fCh0aGlzLnUoImNvbnRlbnRwbGF5IiksdGhpcy5tKCEwKSl9LmJpbmQodGhpcyksCjFFMyl9LG9wOmZ1bmN0aW9uKCl7dGhpcy5SZigpfHx0aGlzLm0oITApfSxlczpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWQoKTshYi5xYSYmYi5ZJiZiLmd4JiZiLml4JiYodGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubSgpKX0saWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm1kKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy53KCksdGhpcy5yYSgpKToodGhpcy51KCJhZGVycm9yIixiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZygpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7aWYoIXRoaXMudGgpZm9yKHZhciBiPQpsLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5LYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy50aD1iW2NdKTtyZXR1cm4gdGhpcy50aH0sQng6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMubWQoKS5hZHNMb2FkZXI/dGhpcy5HKCEwKTp0aGlzLkcoKTp0aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGI9Yy5ZbHx8SGI7KGZ1bmN0aW9uKGMpe2MuJGw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobCYmbC5wbGF5ZXJhcGkpe3ZhciBiPWwucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0KMDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IEdiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBIYihjLHRoaXMuSSkpLmcoKSl9cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBJYj1jLiRsfHxJYixKYj1uZXcgSWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueWw9dGhpcy5hWzRdO3RoaXMubXA9dGhpcy5hWzVdO3RoaXMudXY9dGhpcy5hWzEwXTt0aGlzLldpPXRoaXMuYVszXTt0aGlzLktpPXRoaXMuYVszXTt0aGlzLllxPXRoaXMuYVsyXTt0aGlzLmJuPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzEwXX1jLkF2PWI7Yi5wcm90b3R5cGU9e3hsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLm1wOnRoaXMudHYoYSl9LHR2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51djp0aGlzLlZpKGEpfSxWaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuV2k6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktpOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ZcTp0aGlzLmFuKGEpfSxhbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBLYj1jLkF2fHxLYixUYz1uZXcgS2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1UYy54bCg0KTsoZnVuY3Rpb24oYyl7Yy5Waz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7CkgmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5XKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlooYSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSx6eDpmdW5jdGlvbigpe3ZhciBiPSExOzA8PWUuWmIoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYj0hMCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoSCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sCkFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmIWIucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxMYzpmdW5jdGlvbigpe3JldHVybiEwfSxLYTpmdW5jdGlvbigpe3ZhciBiO0g/KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpLmZpcnN0Q2hpbGQpOmI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2IhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Wa3x8WDsoZnVuY3Rpb24oYyl7Yy5Vaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5YZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhlPQpiLmlkKTtIP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYj1hLnBsYXllckNvbnRhaW5lcjtiJiZ0aGlzLlhlJiZiIT10aGlzLlhlfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuZmEoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKGwuYWRUYWc9YS5hZFVSTCksdGhpcy51KCJhZGVycm9yIixhLkh4KSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2EoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy51KCJhZGVycm9yIiksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9hKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFk9Yy5Va3x8WTsoZnVuY3Rpb24oYyl7Yy5Xaz0KdC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7SD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEgpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgWChiKSxiLm5hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksYi5nKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWChiKSxiLm5hP3RoaXMuYmYoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgWShiLHRoaXMuSSksCmIuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBILExiPWMuV2t8fExiLE1iPW5ldyBMYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWk9dGhpcy5hWzddO3RoaXMuV209dGhpcy5hWzRdO3RoaXMuem49dGhpcy5hWzZdO3RoaXMuTm89dGhpcy5hWzddO3RoaXMuSXc9dGhpcy5hWzFdO3RoaXMua289dGhpcy5hWzhdO3RoaXMubXU9dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbOV19Yy5KbT1iO2IucHJvdG90eXBlPXtEaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRWk6dGhpcy5WbShhKX0sVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldtOnRoaXMueW4oYSl9LHluOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy56bjp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5IdyhhKX0sSHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5Jdzp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmtvOnRoaXMubHUoYSl9LGx1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5tdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBOYj1jLkptfHxOYixVYz1uZXcgTmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1VYy5EaSg0KTsoZnVuY3Rpb24oYyl7Yy5Vaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITEsYz0hMTtiP2IuR2V0VmlkZW9FbD9iLkdldEVsPyhhPWIuR2V0VmlkZW9FbCgpLGM9Yi5HZXRFbCgpLGEmJmM/KHRoaXMuVyhjKSx0aGlzLlooYSkpOnRoaXMuY2EoKSk6dGhpcy5jYSgpOnRoaXMuY2EoKTp0aGlzLmNhKCl9LApudTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSxBYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sRXg6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgT2I9Yy5Vanx8T2I7KGZ1bmN0aW9uKGMpe2MuVGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5PbigiYWRFcnJvciIsZnVuY3Rpb24oYSl7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/Cih0aGlzLncoKSx0aGlzLnJhKCkpOih0aGlzLnUoImFkZXJyb3IiLGEpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk7Yi5PbigiZmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5PbigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oInRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2IuT24oImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5vYSgpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgUGI9Yy5Uanx8UGI7KGZ1bmN0aW9uKGMpe2MuVmo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yayYmCndpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycyl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yay5HZXRBbGxQbGF5ZXJzKCk7aWYoYiYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE9iKGJbYV0pO2MubmF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IFBiKGMsdGhpcy5JKSkuZygpKX19dGhpcy5UKCl9fSl9KShjKTt2YXIgUWI9Yy5Wanx8UWIsUmI9bmV3IFFiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklwPXRoaXMuYVs3XTt0aGlzLm5uPXRoaXMuYVs5XTt0aGlzLmJtPXRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzFdfWMuUnM9YjtiLnByb3RvdHlwZT17SHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JcDp0aGlzLm1uKGEpfSxtbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLm5uOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLlJzfHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5IcCg0KTsoZnVuY3Rpb24oYyl7Yy5kbj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5XKGEpfWVsc2UgdGhpcy5jYSgpfSwKTGQ6ZnVuY3Rpb24oYil7dmFyIGE9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LFB0OmZ1bmN0aW9uKCl7dGhpcy5SZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuTGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5SZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUmR8fCh0aGlzLlJkPSEwLHRoaXMuTGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LApwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLkxkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5MZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxBYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuZG58fFRiOyhmdW5jdGlvbihjKXtjLmNuPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFR0OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSwKYi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuYWQoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5hZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmFkKGEpfS5iaW5kKHRoaXMpKX0sYWQ6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7CmEuZ2V0RXJyb3JDb2RlPyhhLmdldEVycm9yQ29kZSgpLHRoaXMudSgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSksMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5tKCkpOih0aGlzLnUoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxOZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5hZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTmYuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5UdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLk5mKCk7dGhpcy5TdCgpfSxTdDpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsCnRoaXMuZ28uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuTnQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5OdD0hMH19KX0pKGMpO3ZhciBVYj1jLmNufHxVYjsoZnVuY3Rpb24oYyl7Yy5lbj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLlB0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTsKdmFyIFZiPWMuZW58fFZiLFdiPW5ldyBWYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenA9dGhpcy5hWzNdO3RoaXMuemo9dGhpcy5hWzddO3RoaXMuVHA9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbMTBdfWMuS2w9YjtiLnByb3RvdHlwZT17eXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpwOnRoaXMueWooYSl9LHlqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56ajp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYj1jLktsfHxYYixXYz1uZXcgWGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1XYy55cCg0KTsKKGZ1bmN0aW9uKGMpe2Mudm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy53aD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLkJzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxudTpmdW5jdGlvbigpe30sdWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLAphPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQnN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sTmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMud2gmJih0aGlzLndoPSEwLHRoaXMuWCYmdGhpcy5YKCkpfX0pfSkoYyk7dmFyIE89Yy52bXx8TzsoZnVuY3Rpb24oYyl7Yy51bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxDYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMudGUpaWYodGhpcy5EYnx8KHRoaXMuRGI9MCksdGhpcy5EYisrLDE1PHRoaXMuRGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnp1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy50ZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuaGEoYSk7dGhpcy5lYXx8KHRoaXMudSgiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcyksMTApfSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSwKaGE6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkNhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLnVtfHxQOyhmdW5jdGlvbihjKXtjLndtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLldhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTyh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubmF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuYmYoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBZYj1jLndtfHxZYixaYj1uZXcgWWIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudGs9CnRoaXMuYVs4XTt0aGlzLm12PXRoaXMuYVs0XTt0aGlzLnhuPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTnM9YjtiLnByb3RvdHlwZT17c2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRrOnRoaXMubHYoYSl9LGx2OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tdjp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgJGI9Yy5Oc3x8JGIsWGM9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WGMuc2soNCk7KGZ1bmN0aW9uKGMpe2MuS2s9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5XKGIpOwp2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlooYSk7YSYmdGhpcy5XKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5La3x8WjsoZnVuY3Rpb24oYyl7Yy5Kaz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkVjPXRoaXMuQ2E9dGhpcy5YYz0hMTt0aGlzLkFoPWUuSGIoMTApO3RoaXMuYmgoKX0sYmg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiYKYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnFhPWIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5xYigpLCEwO3RoaXMuVGcrKztpZigxMDx0aGlzLlRnKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmguYmluZCh0aGlzKSwxMDApLCExfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmhhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmdhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy54YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT0KYXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmCmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxyZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxFYTpmdW5jdGlvbigpe3RoaXMuZWE9ITB9LGdhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkprfHxhYTsoZnVuY3Rpb24oYyl7Yy5Maz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYKMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBhYz1jLkxrfHxhYyxiYz1uZXcgYWMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQm89dGhpcy5hWzhdO3RoaXMuQ249dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbMl19Yy5zaT1iO2IucHJvdG90eXBlPXtBbzpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLkJvOnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIGNjPWMuc2l8fGNjLFljPW5ldyBjYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVljLkFvKDQpOyhmdW5jdGlvbihjKXtjLkxqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5XKGIpLHRoaXMuWihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBkYz1jLkxqfHxkYzsoZnVuY3Rpb24oYyl7Yy5Laj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5oZygpfSxoZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGVjPWMuS2p8fGVjOyhmdW5jdGlvbihjKXtjLk1qPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmCndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgZGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubmEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7KG5ldyBlYyhiLHRoaXMuSSkpLmcoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGZjPWMuTWp8fGZjLGdjPW5ldyBmYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdz10aGlzLmFbMl07dGhpcy5Zbj10aGlzLmFbOF07dGhpcy5wcT10aGlzLmFbNl07dGhpcy5Caj10aGlzLmFbOF07dGhpcy5Oaz10aGlzLmFbMl07dGhpcy5uaj10aGlzLmFbOF07dGhpcy5pbz10aGlzLmFbM107dGhpcy5ydD10aGlzLmFbOF07dGhpcy5OaT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmt1PWI7Yi5wcm90b3R5cGU9e3J3OmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuc3c6dGhpcy5YbihhKX0sWG46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlluOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5wcTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQmo6dGhpcy5NayhhKX0sTWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk5rOnRoaXMubWooYSl9LG1qOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5uajp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaW86dGhpcy5xdChhKX0scXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnJ0OnRoaXMuTWkoYSl9LE1pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5OaTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhjPWMua3V8fGhjLFpjPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1aYy5ydyg0KTsoZnVuY3Rpb24oYyl7Yy5waT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlcoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgaWM9Yy5waXx8aWM7KGZ1bmN0aW9uKGMpe2Mub2k9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO3RoaXMubGUoKTt0aGlzLmVnKCl9LGhhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi51KCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHJkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LEVhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGI9Yi5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkc0xvYWRlclthXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5yYSgpKTp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmVnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGUuYmluZCh0aGlzKSwxMDApfSxsZTpmdW5jdGlvbigpe2lmKCF0aGlzLnhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1iLmdldFBsYXlTdGF0ZSgpP2IuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMub2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmIuX3BsYXllck9wdGlvbnMmJmIuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxiLl9hZFJlZ2lzdGVyZWQ/dGhpcy5tKCk6dGhpcy5tKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxlLmJpbmQodGhpcyksMTAwKX19LG06ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQodGhpcy5vYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIGpjPWMub2l8fGpjOyhmdW5jdGlvbihjKXtjLnJpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj0KbmV3IGljKGIpO2IubmE/dGhpcy5UKCk6dGhpcy5OKGIpfHwodGhpcy5SKGIpLChuZXcgamMoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuVGEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYl0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlRhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuVCgpfX0pfSkoYyk7dmFyIGtjPWMucml8fGtjLGxjPW5ldyBrYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xbT10aGlzLmFbNl07dGhpcy5jaz10aGlzLmFbMV07dGhpcy5acz10aGlzLmFbMTBdO3RoaXMucW49dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5rbD1iOwpiLnByb3RvdHlwZT17cG06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnFtOnRoaXMuYmsoYSl9LGJrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5jazp0aGlzLllzKGEpfSxZczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWnM6dGhpcy5wbihhKX0scG46ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFuOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy5rbHx8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMucG0oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZWg9dGhpcy5naD10aGlzLmZoPSExO3RoaXMueGQ9W107dGhpcy5hZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHg/bnVsbDp4LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuVGw9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5HcShhKTpbXSxiO3RoaXMuZ2g9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZmg9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuSGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmFmKXtpZih0aGlzLmVoKWJyZWFrO2I9dGhpcy5hZltjXTt0aGlzLnZmKGIpJiYodGhpcy54ZC5wdXNoKGIpLHRoaXMuSGgoYikpfX0sdmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgp0PyEwOiExfSxHcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5hZltjXSx0aGlzLnZmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LEhoOmZ1bmN0aW9uKGEpe3RoaXMudmYoYSkmJmEuZygpfSxTdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuZmgpZm9yKHRoaXMuZWg9ITAsYT0wO2E8dGhpcy54ZC5sZW5ndGg7YSsrKXRoaXMueGRbYV0uTGImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54ZFthXS5MYil9fX0pKGMpO3ZhciBuYz1jLlRsfHxuYyxNPW5ldyBuYztNLmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vcj10aGlzLmFbMTBdO3RoaXMuaXQ9dGhpcy5hWzFdO3RoaXMuQXQ9dGhpcy5hWzVdO3RoaXMuR2w9dGhpcy5hWzEwXTsKdGhpcy53cz10aGlzLmFbOV07dGhpcy5Rcz10aGlzLmFbNV07dGhpcy5tcj10aGlzLmFbN107dGhpcy5IdT10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs3XX1jLmZxPWI7Yi5wcm90b3R5cGU9e25yOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vcjp0aGlzLmh0KGEpfSxodDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaXQ6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkF0OnRoaXMuRmwoYSl9LEZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HbDp0aGlzLnZzKGEpfSx2czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud3M6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFzOnRoaXMubHIoYSl9LGxyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5tcjp0aGlzLkd1KGEpfSxHdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHU6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuajphfX19KShjKTt2YXIgb2M9Yy5mcXx8b2MsYWQ9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9YWQubnIoNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuQmMoay5LdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOgotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkJjKGsuRnMpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtGLndpZHRoPTE7Ri5oZWlnaHQ9MTtGLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChGKTt2YXIgYmQ9Ri5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxyYz1GLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChGKTt2YXIgST1uZXcgSixsPSExO0kua2EoKTtJLllnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5rYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuWWcoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTtJLmthKCk7CnZhciBjZD1iZChmdW5jdGlvbigpe2UueWcod2luZG93LEkuQXIoKSx7aWQ6Y2R9KX0sNTAwKSxpYT1lLmFhKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd0PXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzddfWMuTnA9YjtiLnByb3RvdHlwZT17dnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnd0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5OcHx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQudnQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLnhoPXRoaXMuY29uZj10aGlzLmxiPXRoaXMucGxheWVyPW51bGw7dGhpcy5zZD0wOwp0aGlzLmJiPSIiO3RoaXMueWQ9W107dGhpcy56ZD0wO3RoaXMuemg9ITE7dGhpcy5ZZT1bXTtlLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy50aT1iO2IucHJvdG90eXBlPXt2dTpmdW5jdGlvbihhKXt0aGlzLnhoPWF9LGdmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0scXU6ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSxwdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxNYzpmdW5jdGlvbihhLGIpe2UuZmEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5CcigpKXRoaXMubGIubCh0aGlzLmxiLm9kLHRoaXMubGIud2EsdGhpcy5sYi4kZSxmdW5jdGlvbigpe3RoaXMuTWMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmxiLkFjKTtlbHNlIGlmKHRoaXMuVnEoKSl0aGlzLmp1KGZ1bmN0aW9uKCl7dGhpcy5NYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS52KGsueWMsdGhpcy5wbGF5ZXIucygpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLlV1KCk7bC5leGl0RnVsbHNjcmVlbigpO2Uub2IoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLmxiLApnKTtsLm91KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy50cyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkllJiYoYz10aGlzLnBsYXllci5JZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5LZShhLGMsZik7dGhpcy5wbGF5ZXIuSmgobCl9fSxCcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLnNkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuc2QuZ2V0VGltZSgpLHRoaXMuc2Q9YSwzRTU8Yj8hMDohMTt0aGlzLnNkPWE7cmV0dXJuITF9LEV1OmZ1bmN0aW9uKCl7ZS5vYigicHJlcm9sbCIpO2UuZmYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5KYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMudWcoYSkpP3RoaXMuTWMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX0sRHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMueGgpe2UuZmYoInBvc3Ryb2xsIik7ZS5vYigicG9zdHJvbGwiKTt0aGlzLnZ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLnVnKGMpKT90aGlzLk1jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLnYoay5kZCx0aGlzLnBsYXllci5zKCkpKX19LHVnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxXdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLkJ1KHRoaXMuRHUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5vYigibWlkcm9sbCIpO2UuZmYoIm1pZHJvbGwiKTtpZighdGhpcy5taCl7dGhpcy5taD0hMDt2YXIgYj10aGlzLkphKCJhZFRhZyIpO3RoaXMuSmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkphKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5NYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5taD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5kZCwKdGhpcy5wbGF5ZXIucygpKSl9fSxWdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnV1KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmUoKX0sZzpmdW5jdGlvbigpe3RoaXMuRXUoKTt0aGlzLnBsYXllci5OZSYmdGhpcy5WdCgpO3RoaXMuV3QoKX0sWHQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy55ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuR3coYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnpkPXRoaXMueWQubGVuZ3RofSxWcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy56ZCYmKGE9ITApO3JldHVybiBhfSwKanU6ZnVuY3Rpb24oYSl7dGhpcy56aD1hO2ZvcihhPTA7YTx0aGlzLnlkLmxlbmd0aDthKyspdGhpcy55ZFthXVsiZnVuY3Rpb24iXSh0aGlzLkl0LmJpbmQodGhpcykpfSxJdDpmdW5jdGlvbihhKXt0aGlzLnpkLS07YSYmdGhpcy5ZZS5wdXNoKGEpOzA+PXRoaXMuemQmJnRoaXMuemgoKX0sdHM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuWWUubGVuZ3RoO2MrKyliPXRoaXMuWWVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMudGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWms9dGhpcy5hWzhdO3RoaXMuJG09dGhpcy5hWzhdO3RoaXMuUWw9dGhpcy5hWzNdO3RoaXMuYXE9dGhpcy5hWzddO3RoaXMuZXU9dGhpcy5hWzFdO3RoaXMuTHM9dGhpcy5hWzhdO3RoaXMuUGs9CnRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzVdfWMuSW89YjtiLnByb3RvdHlwZT17WWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlprOnRoaXMuWm0oYSl9LFptOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy4kbTp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUWw6dGhpcy4kcChhKX0sJHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFxOnRoaXMuZHUoYSl9LGR1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZXU6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxzOnRoaXMuT2soYSl9LE9rOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmo6YX19fSkoYyk7dmFyIHFjPWMuSW98fHFjLGVkPW5ldyBxYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Zayg0KX0pLmNhbGwoUGVpZm94b2hPdWNoYW5nYSxQZWlmb3hvaE91Y2hhbmdhKTsK
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
TornadoServer/5.0 /
Resource Hash
ad943d6e6dbcf798423ad954e6f7025c2b3aec3efd5bd199c93dbcf72ca593b5

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/74.0.3729.169 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Wed, 02 Oct 2019 09:37:40 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
111
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43067:uniques_holding&s=6acc7c777cce3be138a245218c439c54&__io=8367263b6.e08999b40_1570009061782&1570009061782
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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:41 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
map.js
js.adscale.de/
21 KB
6 KB
Script
General
Full URL
https://js.adscale.de/map.js
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909301246/wrap.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/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
dkfVZvfV0gdhc2R5a4arQG6Eo23V0d6t
Content-Encoding
gzip
Last-Modified
Thu, 05 Sep 2019 23:46:38 GMT
Server
AmazonS3
x-amz-request-id
45280296D20EB550
ETag
"bebadcf744e89f1c759744a2a44d9f38"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Wed, 02 Oct 2019 09:37:42 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5434
x-amz-id-2
tKq7230iBP/75HIazwSTtIgKBAKWav7f2wNpExvvRpJpHdOMd1onSwcOTNUFAJE7ai1oRBjulIY=
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=37609559
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909301246/wrap.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.106 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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:42 GMT
content-encoding
gzip
last-modified
Fri, 05 Jul 2019 13:52:01 GMT
server
nginx
etag
W/"5d1f5601-9ca4"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Wed, 02 Oct 2019 09:42:42 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: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909301246/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.119 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn1.bbmedia.cz
Software
ibillboard /
Resource Hash
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47

Request headers

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

Response headers

Date
Wed, 02 Oct 2019 09:37:42 GMT
Content-Encoding
gzip
Last-Modified
Sun, 01 Oct 2017 19:12:02 GMT
Server
ibillboard
Vary
Accept-Encoding, Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=604800
Transfer-Encoding
chunked
Connection
keep-alive
Expires
Tue, 08 Oct 2019 20:13:26 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: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909301246/wrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
63.32.86.220 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-63-32-86-220.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d

Request headers

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

Response headers

status
200
date
Wed, 02 Oct 2019 09:37:42 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
495 B
Image
General
Full URL
https://de-gmtdmp.mookie1.com/t/v2/learn?tagid=V2_343&src.rand=72150231&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/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Wed, 02 Oct 2019 09:37:42 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 0B5E
Redirect Chain
  • https://ih.adscale.de/map?ssl=1&format=video
  • https://ih.adscale.de/map?ssl=1&format=video&nut&uu=095ea5a9c1bd4879bac6bce4c5d151bc
0
0
Document
General
Full URL
https://ih.adscale.de/map?ssl=1&format=video&nut&uu=095ea5a9c1bd4879bac6bce4c5d151bc
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/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate, br
Cookie
uu=095ea5a9c1bd4879bac6bce4c5d151bc
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

Server
Apache-Coyote/1.1
Content-Type
text/html;charset=ISO-8859-1
Vary
Accept-Encoding
Content-Encoding
gzip
Expires
Wed, 02 Oct 2019 09:37:42 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:42 GMT
Content-Length
627
Connection
keep-alive
Set-Cookie
tu=4#4001128422#48~~436113~436113~1#101~~436113~436113~1#38~~436113~436113~1#72~~436113~436113~1#42~~436113~436113~1#75~~436113~436113~1#60~~436113~436113~1#63~~436113~436113~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=095ea5a9c1bd4879bac6bce4c5d151bc
Content-Length
0
Expires
Wed, 02 Oct 2019 09:37:42 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:42 GMT
Connection
keep-alive
Set-Cookie
uu=095ea5a9c1bd4879bac6bce4c5d151bc; Domain=.adscale.de; Expires=Tue, 29-Sep-2020 02:04:22 GMT; Path=/
index.html
cdn.districtm.io/ids/ Frame 7B31
0
0
Document
General
Full URL
https://cdn.districtm.io/ids/index.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
104.16.68.69 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains; preload

Request headers

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

Response headers

status
200
date
Wed, 02 Oct 2019 09:37:42 GMT
content-type
text/html
set-cookie
__cfduid=d111f26b257ce645c7b47fcf4c5856bc81570009062; expires=Thu, 01-Oct-20 09:37:42 GMT; path=/; domain=.districtm.io; HttpOnly
last-modified
Thu, 10 Jan 2019 16:50:48 GMT
cache-control
s-maxage=1209600, max-age=14400
strict-transport-security
max-age=31536000; includeSubDomains; preload
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
server
cloudflare
cf-ray
51f5b2fe3d36bf73-AMS
content-encoding
br
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame 1263
0
0
Document
General
Full URL
https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.113.108 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.9.13 /
Resource Hash

Request headers

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

Response headers

Server
nginx/1.9.13
Content-Type
text/html
Last-Modified
Fri, 20 May 2016 02:07:09 GMT
ETag
W/"573e714d-3e3"
Expires
Sun, 06 Aug 2017 09:41:59 GMT
Cache-Control
max-age=31536000
Access-Control-Allow-Origin
*
Content-Encoding
gzip
Via
1.1 varnish 1.1 varnish
Fastly-Debug-Digest
e0a1bb88354655bae6b4f44be1ff58238053e5563770e29e0e433e905ee66055
Content-Length
506
Accept-Ranges
bytes
Date
Wed, 02 Oct 2019 09:37:42 GMT
Age
4924547
Connection
keep-alive
X-Served-By
cache-jfk8123-JFK, cache-hhn4024-HHN
X-Cache
HIT, HIT
X-Cache-Hits
1276778, 81086
X-Timer
S1570009062.176809,VS0,VE0
Vary
Accept-Encoding
Cookie set showad.js
ads.pubmatic.com/AdServer/js/ Frame 12F0
0
0
Document
General
Full URL
https://ads.pubmatic.com/AdServer/js/showad.js
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.233.180 , Ascension Island, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-233-180.deploy.static.akamaitechnologies.com
Software
Apache/2.2.15 (CentOS) /
Resource Hash

Request headers

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

Response headers

Last-Modified
Fri, 26 Jul 2019 09:39:45 GMT
ETag
"13006b6-9bf6-58e925294ef26"
Server
Apache/2.2.15 (CentOS)
Set-Cookie
KTPCACOOKIE=YES; domain=.pubmatic.com; path=/; max-age=7776000;
Accept-Ranges
bytes
Content-Encoding
gzip
P3P
CP="NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC", CP="NOI DSP COR LAW CUR ADMo DEVo TAIo PSAo PSDo IVAo IVDo HISo OTPo OUR SAMo BUS UNI COM NAV INT DEM CNT STA PRE LOC"
Content-Length
14898
Content-Type
text/html; charset=UTF-8
Cache-Control
public, max-age=144390
Expires
Fri, 04 Oct 2019 01:44:12 GMT
Date
Wed, 02 Oct 2019 09:37:42 GMT
Connection
keep-alive
Vary
Accept-Encoding
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame B98B
0
0
Document
General
Full URL
https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.113.108 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx/1.9.13 /
Resource Hash

Request headers

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

Response headers

Server
nginx/1.9.13
Content-Type
text/html
Last-Modified
Fri, 20 May 2016 02:07:09 GMT
ETag
W/"573e714d-3e3"
Expires
Sun, 06 Aug 2017 09:41:59 GMT
Cache-Control
max-age=31536000
Access-Control-Allow-Origin
*
Content-Encoding
gzip
Via
1.1 varnish 1.1 varnish
Fastly-Debug-Digest
e0a1bb88354655bae6b4f44be1ff58238053e5563770e29e0e433e905ee66055
Content-Length
506
Accept-Ranges
bytes
Date
Wed, 02 Oct 2019 09:37:42 GMT
Age
4924547
Connection
keep-alive
X-Served-By
cache-jfk8123-JFK, cache-hhn4024-HHN
X-Cache
HIT, HIT
X-Cache-Hits
1276778, 81087
X-Timer
S1570009062.204744,VS0,VE0
Vary
Accept-Encoding
pd
eu-u.openx.net/w/1.0/ Frame AE6E
Redirect Chain
  • https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
  • https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
0
0
Document
General
Full URL
https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.95.120.147 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
147.120.95.34.bc.googleusercontent.com
Software
OXGW/16.163.0 /
Resource Hash

Request headers

:method
GET
:authority
eu-u.openx.net
:scheme
https
:path
/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
sec-fetch-mode
nested-navigate
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
cross-site
referer
https://www.golem.de/
accept-encoding
gzip, deflate, br
cookie
i=33d2de16-bab9-05f4-18bf-0eeca12b0b16|1570009062
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Referer
https://www.golem.de/

Response headers

status
200
vary
Accept
set-cookie
i=33d2de16-bab9-05f4-18bf-0eeca12b0b16|1570009062; Version=1; Expires=Thu, 01-Oct-2020 09:37:42 GMT; Max-Age=31536000; Domain=.openx.net; Path=/ pd=v2|1570009062|mOgikimWiygu; Version=1; Expires=Thu, 17-Oct-2019 09:37:42 GMT; Max-Age=1296000; Domain=.openx.net; Path=/
server
OXGW/16.163.0
p3p
CP="CUR ADM OUR NOR STA NID"
date
Wed, 02 Oct 2019 09:37:42 GMT
content-type
text/html
content-length
592
via
1.1 google
alt-svc
clear

Redirect headers

status
302
set-cookie
i=33d2de16-bab9-05f4-18bf-0eeca12b0b16|1570009062; Version=1; Expires=Thu, 01-Oct-2020 09:37:42 GMT; Max-Age=31536000; Domain=.openx.net; Path=/
server
OXGW/16.163.0
p3p
CP="CUR ADM OUR NOR STA NID"
location
https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
date
Wed, 02 Oct 2019 09:37:42 GMT
content-length
0
via
1.1 google
alt-svc
clear
usync.html
eus.rubiconproject.com/ Frame 99CB
0
0
Document
General
Full URL
https://eus.rubiconproject.com/usync.html
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.78.125 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-78-125.deploy.static.akamaitechnologies.com
Software
Apache/2.2.15 (CentOS) / PHP/5.3.3
Resource Hash

Request headers

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

Response headers

Server
Apache/2.2.15 (CentOS)
X-Powered-By
PHP/5.3.3
p3p
CP="NOI CURa ADMa DEVa TAIa OUR # BUS IND UNI COM NAV INT"
Last-Modified
Tue, 01 Oct 2019 23:09:07 GMT
Content-Encoding
gzip
Content-Length
7648
Content-Type
text/html; charset=UTF-8
Cache-Control
max-age=72747
Expires
Thu, 03 Oct 2019 05:50:09 GMT
Date
Wed, 02 Oct 2019 09:37:42 GMT
Connection
keep-alive
Vary
Accept-Encoding
launcher.js
sak.userreport.com/sdm/
58 KB
18 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/0d0b6070-e21a-43f6-9151-5f6ee2a7f554/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.225.78.6 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-225-78-6.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
6c5a863192d8b1a82f9a0fb550c45f778d42b8af36fc921045a055389062edad

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/74.0.3729.169 Safari/537.36

Response headers

x-amz-version-id
cj2VE0YVfLxhuffg0VJh8ccads9KhSqM
content-encoding
gzip
last-modified
Thu, 26 Sep 2019 14:50:20 GMT
server
AmazonS3
age
105
date
Wed, 02 Oct 2019 09:35:58 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-C2
x-amz-cf-id
-BrlAN6RUPFlhQATCVFkEga20n2M9C_b_QCuN1Ghbg7pvb_u0i8QNA==
via
1.1 ff2bcb2d3b4a3d9e0615ddd1033c38c4.cloudfront.net (CloudFront)
segments
api.theadex.com/v0.9/pub/
56 B
126 B
Script
General
Full URL
https://api.theadex.com/v0.9/pub/segments?access_token=y5fWjpPcqPTEF7fuHtSSUIh1UnD1w2hVEt2Y2PjI&callback=window.ibb_lib.ibb_store
Requested by
Host: bbcdn-bbnaut.ibillboard.com
URL: https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
85.114.144.106 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
/
Resource Hash
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b

Request headers

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

Response headers

status
200
date
Wed, 02 Oct 2019 09:37:42 GMT
content-length
56
content-type
text/plain; charset=utf-8
p.min.js
cdn.emetriq.de/adp/profiling/0.2.18/
5 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.2.18/p.min.js
Requested by
Host: ups.xplosion.de
URL: https://ups.xplosion.de/loader/69511/default.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:20eb:fa00: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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 25 Sep 2019 11:24:10 GMT
content-encoding
gzip
last-modified
Wed, 25 Sep 2019 11:08:07 GMT
server
AmazonS3
age
598413
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
fTNde0ZXM.BzDu33z6pL5eJgKGxahMla
status
200
cache-control
max-age=31536000, no-transform, public
x-amz-cf-pop
FRA2-C1
content-type
application/javascript; charset=utf-8
x-amz-cf-id
RCFg3EBrs7_RMBl89e0mubBrt156Rgn_tfpjAMFp2L-gZDUzt1VkdQ==
via
1.1 f7bf326347bdd7f275a38a22b5b83724.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%2F74.0.3729.169%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-2&screen=1200x1600&mbr=03412b7eabb5c32092d8052409111d9c&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=209332024759
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.18/p.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
63.32.86.220 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-63-32-86-220.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
934b70ada17d26c8b5416543588cccde2bcfe147ccf5f1c302decd5eac1cf35b

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/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 02 Oct 2019 09:37:42 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
34.250.43.132 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-250-43-132.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.9 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

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

Response headers

Date
Sun, 29 Sep 2019 17:34:55 GMT
Content-Encoding
gzip
Last-Modified
Tue, 24 Sep 2019 18:38:34 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 0736
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFBifAESfCBD7-WDUkWsfABifABSfABSfABiUABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4205533364296263327
42 B
663 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=4205533364296263327
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
63.32.86.220 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-63-32-86-220.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

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

Response headers

status
200
date
Wed, 02 Oct 2019 09:37:42 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
Wed, 02 Oct 2019 09:37:42 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=4205533364296263327
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 64B8
0
0
Document
General
Full URL
https://adstax-match.adrtx.net/activation?receiverId=adaud
Requested by
Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909301246/wrap.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.248.95.73 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-248-95-73.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.9 /
Resource Hash

Request headers

Host
adstax-match.adrtx.net
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Sec-Fetch-Mode
nested-navigate
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site
cross-site
Referer
https://www.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/74.0.3729.169 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
Wed, 02 Oct 2019 09:37:42 GMT
Server
akka-http/10.1.9
X-Error-Reason
Missing UserId
Content-Length
39
Connection
keep-alive
usersync
uss.xplosion.de/
42 B
663 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=03412b7eabb5c32092d8052409111d9c
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
63.32.86.220 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-63-32-86-220.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

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

Response headers

status
200
date
Wed, 02 Oct 2019 09:37:42 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"
data
lb18.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb18.s400.meetrics.net/data?/N/UyKJOBALlnFFUkzFjCPFAAAAAAAAByQnAPBAAFAAyQnTmxfAPAAAAAAAAABmxfAZBAAOA55A55A85B55A58E55A55AGAx2Aw4Ax4ArmxfAPsCAXUAKAAIYeNAPAAAhPAwPAITfPAPAAAAAAAAAImxfAPAAAAAAAAAIhRjAPAAA0EAMCAIbosASksF8FjAAAAAAAAAAAAEAAAyQnAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA53Aw4Ey1AxBEMAxzA4yA2zA21A11A1yANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA05A4wA05AwyA40AKAipFssFivFhyFkyBKA05A4wA05AwyA40AKA05A4wA05AwyA40A4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBdAAAAAAAAAAAAFAAAmxfAAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFBs1+SA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.206 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h213.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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:43 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 02-Oct-19 09:37:42 GMT
/
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&1570009068536
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/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 02 Oct 2019 09:37:48 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

171 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 object| ggeac object| closure_memoize_cache_ object| googleToken object| googleIMState object| google_js_reporting_queue function| processGoogleToken function| $ function| jQuery object| yieldlove_site_settings object| yieldlove_cmd object| YLHH object| __core-js_shared__ object| core function| pbjsYLHHChunk object| de_meetrics object| NUGGjson function| aplauncherExec function| aplauncher string| n_pbt object| _m6rq object| iAbo function| golemAcceptCookies object| stroeerCore boolean| deliveringAds object| adsbygoogle boolean| subDomainCheckVar function| WVEACdd object| pvfnvc1fFlags string| pvfnv862Rnd object| pvfnvd358tc string| szmvars object| iom object| iam_data object| _io_config string| disableStr function| gtag number| timeSincePageLoad object| dataLayer function| setUpAgknTag boolean| pvfnvea5sdl boolean| pvfnvea5sdln string| pvfnvd358genat string| pvfnvd358sthash boolean| pvfnvfcfforceimp number| google_srt boolean| google_measure_js_timing boolean| google_noFetch number| __google_ad_urls_id number| google_unique_id object| google_reactive_ads_global_state object| gaGlobal object| google_ad_modifications object| google_logging_queue object| google_sa_queue object| google_sl_win function| google_process_slots boolean| google_apltlad number| _gfp_ function| google_spfd number| google_lpabyc object| google_sv_map object| google_t12n_vars boolean| pvfnvdaaBody boolean| pvfnv88dDetect object| pvfnv556Mobile object| pvfnvd3581 object| pvfnvd358o1 object| pvfnvd358o2 object| pvfnvd358o3 object| pvfnvd3582 number| pvfnvd358d3 object| pvfnvd3584 object| pvfnvd3585 boolean| pvfnv31cij object| confiant object| google_tag_manager function| Swiper function| Goog_AdSense_getAdAdapterInstance function| Goog_AdSense_OsdAdapter string| GoogleAnalyticsObject function| ga object| ScTag146005 object| ScTagAdditional146005 object| axd2 object| s object| _adexc number| _m6rApiLoaded function| google_sa_impl object| google_jobrunner object| google_persistent_state_async object| __google_ad_urls number| google_global_correlator object| google_prev_clients object| ampInaboxIframes object| ampInaboxPendingMessages object| google_iframe_oncopy boolean| google_osd_loaded boolean| google_onload_fired object| google_tag_data object| gaplugins object| gaData object| rmp3pi function| SwfVideo object| exportz object| m function| agknTagBuilder object| _agknTag string| _agknTagName object| _agknEchoTag number| _isAgknTagSet object| _m6rOnce number| _m6rContainerLoaded object| rmpGlobals function| RadiantMP function| FuckAdBlock object| fuckAdBlock object| __io function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb function| _h object| adex 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_830364 object| PeifoxohOuchanga number| D function| videopkgInterface object| closure_lm_212145 boolean| pvfnvaf0Track string| hic_qos string| _io_uniques_holing_params string| apsrc object| ibb_lib object| _EQLService object| _EQPScript object| _EQPService object| _adrtx number| _emqUSSMutex function| _emqUSSCall string| segments object| segmentsArr undefined| result string| _emqstr object| audienceProjectLayer

5 Cookies

Domain/Path Name / Value
.selfcampaign.com/ Name: _auid
Value: a49e47efc853fa44d585f5d7f2eb5a9b
delivery.selfcampaign.com/ Name: _session_id
Value: a49e47efc853fa44d585f5d7f2eb5a9b
.doubleclick.net/ Name: IDE
Value: AHWqTUnlHjRb1ZHo7GXny44btUhNuqwE2c1EWCkiKqww3Hjdirr6d8CRG9daixtc
.golem.de/ Name: __io
Value: 8367263b6.e08999b40_1570009061782
www.golem.de/ Name: GED_PLAYLIST_ACTIVITY
Value: W3sidSI6ImtkQzgiLCJ0c2wiOjE1NzAwMDkwNjEsIm52IjoxLCJ1cHQiOjE1NzAwMDkwNTgsImx0IjoxNTcwMDA5MDU4fV0.

7 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://pagead2.googlesyndication.com/pagead/js/r20190926/r20190131/show_ads_impl.js(Line 15)
Message:
getPageCorrelator 1726548844389678
console-api log URL: https://pagead2.googlesyndication.com/pagead/js/r20190926/r20190131/show_ads_impl.js(Line 15)
Message:
getPageCorrelator 1726548844389678
console-api log URL: https://pagead2.googlesyndication.com/pagead/js/r20190926/r20190131/show_ads_impl.js(Line 15)
Message:
getPageCorrelator 1726548844389678
console-api log URL: https://pagead2.googlesyndication.com/pagead/js/r20190926/r20190131/show_ads_impl.js(Line 15)
Message:
getPageCorrelator 1726548844389678
console-api log URL: https://pagead2.googlesyndication.com/pagead/js/r20190926/r20190131/show_ads_impl.js(Line 15)
Message:
getPageCorrelator 1726548844389678

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.

acdn.adnxs.com
ad.yieldlab.net
ads.golem.de
ads.pubmatic.com
adservice.google.com
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.districtm.io
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
dmx.districtm.io
eu-u.openx.net
eus.rubiconproject.com
fastlane.rubiconproject.com
golem.de
googleads.g.doubleclick.net
hbopenbid.pubmatic.com
hgc-cf-cache-1.svonm.com
ib.adnxs.com
ih.adscale.de
imasdk.googleapis.com
js.adscale.de
js.agkn.com
lb18.s400.meetrics.net
lib.selfcampaign.com
match.adsrvr.org
nugmw.userreport.com
pagead2.googlesyndication.com
prg.smartadserver.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
stats.g.doubleclick.net
tpc.googlesyndication.com
track.selfcampaign.com
track2.selfcampaign.com
tracking.m6r.eu
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
yieldlove-d.openx.net
104.109.78.125
104.109.82.87
104.16.68.69
116.202.11.242
13.224.196.107
13.224.196.127
13.225.78.6
136.243.12.39
136.243.3.206
136.243.94.77
148.251.131.173
148.251.69.233
151.101.113.108
151.101.13.194
172.217.16.194
185.33.223.202
185.64.189.112
185.86.137.17
188.40.115.112
2.16.122.151
2.18.233.180
2.18.233.67
2.18.234.72
216.58.205.226
2600:9000:200c:be00:1f:a1b:34c0:93a1
2600:9000:20eb:fa00:1c:8c89:a300:93a1
2600:9000:21f3:5000:15:efbc:e300:93a1
2600:9000:21f3:7a00:12:6213:9cc0:93a1
2606:4700:20::681a:3cd
2a00:13c8:f5::f:4b3d:175
2a00:13c8:f5::f:4b3d:17a
2a00:13c8:f5::f:4b3d:181
2a00:1450:4001:809::2001
2a00:1450:4001:814::2002
2a00:1450:4001:815::200e
2a00:1450:4001:816::2002
2a00:1450:4001:817::200a
2a00:1450:4001:81a::2008
2a00:1450:4001:81e::2002
2a00:1450:4001:81f::2006
2a00:1450:400c:c04::9c
2a02:26f0:6c00:2bc::5f76
34.248.95.73
34.250.43.132
34.95.120.147
35.157.22.81
35.186.238.175
37.157.2.235
37.157.2.237
52.216.19.35
54.154.79.134
62.168.44.119
63.32.86.220
69.173.144.143
77.247.84.129
77.247.84.149
85.114.144.106
89.163.159.106
91.215.103.64
91.215.103.65
0119b60e611490f51be9a80060f31f566b232d3026766fd724aa8a41e810a8dd
037bc858629fd4eda5e560ef9513c93d25f1313a276abe64cfd97fa8023c6de5
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
07dc0032af03aa70d823ae29a890bed8b28b51ee10d86ee2db336c64321dcbac
07e29959b703a18e0fa84d4c2beb8e0edd12df42717ce9cd5a360c2e6b641234
0cf30fef0fab894e55602dccf3099fa7c19b13a6f97e84d4d498a532b5a6c725
0dc4b8e0fa0f750e5be2b0ef1d653a23989d4e1fe94c2ed18315c3b6a43e4d47
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47
1154351398f442cae61c3f7a25a0816b6fbc252ce3d6cd93ef9e1a95531c977f
1184e228902329f425f2ffc6f096006080e82a4fbdee4ee28e0d561ccfe4c88a
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8
168a22846aba37d45ba1c76c155db3ccc9ee0e544438182876f8f860f72c043b
1758d5ad477dde11feff235ee6323928855c5172f138a54df819740c106de5f7
17e9a34c14b7a3289f64bb425e3ac33092c3a7748eaeb96311f78b5296a92ef7
1a2d672618e60c667ce620319f392ae45207f2c77c60299ffb5290210b150c53
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9
232180bb028ce94f6d77bd46782c2d305746ae99cbe7adbe884e94076d91107b
24ba18db24e5df3102ba712c3d6238822be2f422789331a9e6f42a6e2d61d269
25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d
25ee8438325f726833afbcc7f75f152d9640156bda461c1b4636275af51c5dbe
2c8f3327989047e73c12f24699abdccfed0536769fffaae1ab0662cc2699ac1f
310e88d0c1dfd7a67d3e3aa187c537b40eaf528afb83a41887214cfd60baba53
3341a937d392ac6893916d5dae7efd6da62d257cccd68fd018242069dff1763c
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1
34815dfa238f8c0e9c2f0c533e27feb0c872d20ee404deb6feb781175c033f31
352c699a724df4758e0005476752014202d4156ce13cbf91f9f948f676488088
359159fe456a7b4879303b756d2880d20df5c922f040fa5866727c27b4858e5c
35aefd2d1de0b25d9a5640cf3129dfc507a3c417a7da34f4bb6f9b4a79e19484
35c073a53df4dd054afab9758b90a88846802754ff15fc3b31cc9af133c8a401
37471fa2b8b21ce6606f6b9f06e4eda8970d12594fa57f3d74fd906754695ff5
3861f11012d2bf6851a66a931e2b1959cce703983c416577cdb33f90fc7775e7
3d0e20e960d26b6b610d648198b6b410c230d5f3e59fc32cb0464e69592deb5c
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
3e84742ca9633f23c8d106e006bc4f5dbee50a88318b4243533a8c188fa2fe57
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d
418544f013a78f89776b5560b6e0892106fceabd2870b35a73ae94c99ec095d4
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5
431ced6916a2a21a156e38701afe55bbd7f88969fbbfc56d7fe099d47f265460
4402acdfead5b00daf6e5ab75a8f93999f696c4098847c63493f41a8019bdf4f
449c96ff92893665c63d897f63c5899be59a2bf98a336a956fc9720981d8b0a0
4516b6bbb2ebdbb75c5259a9a325525a2e9560a219c44d239a95738856873173
4931c1448e1ff3d932016d61343723b80faa393a4ad446fcbc781b350ac428a4
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
4b90ba75e355a3807ea14598c40c071a435184fa4ba8bb8326a8dff647d12155
4c13cd1db06412f5231a3e080e44c24a42f7212b5956b84757fed19eae97a135
4d131d092f6a1d44397026f1bf84f5d43382aaa32db44deb0d9226ed826f27b2
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff
51649bd46e22a115366ce41685d7d0d0ad1c276d29246611f89dbe2fef230599
51f85281f32afbfbb77ddd51c2ce831c30479260b6ac45e53581d99a26e6bf2e
54330a34b484ec175b5a61bb50ee87603d34a83030c6c6729c501930c21caa63
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd
5a8fc6277f1a4f5ba27aca1d6cea5a3174a3b13fc6851e45e621f131caa4bb3a
5b195cb6c314aa8743f79114592a4a2a8486bc5a14de79a6f86ec3cd4ddaaf10
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418
5ca6483fac9f86f9eeed1e4b81573adcd9cda802fcb3c25a65af63454a7079a7
5d2d6cdc6bb2e9a3e32364d21cc3397f25407a66f7e940b53a42f8a1de6a6a28
5f224a13a15499778526423761125cbae8b8063bf0f90a46862671e17ccc9e7b
5ff1ec1da0cd687f57271ea40875d07569d26a2c919d95310355a10cc464431e
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
63b5b4b7f178fd67e030680bc1d18a35984a4ae8422581e82308c9cb1d18fc56
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d
65751a8f886fc5b637061a55efd0b245dd9c1080d82308f7b36cf0635da9e1da
65c6f88aa10cd74354e6f432a1f5456078386f9286af325915bd211cae46a0b8
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
6c5a863192d8b1a82f9a0fb550c45f778d42b8af36fc921045a055389062edad
7096017d5ebff5c81d45fb7c1fd18e10eb13be4af1da737d0b6bfd93b1e35546
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec
7346058873c7f718c1eb7091602686e344d27802c07b55e700bf7aa27169d698
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
78f4a3114e3738eab1ffd31cbd3611435034197ecc40456f3ed43f82af4393d3
7bc34320273bffb9ea03d5498a5012ffa3d0f48632bfd122f04f0c77525ded82
7c5e8ae97d184389610b4deeab367ea2bcbe2108fd50b622546240eadc847a89
7dafa997035d795c9c23778718a4ba60ea7eebbab85f95bcdead8d01f4640900
80b6a4aec4050abca9c1bf05b6ae1730ccdddbcde4ddb48a720c5837bcbce81f
80e20698a9b4720d654427d4fe918306510be65c030d9812eeff65a850eaff00
81d8bf43f33319f1a26707d0c0f426dfd6bc37c00020ae53e399a9bff42e99db
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56
8312031e6ca02a1188d9ee23e0e9aaa6b5aec550886cee72e6d30de206104f40
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
8453ec595b19e74278586279557ad2ed3ff9e76820a6b4c4eaa81072cbd23200
86b3bb9fb0f4f3fbd0a0ca1a7399f99450f1509a39e71d57c21badde01212806
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
8a5ebf17c751099d2f751d23dd57cd262691ccc803fc6f8fa1712922a86a8a8d
8a8fb0aaabb05f148c7415ef60f9a8f0dba05f7c982e070a6bb1aa2d68637867
8b94d0334d3e288d0dff8bce29a01a991c1452be4dd1969a279d78ccaa2332dc
8dddcfd8e72835e894bdf5f1a6834228e9d839d138e4879d176ffff87568181c
9061640c00ecd839dc1d1b654386cddad6052129bcda9d887b57487f8134e3f5
934b70ada17d26c8b5416543588cccde2bcfe147ccf5f1c302decd5eac1cf35b
9503413988272f0430317a02da3f0a5e6ce25f8a0391a876c918123f6bdd3a9a
9874788ff947640469addd4ce1512011c6595d2a0d11ffbd20f29aa2f5b0425c
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a
9bac5d3418cd584d6a1704f0e2283514da5655b520eb5d315b1404370c1fc6c1
9c2e7b28e4212473abe31aa3ad9c470d3de935308118344afe98592df47c2504
9c5b8010b9f862f91cc14b5082dd85d3907a0d179a89a4c2ab8b3273a8b836c2
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627
9d68d3cac9e1f807599c5c9d388d900f1108014535f9368705a0c6a25e73664f
9e4606cc9cfa6753ac01ec3c6ee7abcde1dafc1fcadaa0678a66854aa1836ec7
a0573cf5187027bf17ce5838a0dfea7706bfcc43b91b5c806a24256788ab25d7
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a2a299e787c5e2eae436a7bca674151478821c9dd819d07d637c7abbb6c8df62
a5011ca06b3a6e348d7c1e2a967f256c796c94aa67fb377ed3751d7e85ca2e3d
a60c1df6de6828e4fbe50cafee5273d75f9feb0e401e2ec50bbf3633f3194296
a6362c906f2ad34ad3fd112982c9c1d343d1a7f2be4ba0316ed3cbef9e4c6a92
a7708a738c64bd02df7ae231ab503159ab3336fa03de1853675631309ec07ada
a7ae89dbe679b66dfbb4e9e7e1beedecf56651a85b16d41a6057d75a66d8cebc
ab50a271594ffad54cda02ba744a01d5ba587b6ec47986ac6fab5270b4b11fec
ad943d6e6dbcf798423ad954e6f7025c2b3aec3efd5bd199c93dbcf72ca593b5
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
b027fc110a1c4310d433d4be3ffa26b70886ed33a1ec1a2b8270588519507f00
b20b3ce6703fe8eb65d771633a82baf895a1ec3557f8a6d98fa3d82e2e13894a
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d
b32a93743bd4cf9e4a73a2a07e31713f6ad8a0d4ecb2127bffc2e2e8fb665815
b3c8f5cb7988b744a924e7e3b94e77b25277d66b765409aec0fff0d3b54aaaa5
b4bf79342e85a164d569480f7200e333c3a90e399f00f22b0f91df9728d86808
b526b37334371d31e1d10fbf239d21e98de6d2de57d12f654550ac0a0158c04f
ba800097d4ef40c438b23dfa6f11d6087d51770500ac19dd9aae141a47322afc
bc5ed781667d750725b240ccff97aab2af11e84eae37d12d4ee8a919521ea3fb
bd30ffd9618eaa423abb4c900f4af01cac18be85d75265ba08d87d5230bf85b8
bfbbceab1e33b2fdaf5e3714ce2858b90f8b6ca1f2dea87bfa4df6bb7bb92445
c12c2600516e4ca81ed7034be75232105099b434129a57209b6fd49cd2af153e
c3688c4f3558318584c10d651297832000a94af276da9288d74045a69a85c17f
c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab
c490bd91dfbe6bb4367d8bce43edb36a897342519a126664a097909ff7679c4c
c8615d41121675d739ad8a05627ccfd2c6b99c576521ff17a2313f79a37fa6cc
cac5284f8f3259036443b495e8c2d0adbb0be77052811f38ce871befe9ec9f2d
ce00a8bcf5e6b3267b9e3992831b43c130e28d205c763eec079075ca1055c08f
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
cfedbaf841d07ac07ac1a0c50542476d7b97bf14dc2121841d780ad22d0b8751
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1
d30e84d1c8698d1b922c5e0fefe8c693766945b13505d6c9693048340f198e65
d3e0592d7db4d49071247648315c9f543e447bdf78c3c1494272a7d4ef7f2463
d50f3c8d580746c1d1a272723609f4e5387269828e5c657630df7feeadc2ffa6
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13
d673a9b9fc774bd59042de80e4853e402fad483a9aeecdaa6235a6e81dd75126
d79a2c08ec56eb5e1c76ca58af8b280d29c8792641565d3e9983a9ea8f7e9bb6
d7f29376368e05289528808c6f5e3bb31cd2ac6f1e8577da7a2f785079f73f0d
d7f5b039e95559581c5c6ecedaebe5f02c0851d7f8f8f313ba1e7dea8605103a
d90eedc7423fdd9d51939b844afaf730a5378b8ea2de16738277530588925476
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
de723e7804743d889ca188d45f8069a541f8cd2f9554fb485bb1956f20a2ba5c
df949c5e7d734723d51e393307de9cf5a9d835b0d778682839486cece7aef9bf
e011b2f4d3dabaea088701d4d4a8024561bcef60a745e3ec41f6b7f2030a344b
e030f4eeaf866259d00c936538cc30ca1476d3c35a8a9d24c5925b7a4f20ed15
e11d3d254e8daa4bbb3a5f48a981ea22672adefbaeb51d4efab17c84f63768bb
e192dd8b901bad10acc59606190d742e67dc587f9d3334c609ab030fe12ed52e
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e3e6c93defad2cf35199cb4a925b7ddd47efa939786ca22038d4d3b5ef4ea14c
e67f4cd7737c2d4e0be98f3d2cd70c6536f919c5588d409c66bd0df40b66e20d
e72acd75e28308144c191955763a907264b850d4e8e2960d724f273e4934e34d
e92385f4191769df73ce7639b2cc0988ce3d8b2c9e7ad59852b61fd3a49bd9b8
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
eaa1d30bc491154291ffefb0f40b88f6ab43c88b5d04bee77b9b88dddb65bfb1
eac9f13961b1dae2631310bf3d57f78c857bbad83ec9935a8e339dbb4396aab0
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546
ec47e3dd49c92bd6acbb0f55a6340af287144de5cd50ef8e8423acf23e75099d
eec0354b7a773da37969688d3bbfeec7eb326e960fbad3465bd6b4bde920418d
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f20d865511fa3bf25f2e84d5d3541c3396d3d68e935d84f6d8836f1cfd52dde6
f33117eacda2949088a603d0f749027c248306843cfee539d101afca48d52bea
f94af7643f6c8fa09669a5af1f32f53890a3a43365aa11bd1edb193e0b287245
fec4969577c947a272b6be6924b17ca584660dccaa35d17dd05471b0f0b3e548