URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Submission: On April 17 via automatic, source hackernews

Summary

This website contacted 64 IPs in 7 countries across 38 domains to perform 213 HTTP transactions. The main IP is 77.247.84.129, located in Berlin, Germany and belongs to SYSELEVEN SysEleven GmbH, DE. The main domain is www.golem.de.
TLS certificate: Issued by GeoTrust RSA CA 2018 on July 27th 2018. 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
42 77.247.84.129 25291 (SYSELEVEN...)
3 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
4 2a00:13c8:f5:... 25291 (SYSELEVEN...)
4 2a00:13c8:f5:... 25291 (SYSELEVEN...)
2 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 91.215.103.64 43407 (INFONLINE-AS)
1 2 161.156.66.178 36351 (SOFTLAYER)
11 2a00:1450:400... 15169 (GOOGLE)
1 54.192.94.254 16509 (AMAZON-02)
2 2.18.233.67 16625 (AKAMAI-AS)
3 9 23.38.32.164 16625 (AKAMAI-AS)
1 2 80.82.201.88 48173 (UNBELIEVA...)
4 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
18 172.217.21.194 15169 (GOOGLE)
9 138.201.137.174 24940 (HETZNER-AS)
10 136.243.3.97 24940 (HETZNER-AS)
3 2.18.234.72 16625 (AKAMAI-AS)
6 2a00:1450:400... 15169 (GOOGLE)
1 173.241.240.220 36089 (OPENX-AS1)
1 213.19.162.31 26667 (RUBICONPR...)
1 3 23.8.6.177 20940 (AKAMAI-ASN1)
5 2a00:1450:400... 15169 (GOOGLE)
2 2a00:1450:400... 15169 (GOOGLE)
3 35.190.35.232 15169 (GOOGLE)
1 4 23.211.2.78 16625 (AKAMAI-AS)
1 193.46.63.75 43407 (INFONLINE-AS)
1 2 91.215.100.40 43407 (INFONLINE-AS)
1 138.68.66.61 14061 (DIGITALOC...)
1 2a00:1450:400... 15169 (GOOGLE)
1 77.247.84.149 25291 (SYSELEVEN...)
2 2606:4700:20:... 13335 (CLOUDFLAR...)
1 1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
2 52.216.129.101 16509 (AMAZON-02)
6 23.111.11.152 33438 (HIGHWINDS2)
2 2a01:4f8:202:... 24940 (HETZNER-AS)
1 185.33.223.208 29990 (ASN-APPNEXUS)
1 1 172.217.18.98 15169 (GOOGLE)
1 2.23.75.186 16625 (AKAMAI-AS)
6 188.40.118.169 24940 (HETZNER-AS)
3 54.192.94.8 16509 (AMAZON-02)
1 2606:4700:30:... 13335 (CLOUDFLAR...)
1 213.9.42.202 12676 (NCORE-AS ...)
2 78.47.15.207 24940 (HETZNER-AS)
1 2.18.232.130 16625 (AKAMAI-AS)
6 37.252.173.27 29990 (ASN-APPNEXUS)
2 2 185.33.223.221 29990 (ASN-APPNEXUS)
1 69.16.175.10 20446 (HIGHWINDS3)
1 2a01:4f8:120:... 24940 (HETZNER-AS)
1 54.246.153.43 16509 (AMAZON-02)
2 2a00:1450:400... 15169 (GOOGLE)
1 85.10.200.83 24940 (HETZNER-AS)
1 2a00:1450:400... 15169 (GOOGLE)
5 144.76.237.196 24940 (HETZNER-AS)
1 144.76.158.35 24940 (HETZNER-AS)
2 136.243.65.40 24940 (HETZNER-AS)
1 104.111.230.142 16625 (AKAMAI-AS)
1 173.241.240.143 36089 (OPENX-AS1)
1 89.163.159.104 24961 (MYLOC-AS)
1 194.213.222.30 5588 (GTSCE GTS...)
4 52.211.90.20 16509 (AMAZON-02)
1 2600:9000:200... 16509 (AMAZON-02)
1 54.77.75.246 16509 (AMAZON-02)
1 1 89.163.159.101 24961 (MYLOC-AS)
1 89.163.159.124 24961 (MYLOC-AS)
1 52.213.21.157 16509 (AMAZON-02)
213 64
Apex Domain
Subdomains
Transfer
56 golem.de
www.golem.de
cpxl.golem.de
video.golem.de
ads.golem.de
cpx.golem.de
ssl.1.damoh.golem.de
703 KB
22 doubleclick.net
securepubads.g.doubleclick.net
googleads.g.doubleclick.net
stats.g.doubleclick.net
cm.g.doubleclick.net
241 KB
17 plista.com
static.plista.com
insights.plista.com
farm.plista.com
media.plista.com
171 KB
11 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
186 KB
11 googletagservices.com
www.googletagservices.com
79 KB
10 adnxs.com
ib.adnxs.com
cdn.adnxs.com
fra1-ib.adnxs.com
secure.adnxs.com
37 KB
10 meetrics.net
lb34.s400.meetrics.net
3 KB
10 m6r.eu
tracking.m6r.eu
cdn.m6r.eu
6 KB
9 adscale.de
hb.adscale.de
js.adscale.de
ih.adscale.de
13 KB
7 de.com
s79.research.de.com
dc371.s79.research.de.com
3 KB
7 onthe.io
cdn.onthe.io
tt.onthe.io
29 KB
5 bacontent.de
d.bacontent.de
c.bacontent.de
t.bacontent.de
17 KB
4 xplosion.de
ups.xplosion.de
uss.xplosion.de
5 KB
4 google.de
adservice.google.de
1009 B
4 ioam.de
script.ioam.de
irqs.ioam.de
de.ioam.de
12 KB
3 theadex.com
dmp.theadex.com
xpl.theadex.com
api.theadex.com
14 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
59 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 googleapis.com
imasdk.googleapis.com
82 KB
2 t4ft.de
c.t4ft.de
t4ft.de
17 KB
2 stroeerdigitalmedia.de
cdn.stroeerdigitalmedia.de
8 KB
2 advolution.de
asn.advolution.de
cdn.asn.advolution.de
4 KB
2 amazonaws.com
s3.amazonaws.com
1 KB
2 google-analytics.com
www.google-analytics.com
ssl.google-analytics.com
17 KB
2 rubiconproject.com
fastlane.rubiconproject.com
eus.rubiconproject.com
3 KB
2 openx.net
yieldlove-d.openx.net
eu-u.openx.net
2 KB
2 nuggad.net
si.nuggad.net
adscale.nuggad.net
2 KB
2 mxcdn.net
s400.mxcdn.net
s79.mxcdn.net
95 KB
2 vgwort.de
ssl-golem.met.vgwort.de
733 B
1 emetriq.de
cdn.emetriq.de
2 KB
1 ibillboard.com
bbcdn-bbnaut.ibillboard.com
1014 B
1 2mdn.net
s0.2mdn.net
10 KB
1 adsrvr.org
insight.adsrvr.org
428 B
1 radiantmediatechs.com
cdn.radiantmediatechs.com
3 KB
1 yieldlab.net
ad.yieldlab.net
495 B
1 google.com
adservice.google.com
481 B
1 yieldlove.com
cdn-a.yieldlove.com
86 KB
1 stroeerdigitalgroup.de
cdn.stroeerdigitalgroup.de
62 KB
213 38
Domain Requested by
42 www.golem.de www.golem.de
cdn.stroeerdigitalgroup.de
www.googletagservices.com
18 securepubads.g.doubleclick.net www.googletagservices.com
securepubads.g.doubleclick.net
www.golem.de
11 www.googletagservices.com cdn.stroeerdigitalgroup.de
pagead2.googlesyndication.com
securepubads.g.doubleclick.net
10 lb34.s400.meetrics.net www.golem.de
9 static.plista.com www.golem.de
static.plista.com
9 tracking.m6r.eu 3 redirects www.golem.de
cdn.m6r.eu
6 fra1-ib.adnxs.com www.golem.de
cdn.adnxs.com
6 tt.onthe.io cdn.onthe.io
6 pagead2.googlesyndication.com www.golem.de
pagead2.googlesyndication.com
5 dc371.s79.research.de.com www.golem.de
5 tpc.googlesyndication.com securepubads.g.doubleclick.net
4 ih.adscale.de 1 redirects js.adscale.de
www.golem.de
4 adservice.google.de www.googletagservices.com
4 video.golem.de www.golem.de
text
4 cpxl.golem.de www.golem.de
3 ssl.1.damoh.golem.de text
3 media.plista.com www.golem.de
3 hgc-cf-cache-1.svonm.com www.golem.de
text
3 insights.plista.com static.plista.com
www.golem.de
3 hb.adscale.de 1 redirects www.golem.de
2 uss.xplosion.de
2 ups.xplosion.de cdn.stroeerdigitalgroup.de
cdn.emetriq.de
2 imasdk.googleapis.com www.golem.de
imasdk.googleapis.com
2 secure.adnxs.com 2 redirects
2 s79.research.de.com static.plista.com
s79.research.de.com
2 cdn.stroeerdigitalmedia.de www.golem.de
2 farm.plista.com static.plista.com
www.golem.de
2 s3.amazonaws.com www.golem.de
text
2 c.bacontent.de d.bacontent.de
c.bacontent.de
2 de.ioam.de 1 redirects www.golem.de
2 d.bacontent.de www.golem.de
c.bacontent.de
2 js.adscale.de cdn-a.yieldlove.com
cdn.stroeerdigitalgroup.de
2 googleads.g.doubleclick.net pagead2.googlesyndication.com
2 ssl-golem.met.vgwort.de 1 redirects www.golem.de
2 ads.golem.de www.golem.de
1 adstax-match.adrtx.net cdn.adrtx.net
1 api.theadex.com bbcdn-bbnaut.ibillboard.com
1 xpl.theadex.com 1 redirects
1 cdn.adrtx.net www.golem.de
1 cdn.emetriq.de ups.xplosion.de
1 bbcdn-bbnaut.ibillboard.com cdn.stroeerdigitalgroup.de
1 dmp.theadex.com cdn.stroeerdigitalgroup.de
1 eu-u.openx.net cdn-a.yieldlove.com
1 eus.rubiconproject.com cdn-a.yieldlove.com
1 t.bacontent.de c.bacontent.de
1 s0.2mdn.net imasdk.googleapis.com
1 t4ft.de c.t4ft.de
1 s79.mxcdn.net s79.research.de.com
1 insight.adsrvr.org www.golem.de
1 c.t4ft.de asn.advolution.de
1 cdn.asn.advolution.de asn.advolution.de
1 cdn.adnxs.com static.plista.com
1 asn.advolution.de securepubads.g.doubleclick.net
1 cdn.radiantmediatechs.com www.golem.de
1 ad.yieldlab.net www.golem.de
1 cm.g.doubleclick.net 1 redirects
1 ib.adnxs.com www.golem.de
1 adscale.nuggad.net 1 redirects
1 stats.g.doubleclick.net www.golem.de
1 ssl.google-analytics.com 1 redirects
1 cpx.golem.de www.golem.de
1 www.google-analytics.com www.golem.de
1 cdn.onthe.io www.golem.de
1 irqs.ioam.de script.ioam.de
1 fastlane.rubiconproject.com cdn-a.yieldlove.com
1 yieldlove-d.openx.net cdn-a.yieldlove.com
1 cdn.m6r.eu cdn.stroeerdigitalgroup.de
1 adservice.google.com www.googletagservices.com
1 si.nuggad.net cdn.stroeerdigitalgroup.de
1 s400.mxcdn.net cdn.stroeerdigitalgroup.de
1 cdn-a.yieldlove.com cdn.stroeerdigitalgroup.de
1 script.ioam.de www.golem.de
1 cdn.stroeerdigitalgroup.de www.golem.de
213 73
Subject Issuer Validity Valid
*.golem.de
GeoTrust RSA CA 2018
2018-07-27 -
2019-08-28
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
*.met.vgwort.de
Thawte RSA CA 2018
2018-05-22 -
2020-03-25
2 years crt.sh
*.g.doubleclick.net
Google Internet Authority G3
2019-03-01 -
2019-05-24
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
2018-08-10 -
2019-09-09
a year crt.sh
*.nuggad.net
Gandi Standard SSL CA 2
2018-01-12 -
2020-01-16
2 years crt.sh
*.google.com
Google Internet Authority G3
2019-03-01 -
2019-05-24
3 months crt.sh
*.plista.com
COMODO RSA Domain Validation Secure Server CA
2017-04-11 -
2020-07-10
3 years crt.sh

COMODO RSA Domain Validation Secure Server CA
2016-12-08 -
2019-12-08
3 years crt.sh
*.openx.net
DigiCert ECC Secure Server CA
2019-02-08 -
2020-05-12
a year crt.sh
*.rubiconproject.com
DigiCert SHA2 Secure Server CA
2019-01-10 -
2021-01-14
2 years crt.sh
*.adscale.de
DigiCert SHA2 Secure Server CA
2019-02-19 -
2020-05-20
a year crt.sh
tpc.googlesyndication.com
Google Internet Authority G3
2019-03-01 -
2019-05-24
3 months crt.sh
*.bacontent.de
Thawte TLS RSA CA G1
2018-06-27 -
2019-06-27
a year crt.sh
*.onthe.io
Sectigo RSA Domain Validation Secure Server CA
2019-03-04 -
2020-05-02
a year crt.sh
*.google-analytics.com
Google Internet Authority G3
2019-03-26 -
2019-06-18
3 months crt.sh
ssl381601.cloudflaressl.com
COMODO ECC Domain Validation Secure Server CA 2
2019-04-05 -
2019-10-12
6 months crt.sh
s3.amazonaws.com
DigiCert Baltimore CA-2 G2
2018-12-03 -
2019-10-25
a year crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2018-12-12 -
2020-03-12
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2018-08-09 -
2019-09-09
a year crt.sh
radiantmediatechs.com
CloudFlare Inc ECC CA-2
2019-03-19 -
2020-03-19
a year crt.sh
*.advolution.de
RapidSSL RSA CA 2018
2018-03-14 -
2020-05-12
2 years crt.sh
cdn.adnxs.com
GeoTrust RSA CA 2018
2018-11-20 -
2020-02-19
a year crt.sh
cdn.asn.advolution.de
RapidSSL RSA CA 2018
2018-08-21 -
2020-08-20
2 years crt.sh
c.t4ft.de
Let's Encrypt Authority X3
2019-03-01 -
2019-05-30
3 months crt.sh
*.adsrvr.org
Trustwave Organization Validation SHA256 CA, Level 1
2019-03-07 -
2021-04-19
2 years crt.sh
*.googleapis.com
Google Internet Authority G3
2019-03-01 -
2019-05-24
3 months crt.sh
t4ft.de
Let's Encrypt Authority X3
2019-03-01 -
2019-05-30
3 months crt.sh
*.doubleclick.net
Google Internet Authority G3
2019-03-01 -
2019-05-24
3 months crt.sh
ssl.1.damoh.golem.de
Let's Encrypt Authority X3
2019-03-26 -
2019-06-24
3 months crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2018-02-16 -
2019-10-19
2 years crt.sh
*.ibillboard.com
Thawte RSA CA 2018
2018-05-21 -
2020-06-21
2 years crt.sh
*.xplosion.de
Thawte RSA CA 2018
2018-12-10 -
2020-02-08
a year crt.sh
*.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 21 frames:

Primary Page: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Frame ID: CD72EAD11521EE210D79173E3E0713A5
Requests: 160 HTTP requests in this frame

Frame: https://www.golem.de/microsite/abo/minibanner_flat_620.shtml
Frame ID: B893919DD2DF2F90F98F6F42DB943BE6
Requests: 9 HTTP requests in this frame

Frame: https://www.golem.de/microsite/abo/trial-social-s7.shtml
Frame ID: A6A5823CE97FC7FA2F488B6E89BCE711
Requests: 2 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20190415/r20190131/show_ads_impl.js
Frame ID: 90BB4F7DBD51D43A67DACDC4CF27B382
Requests: 1 HTTP requests in this frame

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

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=7370415692&adk=795422400&adf=1229236390&w=1000&lmt=1555484196&num_ads=2&guci=1.2.0.0.2.2.0.0&format=1000x120&url=https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&flash=0&wgl=1&adsid=NT&dt=1555484196242&bpp=18&bdt=629&fdt=70&idt=69&shv=r20190415&cbv=r20190131&saldr=aa&abxe=1&correlator=3471001701973&frm=20&pv=2&ga_vid=980209430.1555484196&ga_sid=1555484196&ga_hid=1898393361&ga_fc=0&iag=0&icsg=46766532668&dssz=44&mdo=0&mso=0&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=293&ady=2415&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=4092314402&ifi=4&uci=4.my4ao51f5rbi&fsb=1&xpc=iP5wjXv8n0&p=https%3A//www.golem.de&dtd=85
Frame ID: 69A31C44FC9306790CA690183ABF3871
Requests: 1 HTTP requests in this frame

Frame: https://www.googletagservices.com/tag/js/gpt.js
Frame ID: 90F4CB0A03598946F3A4644C7503AE0F
Requests: 9 HTTP requests in this frame

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

Frame: https://ih.adscale.de/adscale-ih/nuggad?/nu/0/pre/0/sid/YzU5MzQw/uu/622901555484196223/ts/1555484196567/v/2/hid/430/ssl/1/lb/node20.lb.adscale.de/ws/https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html/nvars/d1=1&d9=2&d8=2&d7=1&d2=4&d12=1&d11=0&d4=6&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4
Frame ID: 24B934679FC7FA8236111FC1D1EB15CF
Requests: 1 HTTP requests in this frame

Frame: https://asn.advolution.de/00016ff0100000e94/?rnd=1692258225&click=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsuk9yJuovJTn0u79Q6CMuMDjr1Q20sRt-r1rFv9yxjWNV2trgafHO7hgT7Id9PxxxAOFW_1BDF6X8d9vYH9F6FFqInwtCSVzt5WY0UMk0deaqpmkVSm8sXmeYJE-6w5I3vuhOvp8IldA3cjsq-xeXd7qyyXSh7sAVcA4_uc4XI3hIkY9YEYboNamNRU3hkpBoop8QDhhgbmPHHxx8r3ssI5D-1rGJx6EDrPREbUO6YjJee-EppL07bebPTEq9fPk88Q5vsAq_J3%2526sai%253DAMfl-YR5uc3JohjKjrL0owLdJsKrsjCQiz0RwdfTnvq3bO-twyowaKW0RLGbg2z2fpmvw5dPeijCAnGBXI803MBh3OmhmogICfjS8R-d0XBlHg%2526sig%253DCg0ArKJSzDO8gORz6h2pEAE%2526urlfix%253D1%2526adurl%253D&async=1&gdpr={gdpr}&gdpr_consent={gdpr_consent}
Frame ID: D5699A685E1F1E300310DDF8BAD51294
Requests: 9 HTTP requests in this frame

Frame: https://cdn.stroeerdigitalmedia.de/Ads/script/sDm_BB_Pos.js
Frame ID: E5503BFC00116D49E2EAFA7E74709B47
Requests: 5 HTTP requests in this frame

Frame: https://www.googletagservices.com/tag/js/gpt.js
Frame ID: 38203102EF93157333D85C5DE29A161C
Requests: 10 HTTP requests in this frame

Frame: https://www.googletagservices.com/tag/js/gpt.js
Frame ID: AF8962170A2D6B2B99A593E0B19A6CAD
Requests: 8 HTTP requests in this frame

Frame: https://cdn.asn.advolution.de/cr/00076472/76.html?clickTag=https%3A%2F%2Fadclick.g.doubleclick.net%2Fpcs%2Fclick%253Fxai%253DAKAOjsuk9yJuovJTn0u79Q6CMuMDjr1Q20sRt-r1rFv9yxjWNV2trgafHO7hgT7Id9PxxxAOFW_1BDF6X8d9vYH9F6FFqInwtCSVzt5WY0UMk0deaqpmkVSm8sXmeYJE-6w5I3vuhOvp8IldA3cjsq-xeXd7qyyXSh7sAVcA4_uc4XI3hIkY9YEYboNamNRU3hkpBoop8QDhhgbmPHHxx8r3ssI5D-1rGJx6EDrPREbUO6YjJee-EppL07bebPTEq9fPk88Q5vsAq_J3%2526sai%253DAMfl-YR5uc3JohjKjrL0owLdJsKrsjCQiz0RwdfTnvq3bO-twyowaKW0RLGbg2z2fpmvw5dPeijCAnGBXI803MBh3OmhmogICfjS8R-d0XBlHg%2526sig%253DCg0ArKJSzDO8gORz6h2pEAE%2526urlfix%253D1%2526adurl%253Dhttps%3A%2F%2Fasn.advolution.de%2F00016ff040007647200000e94/%3Fasn_ct%3D5cb6ce25-16ff0-76472-6a5%26gdpr%3D%26gdpr_consent%3D&
Frame ID: 8B38E6E8A147E446A5DC286A4548E0DE
Requests: 1 HTTP requests in this frame

Frame: https://cdn.stroeerdigitalmedia.de/Ads/2019_2203_0017/blb1/index.html?clicktag=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsthX-_BqKtBSUqCLi2GO03_Sd4c3k1SqGqAw0OmOB9yHt1ZoDxs-fQTPpmjxTirFhYHbt6iYfYQZkFzUFkYlT1zRS0I0qB3o-wIbu_dUxymWKRaKbVY1oxlr7JY3lRLVNkeAHwlBWmj-8ykb6MwWfycEsF7XHV_wTPzpJWfh6CRmKchmvkASeu5pT1VSHKC1bwiL_8fi69DI3wX5RtOO-oXZklCb8xYwrjvpvuhV4hXPQjTt3GbxjL7ZfSv_C-arixZGc3JmN2WLA%2526sai%253DAMfl-YTDfiIyHkukZlrEms3yswsMHWw19PGyNJOouU9-bscbBaiHRPM7hU3fogbUmMt677FwnGlFQZMCic_FquD1AceFIagVmkr5SEzSMPzlSg%2526sig%253DCg0ArKJSzP3se0ve3DIZEAE%2526urlfix%253D1%2526adurl%253Dhttps%3A%2F%2Fwww.vodafoneuplift.de
Frame ID: B4B8EA12D3409CC1B7E4351B5389B505
Requests: 1 HTTP requests in this frame

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

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

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

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

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

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

Screenshot


Detected technologies

Overall confidence: 100%
Detected patterns
  • env /^io$/i

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

Overall confidence: 100%
Detected patterns
  • env /^io$/i

Overall confidence: 100%
Detected patterns
  • env /pbjs/i

Overall confidence: 100%
Detected patterns
  • script /2mdn\.net/i

Overall confidence: 100%
Detected patterns
  • script /2mdn\.net/i
  • env /^google_ad_/i
  • env /^__google_ad_/i
  • env /^Goog_AdSense_/i

Overall confidence: 100%
Detected patterns
  • env /^gaGlobal$/i

Overall confidence: 100%
Detected patterns
  • env /^googletag$/i

Overall confidence: 100%
Detected patterns
  • env /^szmvars$/i
  • env /^iam_data$/i

Overall confidence: 100%
Detected patterns
  • env /^jQuery$/i

Page Statistics

213
Requests

100 %
HTTPS

30 %
IPv6

38
Domains

73
Subdomains

64
IPs

7
Countries

1969 kB
Transfer

5761 kB
Size

1
Cookies

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 17
  • https://ssl-golem.met.vgwort.de/na/06f79c438dfb420cb10ecb0afc0589af HTTP 302
  • https://ssl-golem.met.vgwort.de/blank.gif
Request Chain 21
  • https://tracking.m6r.eu/sync/dmp HTTP 302
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
Request Chain 45
  • https://hb.adscale.de/dsh HTTP 307
  • https://hb.adscale.de/dsh?uu=622901555484196223
Request Chain 75
  • https://de.ioam.de/tx.io?st=golem&cp=G_SEC&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=000e&i2=000e465b7531c34525cb6ce23&ep=1578877920&vr=412&id=s9k4qs&i3=000e465b7531c34525cb6ce23%3A1584946596535%3A1555484196535%3A.golem.de%3A1%3A1555484196535!hvb178&n1=2&dntt=0&lt=1555484196541&ev=&cs=4r7fj0&mo=1 HTTP 302
  • https://de.ioam.de/tx.io?st=golem&cp=G_SEC&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=000e&i2=000e465b7531c34525cb6ce23&ep=1578877920&vr=412&id=s9k4qs&i3=000e465b7531c34525cb6ce23%3A1584946596535%3A1555484196535%3A.golem.de%3A1%3A1555484196535%21hvb178&n1=2&dntt=0&lt=1555484196541&ev=&cs=4r7fj0&mo=1&sr=71
Request Chain 90
  • https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=575536558&utmhn=www.golem.de&utmcs=UTF-8&utmsr=1600x1200&utmvp=1585x1200&utmsc=24-bit&utmul=en-us&utmje=0&utmfl=-&utmdt=Subdomain%20Takeover%3A%20Microsoft%20loses%20control%20over%20Windows%20Tiles%20-%20Golem.de&utmhid=1898393361&utmr=-&utmp=%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&utmht=1555484196670&utmac=UA-518800-2&utmcc=__utma%3D21769261.980209430.1555484196.1555484196.1555484196.1%3B%2B__utmz%3D21769261.1555484197.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B&aip=1&utmjid=595917672&utmredir=1&utmu=qBQAAAAAAAAAAAAAAAQAAAAE~ HTTP 302
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=980209430.1555484196&jid=595917672&_v=5.7.2&z=575536558
Request Chain 95
  • https://adscale.nuggad.net/bk?nuggn=1660240041&nuggsid=1029839715&nuggrid=https%3A%2F%2Fgolem.de%2F&nuggl=https%3A%2F%2Fih.adscale.de%2Fadscale-ih%2Fnuggad%3F%2Fnu%2F0%2Fpre%2F0%2Fsid%2FYzU5MzQw%2Fuu%2F622901555484196223%2Fts%2F1555484196567%2Fv%2F2%2Fhid%2F430%2Fssl%2F1%2Flb%2Fnode20.lb.adscale.de%2Fws%2Fhttps%253A%252F%252Fwww.golem.de%252Fnews%252Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html%2Fnvars%2FNUGGVARS HTTP 302
  • https://ih.adscale.de/adscale-ih/nuggad?/nu/0/pre/0/sid/YzU5MzQw/uu/622901555484196223/ts/1555484196567/v/2/hid/430/ssl/1/lb/node20.lb.adscale.de/ws/https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html/nvars/d1=1&d9=2&d8=2&d7=1&d2=4&d12=1&d11=0&d4=6&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4
Request Chain 100
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=5ac8baa3e28ca8cf5599ee776b575ca6&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D5ac8baa3e28ca8cf5599ee776b575ca6%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__ HTTP 307
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=5ac8baa3e28ca8cf5599ee776b575ca6&userId=adscale-user:622901555484196223
Request Chain 101
  • https://tracking.m6r.eu/sync/appnexusRedirect HTTP 302
  • https://ib.adnxs.com/setuid?entity=197&code=5ac8baa3e28ca8cf5599ee776b575ca6
Request Chain 102
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=Wsi6o-KMqM9Vme53a1dcpg HTTP 302
  • https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
Request Chain 103
  • https://tracking.m6r.eu/sync/yieldlabRedirect HTTP 302
  • https://ad.yieldlab.net/m?dt_id=36356&ext_id=5ac8baa3e28ca8cf5599ee776b575ca6
Request Chain 157
  • https://secure.adnxs.com/getuid?https%3A%2F%2Ffarm.plista.com%2Fmatching%2Fpixel%2F%3Fssp%3Dc3de%26dsp_user_id%3D$UID HTTP 302
  • https://secure.adnxs.com/bounce?%2Fgetuid%3Fhttps%253A%252F%252Ffarm.plista.com%252Fmatching%252Fpixel%252F%253Fssp%253Dc3de%2526dsp_user_id%253D%24UID HTTP 302
  • https://farm.plista.com/matching/pixel/?ssp=c3de&dsp_user_id=5045228119438708754
Request Chain 219
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSa0WS_3Wi7ABsfCWDUkWsfABifABSfABSfABi7ABifABfrr&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=4189937415699073958

213 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request Cookie set subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
www.golem.de/news/
112 KB
30 KB
Document
General
Full URL
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3814609147d9cc6299925b351bf3f95074474a35b151af98d64e02944f2475ad
Security Headers
Name Value
Strict-Transport-Security max-age=11001100; 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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Server
nginx
Date
Wed, 17 Apr 2019 06:56:35 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_67; expires=Wed, 17-Apr-2019 18:56:35 GMT; Max-Age=43200; path=/; domain=.golem.de
Strict-Transport-Security
max-age=11001100; includeSubDomains; preload
ETag
"PEAR-Cache-d72706de3f4c452c215acfd629c5ee23"
Content-Encoding
gzip
Cache-Control
private
Vary
User-Agent, Accept-Encoding
golem_main_129-min.css
www.golem.de/staticrl/styles/
73 KB
20 KB
Stylesheet
General
Full URL
https://www.golem.de/staticrl/styles/golem_main_129-min.css
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5a7eb85e3b035673ff1e9f66977c697902a8be8235e3ebbd233b8d2636cfaed1

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/css,*/*;q=0.1
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 GMT
Content-Encoding
gzip
Last-Modified
Mon, 08 Apr 2019 19:14:59 GMT
Server
nginx
ETag
W/"5cab9db3-124d7"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 18 May 2019 06:56:35 GMT
gg2_1-0-0-min.css
www.golem.de/staticrl/styles/
3 KB
1 KB
Stylesheet
General
Full URL
https://www.golem.de/staticrl/styles/gg2_1-0-0-min.css
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ff8d0cd9b6e1af7e78d6e1c78d2e71bd6c887ec2f83277305d69f8252f6c26d6

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/css,*/*;q=0.1
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-cc0"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 18 May 2019 06:56:35 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/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-190c7"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 18 May 2019 06:56:35 GMT
metaTag.min.js
cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/
255 KB
62 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/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:18a::5f76 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
KONICHIWA/1.0 /
Resource Hash
5160f205cf787448cd7177537bf9fbc93cbb11e172933d0b226e05c747baf205

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:35 GMT
content-encoding
gzip
x-amz-request-id
6F1FE70E35980E84
status
200
access-control-max-age
86400
content-length
62767
x-amz-id-2
N68sWGuXswTIeBvCwIk3pfldMOaAgBuLzi8emo4cH7+RZO0Z7Udreo98f9WvXHp3IFjHQ33bwfk=
last-modified
Tue, 16 Apr 2019 15:05:03 GMT
server
KONICHIWA/1.0
etag
"4c5c94a977b877abcac4ecd06f1b2ab6"
vary
Accept-Encoding
access-control-allow-methods
GET,HEAD
content-type
application/javascript
access-control-allow-origin
*
cache-control
max-age=94
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/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-e82"
Content-Type
image/png
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
3714
Expires
Sat, 18 May 2019 06:56:35 GMT
140717-193471-193469_rc.jpg
www.golem.de/1904/
27 KB
27 KB
Image
General
Full URL
https://www.golem.de/1904/140717-193471-193469_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
005b9234bb1818c7d1298e1c1ad7f62f9d11a74074657a09157092cc7e9f135b

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 GMT
Last-Modified
Wed, 17 Apr 2019 05:15:04 GMT
Server
nginx
ETag
"5cb6b658-6aea"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
27370
Expires
Sat, 18 May 2019 06:56:35 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=1555483142&f=ev&v=d&t=ad%2Fjobs2018kw10
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
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

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 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
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=1555482241&f=ev&v=d&t=ad%2Fdeals2016kw24
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
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

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 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
finwave-snap.jpg
video.golem.de/teaser/1/1/22699/thumb-high-1000/
113 KB
114 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22699/thumb-high-1000/finwave-snap.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
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
1478c0f24c51bfaeb59e580f11f0baa3742eecf98db25f9f60c04a42ee35f59d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 GMT
Last-Modified
Tue, 02 Apr 2019 08:46:38 GMT
Server
nginx
ETag
"5ca3216e-1c54f"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
116047
Expires
Sat, 18 May 2019 06:56:35 GMT
links.png
www.golem.de/_img/gg/
195 B
550 B
Image
General
Full URL
https://www.golem.de/_img/gg/links.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9e08d9b8d1eb5cfb13e10bc6afb3a6f3a40f6ac1f65c6ecd076dc66b7edafb6a

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 GMT
Last-Modified
Wed, 18 Feb 2009 13:50:45 GMT
Server
nginx
ETag
"499c1235-c3"
Content-Type
image/png
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
195
Expires
Sat, 18 May 2019 06:56:35 GMT
rechts.png
www.golem.de/_img/gg/
197 B
552 B
Image
General
Full URL
https://www.golem.de/_img/gg/rechts.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
55e30adb2faf80e59e4a70a75809a573ed0acd7b6fb703bde722bd3ddf56584d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 GMT
Last-Modified
Wed, 18 Feb 2009 13:50:45 GMT
Server
nginx
ETag
"499c1235-c5"
Content-Type
image/png
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
197
Expires
Sat, 18 May 2019 06:56:35 GMT
minus.png
www.golem.de/_img/gg/
404 B
760 B
Image
General
Full URL
https://www.golem.de/_img/gg/minus.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
600a0718bc411395294d3af96651470ec26c15c3f0a6ca3b579a523c9098b4ce

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 GMT
Last-Modified
Wed, 18 Feb 2009 13:50:44 GMT
Server
nginx
ETag
"499c1234-194"
Content-Type
image/png
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
404
Expires
Sat, 18 May 2019 06:56:35 GMT
icon-ggfs_w2.png
www.golem.de/staticrl/images/
274 B
630 B
Image
General
Full URL
https://www.golem.de/staticrl/images/icon-ggfs_w2.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2abfcd790056afc481c48cd6f8e35b79b3bccf309ff6f2c0dfad0650df73d645

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
"5c3e3687-112"
Content-Type
image/png
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
274
Expires
Sat, 18 May 2019 06:56:35 GMT
golemgallery2_125-min.js
www.golem.de/staticrl/scripts/
14 KB
5 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/golemgallery2_125-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
96bff9a63428fcafaa40226d7ccf7b90ab5776979db144a62bdef6a7a77d5eec

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-36a9"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 18 May 2019 06:56:35 GMT
account_js_dt18_1_0.php
www.golem.de/abo/
88 B
474 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/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8a5ebf17c751099d2f751d23dd57cd262691ccc803fc6f8fa1712922a86a8a8d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:35 GMT
Last-Modified
Wed, 17 Apr 2019 06:56:35 GMT
Server
nginx
Vary
User-Agent, Accept-Encoding
Content-Type
application/javascript
Cache-Control
no-store, no-cache, must-revalidate
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
430 B
Script
General
Full URL
https://ads.golem.de/sdcv.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
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

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
ads.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 GMT
Last-Modified
Tue, 13 May 2014 18:28:31 GMT
Server
nginx
ETag
"5372644f-3f"
Content-Type
application/javascript
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
63
Expires
Sat, 18 May 2019 06:56:35 GMT
iam.js
script.ioam.de/
31 KB
10 KB
Script
General
Full URL
https://script.ioam.de/iam.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
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.9 000e
Resource Hash
7152ad98e1f372f3b835635caad24256a8b5ba093934fe38e32e342b632a1f64

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 GMT
Content-Encoding
gzip
Last-Modified
Wed, 17 Apr 2019 06:56:35 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.9 000e
Vary
Accept-Encoding
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Cache-Control
privat, max-age=7200, pre-check=7200
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
application/javascript
Expires
Wed, 17 Apr 2019 08:56:35 GMT
blank.gif
ssl-golem.met.vgwort.de/
Redirect Chain
  • https://ssl-golem.met.vgwort.de/na/06f79c438dfb420cb10ecb0afc0589af
  • https://ssl-golem.met.vgwort.de/blank.gif
43 B
310 B
Image
General
Full URL
https://ssl-golem.met.vgwort.de/blank.gif
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
161.156.66.178 , United States, ASN36351 (SOFTLAYER - SoftLayer Technologies Inc., US),
Reverse DNS
b2.42.9ca1.ip4.static.sl-reverse.com
Software
s2.50.17 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Wed, 17 Apr 2019 06:56:35 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
s2.50.17
Connection
keep-alive
Content-Length
43
Content-Type
image/gif

Redirect headers

Date
Wed, 17 Apr 2019 06:56:35 GMT
Last-Modified
Wed, 17 Apr 2019 06:56:35 GMT
Server
s2.50.17
Location
/blank.gif
Transfer-Encoding
chunked
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
max-age=0, no-cache, must-revalidate, proxy-revalidate
Connection
keep-alive
Expires
Tue, 22 Aug 2000 15:05:01 GMT
gpt.js
www.googletagservices.com/tag/js/
42 KB
11 KB
Script
General
Full URL
https://www.googletagservices.com/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.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:806::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
57c2e726a99e0cd4d74abe9a1e39d0666c6f8f4c3b66fede44fdb864d014f50d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:35 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"138 / 765 of 1000 / last-modified: 1555449875"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
11162
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:35 GMT
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
295 KB
86 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
54.192.94.254 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-54-192-94-254.fra2.r.cloudfront.net
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash
c354b19e4b3822248f56b3c7b43ce39671277cf09fc188cde217d98bc076ebb5

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 04:08:53 GMT
content-encoding
gzip
server
nginx/1.14.0 (Ubuntu)
age
10062
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
max-age=10800, public
x-amz-cf-id
5MlZTVJu0ksJs2DyUlrv2T3WjIC1-xo19maAUb-bQhKlsKWs79zlxA==
via
1.1 ede9297e2bd56d0c4c812154e0ce4da2.cloudfront.net (CloudFront)
expires
Wed, 17 Apr 2019 07:08:53 GMT
mtrcs_679600.js
s400.mxcdn.net/bb-mx/serve/
114 KB
44 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 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-233-67.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
ce7cecb1e1ebfd9f4e3a8c8dc00fc6c218e952fd35b2e86811f6db7f47ff700e

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 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
45138
Expires
Wed, 17 Apr 2019 08:56:35 GMT
dmp
tracking.m6r.eu/sync/
Redirect Chain
  • https://tracking.m6r.eu/sync/dmp
  • https://tracking.m6r.eu/sync/dmp?checkcookies=true
0
-1 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.38.32.164 Amsterdam, Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-38-32-164.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 GMT
Server
nginx
Location
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Content-Type
text/plain; charset=utf-8
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
72

Redirect headers

Date
Wed, 17 Apr 2019 06:56:35 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
rc
si.nuggad.net/
848 B
1 KB
Script
General
Full URL
https://si.nuggad.net/rc?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
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, RSA, AES_128_CBC
Server
80.82.201.88 Berlin, Germany, ASN48173 (UNBELIEVABLE-AS, DE),
Reverse DNS
pbtgx-nuggad.unbelievable-machine.net
Software
Apache /
Resource Hash
eb817a345d87a4c839f62287f22590f4b4792d40cfc257ceb09dbe2857f225a0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 GMT
Content-Encoding
gzip
Server
Apache
Vary
Accept-Encoding
P3P
CP="NOI DSP COR NID ADMa OTPa OUR NOR"
Status
200 OK
Cache-Control
no-store,no-cache
Connection
close
Content-Type
text/javascript
Keep-Alive
timeout=3, max=500
Content-Length
266
Expires
Wed, 18 Feb 2009 11:53:30 GMT
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/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

Date
Wed, 17 Apr 2019 06:56:35 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, 18 May 2019 06:56:35 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/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

Date
Wed, 17 Apr 2019 06:56:35 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, 18 May 2019 06:56:35 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/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

Date
Wed, 17 Apr 2019 06:56:35 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, 18 May 2019 06:56:35 GMT
truncated
/
335 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
72ce44d1321e5caeec893cabdf662745ce2d8af68b65665b6e62e5f7bbcd5e0f

Request headers

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

Response headers

Content-Type
image/svg+xml
dmp
tracking.m6r.eu/sync/
119 B
612 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp?checkcookies=true
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.38.32.164 Amsterdam, Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-38-32-164.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
e6481d35736649e0e91386eabc586257723aaac7bfa5a5e9ce4df73e1db778a1

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

Date
Wed, 17 Apr 2019 06:56:36 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
120
integrator.js
adservice.google.de/adsid/
109 B
481 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.golem.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:825::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:35 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
104
x-xss-protection
0
integrator.js
adservice.google.com/adsid/
109 B
481 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.golem.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:815::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:35 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
104
x-xss-protection
0
pubads_impl_2019041101.js
securepubads.g.doubleclick.net/gpt/
150 KB
54 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019041101.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
e4885a28625faed1eddb274893c3153424206b7bd0fa0ec3b40478537f973d60
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 11 Apr 2019 13:16:32 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,44,43,39"
content-length
55432
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:36 GMT
minibanner_flat_620.shtml
www.golem.de/microsite/abo/ Frame B893
963 B
792 B
Document
General
Full URL
https://www.golem.de/microsite/abo/minibanner_flat_620.shtml
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
653ecfa4fbb8a0a5085d4eb14fc668c8cd30ff0b51616f7a8032c88d7468ea93

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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Accept-Encoding
gzip, deflate, br
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html

Response headers

Server
nginx
Date
Wed, 17 Apr 2019 06:56:35 GMT
Content-Type
text/html
Last-Modified
Wed, 16 May 2018 15:57:13 GMT
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Vary
Accept-Encoding
ETag
W/"5afc54d9-3c3"
X-UPSTREAM
hybrid3.golem.de
Content-Encoding
gzip
trial-social-s7.shtml
www.golem.de/microsite/abo/ Frame A6A5
491 B
775 B
Document
General
Full URL
https://www.golem.de/microsite/abo/trial-social-s7.shtml
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
c84c74f33c1a1dbc16e8abe0c2ad14706d00a0e9169ece5f60a114ab3cd7a7ee

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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Accept-Encoding
gzip, deflate, br
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html

Response headers

Server
nginx
Date
Wed, 17 Apr 2019 06:56:35 GMT
Content-Type
text/html
Content-Length
491
Last-Modified
Tue, 24 Jan 2017 21:24:03 GMT
Connection
keep-alive
Keep-Alive
timeout=3
ETag
"5887c5f3-1eb"
X-UPSTREAM
hybrid2.golem.de
Accept-Ranges
bytes
async.js
static.plista.com/
61 KB
17 KB
Script
General
Full URL
https://static.plista.com/async.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
138.201.137.174 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.174.137.201.138.clients.your-server.de
Software
nginx /
Resource Hash
3168b9244a0039127b0265b9593da97e4eedf6baf6a12524e0f2b326d78854f3
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

x-plista-versions
plista-plugin- libplista-php-0.0.0
date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
x-plista-node
plista855
age
275
status
200
content-length
16625
last-modified
Wed, 17 Apr 2019 06:51:59 GMT
server
nginx
vary
Accept-Encoding
x-varnish
946500618 949080875
via
1.1 varnish-v4
cache-control
public, must-revalidate, proxy-revalidate
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
expires
Thu, 18 Apr 2019 06:52:00 GMT
btn-follow-sp4b.png
www.golem.de/staticrl/images/
3 KB
3 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/btn-follow-sp4b.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d79a2c08ec56eb5e1c76ca58af8b280d29c8792641565d3e9983a9ea8f7e9bb6

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/staticrl/styles/golem_main_129-min.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/staticrl/styles/golem_main_129-min.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 GMT
Last-Modified
Mon, 08 Apr 2019 18:48:10 GMT
Server
nginx
ETag
"5cab976a-b0e"
Content-Type
image/png
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
2830
Expires
Sat, 18 May 2019 06:56:35 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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 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 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

Date
Wed, 17 Apr 2019 06:56:36 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, 18 May 2019 06:56:36 GMT
submit
lb34.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb34.s400.meetrics.net/bb-mx/submit?/Lod4BKAAA/whFoBo0F0wFz6BvvA33F3uBnvFslFtuBklFvuEl3FzvBz1FikFvtFhpFutB0hFrlFv2FlyFttEpjFyvFzvFm0FtsEvzFlzFtjEvuF0yFvsFtvE2lFytB3pFukFv3FztB0pFslFztBx5Aw0AtxA0wA3xA3uAo0FtsFfpyF+k2FoywAx5AtwA0tAx2AtxA26Ay3At2A35A2wAwtAyuAxwA2uAytAxkExlE4mEwkEL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSyKBPAAAAAAAAAOAAAAGBAAAAAAZwSyKBBRksFAQtjFalPATA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.97 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h222.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:36 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Wed, 17 Apr 2019 06:56:35 GMT
data
lb34.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb34.s400.meetrics.net/data?/Lod4CKAAATkzFARksFAQtjFmqJNSA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.97 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h222.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:36 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 17-Apr-19 06:56:35 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 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
5ccef4c578bc4792e27c6b094f421f3948add858035cf045a8471cbe2d7d59ed

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Content-Encoding
gzip
Last-Modified
Mon, 15 Apr 2019 12:08: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
642
Expires
Thu, 18 Apr 2019 06:56:36 GMT
truncated
/
66 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
b71c20271d9c80d1a71aa0ab9935281c4fa8ac404533f1a0747d7fb03fc68e79

Request headers

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

Response headers

Content-Type
image/webp
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
85 KB
32 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:814::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
5da000b164d6eaecd142e3faff163d19cc4c2a66eefb4adcb2913937bd92f329
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 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,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
32450
x-xss-protection
0
server
cafe
etag
10383538058663581366
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Wed, 17 Apr 2019 06:56:36 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/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b027fc110a1c4310d433d4be3ffa26b70886ed33a1ec1a2b8270588519507f00

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-7ff"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 18 May 2019 06:56:36 GMT
arj
yieldlove-d.openx.net/w/1.0/
8 KB
2 KB
XHR
General
Full URL
https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=0&tws=1600x1200&be=1&bc=hb_pb_2.1.6&dddid=7a3bb525-29f2-4690-a269-29b6737a28a0%2Cd08c04e2-3339-4cd9-b132-9d8db4e2e30f%2Ce3299bf1-7dbe-40bf-9fc9-49ec985c2094%2C25862eb3-7e05-4d7b-b79f-cddf757770b0&nocache=1555484196153&x_gdpr_f=1&aus=300x250%7C300x600%2C160x600%2C120x600%2C200x600%7C300x600%2C300x250%7C970x250%2C970x90%2C800x250%2C728x90&divIds=rectangle2%2Csky%2Crectangle%2Cbanner&auid=540523394%2C540523392%2C540523393%2C540523387&
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_256_GCM
Server
173.241.240.220 New York, United States, ASN36089 (OPENX-AS1 - OPENX TECHNOLOGIES, INC., US),
Reverse DNS
ox-173-241-240-220.xa.dc.openx.org
Software
OXGW/16.132.0 /
Resource Hash
4f3c6969c7740cde6552ca184d31878e93280486979b16ac52231f15516c4eb4

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
text/plain

Response headers

pragma
no-cache
date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
server
OXGW/16.132.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
expires
Mon, 26 Jul 1997 05:00:00 GMT
fastlane.json
fastlane.rubiconproject.com/a/api/
3 KB
3 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%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&tk_flint=pbjs_lite_v2.3.0&x_source.tid=d08c04e2-3339-4cd9-b132-9d8db4e2e30f&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.8630905759098146
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_256_GCM
Server
213.19.162.31 , United Kingdom, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
5bc83c1ce153350a2061ea6314c42b87fb68b61078c0d06c3d50fab595009157

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:36 GMT
Content-Encoding
gzip
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=0, max=9
Content-Length
1532
Expires
Wed, 17 Sep 1975 21:32:10 GMT
dsh
hb.adscale.de/
Redirect Chain
  • https://hb.adscale.de/dsh
  • https://hb.adscale.de/dsh?uu=622901555484196223
0
-1 B
XHR
General
Full URL
https://hb.adscale.de/dsh?uu=622901555484196223
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.8.6.177 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-8-6-177.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Origin
null
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Location
//hb.adscale.de/dsh?uu=622901555484196223
P3P
CP=NOI PSA OUR
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
0

Redirect headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Access-Control-Allow-Origin
https://www.golem.de
P3P
CP=NOI PSA OUR
Location
//hb.adscale.de/dsh?uu=622901555484196223
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
0
gx-ads.js
ads.golem.de/track.ads/
226 B
594 B
Script
General
Full URL
https://ads.golem.de/track.ads/gx-ads.js?ord=9350636446850422&adsize=300x250&adunit=11
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
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

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
ads.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Last-Modified
Mon, 04 Feb 2019 16:34:53 GMT
Server
nginx
ETag
"5c5869ad-e2"
Content-Type
application/javascript
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
226
Expires
Sat, 18 May 2019 06:56:36 GMT
ads
securepubads.g.doubleclick.net/gampad/
12 KB
5 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3468223378226616&correlator=263922334468187&output=json_html&callback=googletag.impl.pubads.callbackProxy1&impl=fifs&adsid=NT&json_a=1&eid=21062456%2C21062745%2C21062888%2C21063348%2C953563516&vrg=2019041101&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A32776&sc=1&sfv=1-0-32&iu_parts=4444%2Cdisp_ctc_golem.de_sd%2Cartikel&enc_prev_ius=0%2F1%2F2%2C0%2F1%2F2&prev_iu_szs=20x10%7C20x11%7C30x10%7C30x11%7C40x10%7C40x11%7C80x10%7C80x11%7C100x10%7C800x251%7C970x251%7C728x91%7C770x251%2C800x450%7C580x500%7C580x360&prev_scp=adslot%3Dbanner2%26pc%3D1%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cf10x1%2Cbb%7Cadslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26flash%3Dno%26keywords%3Dsec%252Cinet%252Capps%252Cazure%252Ccloudcomputing%252Cdatensicherheit%252Cwindows%252Ctsilkcalb%252Citsicherheit%252Csicherheitsluecke%252Cwebservice%252Cautorhannoboeck%252Crss%252Ctechnologie%252Cmicrosoft%252Cinternet%252Csecurity%26nuggad%3Dn3-1%252Cn4-0%252Cn5-5%252Cn6-2%252Cn7-2%252Cn8-5%252Cn9-0%252Cn10-1%252Cn11-1%252Cn12-6%252Cn17-4%252Cn18-2%252Cn20-2%252Cn21-4%252Cn33-4%252Cn38-2%252Cn39-4%252Cn43-3%252Cn44-3%252Cn46-4%252Cn52-2%252Cn57-3%252Cn58-4%252Cn60-3%252Cn62-3%252Cn67-0%252Cn70-4%252Cn71-5%252Cn75-0%252Cn76-1%252Cn77-0%252Cn78-1%252Cn79-1%252Cn80-0%252Cn81-1%252Cn82-1%252Cn83-0%252Cn84-0%252Cn85-1%252Cn86-0%252Cn87-0%252Cn88-1%252Cn117-2%252Cn118-6%252Cn119-3%252Cn120-2%252Cn121-2%252Cn122-1%252Cn123-2%252Cn127-0%252Cn128-2%252Cn135-9%252Cn15-1%252Cn66-1%252Cn89-2%252Cn90-1%252Cn92-1%252Cn93-3%252Cn94-2%252Cn97-1%252Cn98-1%252Cn99-1%252Cn101-1%252Cn104-1%252Cn106-1%252Cn107-1%252Cn114-1%252Cn115-1%252Cn124-1%252Cn125-1%252Cn126-1%252Cn139-1%252Cn153-1%252Cn154-1%252Cn155-1%252Cn156-1%252Cn157-1%252Cn158-1%252Cn159-1%252Cn160-1%252Cn161-1%26mbrStatus%3Dcalled-idfound%26mbrid%3D5ac8baa3e28ca8cf5599ee776b575ca6%26mbrseg%3Db3838f1f%252C7dd5680d%252C134dad1c%252C781245b2%252C3e05b94d&cookie_enabled=1&bc=15&abxe=1&lmt=1555484196&dt=1555484196187&dlt=1555484195613&idt=551&frm=20&biw=1585&bih=1200&oid=3&adxs=0%2C0&adys=0%2C0&adks=3957102850%2C1587276660&ucis=1%7C2&ifi=1&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%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&dssz=42&icsg=3816859708&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&blev=1&bisch=1&ga_vid=980209430.1555484196&ga_sid=1555484196&ga_hid=1898393361&fws=128%2C128
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
614b40b2e3a1231356677db78fd4084064c30076610e4a3143237be5d052ec53
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-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
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
4499
x-xss-protection
0
google-lineitem-id
4890373424,-2
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138263529492,-2
content-type
text/javascript; 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_2019041101.js
securepubads.g.doubleclick.net/gpt/
71 KB
27 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019041101.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
1f405ddbb1e3b65da78d0d83af6fd0f5cd1567dce3e2af32112dc756a70ece08
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 11 Apr 2019 13:16:32 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,44,43,39"
content-length
27194
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:36 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-32/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-32/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:815::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Purpose
prefetch
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

font-face-1.0.5.css
www.golem.de/staticrl/styles/ Frame B893
2 KB
729 B
Stylesheet
General
Full URL
https://www.golem.de/staticrl/styles/font-face-1.0.5.css
Requested by
Host: www.golem.de
URL: https://www.golem.de/microsite/abo/minibanner_flat_620.shtml
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2302ce8cf6307e809a07b5cd6ba8a546381a971b75fcc2971090154eea40c4f9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/css,*/*;q=0.1
Referer
https://www.golem.de/microsite/abo/minibanner_flat_620.shtml
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/microsite/abo/minibanner_flat_620.shtml
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-738"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 18 May 2019 06:56:36 GMT
minibanner_flat2.css
www.golem.de/microsite/abo/ Frame B893
2 KB
1 KB
Stylesheet
General
Full URL
https://www.golem.de/microsite/abo/minibanner_flat2.css
Requested by
Host: www.golem.de
URL: https://www.golem.de/microsite/abo/minibanner_flat_620.shtml
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
14c912652278a80cde809c24f37f3e86754d820ca7c7b2c409af205de7d22d9a

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/css,*/*;q=0.1
Referer
https://www.golem.de/microsite/abo/minibanner_flat_620.shtml
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/microsite/abo/minibanner_flat_620.shtml
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Content-Encoding
gzip
Last-Modified
Wed, 12 Aug 2015 17:46:08 GMT
Server
nginx
ETag
W/"55cb8660-8d2"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 18 May 2019 06:56:36 GMT
socialLeiste_Abo_7_2_120x23px.jpg
www.golem.de/microsite/abo/trial/ Frame A6A5
21 KB
21 KB
Image
General
Full URL
https://www.golem.de/microsite/abo/trial/socialLeiste_Abo_7_2_120x23px.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/microsite/abo/trial-social-s7.shtml
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
48b8c07b634d64c042f313e2fb074178a45702f3529f4ec840d1b55f9951bfe1

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/microsite/abo/trial-social-s7.shtml
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/microsite/abo/trial-social-s7.shtml
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Last-Modified
Tue, 01 Sep 2015 16:30:03 GMT
Server
nginx
ETag
"55e5d28b-52ee"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
21230
Expires
Sat, 18 May 2019 06:56:36 GMT
dsh
hb.adscale.de/
11 B
394 B
XHR
General
Full URL
https://hb.adscale.de/dsh?uu=622901555484196223
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.8.6.177 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-8-6-177.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
846949c5a40e3ffbb702473e54dfac0646541aa624a844369b6e24e51ddaf96b

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
text/plain

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
P3P
CP=NOI PSA OUR
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/plain
Content-Length
11
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20190415/r20190131/
205 KB
77 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20190415/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.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:814::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
675e0cb9411504eb34cebde60790c65e7f6c50dd332e937c3a6309e8bdebf2ef
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 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,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
78224
x-xss-protection
0
server
cafe
etag
12474342945149312974
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Wed, 17 Apr 2019 06:56:36 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20190415/r20190131/ Frame 90BB
205 KB
77 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20190415/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.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:814::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
675e0cb9411504eb34cebde60790c65e7f6c50dd332e937c3a6309e8bdebf2ef
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 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,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
78224
x-xss-protection
0
server
cafe
etag
12474342945149312974
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Wed, 17 Apr 2019 06:56:36 GMT
ca-pub-2342548244565729.js
pagead2.googlesyndication.com/pub-config/r20160913/
133 B
276 B
Script
General
Full URL
https://pagead2.googlesyndication.com/pub-config/r20160913/ca-pub-2342548244565729.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:814::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
7e7fa886d5d75c745d95be4fc3c5bfb4c988019b3f643c669734612345e1b8c8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 04:15:21 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 15 Apr 2019 20:13:44 GMT
server
sffe
age
9675
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=43200
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
125
x-xss-protection
0
expires
Wed, 17 Apr 2019 16:15:21 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20190415/r20190131/ Frame E492
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20190415/r20190131/zrt_lookup.html
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:80b::2002 , Ireland, 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/r20190415/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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html

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
Mon, 15 Apr 2019 14:41:47 GMT
expires
Mon, 29 Apr 2019 14:41:47 GMT
content-type
text/html; charset=UTF-8
etag
3275482936266559025
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
6909
x-xss-protection
0
cache-control
public, max-age=1209600
age
144889
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
DroidSans-Bold.woff2
www.golem.de/staticrl/fonts/droidsans/ Frame B893
22 KB
0
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/microsite/abo/minibanner_flat_620.shtml
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Origin
https://www.golem.de
Referer
https://www.golem.de/staticrl/styles/font-face-1.0.5.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 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, 18 May 2019 06:56:35 GMT
DroidSerif.woff2
www.golem.de/staticrl/fonts/droidserif/ Frame B893
22 KB
0
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/microsite/abo/minibanner_flat_620.shtml
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Origin
https://www.golem.de
Referer
https://www.golem.de/staticrl/styles/font-face-1.0.5.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 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, 18 May 2019 06:56:35 GMT
DroidSans.woff2
www.golem.de/staticrl/fonts/droidsans/ Frame B893
21 KB
0
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidsans/DroidSans.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/microsite/abo/minibanner_flat_620.shtml
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Origin
https://www.golem.de
Referer
https://www.golem.de/staticrl/styles/font-face-1.0.5.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:35 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, 18 May 2019 06:56:35 GMT
DroidSerif-Italic.woff2
www.golem.de/staticrl/fonts/droidserif/ Frame B893
20 KB
0
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif-Italic.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/microsite/abo/minibanner_flat_620.shtml
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Origin
https://www.golem.de
Referer
https://www.golem.de/staticrl/styles/font-face-1.0.5.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 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, 18 May 2019 06:56:36 GMT
display-mit-werbung5.png
www.golem.de/microsite/abo/img/ Frame B893
984 B
1 KB
Image
General
Full URL
https://www.golem.de/microsite/abo/img/display-mit-werbung5.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/microsite/abo/minibanner_flat_620.shtml
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a5bca980db62cd62b8af6d7e13a8fca10bcf3275d804a266bac4cd2907e206d2

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/microsite/abo/minibanner_flat2.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/microsite/abo/minibanner_flat2.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Last-Modified
Wed, 12 Aug 2015 17:41:58 GMT
Server
nginx
ETag
"55cb8566-3d8"
Content-Type
image/png
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
984
Expires
Sat, 18 May 2019 06:56:36 GMT
display-ohne-werbung5.png
www.golem.de/microsite/abo/img/ Frame B893
875 B
1 KB
Image
General
Full URL
https://www.golem.de/microsite/abo/img/display-ohne-werbung5.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/microsite/abo/minibanner_flat_620.shtml
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
71561a3bca82f8abb1c48231b9d1a6500aa76c5f3eb838f2ac1dc0c81c5811ae

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/microsite/abo/minibanner_flat2.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/microsite/abo/minibanner_flat2.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Last-Modified
Wed, 12 Aug 2015 17:41:59 GMT
Server
nginx
ETag
"55cb8567-36b"
Content-Type
image/png
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
875
Expires
Sat, 18 May 2019 06:56:36 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 69A3
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=7370415692&adk=795422400&adf=1229236390&w=1000&lmt=1555484196&num_ads=2&guci=1.2.0.0.2.2.0.0&format=1000x120&url=https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&flash=0&wgl=1&adsid=NT&dt=1555484196242&bpp=18&bdt=629&fdt=70&idt=69&shv=r20190415&cbv=r20190131&saldr=aa&abxe=1&correlator=3471001701973&frm=20&pv=2&ga_vid=980209430.1555484196&ga_sid=1555484196&ga_hid=1898393361&ga_fc=0&iag=0&icsg=46766532668&dssz=44&mdo=0&mso=0&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=293&ady=2415&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=4092314402&ifi=4&uci=4.my4ao51f5rbi&fsb=1&xpc=iP5wjXv8n0&p=https%3A//www.golem.de&dtd=85
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190415/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:80b::2002 , Ireland, 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=7370415692&adk=795422400&adf=1229236390&w=1000&lmt=1555484196&num_ads=2&guci=1.2.0.0.2.2.0.0&format=1000x120&url=https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&flash=0&wgl=1&adsid=NT&dt=1555484196242&bpp=18&bdt=629&fdt=70&idt=69&shv=r20190415&cbv=r20190131&saldr=aa&abxe=1&correlator=3471001701973&frm=20&pv=2&ga_vid=980209430.1555484196&ga_sid=1555484196&ga_hid=1898393361&ga_fc=0&iag=0&icsg=46766532668&dssz=44&mdo=0&mso=0&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=293&ady=2415&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853&oid=3&rx=0&eae=0&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=15&osw_key=4092314402&ifi=4&uci=4.my4ao51f5rbi&fsb=1&xpc=iP5wjXv8n0&p=https%3A//www.golem.de&dtd=85
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html

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, 17 Apr 2019 06:56:36 GMT
server
cafe
content-length
19980
x-xss-protection
0
set-cookie
test_cookie=CheckForPermission; expires=Wed, 17-Apr-2019 07:11:36 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
expires
Wed, 17 Apr 2019 06:56:36 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/r20190415/r20190131/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:806::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
030abf52b6ae97a39b654a1501817eabbd77224dea6175a9c7a6a61f45ee4008
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1555327092593175"
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,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
29092
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:36 GMT
userconnect.js
js.adscale.de/
12 KB
4 KB
Script
General
Full URL
https://js.adscale.de/userconnect.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.234.72 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
bb7c8a563d7d215b6c66fa0fcc6d637ea9b8c1083de7ea83c51900eee4415d8a

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

x-amz-version-id
OY3f9p2C6rTLINavR_YNJEzZMUTYiT2J
Content-Encoding
gzip
Last-Modified
Mon, 01 Apr 2019 21:35:44 GMT
Server
AmazonS3
x-amz-request-id
3015C0FD93AFA0F6
ETag
"ed02917e314333b4abe723cbcec23831"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Wed, 17 Apr 2019 06:56:36 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
3764
x-amz-id-2
aAxEeW4a4TAX/TQ+LYcrYmOgdmQovYvXpy5JVb0nAuY7Y9jJ0/OgNT3/k8j0G1jnHnPyOKhRl1Q=
ads
securepubads.g.doubleclick.net/gampad/
74 KB
13 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3468223378226616&correlator=263922334468187&output=json_html&callback=googletag.impl.pubads.callbackProxy2&impl=fifs&adsid=NT&json_a=1&eid=21062456%2C21062745%2C21062888%2C21063348%2C953563516&vrg=2019041101&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A32776&sc=1&sfv=1-0-32&iu_parts=4444%2Cdisp_ctc_golem.de_sd%2Cartikel&enc_prev_ius=0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2&prev_iu_szs=10x40%7C10x30%7C10x20%7C10x22%7C120x600%7C160x600%7C200x600%7C300x600%2C20x10%7C30x10%7C40x10%7C80x10%7C800x250%7C970x250%7C728x90%7C728x180%7C770x250%2C10x20%7C10x10%7C300x250%7C300x601%7C300x125%2C10x10%7C10x11%7C301x250%7C300x126&prev_scp=adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_meta%3Dpid%253A17298.sb%253Af%26yieldlove_pid%3D17298%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26af%3Df1x4%2Cf1x3%2Cf1x2%2Cds%2Csky%2Chpad%2Cband%7Cadslot%3Dbanner%26pc%3D1%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_meta%3Dpid%253A17295.sb%253Af%26yieldlove_pid%3D17295%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cush%2Cbb%2Cvidwa%2Cfufrad%7Cadslot%3Drectangle%26pc%3D1%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_meta%3Dpid%253A17299.sb%253Af%26yieldlove_pid%3D17299%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26af%3Df1x2%2Cf1x1%2Cmrec%7Cadslot%3Drectangle2%26pc%3D1%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%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%26flash%3Dno%26keywords%3Dsec%252Cinet%252Capps%252Cazure%252Ccloudcomputing%252Cdatensicherheit%252Cwindows%252Ctsilkcalb%252Citsicherheit%252Csicherheitsluecke%252Cwebservice%252Cautorhannoboeck%252Crss%252Ctechnologie%252Cmicrosoft%252Cinternet%252Csecurity%26nuggad%3Dn3-1%252Cn4-0%252Cn5-5%252Cn6-2%252Cn7-2%252Cn8-5%252Cn9-0%252Cn10-1%252Cn11-1%252Cn12-6%252Cn17-4%252Cn18-2%252Cn20-2%252Cn21-4%252Cn33-4%252Cn38-2%252Cn39-4%252Cn43-3%252Cn44-3%252Cn46-4%252Cn52-2%252Cn57-3%252Cn58-4%252Cn60-3%252Cn62-3%252Cn67-0%252Cn70-4%252Cn71-5%252Cn75-0%252Cn76-1%252Cn77-0%252Cn78-1%252Cn79-1%252Cn80-0%252Cn81-1%252Cn82-1%252Cn83-0%252Cn84-0%252Cn85-1%252Cn86-0%252Cn87-0%252Cn88-1%252Cn117-2%252Cn118-6%252Cn119-3%252Cn120-2%252Cn121-2%252Cn122-1%252Cn123-2%252Cn127-0%252Cn128-2%252Cn135-9%252Cn15-1%252Cn66-1%252Cn89-2%252Cn90-1%252Cn92-1%252Cn93-3%252Cn94-2%252Cn97-1%252Cn98-1%252Cn99-1%252Cn101-1%252Cn104-1%252Cn106-1%252Cn107-1%252Cn114-1%252Cn115-1%252Cn124-1%252Cn125-1%252Cn126-1%252Cn139-1%252Cn153-1%252Cn154-1%252Cn155-1%252Cn156-1%252Cn157-1%252Cn158-1%252Cn159-1%252Cn160-1%252Cn161-1%26mbrStatus%3Dcalled-idfound%26mbrid%3D5ac8baa3e28ca8cf5599ee776b575ca6%26mbrseg%3Db3838f1f%252C7dd5680d%252C134dad1c%252C781245b2%252C3e05b94d&cookie_enabled=1&bc=15&abxe=1&lmt=1555484196&dt=1555484196406&dlt=1555484195613&idt=551&frm=20&biw=1585&bih=1200&oid=3&adxs=0%2C0%2C0%2C0&adys=0%2C0%2C0%2C0&adks=4154185509%2C3506586144%2C2040986986%2C2621756903&ucis=5%7C6%7C7%7C8&ifi=5&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&dssz=46&icsg=184205486140&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&blev=1&bisch=1&ga_vid=980209430.1555484196&ga_sid=1555484196&ga_hid=1898393361&fws=128%2C128%2C128%2C128
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
d9eb077a0ddaacd93c8b318432751908eb77569685dd1ffd5e33403b92d0c6c7
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-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
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
12974
x-xss-protection
0
google-lineitem-id
5000737376,5018820373,4889680744,4889801247
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138265413557,138266246442,138267872656,138267872671
content-type
text/javascript; 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
init
d.bacontent.de/d/
676 B
751 B
Script
General
Full URL
https://d.bacontent.de/d/init
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.190.35.232 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
232.35.190.35.bc.googleusercontent.com
Software
Apache /
Resource Hash
3a52aed15bf03666803d2c7dfe5f84fc1a8600ec4231403b66bbe7a614ec42c2

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

pragma
no-cache
date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
last-modified
Wed, 17 Apr 2019 06:56:36 GMT
server
Apache
vary
Accept-Encoding
content-type
text/javascript; charset=utf8
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
alt-svc
clear
content-length
389
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
160622-teaser_4scotty.png
www.golem.de/_img/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/_img/160622-teaser_4scotty.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
02a8df34e2a6941840bd5caa0e5e71a7f5e773768b55c395c2f1d023042c1908

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Last-Modified
Wed, 22 Jun 2016 19:41:43 GMT
Server
nginx
ETag
"576ae9f7-580c"
Content-Type
image/png
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22540
Expires
Sat, 18 May 2019 06:56:36 GMT
gpt.js
www.googletagservices.com/tag/js/ Frame 90F4
42 KB
11 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:806::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
57c2e726a99e0cd4d74abe9a1e39d0666c6f8f4c3b66fede44fdb864d014f50d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"138 / 657 of 1000 / last-modified: 1555449875"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
11162
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:36 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 90F4
76 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:806::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
73f3e1b6a98ae5f1890457e2a0dd0986a1a7d9487e17240ed7ffdc849580aa95
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1555327092593175"
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,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
28898
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:36 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 90F4
0
273 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstoqZZjMELzDt0Qy0uHPVAr7gAXxlT8_kQjv44YSURsD5NlZ3uk7dZh5X7H_18D9cLypg2zfaLIDNjTkEl50CLK-P0ULfb199ZkMArSctpIDGF4wKAJxzm6YfTbvGylUa3Z4HsTmqKa4nCciz4M0TARVbJGmVhrHPqqYR1ZXQXPIuHxBxwVH18IGWsdA_ot338lgzq_sPfGePWaLdLV5LvDlNJy8wlDikPHYnogs3PI1OKqCDh9KkYURofm_umybrvHq5lmBHMHjotnKeW7&sai=AMfl-YTJvYbTAY7ndgoHhwQfT0nAnZFXXTPfkFO8_p-I_Kd4imxFiG7lR2tzZfmgjGdejXsWJugKIn5g1bTegN4abRVj1mtkdrhTuC0KY2cMDA&sig=Cg0ArKJSzM7ISeiFsTKYEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
cache-control
private
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
0
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:36 GMT
userconnect
ih.adscale.de/
565 B
942 B
Script
General
Full URL
https://ih.adscale.de/userconnect?ssl=1&sid=8d1441b6-e53b-4380-b7f5-a4ac4d5d5e8b&cbfn=stroeerCoreConnect&ts=1555484196516&umd=false
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/userconnect.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.211.2.78 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-2-78.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash
46f3a2287df06b55759f8944ae178b9608de9ddf90c5136a459861df4888b0cc

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:36 GMT
Server
Apache-Coyote/1.1
Content-Type
application/javascript
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
565
Expires
Wed, 17 Apr 2019 06:56:36 GMT
identitystatus
irqs.ioam.de/
25 B
204 B
XHR
General
Full URL
https://irqs.ioam.de/identitystatus?offerIdentifier=golem&siteIdentifier=G_SEC&sampleType=in&pixelType=CP&isFadeoutFlash=true&isFadeoutFrame=true&isFadeoutForm=true&positionTop=10&positionLeft=100&zIndex=1100000&c=0.22853668381948689
Requested by
Host: script.ioam.de
URL: https://script.ioam.de/iam.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
193.46.63.75 Bonn, Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
irqs.ioam.de
Software
nginx /
Resource Hash
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
server
nginx
status
200
vary
Origin
content-type
application/vnd.api+json
access-control-allow-origin
https://www.golem.de
access-control-allow-credentials
true
strict-transport-security
max-age=15768000
tx.io
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=golem&cp=G_SEC&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=000e&i2=000e465b7531c34525cb6ce23&ep=1578877920&vr=412&id=s9k4q...
  • https://de.ioam.de/tx.io?st=golem&cp=G_SEC&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=000e&i2=000e465b7531c34525cb6ce23&ep=1578877920&vr=412&id=s9k4q...
0
694 B
Script
General
Full URL
https://de.ioam.de/tx.io?st=golem&cp=G_SEC&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=000e&i2=000e465b7531c34525cb6ce23&ep=1578877920&vr=412&id=s9k4qs&i3=000e465b7531c34525cb6ce23%3A1584946596535%3A1555484196535%3A.golem.de%3A1%3A1555484196535%21hvb178&n1=2&dntt=0&lt=1555484196541&ev=&cs=4r7fj0&mo=1&sr=71
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.100.40 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de4.ioam.de
Software
nginx / BLACKBIRD-RCV v1.05.0 0023
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.05.0 0023
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, 17 Apr 2019 06:56:36 GMT
X-Powered-By
BLACKBIRD-RCV v1.05.0 0023
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, 17 Apr 2019 06:56:36 GMT
Server
nginx
Location
/tx.io?st=golem&cp=G_SEC&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=000e&i2=000e465b7531c34525cb6ce23&ep=1578877920&vr=412&id=s9k4qs&i3=000e465b7531c34525cb6ce23%3A1584946596535%3A1555484196535%3A.golem.de%3A1%3A1555484196535%21hvb178&n1=2&dntt=0&lt=1555484196541&ev=&cs=4r7fj0&mo=1&sr=71
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, must-revalidate
Access-Control-Allow-Credentials
true
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Expires
Tue, 17 Apr 2018 06:56:36 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/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
138.68.66.61 Frankfurt, Germany, ASN14061 (DIGITALOCEAN-ASN - DigitalOcean, LLC, US),
Reverse DNS
cdn-eu-20.fra1.do.onthe.io
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash
cfedbaf841d07ac07ac1a0c50542476d7b97bf14dc2121841d780ad22d0b8751

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Content-Encoding
gzip
Last-Modified
Mon, 04 Mar 2019 12:32:01 GMT
Server
nginx/1.14.0 (Ubuntu)
ETag
W/"5c7d1ac1-11e36"
Transfer-Encoding
chunked
X-Hostname
cdn-eu-20
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Expires
Wed, 17 Apr 2019 12:36:57 GMT
ga.js
www.google-analytics.com/
45 KB
17 KB
Script
General
Full URL
https://www.google-analytics.com/ga.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:816::200e , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
1259ea99bd76596239bfd3102c679eb0a5052578dc526b0452f4d42f8bcdd45f
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 16 Jan 2019 20:01:45 GMT
server
Golfe2
age
5439
date
Wed, 17 Apr 2019 05:25:57 GMT
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=7200
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
17168
expires
Wed, 17 Apr 2019 07:25:57 GMT
rmp-rl_128-min.js
www.golem.de/staticrl/scripts/radiant/
17 KB
7 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/rmp-rl_128-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f1b0696c82aed5a85efb033561f5a8c6c5d72fae12aeb0f8d51b009cc14a33b9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; __gads=ID=b9eb082644aa3e2d:T=1555484196:S=ALNI_MY3bHQPqtwvKxVQ2mdnGtFk5FtlrA; ioam2018=000e465b7531c34525cb6ce23:1584946596535:1555484196535:.golem.de:1:1555484196535!hvb178; POPUPCHECK=1555570596540
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Content-Encoding
gzip
Last-Modified
Thu, 24 Jan 2019 16:39:03 GMT
Server
nginx
ETag
W/"5c49ea27-4405"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 18 May 2019 06:56:36 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/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; __gads=ID=b9eb082644aa3e2d:T=1555484196:S=ALNI_MY3bHQPqtwvKxVQ2mdnGtFk5FtlrA; ioam2018=000e465b7531c34525cb6ce23:1584946596535:1555484196535:.golem.de:1:1555484196535!hvb178; POPUPCHECK=1555570596540
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-1e61"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 18 May 2019 06:56:36 GMT
sp_140463-192375-192373_rc.jpg
www.golem.de/1904/
29 KB
29 KB
Image
General
Full URL
https://www.golem.de/1904/sp_140463-192375-192373_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d5afb0a142bbc8ca74eac73a392f8379884d08dd450f5f4e7044dc0edcfc25e0

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; __gads=ID=b9eb082644aa3e2d:T=1555484196:S=ALNI_MY3bHQPqtwvKxVQ2mdnGtFk5FtlrA; ioam2018=000e465b7531c34525cb6ce23:1584946596535:1555484196535:.golem.de:1:1555484196535!hvb178; POPUPCHECK=1555570596540
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Last-Modified
Fri, 05 Apr 2019 10:05:06 GMT
Server
nginx
ETag
"5ca72852-7314"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
29460
Expires
Sat, 18 May 2019 06:56:36 GMT
sp_140383-191905-191903_rc.jpg
www.golem.de/1904/
18 KB
19 KB
Image
General
Full URL
https://www.golem.de/1904/sp_140383-191905-191903_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
4620e48e88152afd297b78cd9812c80de495c96d54b1c8fd46491b837fcdbb6f

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; __gads=ID=b9eb082644aa3e2d:T=1555484196:S=ALNI_MY3bHQPqtwvKxVQ2mdnGtFk5FtlrA; ioam2018=000e465b7531c34525cb6ce23:1584946596535:1555484196535:.golem.de:1:1555484196535!hvb178; POPUPCHECK=1555570596540
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Last-Modified
Tue, 02 Apr 2019 07:06:05 GMT
Server
nginx
ETag
"5ca309dd-48a2"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
18594
Expires
Sat, 18 May 2019 06:56:36 GMT
sp_140506-192677-192675_rc.jpg
www.golem.de/1904/
19 KB
20 KB
Image
General
Full URL
https://www.golem.de/1904/sp_140506-192677-192675_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1228b3630117143f99622daac0928ea8b299c124bfe74e594c3990956e261e07

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; __gads=ID=b9eb082644aa3e2d:T=1555484196:S=ALNI_MY3bHQPqtwvKxVQ2mdnGtFk5FtlrA; ioam2018=000e465b7531c34525cb6ce23:1584946596535:1555484196535:.golem.de:1:1555484196535!hvb178; POPUPCHECK=1555570596540
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Last-Modified
Tue, 09 Apr 2019 06:46:06 GMT
Server
nginx
ETag
"5cac3fae-4da2"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
19874
Expires
Sat, 18 May 2019 06:56:36 GMT
cpx.php
cpx.golem.de/
42 B
420 B
Image
General
Full URL
https://cpx.golem.de/cpx.php?class=1&aid=140717&page=1&ts=1555484197&ref=
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.149 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
Apache /
Resource Hash
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
cpx.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; __gads=ID=b9eb082644aa3e2d:T=1555484196:S=ALNI_MY3bHQPqtwvKxVQ2mdnGtFk5FtlrA; ioam2018=000e465b7531c34525cb6ce23:1584946596535:1555484196535:.golem.de:1:1555484196535!hvb178
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:37 GMT
Last-Modified
Wed, 17 Apr 2019 06:56:37 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
cfdeb2e72a2eff788500e423.js
static.plista.com/async/pub/
47 KB
5 KB
Script
General
Full URL
https://static.plista.com/async/pub/cfdeb2e72a2eff788500e423.js
Requested by
Host: static.plista.com
URL: https://static.plista.com/async.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
138.201.137.174 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.174.137.201.138.clients.your-server.de
Software
nginx /
Resource Hash
e570d0bed4f62e7c97a2849d4450f78a57dd8d80bce74c9853bce0e6b94dfe6c
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 17 Apr 2019 06:42:10 GMT
server
nginx
age
864
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
status
200
cache-control
public, must-revalidate, proxy-revalidate
x-varnish
949629139 922116978
accept-ranges
bytes
content-length
4882
via
1.1 varnish-v4
expires
Thu, 18 Apr 2019 06:42:11 GMT
container
tracking.m6r.eu/pixel/
3 KB
2 KB
Script
General
Full URL
https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n3=1&n4=0&n5=5&n6=2&n7=2&n8=5&n9=0&n10=1&n11=1&n12=6&n17=4&n18=2&n20=2&n21=4&n33=4&n38=2&n39=4&n43=3&n44=3&n46=4&n52=2&n57=3&n58=4&n60=3&n62=3&n67=0&n70=4&n71=5&n75=0&n76=1&n77=0&n78=1&n79=1&n80=0&n81=1&n82=1&n83=0&n84=0&n85=1&n86=0&n87=0&n88=1&n117=2&n118=6&n119=3&n120=2&n121=2&n122=1&n123=2&n127=0&n128=2&n135=9&n15=1&n66=1&n89=2&n90=1&n92=1&n93=3&n94=2&n97=1&n98=1&n99=1&n101=1&n104=1&n106=1&n107=1&n114=1&n115=1&n124=1&n125=1&n126=1&n139=1&n153=1&n154=1&n155=1&n156=1&n157=1&n158=1&n159=1&n160=1&n161=1
Requested by
Host: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.38.32.164 Amsterdam, Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-38-32-164.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
1895cdc2ac5045d44faced3b716858681fa1b94a66d713e5f75fc8993e47e871

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 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
1506
loader.js
c.bacontent.de/assets/js/
43 KB
14 KB
Script
General
Full URL
https://c.bacontent.de/assets/js/loader.js?v=22170164
Requested by
Host: d.bacontent.de
URL: https://d.bacontent.de/d/init
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::6819:f07 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
a41946e51bc5dbf3f667aa2938c6b41e02c72b2f7479d75fae7b8f1b32c292dd

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
via
1.1 varnish-v4, 1.1 google
cf-cache-status
HIT
status
200
content-encoding
br
alt-svc
clear
x-robots-tag
noindex, nofollow
last-modified
Tue, 29 Jan 2019 12:53:33 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
x-varnish
8106721 7544970
content-type
application/javascript
cache-control
public, max-age=31536000
cf-ray
4c8c80052d3b9744-FRA
expires
Thu, 16 Apr 2020 06:56:36 GMT
sp_KuCW-198345_rc.jpg
www.golem.de/6145/
68 B
486 B
Image
General
Full URL
https://www.golem.de/6145/sp_KuCW-198345_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; __gads=ID=b9eb082644aa3e2d:T=1555484196:S=ALNI_MY3bHQPqtwvKxVQ2mdnGtFk5FtlrA; ioam2018=000e465b7531c34525cb6ce23:1584946596535:1555484196535:.golem.de:1:1555484196535!hvb178; POPUPCHECK=1555570596540
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:36 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Vary
Accept-Encoding
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
pubads_impl_2019041101.js
securepubads.g.doubleclick.net/gpt/ Frame 90F4
150 KB
54 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019041101.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
e4885a28625faed1eddb274893c3153424206b7bd0fa0ec3b40478537f973d60
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 11 Apr 2019 13:16:32 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,44,43,39"
content-length
55432
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:36 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame 90F4
113 B
178 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.golem.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:825::2002 , Ireland, 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

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
108
x-xss-protection
0
collect
stats.g.doubleclick.net/r/
Redirect Chain
  • https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=575536558&utmhn=www.golem.de&utmcs=UTF-8&utmsr=1600x1200&utmvp=1585x1200&utmsc=24-bit&utmul=en-us&utmje=0&utmfl=-&utmdt=Subdomai...
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=980209430.1555484196&jid=595917672&_v=5.7.2&z=575536558
35 B
102 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=980209430.1555484196&jid=595917672&_v=5.7.2&z=575536558
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:400c:c08::9a , Ireland, 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/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 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
access-control-allow-origin
*
date
Wed, 17 Apr 2019 06:56:36 GMT
content-type
image/gif
status
200
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT

Redirect headers

pragma
no-cache
date
Wed, 17 Apr 2019 06:56:36 GMT
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
access-control-allow-origin
*
location
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=980209430.1555484196&jid=595917672&_v=5.7.2&z=575536558
content-type
text/html; charset=UTF-8
status
302
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
366
expires
Fri, 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/staticrl/scripts/radiant/rmp-rl_128-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.129.101 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

Date
Wed, 17 Apr 2019 06:56:38 GMT
Last-Modified
Wed, 17 Apr 2019 04:47:04 GMT
Server
AmazonS3
x-amz-request-id
997CB36B8A771A1A
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
5WfP0V/Jrjss/hm4PMkq/SIzXZEvRtJJSJk1P3E1QveT9VPqEltE1f0GfgxyIGvK0WewN58Oseo=
Expires
0
homadclienthttpsle-json.php
video.golem.de/staticrl/scripts/radiant/
291 B
682 B
XHR
General
Full URL
https://video.golem.de/staticrl/scripts/radiant/homadclienthttpsle-json.php
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/radiant/rmp-rl_128-min.js
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

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Vary
User-Agent, Accept-Encoding
Access-Control-Allow-Methods
POST, GET, OPTIONS
Content-Type
application/json;charset=utf-8
Access-Control-Allow-Origin
*
Cache-Control
private
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
rmp.min.js
www.golem.de/staticrl/scripts/radiant/4.9.1/js/
378 KB
110 KB
Script
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/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; __gads=ID=b9eb082644aa3e2d:T=1555484196:S=ALNI_MY3bHQPqtwvKxVQ2mdnGtFk5FtlrA; ioam2018=000e465b7531c34525cb6ce23:1584946596535:1555484196535:.golem.de:1:1555484196535!hvb178; POPUPCHECK=1555570596540; __utmc=21769261; __utmz=21769261.1555484197.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.980209430.1555484196.1555484196.1555484196.1; __utmb=21769261.1.10.1555484197
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-5e9f0"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 18 May 2019 06:56:36 GMT
Cookie set map
ih.adscale.de/ Frame 22F4
0
0
Document
General
Full URL
https://ih.adscale.de/map?format=display&ssl=1
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/userconnect.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.211.2.78 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-2-78.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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Accept-Encoding
gzip, deflate, br
Cookie
uu=622901555484196223; ng=2#275934#25924736#84086
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html

Response headers

Server
Apache-Coyote/1.1
Content-Type
text/html;charset=ISO-8859-1
Vary
Accept-Encoding
Content-Encoding
gzip
Expires
Wed, 17 Apr 2019 06:56:36 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:36 GMT
Content-Length
634
Connection
keep-alive
Set-Cookie
tu=4#617223333#48~~432078~432078~1#101~~432078~432078~1#38~~432078~432078~1#39~~432078~432078~1#40~~432078~432078~1#42~~432078~432078~1#75~~432078~432078~1#63~~432078~432078~1; Domain=ih.adscale.de; Expires=Fri, 17-May-2019 06:56:36 GMT; Path=/
nuggad
ih.adscale.de/adscale-ih/ Frame 24B9
Redirect Chain
  • https://adscale.nuggad.net/bk?nuggn=1660240041&nuggsid=1029839715&nuggrid=https%3A%2F%2Fgolem.de%2F&nuggl=https%3A%2F%2Fih.adscale.de%2Fadscale-ih%2Fnuggad%3F%2Fnu%2F0%2Fpre%2F0%2Fsid%2FYzU5MzQw%2F...
  • https://ih.adscale.de/adscale-ih/nuggad?/nu/0/pre/0/sid/YzU5MzQw/uu/622901555484196223/ts/1555484196567/v/2/hid/430/ssl/1/lb/node20.lb.adscale.de/ws/https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-ta...
49 B
490 B
Image
General
Full URL
https://ih.adscale.de/adscale-ih/nuggad?/nu/0/pre/0/sid/YzU5MzQw/uu/622901555484196223/ts/1555484196567/v/2/hid/430/ssl/1/lb/node20.lb.adscale.de/ws/https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html/nvars/d1=1&d9=2&d8=2&d7=1&d2=4&d12=1&d11=0&d4=6&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.211.2.78 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-2-78.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17

Request headers

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

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:36 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, 17 Apr 2019 06:56:36 GMT

Redirect headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Server
Apache
Location
https://ih.adscale.de/adscale-ih/nuggad?/nu/0/pre/0/sid/YzU5MzQw/uu/622901555484196223/ts/1555484196567/v/2/hid/430/ssl/1/lb/node20.lb.adscale.de/ws/https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html/nvars/d1=1&d9=2&d8=2&d7=1&d2=4&d12=1&d11=0&d4=6&c5=9&c6=9&c7=9&c8=9&d3=5&d10=4
P3P
CP="NOI DSP COR NID ADMa OTPa OUR NOR"
Status
302 Found
Cache-Control
no-store,no-cache
Transfer-Encoding
chunked
Connection
close
Keep-Alive
timeout=3, max=500
Expires
Wed, 18 Feb 2009 11:53:30 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

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Connection
keep-alive
Content-Length
865
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Wed, 17 Apr 2019 06:56:36 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

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Connection
keep-alive
Content-Length
861
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Wed, 17 Apr 2019 06:56:36 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"
5a9fe1dae45a1d155411456a.js
insights.plista.com/app/5a/9f/e1/
53 KB
19 KB
Script
General
Full URL
https://insights.plista.com/app/5a/9f/e1/5a9fe1dae45a1d155411456a.js
Requested by
Host: static.plista.com
URL: https://static.plista.com/async/pub/cfdeb2e72a2eff788500e423.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
23.111.11.152 Phoenix, United States, ASN33438 (HIGHWINDS2 - Highwinds Network Group, Inc., US),
Reverse DNS
Software
NetDNA-cache/2.2 /
Resource Hash
13b219900bd84f484766a5a90357d312a6583a41591452752da8c9c12cc662b6

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
last-modified
Tue, 09 Apr 2019 09:39:18 GMT
server
NetDNA-cache/2.2
etag
W/"d219-58615ba1a52aa"
vary
Accept-Encoding
x-cache
HIT
content-type
application/javascript
status
200
cache-control
max-age=1800
expires
Wed, 17 Apr 2019 07:03:17 GMT
async_lib.js
farm.plista.com/
32 KB
11 KB
Script
General
Full URL
https://farm.plista.com/async_lib.js?json=%7B%22name%22%3A%22PLISTA_%5B0%5D%22%2C%22publickey%22%3A%22cfdeb2e72a2eff788500e423%22%2C%22objectid%22%3A%22140717%22%2C%22rev%22%3A1542876208%2C%22req%22%3A%5B%5B%22isarticle%22%5D%2C%5B%22widgetload%22%2C%7B%22widgets%22%3A%5B%22underArticle%22%5D%2C%22ab%22%3A0%2C%22vo%22%3Atrue%2C%22pm%22%3Atrue%2C%22sc%22%3A%221600x1200%22%2C%22px%22%3A1%2C%22vs%22%3A%220.6.11%22%2C%22vp%22%3Atrue%2C%22ww%22%3A1600%2C%22wb%22%3Atrue%7D%5D%5D%7D&x=1555484196731
Requested by
Host: static.plista.com
URL: https://static.plista.com/async.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a01:4f8:202:42d4::2 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
3738c623b836c0b4de4507f3824ed09b00a2f20c8c26198443a85e4e8b1222e6

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

pragma
no-cache
date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
last-modified
Wed, 17 Apr 2019 06:56:36 GMT
server
nginx
p3p
policyref="https://www.plista.com/w3c/p3p.xml", CP="CAO DSP COR TAIa PSAa PSDa IVAi IVDi CONi HISa OUR IND PHY ONL UNI COM NAV INT DEM STA PRE"
status
200
cache-control
no-cache, must-revalidate
content-type
application/javascript; charset=utf-8
content-length
9817
expires
Mon, 26 Jul 1997 05:00:00 GMT
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=5ac8baa3e28ca8cf5599ee776b575ca6&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D5ac8baa3e28ca8cf5599ee776b575ca6%2...
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=5ac8baa3e28ca8cf5599ee776b575ca6&userId=adscale-user:622901555484196223
44 B
528 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=5ac8baa3e28ca8cf5599ee776b575ca6&userId=adscale-user:622901555484196223
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.38.32.164 Amsterdam, Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-38-32-164.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:36 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Location
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=5ac8baa3e28ca8cf5599ee776b575ca6&userId=adscale-user:622901555484196223
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
0
Expires
Wed, 17 Apr 2019 06:56:36 GMT
setuid
ib.adnxs.com/
Redirect Chain
  • https://tracking.m6r.eu/sync/appnexusRedirect
  • https://ib.adnxs.com/setuid?entity=197&code=5ac8baa3e28ca8cf5599ee776b575ca6
43 B
842 B
Image
General
Full URL
https://ib.adnxs.com/setuid?entity=197&code=5ac8baa3e28ca8cf5599ee776b575ca6
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.208 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
311.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/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:39 GMT
AN-X-Request-Uuid
fee494aa-0aa6-4acb-89c1-2cc553abc5b2
Content-Type
image/gif
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
X-Proxy-Origin
185.220.70.202; 185.220.70.202; 311.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.222.249:80
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=5ac8baa3e28ca8cf5599ee776b575ca6
Date
Wed, 17 Apr 2019 06:56:36 GMT
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
98
Content-Type
text/plain; charset=utf-8
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=Wsi6o-KMqM9Vme53a1dcpg
  • 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/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.38.32.164 Amsterdam, Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-38-32-164.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:36 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

pragma
no-cache
date
Wed, 17 Apr 2019 06:56:36 GMT
server
HTTP server (unknown)
location
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
302
cache-control
no-cache, must-revalidate
content-type
text/html; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
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=5ac8baa3e28ca8cf5599ee776b575ca6
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=36356&ext_id=5ac8baa3e28ca8cf5599ee776b575ca6
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.23.75.186 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-23-75-186.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/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:37 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, 16 Apr 2019 06:56:37 GMT

Redirect headers

Location
https://ad.yieldlab.net/m?dt_id=36356&ext_id=5ac8baa3e28ca8cf5599ee776b575ca6
Date
Wed, 17 Apr 2019 06:56:36 GMT
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
99
Content-Type
text/plain; charset=utf-8
sp_KuCW-899083_rc.jpg
www.golem.de/1559/ad-third-party/
68 B
486 B
Image
General
Full URL
https://www.golem.de/1559/ad-third-party/sp_KuCW-899083_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; __gads=ID=b9eb082644aa3e2d:T=1555484196:S=ALNI_MY3bHQPqtwvKxVQ2mdnGtFk5FtlrA; ioam2018=000e465b7531c34525cb6ce23:1584946596535:1555484196535:.golem.de:1:1555484196535!hvb178; POPUPCHECK=1555570596540; __utmc=21769261; __utmz=21769261.1555484197.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.980209430.1555484196.1555484196.1555484196.1; __utmb=21769261.1.10.1555484197; golem_us=5bb0cb86; golem_uv=5bb0cb86; golem_uz=5bb0cb86
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:36 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Vary
Accept-Encoding
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_KuCW-131705_rc.jpg
www.golem.de/5364/ad-third-party/
68 B
486 B
Image
General
Full URL
https://www.golem.de/5364/ad-third-party/sp_KuCW-131705_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; __gads=ID=b9eb082644aa3e2d:T=1555484196:S=ALNI_MY3bHQPqtwvKxVQ2mdnGtFk5FtlrA; ioam2018=000e465b7531c34525cb6ce23:1584946596535:1555484196535:.golem.de:1:1555484196535!hvb178; POPUPCHECK=1555570596540; __utmc=21769261; __utmz=21769261.1555484197.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.980209430.1555484196.1555484196.1555484196.1; __utmb=21769261.1.10.1555484197; golem_us=5bb0cb86; golem_uv=5bb0cb86; golem_uz=5bb0cb86; __io_lv=1555484196815
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:36 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Vary
Accept-Encoding
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
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:uniques_instantly[domain:www.golem.de,url:%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html,page:Subdomain%20Takeover%3A%20Microsoft%20loses%20control%20over%20Windows%20Tiles,author:No%20Author,language:de,site_skin:desktop,custom_page_type:Article%20page,article_layout:default,category:news,type_article:shortread,pub_date:17%20Apr%202019%2007%3A15%3A00%20CEST,reference_time:185,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36,device:desktop,browser_version:Other%2067,browser:Other,depth:1,user_type:new,user_id:a4e139041.463f71015_1555484196816,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1555484196829
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.118.169 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.169.118.40.188.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:36 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
515 B
Script
General
Full URL
https://tt.onthe.io/uniques/?current=17&holding=108810e7aaccba71ff5759d480adc9d0&hash_user=a4e139041.463f71015_1555484196816&1555484196832
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.118.169 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.169.118.40.188.clients.your-server.de
Software
nginx /
Resource Hash
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:36 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:%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html,page:Subdomain%20Takeover%3A%20Microsoft%20loses%20control%20over%20Windows%20Tiles,author:No%20Author,language:de,site_skin:desktop,custom_page_type:Article%20page,article_layout:default,category:news,type_article:shortread,pub_date:17%20Apr%202019%2007%3A15%3A00%20CEST,reference_time:185,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36,device:desktop,browser_version:Other%2067,browser:Other,depth:1,user_type:new,user_id:a4e139041.463f71015_1555484196816,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&__io=a4e139041.463f71015_1555484196816&1555484196840
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.118.169 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.169.118.40.188.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:36 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:%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html,page:Subdomain%20Takeover%3A%20Microsoft%20loses%20control%20over%20Windows%20Tiles,author:No%20Author,language:de,site_skin:desktop,custom_page_type:Article%20page,article_layout:default,category:news,type_article:shortread,pub_date:17%20Apr%202019%2007%3A15%3A00%20CEST,reference_time:185,user_agent:Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36,device:desktop,browser_version:Other%2067,browser:Other,depth:1,user_type:new,user_id:a4e139041.463f71015_1555484196816,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1555484196844
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.118.169 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.169.118.40.188.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:36 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
ads
securepubads.g.doubleclick.net/gampad/ Frame 90F4
344 B
306 B
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2787424940548778&correlator=256186144000756&output=json_html&callback=googletag.impl.pubads.callbackProxy1&impl=fif&eid=21061865%2C21062414%2C21062887%2C21063347%2C21063606%2C53887177&vrg=2019041101&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A32776&sc=1&sfv=1-0-32&iu=%2F53015287%2Fgolem.de_d_970x250_2_dc&sz=20x10%7C20x11%7C30x10%7C30x11%7C40x10%7C40x11%7C80x10%7C80x11%7C100x10%7C800x251%7C970x251%7C728x91%7C770x251&scp=adslot%3Dbanner2%26src%3Dsdg&eri=6&cookie=ID%3Db9eb082644aa3e2d%3AT%3D1555484196%3AS%3DALNI_MY3bHQPqtwvKxVQ2mdnGtFk5FtlrA&cdm=www.golem.de&bc=15&lmt=1555484196&dt=1555484196865&dlt=1555484196502&idt=351&ea=0&frm=23&biw=1585&bih=1200&isw=770&ish=251&oid=3&adx=408&ady=1342&adk=2597046730&uci=girjw6v7sevz&ifi=1&ifk=344106302&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%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&top=www.golem.de&dssz=6&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=770x10&msz=770x10&blev=1&bisch=1&ga_vid=980209430.1555484196&ga_sid=1555484196&ga_hid=563694628&ga_fc=true&fws=256
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
12e1e67ef5f1ce88f9495e46e13538b1f22874b1af51833f0e03dc4b12c7f4b1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

date
Wed, 17 Apr 2019 06:56:37 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
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
216
x-xss-protection
0
google-lineitem-id
-2
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
-2
content-type
text/javascript; 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_2019041101.js
securepubads.g.doubleclick.net/gpt/ Frame 90F4
71 KB
27 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019041101.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
1f405ddbb1e3b65da78d0d83af6fd0f5cd1567dce3e2af32112dc756a70ece08
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 11 Apr 2019 13:16:32 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,44,43,39"
content-length
27194
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:36 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-32/html/ Frame 90F4
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-32/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:815::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Purpose
prefetch
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
288 B
954 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/staticrl/scripts/radiant/rmp-rl_128-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.192.94.8 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-54-192-94-8.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
640f0a03cd1e9c721ac8844b006b9047b070a9f7d13a3278b98fb0461947dd8f

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

Date
Thu, 28 Mar 2019 04:13:43 GMT
Via
1.1 7e6ac12144acebd1fc302708f2ecfad6.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
4
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
288
Last-Modified
Wed, 27 Mar 2019 14:25:44 GMT
Server
AmazonS3
ETag
"54c7dbe42d2e906013c324c59a35e181"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
X-Amz-Cf-Id
2Caz1ndLfdj1jJ7PBYFu24MF9EFqhp26hXCUU1NOem98wD1s9bq9Cw==
Expires
0
nativendo.css
c.bacontent.de/assets/css/
5 KB
1 KB
Stylesheet
General
Full URL
https://c.bacontent.de/assets/css/nativendo.css?22170164
Requested by
Host: c.bacontent.de
URL: https://c.bacontent.de/assets/js/loader.js?v=22170164
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::6819:f07 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
250923173308c9cfd284f3afad886e18e796f1f1ed266fcb4dbb55fd6e713daa

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
via
1.1 varnish-v4, 1.1 google
cf-cache-status
HIT
status
200
content-encoding
br
alt-svc
clear
x-robots-tag
noindex, nofollow
last-modified
Fri, 15 Jun 2018 10:58:45 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
x-varnish
5032676 6972832
content-type
text/css
cache-control
public, max-age=31536000
cf-ray
4c8c80069eca9744-FRA
expires
Thu, 16 Apr 2020 06:56:36 GMT
p
insights.plista.com/
0
66 B
Image
General
Full URL
https://insights.plista.com/p?i=5a9fe1dae45a1d155411456a&r=&sr=&mt=Subdomain%20Takeover%3A%20Microsoft%20loses%20control%20over%20Windows%20Tiles%20-%20Golem.de&ma=-1&tg=-1&ctg=-1&mp=-1&mu=-1&mi=https%3A%2F%2Fwww.golem.de%2F1904%2F140717-193471-193469_rc.jpg&md=A%20service%20from%20Microsoft%20used%20to%20allow%20web%20page%20owners%20to%20deliver%20news%20on%20Windows%20Tiles%20as%20so-called%20Windows%20Live%20Tiles.%20After%20the%20service%20has%20been%20disabled%2C%20we%20were%20able%20to%20take&or=-1&wc=-1&pw=&pwu=0&co=0&il=&hv=&sc=-1&p=https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&c=desktop&t=article&s=&_r=1555484196904:4.7.12:20190409-113831
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
23.111.11.152 Phoenix, United States, ASN33438 (HIGHWINDS2 - Highwinds Network Group, Inc., US),
Reverse DNS
Software
NetDNA-cache/2.2 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

status
204
date
Wed, 17 Apr 2019 06:56:36 GMT
server
NetDNA-cache/2.2
x-cache
MISS
vgs.json
cdn.radiantmediatechs.com/rmp/rr/
5 KB
3 KB
XHR
General
Full URL
https://cdn.radiantmediatechs.com/rmp/rr/vgs.json?rdm=432078
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/radiant/4.9.1/js/rmp.min.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:30::6818:6624 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
d309f096791ea07b144ed52f7905e5bef30710408b7eb4fa1d62df755ed85206
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

date
Wed, 17 Apr 2019 06:56:37 GMT
content-encoding
br
x-content-type-options
nosniff
cf-cache-status
HIT
cf-ray
4c8c80079be797b6-FRA
status
200
last-modified
Mon, 15 Apr 2019 18:28:23 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, 17 Apr 2019 07:56:37 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/staticrl/scripts/radiant/4.9.1/js/rmp.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/css,*/*;q=0.1
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; __gads=ID=b9eb082644aa3e2d:T=1555484196:S=ALNI_MY3bHQPqtwvKxVQ2mdnGtFk5FtlrA; ioam2018=000e465b7531c34525cb6ce23:1584946596535:1555484196535:.golem.de:1:1555484196535!hvb178; POPUPCHECK=1555570596540; __utmc=21769261; __utmz=21769261.1555484197.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.980209430.1555484196.1555484196.1555484196.1; __utmb=21769261.1.10.1555484197; golem_us=5bb0cb86; golem_uv=5bb0cb86; golem_uz=5bb0cb86; __io_lv=1555484196815; __io=a4e139041.463f71015_1555484196816; __io_unique_43098=17; __io_uh=1; __io_visit_43098=1
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:37 GMT
Content-Encoding
gzip
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
ETag
W/"5c3e3687-e209"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Sat, 18 May 2019 06:56:37 GMT
truncated
/ Frame 90F4
215 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
8df226d462a064cf32788982560dbc97cbacfaa8ff9ba137cf032d6771cc9228

Request headers

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

Response headers

Content-Type
image/png
hd-main.js
hgc-cf-cache-1.svonm.com/
211 KB
57 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=JdGwWYvsWm
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/radiant/rmp-rl_128-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.192.94.8 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-54-192-94-8.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
885cd8d835b8329a2b3d8c5e437cf44c6baec7155c945e0f8616342a95128e1d

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

Date
Wed, 17 Apr 2019 06:56:33 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
9
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Mon, 15 Apr 2019 10:19:51 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 7e6ac12144acebd1fc302708f2ecfad6.cloudfront.net (CloudFront)
Cache-Control
no-cache
X-Amz-Cf-Id
Rl4Qokfnp7hyXyktDoDzkmuKvBcXuewUqM-o5VCjM6yjkD8EUWqyUA==
/
asn.advolution.de/00016ff0100000e94/ Frame D569
8 KB
4 KB
Script
General
Full URL
https://asn.advolution.de/00016ff0100000e94/?rnd=1692258225&click=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsuk9yJuovJTn0u79Q6CMuMDjr1Q20sRt-r1rFv9yxjWNV2trgafHO7hgT7Id9PxxxAOFW_1BDF6X8d9vYH9F6FFqInwtCSVzt5WY0UMk0deaqpmkVSm8sXmeYJE-6w5I3vuhOvp8IldA3cjsq-xeXd7qyyXSh7sAVcA4_uc4XI3hIkY9YEYboNamNRU3hkpBoop8QDhhgbmPHHxx8r3ssI5D-1rGJx6EDrPREbUO6YjJee-EppL07bebPTEq9fPk88Q5vsAq_J3%2526sai%253DAMfl-YR5uc3JohjKjrL0owLdJsKrsjCQiz0RwdfTnvq3bO-twyowaKW0RLGbg2z2fpmvw5dPeijCAnGBXI803MBh3OmhmogICfjS8R-d0XBlHg%2526sig%253DCg0ArKJSzDO8gORz6h2pEAE%2526urlfix%253D1%2526adurl%253D&async=1&gdpr={gdpr}&gdpr_consent={gdpr_consent}
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019041101.js
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_256_CBC
Server
213.9.42.202 , Germany, ASN12676 (NCORE-AS Hochstadenstr. 5, DE),
Reverse DNS
Software
httpd / PHP/5.3.5-0.dotdeb.0
Resource Hash
962bc864987517a2624229d5639cf0881e96c246d3db5d92e6b730bda976b339

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:37 GMT
Content-Encoding
gzip
X-Powered-By
PHP/5.3.5-0.dotdeb.0
Transfer-Encoding
chunked
P3P
CP="NOI DSP COR NID CUR OUR NOR"
X-DNT-Detected
false
X-GDPR-Detected
false
Pragma
no-cache
Last-Modified
Wed, 17 Apr 2019 06:56:37 GMT
Server
httpd
Vary
Accept-Encoding,User-Agent, Accept-Encoding
Content-Type
text/javascript; charset=UTF-8
Cache-Control
no-cache, must-revalidate
X-Server
formosa
X-Script-Lastchange
2019-04-15 16:44:35, www-data
X-Systime
2019-04-17 08:56:37
X-GDPR-Status
v1t1p1
Expires
Mon, 26 Jul 1997 05:00:00 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame D569
76 KB
0
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_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:806::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
73f3e1b6a98ae5f1890457e2a0dd0986a1a7d9487e17240ed7ffdc849580aa95
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1555327092593175"
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,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
28898
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:36 GMT
sDm_BB_Pos.js
cdn.stroeerdigitalmedia.de/Ads/script/ Frame E550
41 KB
8 KB
Script
General
Full URL
https://cdn.stroeerdigitalmedia.de/Ads/script/sDm_BB_Pos.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:18a::5f76 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
b8f790879457abe43314fb2ed842df1aaf949bdd68433dbb59ca7e8f02566bb4

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 GMT
content-encoding
gzip
status
200
access-control-max-age
86400
content-length
7644
last-modified
Wed, 10 Apr 2019 15:12:27 GMT
server
Apache
etag
"e22180fde4818e16c45e8aad0cf18ee2:1554909148"
vary
Accept-Encoding
access-control-allow-methods
GET,HEAD
content-type
application/x-javascript
access-control-allow-origin
*
cache-control
max-age=807
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
expires
Wed, 17 Apr 2019 07:10:04 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame E550
76 KB
0
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_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:806::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
73f3e1b6a98ae5f1890457e2a0dd0986a1a7d9487e17240ed7ffdc849580aa95
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1555327092593175"
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,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
28898
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:36 GMT
gpt.js
www.googletagservices.com/tag/js/ Frame 3820
42 KB
0
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:806::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
57c2e726a99e0cd4d74abe9a1e39d0666c6f8f4c3b66fede44fdb864d014f50d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"138 / 657 of 1000 / last-modified: 1555449875"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
11162
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:36 GMT
pubads_impl_2019041101.js
securepubads.g.doubleclick.net/gpt/ Frame 3820
150 KB
0
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019041101.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
e4885a28625faed1eddb274893c3153424206b7bd0fa0ec3b40478537f973d60
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 11 Apr 2019 13:16:32 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,44,43,39"
content-length
55432
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:36 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame 3820
113 B
175 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.golem.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:825::2002 , Ireland, 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

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
108
x-xss-protection
0
ads
securepubads.g.doubleclick.net/gampad/ Frame 3820
11 KB
6 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3640191191815822&correlator=2542572988612532&output=json_html&callback=googletag.impl.pubads.setPassbackAdContents&impl=s&eid=21063195%2C21063347&vrg=2019041101&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A32776&sc=1&sfv=1-0-32&iu=%2F53015287%2Fgolem.de_d_300x600_2_dc&sz=10x20%7C10x10%7C300x250%7C300x601%7C300x125&scp=adslot%3Drectangle%26src%3Dsdg&eri=6&cookie=ID%3D91124d6a96ce1f18%3AT%3D1555484196%3AS%3DALNI_MajQvC0Wtmvmb0T-uT3kRdgRTFTPg&cdm=www.golem.de&bc=15&lmt=1555484197&dt=1555484197145&dlt=1555484197102&idt=26&frm=23&biw=1585&bih=1185&isw=300&ish=601&oid=3&adk=1812355494&uci=97l0uouz7pui&ifi=1&ifk=526239912&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%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&top=www.golem.de&dssz=6&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=980209430.1555484196&ga_sid=1555484196&ga_hid=2136974828&ga_fc=true&fws=2
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
be246e14547e2c75bbfd5f64a5d54ad7c5acf4859600970481b18a9c6dab8457
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 GMT
content-encoding
br
x-content-type-options
nosniff
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
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
5561
x-xss-protection
0
google-lineitem-id
-1
pragma
no-cache
server
cafe
google-creative-id
-1
content-type
text/javascript; charset=UTF-8
cache-control
no-cache, must-revalidate
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
pubads_impl_rendering_2019041101.js
securepubads.g.doubleclick.net/gpt/ Frame 3820
71 KB
27 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019041101.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
1f405ddbb1e3b65da78d0d83af6fd0f5cd1567dce3e2af32112dc756a70ece08
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 11 Apr 2019 13:16:32 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,44,43,39"
content-length
27194
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:37 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-32/html/ Frame 3820
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-32/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:815::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Purpose
prefetch
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 3820
76 KB
0
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_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:806::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
73f3e1b6a98ae5f1890457e2a0dd0986a1a7d9487e17240ed7ffdc849580aa95
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1555327092593175"
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,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
28898
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:36 GMT
gpt.js
www.googletagservices.com/tag/js/ Frame AF89
42 KB
0
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:806::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
57c2e726a99e0cd4d74abe9a1e39d0666c6f8f4c3b66fede44fdb864d014f50d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"138 / 657 of 1000 / last-modified: 1555449875"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
11162
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:36 GMT
pubads_impl_2019041101.js
securepubads.g.doubleclick.net/gpt/ Frame AF89
150 KB
0
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019041101.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
e4885a28625faed1eddb274893c3153424206b7bd0fa0ec3b40478537f973d60
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 11 Apr 2019 13:16:32 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,44,43,39"
content-length
55432
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:36 GMT
integrator.sync.js
adservice.google.de/adsid/ Frame AF89
113 B
175 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.sync.js?domain=www.golem.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:825::2002 , Ireland, 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

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
108
x-xss-protection
0
ads
securepubads.g.doubleclick.net/gampad/ Frame AF89
355 B
375 B
Script
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=773257359421072&correlator=2468329284524597&output=json_html&callback=googletag.impl.pubads.setPassbackAdContents&impl=s&eid=21062421%2C21063347&vrg=2019041101&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A32776&sc=1&sfv=1-0-32&iu=%2F53015287%2Fgolem.de_d_300x250_2_dc&sz=10x10%7C10x11%7C301x250%7C300x126&scp=adslot%3Drectangle2%26src%3Dsdg&eri=6&cookie=ID%3D91124d6a96ce1f18%3AT%3D1555484196%3AS%3DALNI_MajQvC0Wtmvmb0T-uT3kRdgRTFTPg&cdm=www.golem.de&bc=15&lmt=1555484197&dt=1555484197192&dlt=1555484197167&idt=17&ea=0&frm=23&biw=1585&bih=1185&isw=301&ish=250&oid=3&adk=4292326851&uci=iq6qenglzsah&ifi=1&ifk=2027090725&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%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&top=www.golem.de&dssz=6&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=980209430.1555484196&ga_sid=1555484196&ga_hid=2138421108&ga_fc=true&fws=2
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
ef958e61caf88d2aaf88bbdb8c342dd4d3b330b22cc035d85825a237f414f060
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 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
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
228
x-xss-protection
0
google-lineitem-id
-2
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
-2
content-type
text/javascript; charset=UTF-8
cache-control
no-cache, must-revalidate
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
pubads_impl_rendering_2019041101.js
securepubads.g.doubleclick.net/gpt/ Frame AF89
71 KB
27 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019041101.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
1f405ddbb1e3b65da78d0d83af6fd0f5cd1567dce3e2af32112dc756a70ece08
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 11 Apr 2019 13:16:32 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,44,43,39"
content-length
27194
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:37 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-32/html/ Frame AF89
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-32/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:815::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Purpose
prefetch
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame AF89
76 KB
0
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_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:806::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
73f3e1b6a98ae5f1890457e2a0dd0986a1a7d9487e17240ed7ffdc849580aa95
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1555327092593175"
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,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
28898
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:36 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame D569
0
129 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssT5XHKhCx2c7s3DYsRKoqDv-UZjJfWx04JRko9_C8WLgbQj-apMD5nhqQSm6_N3egDVkJ4M0UTWqNzzf2w9E3xg7_3DQLkjCnLFKIPGPWElx1naldV68C9Mdv-t-0PxTA6ce4qyyHonP9dpljXphnlhzzd6gcKzV0SprfI_sHykbcyrUFPevr4ucyubedeBpMRFMo3VSs_y0BRdrGP0zucG3ALkxmqmQYgRSma2uyY1m2SSBanlK3QOtOMrhS90-giWVIoyjSeIeEhGqe4MX91xaqUS2a6OLw&sai=AMfl-YTzM3g0hPBoYr_0s-M1jFBxurnqdiR9itY3P6gr6xbv7cC57Y6c5R_BIv85a9qH6FlLdnNt21y3RJCRrUDuBxCU1hmSPLw88H2ZlQJSyw&sig=Cg0ArKJSzBpLiuRS5Lv7EAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
cache-control
private
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
0
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:37 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame E550
0
129 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstOqs_qv07GkvPMA2gRRLXHHT7gZmrt9_GX3nMFJXTT05A_5cLXdvhLH72uRQf0e_6nB8eTMja_0jqzziFuDaBBAn6FXlWPnaZIs835XHh8_Zwc9e5j61Awj0hPs5pPET3-q_6UC9k-FfPAw_-c9mINcXMs6YHFZ0Omtc935aYxcOu67oychI5r0OywMERVKp8QqmwqIghG6zlkBZqyRXwOYHvJLE-cImjh9GLae3fTto3sRhHT3ouSMj-9GqQ1h3K2HodST9CnqJft75xApOX4kqoll-u73PZ5C6xJ0N4ENi_t5Sk8IysnXdU&sai=AMfl-YQAv3YR9BJmAvhY_jWuhR9bM9yaUEUx9Ti5g-c4MfKJCYiDQ-tc_pwcvMlVEkwWORbx5ewFj7nVz0hGLt4I2hrYrecr0cCzQIDm6KEM_g&sig=Cg0ArKJSzOC3L_8JK4aKEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
cache-control
private
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
0
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:37 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 3820
0
129 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsurqFoYongL_OxNOUzj6vnnpFqvvr87V0SZgXt4lk7Io5xDKVMGDMJZMeLwIMO2NR-FMJNIVIqVzw3ejKj-tal0-Nb9uJ2Z1W1Fsh0RKuMmZyHAkfnfqIMhQApuFz4sWAkR0BQSOTURHc_aQd9GuZkDd8yB7NiTjgCMIo18Rwg5X7qk6C0UneMadaS4ZvNwBmadPiF-tcslngZRicRHpstdm4h7uzzR7eEo-HGfacuuJOhfUfUzvVtXBNFN6jZU8YEPk-9DSALS7EhbGAHk&sai=AMfl-YSae7A9411aYpgvFZ7088wsUUTD3JiggdsNXF-67EtEqPd-BQiNWIjyoigdOAIk-c6K3oHYYqnI7haSqGzOTgcmpD7fFsq5tir9vUCwzg&sig=Cg0ArKJSzKVGLQJNrGavEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
cache-control
private
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
0
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:37 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame AF89
0
129 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsu7aw9ETHEX2V1Z4SlxLzk_yUzXCt5smDeTcRNvEfJMypFUqvJ0_avZg9IObR5P9Dlgj9Rol9vCVENvoN7Bk81OFqlSzt8i1O_wnXIahx_961WKnplA4Xhk_o8AR9H3vP14IYQQTAriajhAK8cie1AqypGvkmNpxuQPTfIdwjCNu_EIpYIGYVDmpyPfQwyAEHrpgkkPa29Mzpb2YsIr4OOnHmEIyh0pgBLvpaD_Ng4yZDkOs_ScjmETYdJvwrXLYKU5iOJrtjhmE4QGsoTD&sai=AMfl-YSvWMqeRWoNueZc8EcfREFIEbbcZCcRdNd0WXyjewOrBWi_z67D4b3SfmZDQRByfpO1iZFj7yyUbfYZsi38MPuIOWcamykfCQCHXL_2LA&sig=Cg0ArKJSzKpPYMNX6UqBEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
cache-control
private
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
0
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:37 GMT
1.png
static.plista.com/image/adchoices/de/13/119,119,119/0/
1 KB
1 KB
Image
General
Full URL
https://static.plista.com/image/adchoices/de/13/119,119,119/0/1.png
Requested by
Host: static.plista.com
URL: https://static.plista.com/async.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
138.201.137.174 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.174.137.201.138.clients.your-server.de
Software
nginx /
Resource Hash
76ceb9b46c9787fba45d74064ac8e7ea819b8cfe3060d11a0c9cea3706f4575f

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 GMT
via
1.1 varnish-v4
last-modified
Tue, 16 Apr 2019 19:12:19 GMT
server
nginx
age
42256
content-type
Content-type: image/png; charset=utf-8
status
200
cache-control
public, must-revalidate, proxy-revalidate
x-varnish
946520040 922824063
accept-ranges
bytes
content-length
1148
expires
Thu, 16 May 2019 19:12:20 GMT
mtrcs_914466.js
s79.research.de.com/bb-mx/prime/
2 KB
1 KB
Script
General
Full URL
https://s79.research.de.com/bb-mx/prime/mtrcs_914466.js
Requested by
Host: static.plista.com
URL: https://static.plista.com/async.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
78.47.15.207 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h549.meetrics.de
Software
nginx /
Resource Hash
149ef17980eb2cb2398c3c7e569858c8b57c2fdf723f82dda3676780cac4fe2d

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:37 GMT
Content-Encoding
gzip
Server
nginx
P3P
policyref="/w3c/p3p.xml", CP="NON DSP CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI COM NAV STA"
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Type
text/javascript
Content-Length
1133
Expires
Wed, 17 Apr 2019 06:56:36 GMT
trk.js
cdn.adnxs.com/v/s/162/
80 KB
30 KB
Script
General
Full URL
https://cdn.adnxs.com/v/s/162/trk.js
Requested by
Host: static.plista.com
URL: https://static.plista.com/async.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.130 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-130.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
585cc11b4d20958229b3e7f944f3c7d616e947fdf93777fdee3bae2b3da47207

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:37 GMT
Content-Encoding
gzip
Last-Modified
Thu, 11 Apr 2019 07:33:08 GMT
Server
Apache
ETag
"41c9cba9146dc2b11581787d690f54a1:1554967990"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Access-Control-Allow-Origin
*, *, *, *
Cache-Control
max-age=31536000
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
30115
Expires
Thu, 16 Apr 2020 06:56:37 GMT
vcdn.adnxs.com%2Fp%2Fcreative-image%2Fdb%2Fa6%2F1f%2F31%2Fdba61f31-22d8-42bc-8ed4-f33fdfc3896d.jpg
media.plista.com/M3Je16wpv77_cTFmhNLNus3NSxo=/320x180/filters:format(webp):quality(85)/
15 KB
15 KB
Image
General
Full URL
https://media.plista.com/M3Je16wpv77_cTFmhNLNus3NSxo=/320x180/filters:format(webp):quality(85)/vcdn.adnxs.com%2Fp%2Fcreative-image%2Fdb%2Fa6%2F1f%2F31%2Fdba61f31-22d8-42bc-8ed4-f33fdfc3896d.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
23.111.11.152 Phoenix, United States, ASN33438 (HIGHWINDS2 - Highwinds Network Group, Inc., US),
Reverse DNS
Software
NetDNA-cache/2.2 /
Resource Hash
2463e73f784cd35a6c5d90c18a5ca357a23cbd33dc12479b357525cfb6e14477

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 GMT
server
NetDNA-cache/2.2
etag
"46e72fdce35a883a3a09f80212abba2573388f5c"
x-cache
HIT
content-type
image/webp
status
200
cache-control
max-age=2592000,public
content-length
15594
expires
Sat, 04 May 2019 13:40:06 GMT
3887.jpg
static.plista.com/imageserver/c/3318/140707/320/180/
10 KB
10 KB
Image
General
Full URL
https://static.plista.com/imageserver/c/3318/140707/320/180/3887.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
138.201.137.174 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.174.137.201.138.clients.your-server.de
Software
nginx /
Resource Hash
ef1897a8e51a7742e7278ff4ac5f87b0e211f02393f98e84fb9de905c82be3b2

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 GMT
via
1.1 varnish-v4
server
nginx
age
70591
x-varnish
946520045 880718865
status
200
cache-control
max-age=2592000
accept-ranges
bytes
content-type
image/jpeg
content-length
9913
expires
Thu, 16 May 2019 11:20:05 GMT
D4HYWCUF6QzyNk0_320x180_8370.jpeg
static.plista.com/image/resized/c/243560/
18 KB
18 KB
Image
General
Full URL
https://static.plista.com/image/resized/c/243560/D4HYWCUF6QzyNk0_320x180_8370.jpeg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
138.201.137.174 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.174.137.201.138.clients.your-server.de
Software
nginx /
Resource Hash
5149ee890a73989bdafa7c74e8aadd100cf3ac324fc386592cb708c7b3633b87

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 GMT
via
1.1 varnish-v4
server
nginx
age
113
x-varnish
949629193 949912406
status
200
cache-control
max-age=2592000
accept-ranges
bytes
content-type
image/jpeg
content-length
17981
expires
Fri, 17 May 2019 06:54:43 GMT
9425.jpg
static.plista.com/imageserver/c/3318/22766/320/180/
13 KB
14 KB
Image
General
Full URL
https://static.plista.com/imageserver/c/3318/22766/320/180/9425.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
138.201.137.174 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.174.137.201.138.clients.your-server.de
Software
nginx /
Resource Hash
44594559c81c82f38b8c87de9ce12b518f2fc71cd6927c9c5fec9a274e902448

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 GMT
via
1.1 varnish-v4
server
nginx
age
83484
x-varnish
950181477 855952233
status
200
cache-control
max-age=2592000
accept-ranges
bytes
content-type
image/jpeg
content-length
13816
expires
Thu, 16 May 2019 07:45:12 GMT
3897.jpg
static.plista.com/imageserver/c/3318/140682/320/180/
21 KB
21 KB
Image
General
Full URL
https://static.plista.com/imageserver/c/3318/140682/320/180/3897.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
138.201.137.174 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.174.137.201.138.clients.your-server.de
Software
nginx /
Resource Hash
aba92b1af0abb35eca058a52b933b1436b0323ed924c0e8650deb08267425dae

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 GMT
via
1.1 varnish-v4
server
nginx
age
37261
x-varnish
945911632 926890412
status
200
cache-control
max-age=2592000
accept-ranges
bytes
content-type
image/jpeg
content-length
21052
expires
Thu, 16 May 2019 20:35:36 GMT
vcdn.adnxs.com%2Fp%2Fcreative-image%2F14%2Fb4%2Fc7%2F7b%2F14b4c77b-2250-49cb-96c3-e6902de3b242.jpg
media.plista.com/7BC5ypoazas-KFTU_G8dyv7UVKg=/320x180/filters:format(webp):quality(85)/
7 KB
7 KB
Image
General
Full URL
https://media.plista.com/7BC5ypoazas-KFTU_G8dyv7UVKg=/320x180/filters:format(webp):quality(85)/vcdn.adnxs.com%2Fp%2Fcreative-image%2F14%2Fb4%2Fc7%2F7b%2F14b4c77b-2250-49cb-96c3-e6902de3b242.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
23.111.11.152 Phoenix, United States, ASN33438 (HIGHWINDS2 - Highwinds Network Group, Inc., US),
Reverse DNS
Software
NetDNA-cache/2.2 /
Resource Hash
b5a2ce9fe5fb1d55a67996034ca0a0094564ab6ff8c284a9b921f44cf3a082ff

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 GMT
server
NetDNA-cache/2.2
etag
"085631fa2a14050e455f555eecc7b3b2f61fdc6c"
x-cache
HIT
content-type
image/webp
status
200
cache-control
max-age=2592000,public
content-length
6814
expires
Wed, 17 Apr 2019 11:00:41 GMT
3893.jpg
static.plista.com/imageserver/c/3318/140710/320/180/
16 KB
16 KB
Image
General
Full URL
https://static.plista.com/imageserver/c/3318/140710/320/180/3893.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
138.201.137.174 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.174.137.201.138.clients.your-server.de
Software
nginx /
Resource Hash
8b7ec20255458d5b7559ce3ee3793cf5590a049c75a0abae756fa13e80485181

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 GMT
via
1.1 varnish-v4
server
nginx
age
29898
x-varnish
950473315 935603604
status
200
cache-control
max-age=2592000
accept-ranges
bytes
content-type
image/jpeg
content-length
16316
expires
Thu, 16 May 2019 22:38:19 GMT
vcdn.adnxs.com%2Fp%2Fcreative-image%2F5a%2Fe2%2F25%2F5e%2F5ae2255e-5be3-4db0-9f98-03c2296ebc4e.png
media.plista.com/sQp9ZoTeTEjEVnvnxAlq89-k4Bo=/320x180/filters:format(webp):quality(85)/
16 KB
16 KB
Image
General
Full URL
https://media.plista.com/sQp9ZoTeTEjEVnvnxAlq89-k4Bo=/320x180/filters:format(webp):quality(85)/vcdn.adnxs.com%2Fp%2Fcreative-image%2F5a%2Fe2%2F25%2F5e%2F5ae2255e-5be3-4db0-9f98-03c2296ebc4e.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
23.111.11.152 Phoenix, United States, ASN33438 (HIGHWINDS2 - Highwinds Network Group, Inc., US),
Reverse DNS
Software
NetDNA-cache/2.2 /
Resource Hash
13533d8fe0663f05bac2eea2a5bd334b6936ccde08a9aa1f86257a5ce90450ea

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 GMT
server
NetDNA-cache/2.2
etag
"78623e7241f23a31ee538b38340f0795b8d2e81f"
x-cache
HIT
content-type
image/webp
status
200
cache-control
max-age=2592000,public
content-length
16478
expires
Wed, 24 Apr 2019 17:34:08 GMT
logo_plista_small_AAAAAA.png
static.plista.com/image/
496 B
699 B
Image
General
Full URL
https://static.plista.com/image/logo_plista_small_AAAAAA.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
138.201.137.174 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.174.137.201.138.clients.your-server.de
Software
nginx /
Resource Hash
a4e2ab69b80ecc4e29d8084f4e849300660944f81f87a4960ff5a017aa750098

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 GMT
via
1.1 varnish-v4
server
nginx
age
41985
x-varnish
950601900 919891843
status
200
cache-control
max-age=2592000
accept-ranges
bytes
content-type
Content-type: image/png; charset=utf-8
content-length
496
expires
Thu, 16 May 2019 19:16:51 GMT
it
fra1-ib.adnxs.com/
0
662 B
Image
General
Full URL
https://fra1-ib.adnxs.com/it?referrer=https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&e=wqT_3QKZCfBCmQQAAAMA1gAFAQimnNvlBRCltsXRpPKcu3UY4febo-DFnfokKjYJ0LNZ9bna-D8R0LNZ9bna-D8ZAAAAwMzMCEAh0A0SACkRJPCWMQAAAKBH4eo_MIrjgQY46xtA6xtIAlCumf1IWO6bWGAAaNTLfHjRjgWAAQGKAQNVU0SSAQNFVVKYAQGgAQGoAQGwAQC4AQLAAQTIAQLQAQnYAQDgAQDwAQCKApQBdWYoJ2EnLCAyNjM5MDA2LCAxNTU1NDg0MTk4KTt1ZignaScsIDExNDY4MTEsIDE1NTU0ODQxOTgpOwE6LGcnLCA3NzA5NjIyLEI6ACxjJywgMjg1MTczNzVGHgAAcgFYHDUzMDQ2MTkwNh8A8NiSAukCIUJGak5zZ2pfeDh3TkVLNlpfVWdZQUNEdW0xZ3dBamdBUUFSSTZ4dFFpdU9CQmxnQVlQX19fXzhQYUFCd0FYZ0JnQUVCaUFFQmtBRUJtQUVCb0FFS3FBRUtzQUVBdVFGbThjOUdxQUQyUDhFQjBfbTNITGZhLURfSkFRQUFBR0F1V2ZBXzJRRnJuNDdIREZUc1AtQUJ1XzlGOVFFQUFIcEVnQUlCaUFLaHFDdUlBdEs2bVFlUUFnR1FBZ0dZQWdDZ0FnU29BZ0dvQWdHMUFnQUFBQUM5BQjwmURfQUFnSElBZ0hRQWdIWUFnSGdBZ0RvQWdENEFnQ0FBd0dZQXdHaUF3NElobzNyQlJBRUdBRXRkbWN3T3FJREV3aUE4dUlGRUFvWUFTMXp5WUlfTWdOMWJtdW9BX19IekEyNkF3bEdVa0V4T2pNM01URGdBNXdLZ0FUMGpZSUNpQVNGam9JQ2tBUUFtQVFCmgJhIV9oQWw0QWoybAEsN3B0WUlBUW9BREVBCQGQRHdQem9KUmxKQk1Ub3pOekV3UUp3S1NXdWZqc2NNVk93X1VRQQkrDEFBQVcdDPQ0AdgC5pMB4AKYk0bqAmhodHRwczovL3d3dy5nb2xlbS5kZS9uZXdzL3N1YmRvbWFpbi10YWtlb3Zlci1taWNyb3NvZnQtbG9zZXMtY29udHJvbC1vdmVyLXdpbmRvd3MtdGlsZXMtMTkwNC0xNDA3MTcuaHRtbIADAYgDAZADAJgDFKADAaoDAMAD4KgByAMA2APeuCjgAwDoAwD4AwOABACSBAkvb3BlbnJ0YjKYBACoBACyBAwIABAAGAAgADAAOAC4BADABADIBADSBA4zNTYzI0ZSQTE6MzcxMNoEAggB4AQA8ASumf1I-gQSCQAAAGBtDUlAEQAAAOBNQiFAiAUBmAUAoAX___________8BqgURNDMwNDg4NzkyOTkwMTkwODnABQDJBQAAAAAAAPA_0gUJCQkMNAAA2AUB4AUB8AU2-gUEAZQokAYBmAYAuAYAwQYJIyTwP8gGANoGFgoQCRAZASwQABgA4AYM8gYCCAA.&s=7962f97a7dba7c2f98fd6f7ccb10f84496c60cfa&pp=1.379559326728635
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
37.252.173.27 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
539.bm-nginx-loadbalancer.mgmt.fra1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:39 GMT
AN-X-Request-Uuid
1bb94bc7-ad2c-44b0-85bf-6b2a70dafad1
Content-Type
text/html; charset=utf-8
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Proxy-Origin
185.220.70.202; 185.220.70.202; 539.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.172.8:80
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
it
fra1-ib.adnxs.com/
0
664 B
Image
General
Full URL
https://fra1-ib.adnxs.com/it?referrer=https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&e=wqT_3QKaCfBCmgQAAAMA1gAFAQimnNvlBRDbqfT488vNuUIY4febo-DFnfokKjYJMnctIR_04T8RMnctIR_04T8ZAAAAwMzMCEAhMg0SACkRJPCWMQAAAKBH4eo_MIrjgQY46xtA6xtIAlC2zOdEWO6bWGAAaNTLfHjRjgWAAQGKAQNVU0SSAQNFVVKYAQGgAQGoAQGwAQC4AQLAAQTIAQLQAQnYAQDgAQDwAQCKApQBdWYoJ2EnLCAyOTg2MzE5LCAxNTU1NDg0MTk4KTt1ZignaScsIDEwMzk1MDMsIDE1NTU0ODQxOTgpOwE6LGcnLCA3MzQ4NzE4LEI6ACxjJywgMjcyMTc2MzJGHgAAcgFYHDQ0MzAzNjcwNh8A9HcBkgLpAiFhRmRZdEFqZ25mME1FTGJNNTBRWUFDRHVtMWd3QkRnQVFBUkk2eHRRaXVPQkJsZ0FZUF9fX184UGFBQndBWGdCZ0FFQmlBRUJrQUVCbUFFQm9BRVFxQUVLc0FFQXVRRUtma1ZMZE1uZlA4RUJHV0JEM3hUMDRUX0pBUUFBQUlCOG5Pa18yUUZybjQ3SERGVHNQLUFCajdrXzlRRUFnRHRFbUFJQW9BSUV0UUlBQUFBQXZRSUFBQUFfd0FJQnlBSUIwQUlCMkFJQjRBSUE2QUlBLUFJQWdBTUJtQU1Cb2dNWENON2N0Z1VRQWhnQkxRQUFBQUF5QjJSbFptRjFiSFNpQXc0SW80YnJCUkFFR0FFdFlIbktPNklERXdqT29wY0ZFQW9ZQVMzazQwd19NZ04xYm11b0EtQ2RfUXk2QXdsR1VrRXhPak0zTVREZ0E1d0tnQVQ4eWV3QmlBVG0ydXdCa0FRQW1BUUKaAmEhX2hBUTRBajJsASg3cHRZSUFRb0FERQHYmEFBQURvUHpvSlJsSkJNVG96TnpFd1FKd0tTV3VmanNjTVZPd19VUQEoCQEEV1EJCAEB9DQB2ALmkwHgApiTRuoCaGh0dHBzOi8vd3d3LmdvbGVtLmRlL25ld3Mvc3ViZG9tYWluLXRha2VvdmVyLW1pY3Jvc29mdC1sb3Nlcy1jb250cm9sLW92ZXItd2luZG93cy10aWxlcy0xOTA0LTE0MDcxNy5odG1sgAMBiAMBkAMAmAMUoAMBqgMAwAPgqAHIAwDYA964KOADAOgDAPgDA4AEAJIECS9vcGVucnRiMpgEAKgEALIEDAgAEAAYACAAMAA4ALgEAMAEAMgEANIEDjM1NjMjRlJBMTozNzEw2gQCCAHgBADwBLbM50T6BBIJAAAAYG0NSUARAAAA4E1CIUCIBQGYBQCgBf___________wGqBRE0MzA0ODg3OTI5OTAxOTA4OcAFAMkFAAAAAAAA8D_SBQkJCQw4AADYBQHgBQHwBa9E-gUEAZUokAYBmAYAuAYAwQYJJCTwP8gGANoGFgoQCRAZASwQABgA4AYM8gYCCAA.&s=b523c78e6d9fadd091e62f93ee388f2e1220e382&pp=0.433605
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
37.252.173.27 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
539.bm-nginx-loadbalancer.mgmt.fra1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:39 GMT
AN-X-Request-Uuid
3858b83e-75d5-45ef-affd-edf9b96c2418
Content-Type
text/html; charset=utf-8
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Proxy-Origin
185.220.70.202; 185.220.70.202; 539.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.172.135:80
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
it
fra1-ib.adnxs.com/
0
664 B
Image
General
Full URL
https://fra1-ib.adnxs.com/it?referrer=https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&e=wqT_3QKXCfBClwQAAAMA1gAFAQimnNvlBRDPlZW4tP3CtHcY4febo-DFnfokKjYJgnNGlPYG2z8RgnNGlPYG2z8ZAAAAwMzMCEAhgg0SACkRJPCWMQAAAKBH4eo_MIrjgQY46xtA6xtIAlDb6KtIWO6bWGAAaNTLfHjRjgWAAQGKAQNVU0SSAQNFVVKYAQGgAQGoAQGwAQC4AQLAAQTIAQLQAQnYAQDgAQDwAQCKApQBdWYoJ2EnLCAzMTYzOTg0LCAxNTU1NDg0MTk4KTt1ZignaScsIDEwODk5MzQsIDE1NTU0ODQxOTgpOwE6LGcnLCA3NjM0NzY5LEI6ACxjJywgMjgyOTM1NzhGHgAAcgFYGDUxNzEyODU6PQD0cgGSAuUCIUFsYXlnQWpLODc0TkVOdm9xMGdZQUNEdW0xZ3dCRGdBUUFSSTZ4dFFpdU9CQmxnQVlQX19fXzhQYUFCd0FYZ0JnQUVCaUFFQmtBRUJtQUVCb0FFUXFBRUtzQUVBdVFHZkNtR1pCZTNYUDhFQjhrNG9ZT1VHMnpfSkFRQUFBRUEzdC1zXzJRRnJuNDdIREZUc1AtQUJqc05DOVFFQUFENURtQUlBb0FJRXRRSUFBQUFBdlFJQUFBQV93QUlCeUFJQjBBSUIyQUlCNEFJQTZBSUEtQUlBZ0FNQm1BTUJvZ01VQ0lfMjB3VVFBaGdCTFFBQUFBQXlCR056WHpLaUF3NEkzX2JxQlJBRUdBRXRjT0dVT3FJREV3akp5OU1GRUFvWUFTMjZ1VjBfTWdOMWJtdW9BOHJ6dmcyNkF3bEdVa0V4T2pNM01URGdBNXdLZ0FULXhQY0JpQVMwcWY0QmtBUUJtQVFCmgJhITBoTzlaQTZoAdg3cHRZSUFRb0FERlN1QjZGNjFISVB6b0pSbEpCTVRvek56RXdRSndLU1d1ZmpzY01WT3dfVVFBIQAFAQBXHQzw5NgC5pMB4AKYk0bqAmhodHRwczovL3d3dy5nb2xlbS5kZS9uZXdzL3N1YmRvbWFpbi10YWtlb3Zlci1taWNyb3NvZnQtbG9zZXMtY29udHJvbC1vdmVyLXdpbmRvd3MtdGlsZXMtMTkwNC0xNDA3MTcuaHRtbIADAYgDAZADAJgDFKADAaoDAMAD4KgByAMA2APeuCjgAwDoAwD4AwOABACSBAkvb3BlbnJ0YjKYBACoBACyBAwIABAAGAAgADAAOAC4BADABADIBADSBA4zNTYzI0ZSQTE6MzcxMNoEAggB4AQA8ARhjHT6BBIJAAAAYG0NSUARAAAA4E1CIUCIBQGYBQCgBf8RAWgBqgURNDMwNDg4NzkyOTkwMTkwODnABQDJBQAFARDwP9IFCQFIBQE02AUB4AUB8AXSxh_6BQQBliiQBgGYBgC4BgDBBgUiKADwP8gGANoGFgoQCRAZASwQABgA4AYM8gYCCAA.&s=c2403a8ec7d492c0fc0357f0a2cd18a5807764ce&pp=0.237789
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
37.252.173.27 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
539.bm-nginx-loadbalancer.mgmt.fra1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:39 GMT
AN-X-Request-Uuid
3b502676-aa25-4efb-8ee0-045392bf0317
Content-Type
text/html; charset=utf-8
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Proxy-Origin
185.220.70.202; 185.220.70.202; 539.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.172.197:80
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
/
farm.plista.com/matching/pixel/
Redirect Chain
  • https://secure.adnxs.com/getuid?https%3A%2F%2Ffarm.plista.com%2Fmatching%2Fpixel%2F%3Fssp%3Dc3de%26dsp_user_id%3D$UID
  • https://secure.adnxs.com/bounce?%2Fgetuid%3Fhttps%253A%252F%252Ffarm.plista.com%252Fmatching%252Fpixel%252F%253Fssp%253Dc3de%2526dsp_user_id%253D%24UID
  • https://farm.plista.com/matching/pixel/?ssp=c3de&dsp_user_id=5045228119438708754
35 B
386 B
Image
General
Full URL
https://farm.plista.com/matching/pixel/?ssp=c3de&dsp_user_id=5045228119438708754
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a01:4f8:202:42d4::2 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
6a842ea462daca2a0b5a0f5f25bcfc8e0059ac811ca6c6a1bc54e4d9119621c3

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

status
200
date
Wed, 17 Apr 2019 06:56:37 GMT
content-encoding
gzip
server
nginx
p3p
policyref="https://www.plista.com/w3c/p3p.xml", CP="CAO DSP COR TAIa PSAa PSDa IVAi IVDi CONi HISa OUR IND PHY ONL UNI COM NAV INT DEM STA PRE"
content-length
51
content-type
image/gif

Redirect headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:39 GMT
AN-X-Request-Uuid
dee1f73f-550c-48e8-91f4-a282ac9a7389
Content-Type
text/html; charset=utf-8
Server
nginx/1.13.4
Location
https://farm.plista.com/matching/pixel/?ssp=c3de&dsp_user_id=5045228119438708754
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Proxy-Origin
185.220.70.202; 185.220.70.202; 316.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.85:80
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
76.html
cdn.asn.advolution.de/cr/00076472/ Frame 8B38
0
0
Document
General
Full URL
https://cdn.asn.advolution.de/cr/00076472/76.html?clickTag=https%3A%2F%2Fadclick.g.doubleclick.net%2Fpcs%2Fclick%253Fxai%253DAKAOjsuk9yJuovJTn0u79Q6CMuMDjr1Q20sRt-r1rFv9yxjWNV2trgafHO7hgT7Id9PxxxAOFW_1BDF6X8d9vYH9F6FFqInwtCSVzt5WY0UMk0deaqpmkVSm8sXmeYJE-6w5I3vuhOvp8IldA3cjsq-xeXd7qyyXSh7sAVcA4_uc4XI3hIkY9YEYboNamNRU3hkpBoop8QDhhgbmPHHxx8r3ssI5D-1rGJx6EDrPREbUO6YjJee-EppL07bebPTEq9fPk88Q5vsAq_J3%2526sai%253DAMfl-YR5uc3JohjKjrL0owLdJsKrsjCQiz0RwdfTnvq3bO-twyowaKW0RLGbg2z2fpmvw5dPeijCAnGBXI803MBh3OmhmogICfjS8R-d0XBlHg%2526sig%253DCg0ArKJSzDO8gORz6h2pEAE%2526urlfix%253D1%2526adurl%253Dhttps%3A%2F%2Fasn.advolution.de%2F00016ff040007647200000e94/%3Fasn_ct%3D5cb6ce25-16ff0-76472-6a5%26gdpr%3D%26gdpr_consent%3D&
Requested by
Host: asn.advolution.de
URL: https://asn.advolution.de/00016ff0100000e94/?rnd=1692258225&click=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsuk9yJuovJTn0u79Q6CMuMDjr1Q20sRt-r1rFv9yxjWNV2trgafHO7hgT7Id9PxxxAOFW_1BDF6X8d9vYH9F6FFqInwtCSVzt5WY0UMk0deaqpmkVSm8sXmeYJE-6w5I3vuhOvp8IldA3cjsq-xeXd7qyyXSh7sAVcA4_uc4XI3hIkY9YEYboNamNRU3hkpBoop8QDhhgbmPHHxx8r3ssI5D-1rGJx6EDrPREbUO6YjJee-EppL07bebPTEq9fPk88Q5vsAq_J3%2526sai%253DAMfl-YR5uc3JohjKjrL0owLdJsKrsjCQiz0RwdfTnvq3bO-twyowaKW0RLGbg2z2fpmvw5dPeijCAnGBXI803MBh3OmhmogICfjS8R-d0XBlHg%2526sig%253DCg0ArKJSzDO8gORz6h2pEAE%2526urlfix%253D1%2526adurl%253D&async=1&gdpr={gdpr}&gdpr_consent={gdpr_consent}
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
69.16.175.10 Phoenix, United States, ASN20446 (HIGHWINDS3 - Highwinds Network Group, Inc., US),
Reverse DNS
tlb.hwcdn.net
Software
/
Resource Hash

Request headers

Host
cdn.asn.advolution.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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Accept-Encoding
gzip, deflate, br
Cookie
asncl=6cb9f29dd395ed5fa16a694c7abdddf5; asnbc94192v=v.94192.3732.484466.1555484197; asnch00=hv.16ff0.e94.76472.5cb6ce25
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html

Response headers

Date
Wed, 17 Apr 2019 06:56:37 GMT
Connection
Keep-Alive
Accept-Ranges
bytes
ETag
"1553522296"
Cache-Control
max-age=20594
Content-Encoding
gzip
Content-Length
1913
Content-Type
text/html; charset=UTF-8
Last-Modified
Mon, 25 Mar 2019 13:58:16 GMT
X-HW
1555484197.dop033.pa1.t,1555484197.cds035.pa1.shn,1555484197.dop033.pa1.t,1555484197.cds007.pa1.c
ftg_t_v_bk.min.js
c.t4ft.de/c/ Frame D569
40 KB
17 KB
Script
General
Full URL
https://c.t4ft.de/c/ftg_t_v_bk.min.js
Requested by
Host: asn.advolution.de
URL: https://asn.advolution.de/00016ff0100000e94/?rnd=1692258225&click=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsuk9yJuovJTn0u79Q6CMuMDjr1Q20sRt-r1rFv9yxjWNV2trgafHO7hgT7Id9PxxxAOFW_1BDF6X8d9vYH9F6FFqInwtCSVzt5WY0UMk0deaqpmkVSm8sXmeYJE-6w5I3vuhOvp8IldA3cjsq-xeXd7qyyXSh7sAVcA4_uc4XI3hIkY9YEYboNamNRU3hkpBoop8QDhhgbmPHHxx8r3ssI5D-1rGJx6EDrPREbUO6YjJee-EppL07bebPTEq9fPk88Q5vsAq_J3%2526sai%253DAMfl-YR5uc3JohjKjrL0owLdJsKrsjCQiz0RwdfTnvq3bO-twyowaKW0RLGbg2z2fpmvw5dPeijCAnGBXI803MBh3OmhmogICfjS8R-d0XBlHg%2526sig%253DCg0ArKJSzDO8gORz6h2pEAE%2526urlfix%253D1%2526adurl%253D&async=1&gdpr={gdpr}&gdpr_consent={gdpr_consent}
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
2a01:4f8:120:53ef::2 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
Software
nginx/1.10.3, static-1201 /
Resource Hash
14ab4b5ec62c192ebeefbf12502ff9570eff1ad636f236df06cab090803f29fb

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:37 GMT
Content-Encoding
gzip
Last-Modified
Tue, 18 Sep 2018 12:25:48 GMT
Server
nginx/1.10.3, static-1201
ETag
W/"5ba0eecc-a1b0"
Vary
Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=3600
Transfer-Encoding
chunked
Connection
keep-alive
Expires
Wed, 17 Apr 2019 07:56:37 GMT
/
insight.adsrvr.org/track/evnt/ Frame D569
70 B
428 B
Image
General
Full URL
https://insight.adsrvr.org/track/evnt/?adv=ol838q6&ct=0:k798h36&fmt=3
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.246.153.43 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-246-153-43.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
8d70b3e6badb6973663b398d297bb32eaedd08826a1af98d0a1cfce5324ffce0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Wed, 17 Apr 2019 06:56:37 GMT
cache-control
private,no-cache, must-revalidate
x-aspnet-version
4.0.30319
p3p
CP="NOI DSP COR CUR ADMo DEVo PSAo PSDo OUR SAMo BUS UNI NAV"
content-type
image/gif
truncated
/ Frame D569
210 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4c21aea3d1e9061beaa0530ee1bd2045ad4cb87d97993987a3a17bff25c1892a

Request headers

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

Response headers

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

Request headers

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

Response headers

Content-Type
image/png
ima3.js
imasdk.googleapis.com/js/sdkloader/
240 KB
82 KB
Script
General
Full URL
https://imasdk.googleapis.com/js/sdkloader/ima3.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/radiant/4.9.1/js/rmp.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:820::200a , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
0bf198aee5a9848fb9676ecfd200c4bcab821c11ac18efdad771f8a5573ecf06
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 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,44,43,39"
content-length
84221
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:37 GMT
tile-snap.jpg
video.golem.de/teaser/1/1/22770/thumb-high-700/
84 KB
85 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22770/thumb-high-700/tile-snap.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
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
2f9302edbbfc6fd039809ad639ab76a78ee7a176735f187b3b540dcf536a85bf

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000e465b7531c34525cb6ce23:1584946596535:1555484196535:.golem.de:1:1555484196535!hvb178; __utmc=21769261; __utmz=21769261.1555484197.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.980209430.1555484196.1555484196.1555484196.1; __utmb=21769261.1.10.1555484197; golem_us=5bb0cb86; golem_uv=5bb0cb86; golem_uz=5bb0cb86; __io=a4e139041.463f71015_1555484196816; __io_unique_43098=17; __io_uh=1; __io_visit_43098=1; __gads=ID=91124d6a96ce1f18:T=1555484196:S=ALNI_MajQvC0Wtmvmb0T-uT3kRdgRTFTPg
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:37 GMT
Last-Modified
Tue, 16 Apr 2019 08:56:29 GMT
Server
nginx
ETag
"5cb598bd-150fb"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
86267
Expires
Sat, 18 May 2019 06:56:37 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43067:uniques_holding&s=6acc7c777cce3be138a245218c439c54&__io=a4e139041.463f71015_1555484196816&1555484197399
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.118.169 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.169.118.40.188.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:37 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
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Content-Type
image/png
rmp-font.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
8 KB
9 KB
Font
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/rmp-font.woff2?vj7w12
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000e465b7531c34525cb6ce23:1584946596535:1555484196535:.golem.de:1:1555484196535!hvb178; POPUPCHECK=1555570596540; __utmc=21769261; __utmz=21769261.1555484197.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.980209430.1555484196.1555484196.1555484196.1; __utmb=21769261.1.10.1555484197; golem_us=5bb0cb86; golem_uv=5bb0cb86; golem_uz=5bb0cb86; __io_lv=1555484196815; __io=a4e139041.463f71015_1555484196816; __io_unique_43098=17; __io_uh=1; __io_visit_43098=1; __gads=ID=91124d6a96ce1f18:T=1555484196:S=ALNI_MajQvC0Wtmvmb0T-uT3kRdgRTFTPg
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Origin
https://www.golem.de

Response headers

Date
Wed, 17 Apr 2019 06:56:37 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, 18 May 2019 06:56:37 GMT
roboto-v18-latin-regular.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
15 KB
15 KB
Font
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/roboto-v18-latin-regular.woff2
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000e465b7531c34525cb6ce23:1584946596535:1555484196535:.golem.de:1:1555484196535!hvb178; POPUPCHECK=1555570596540; __utmc=21769261; __utmz=21769261.1555484197.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.980209430.1555484196.1555484196.1555484196.1; __utmb=21769261.1.10.1555484197; golem_us=5bb0cb86; golem_uv=5bb0cb86; golem_uz=5bb0cb86; __io_lv=1555484196815; __io=a4e139041.463f71015_1555484196816; __io_unique_43098=17; __io_uh=1; __io_visit_43098=1; __gads=ID=91124d6a96ce1f18:T=1555484196:S=ALNI_MajQvC0Wtmvmb0T-uT3kRdgRTFTPg
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Origin
https://www.golem.de

Response headers

Date
Wed, 17 Apr 2019 06:56:37 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, 18 May 2019 06:56:37 GMT
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/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.38.32.164 Amsterdam, Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-38-32-164.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:37 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Length
44
Content-Type
image/gif
index.html
cdn.stroeerdigitalmedia.de/Ads/2019_2203_0017/blb1/ Frame B4B8
0
0
Document
General
Full URL
https://cdn.stroeerdigitalmedia.de/Ads/2019_2203_0017/blb1/index.html?clicktag=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsthX-_BqKtBSUqCLi2GO03_Sd4c3k1SqGqAw0OmOB9yHt1ZoDxs-fQTPpmjxTirFhYHbt6iYfYQZkFzUFkYlT1zRS0I0qB3o-wIbu_dUxymWKRaKbVY1oxlr7JY3lRLVNkeAHwlBWmj-8ykb6MwWfycEsF7XHV_wTPzpJWfh6CRmKchmvkASeu5pT1VSHKC1bwiL_8fi69DI3wX5RtOO-oXZklCb8xYwrjvpvuhV4hXPQjTt3GbxjL7ZfSv_C-arixZGc3JmN2WLA%2526sai%253DAMfl-YTDfiIyHkukZlrEms3yswsMHWw19PGyNJOouU9-bscbBaiHRPM7hU3fogbUmMt677FwnGlFQZMCic_FquD1AceFIagVmkr5SEzSMPzlSg%2526sig%253DCg0ArKJSzP3se0ve3DIZEAE%2526urlfix%253D1%2526adurl%253Dhttps%3A%2F%2Fwww.vodafoneuplift.de
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:18a::5f76 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash

Request headers

:method
GET
:authority
cdn.stroeerdigitalmedia.de
:scheme
https
:path
/Ads/2019_2203_0017/blb1/index.html?clicktag=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsthX-_BqKtBSUqCLi2GO03_Sd4c3k1SqGqAw0OmOB9yHt1ZoDxs-fQTPpmjxTirFhYHbt6iYfYQZkFzUFkYlT1zRS0I0qB3o-wIbu_dUxymWKRaKbVY1oxlr7JY3lRLVNkeAHwlBWmj-8ykb6MwWfycEsF7XHV_wTPzpJWfh6CRmKchmvkASeu5pT1VSHKC1bwiL_8fi69DI3wX5RtOO-oXZklCb8xYwrjvpvuhV4hXPQjTt3GbxjL7ZfSv_C-arixZGc3JmN2WLA%2526sai%253DAMfl-YTDfiIyHkukZlrEms3yswsMHWw19PGyNJOouU9-bscbBaiHRPM7hU3fogbUmMt677FwnGlFQZMCic_FquD1AceFIagVmkr5SEzSMPzlSg%2526sig%253DCg0ArKJSzP3se0ve3DIZEAE%2526urlfix%253D1%2526adurl%253Dhttps%3A%2F%2Fwww.vodafoneuplift.de
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html

Response headers

status
200
server
Apache
etag
"8934da3cdc65b2c5167f41c63044e69b:1554206240"
last-modified
Tue, 02 Apr 2019 11:57:20 GMT
accept-ranges
bytes
content-type
text/html
vary
Accept-Encoding
content-encoding
gzip
cache-control
max-age=86400
expires
Thu, 18 Apr 2019 06:56:37 GMT
date
Wed, 17 Apr 2019 06:56:37 GMT
content-length
16866
access-control-max-age
86400
access-control-allow-credentials
false
access-control-allow-headers
*
access-control-allow-methods
GET,HEAD
access-control-allow-origin
*
truncated
/ Frame E550
213 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
868bf06674305de7f90c6b6c68238aa1a6313548256418f988f1f4f0fafcb040

Request headers

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

Response headers

Content-Type
image/png
/
d.bacontent.de/d/get/
311 B
333 B
Script
General
Full URL
https://d.bacontent.de/d/get/?url=https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&v=22170164
Requested by
Host: c.bacontent.de
URL: https://c.bacontent.de/assets/js/loader.js?v=22170164
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.190.35.232 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
232.35.190.35.bc.googleusercontent.com
Software
Apache /
Resource Hash
3414d646a7395a4c3d184f90cedafa2b9c568fbc9f9414547a1276ad7971244b

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

pragma
no-cache
date
Wed, 17 Apr 2019 06:56:37 GMT
content-encoding
gzip
last-modified
Wed, 17 Apr 2019 06:56:37 GMT
server
Apache
vary
Accept-Encoding
content-type
text/javascript; charset=utf8
status
200
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
alt-svc
clear
content-length
238
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
mtrcs_914466.js
s79.mxcdn.net/bb-mx/serve/
134 KB
50 KB
Script
General
Full URL
https://s79.mxcdn.net/bb-mx/serve/mtrcs_914466.js
Requested by
Host: s79.research.de.com
URL: https://s79.research.de.com/bb-mx/prime/mtrcs_914466.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.233.67 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-233-67.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
b8121230be7463e25719852162bfad7b15b22b47f76c2de50c15c49b5d589496

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56: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=1800
Connection
keep-alive
Content-Type
text/javascript
Content-Length
50915
Expires
Wed, 17 Apr 2019 07:26:37 GMT
gettag
s79.research.de.com/bb-mxad/
0
294 B
Script
General
Full URL
https://s79.research.de.com/bb-mxad/gettag
Requested by
Host: s79.research.de.com
URL: https://s79.research.de.com/bb-mx/prime/mtrcs_914466.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
78.47.15.207 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h549.meetrics.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:37 GMT
Cache-control
private,must-revalidate
Server
nginx
Connection
keep-alive
P3P
policyref="/w3c/p3p.xml", CP="NON DSP CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI COM NAV STA"
Content-Length
0
Content-Type
text/javascript
truncated
/
211 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
885cd8d835b8329a2b3d8c5e437cf44c6baec7155c945e0f8616342a95128e1d

Request headers

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

Response headers

Content-Type
text/javascript
vevent
fra1-ib.adnxs.com/
0
813 B
Other
General
Full URL
https://fra1-ib.adnxs.com/vevent?referrer=https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&e=wqT_3QLtCfBC7QQAAAMA1gAFAQimnNvlBRCltsXRpPKcu3UY4febo-DFnfokKjYJ0LNZ9bna-D8R0LNZ9bna-D8ZAAAAwMzMCEAh0A0SACkRJPCWMQAAAKBH4eo_MIrjgQY46xtA6xtIAlCumf1IWO6bWGAAaNTLfHjRjgWAAQGKAQNVU0SSAQNFVVKYAQGgAQGoAQGwAQC4AQLAAQTIAQLQAQnYAQDgAQDwAQCKApQBdWYoJ2EnLCAyNjM5MDA2LCAxNTU1NDg0MTk4KTt1ZignaScsIDExNDY4MTEsIDE1NTU0ODQxOTgpOwE6LGcnLCA3NzA5NjIyLEI6ACxjJywgMjg1MTczNzVGHgAAcgFYHDUzMDQ2MTkwNh8A8NiSAukCIUJGak5zZ2pfeDh3TkVLNlpfVWdZQUNEdW0xZ3dBamdBUUFSSTZ4dFFpdU9CQmxnQVlQX19fXzhQYUFCd0FYZ0JnQUVCaUFFQmtBRUJtQUVCb0FFS3FBRUtzQUVBdVFGbThjOUdxQUQyUDhFQjBfbTNITGZhLURfSkFRQUFBR0F1V2ZBXzJRRnJuNDdIREZUc1AtQUJ1XzlGOVFFQUFIcEVnQUlCaUFLaHFDdUlBdEs2bVFlUUFnR1FBZ0dZQWdDZ0FnU29BZ0dvQWdHMUFnQUFBQUM5BQjwmURfQUFnSElBZ0hRQWdIWUFnSGdBZ0RvQWdENEFnQ0FBd0dZQXdHaUF3NElobzNyQlJBRUdBRXRkbWN3T3FJREV3aUE4dUlGRUFvWUFTMXp5WUlfTWdOMWJtdW9BX19IekEyNkF3bEdVa0V4T2pNM01URGdBNXdLZ0FUMGpZSUNpQVNGam9JQ2tBUUFtQVFCmgJhIV9oQWw0QWoybAEsN3B0WUlBUW9BREVBCQGQRHdQem9KUmxKQk1Ub3pOekV3UUp3S1NXdWZqc2NNVk93X1VRQQkrDEFBQVcdDPCu2ALmkwHgApiTRuoCaGh0dHBzOi8vd3d3LmdvbGVtLmRlL25ld3Mvc3ViZG9tYWluLXRha2VvdmVyLW1pY3Jvc29mdC1sb3Nlcy1jb250cm9sLW92ZXItd2luZG93cy10aWxlcy0xOTA0LTE0MDcxNy5odG1s8gITCg9DVVNUT01fTU9ERUxfSUQSAPICGgoWQ1VTVE9NX01PREVMX0xFQUZfTkFNRRIA8gIeChpDVR0z8KJMQVNUX01PRElGSUVEEgCAAwGIAwGQAwCYAxSgAwGqAwDAA-CoAcgDANgD3rgo4AMA6AMA-AMDgAQAkgQJL29wZW5ydGIymAQAqAQAsgQMCAAQABgAIAAwADgAuAQAwAQAyAQA0gQOMzU2MyNGUkExOjM3MTDaBAIIAeAEAPAErpn9SPoEEgkAAABgbQ1JQBEAAADgTUIhQIgFAZgFAKAF____CQNoAaoFETQzMDQ4ODc5Mjk5MDE5MDg5wAUAyQUABQEU8D_SBQkJBQs4AAAA2AUB4AUB8AU2-gUEAZQokAYBmAYAuAYAwQYBHywAAPA_yAYA2gYWChAJEBkBLBAAGADgBgzyBgIIAA..&s=02533a8f1d8572d8beb8df7b357dea0aa79c638f&type=nv&nvt=5&jm=1003&px=293&py=3211&bw=235&bh=183&sid=8476289291203843189&vd=ct~0|rr~0&sv=162&tv=native1-18hs&ua=chrome52&pl=mac&x=v&tag_id=12611978&cid=3&cr=nv&sw=1600&sh=1200&pw=1603&ph=6293&ww=1600&wh=1200&ft=0
Requested by
Host: cdn.adnxs.com
URL: https://cdn.adnxs.com/v/s/162/trk.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
37.252.173.27 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
539.bm-nginx-loadbalancer.mgmt.fra1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
text/plain;charset=UTF-8

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:39 GMT
AN-X-Request-Uuid
52f62f2d-df2d-4689-a530-c02e17af56f3
Content-Type
text/html; charset=utf-8
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
X-Proxy-Origin
185.220.70.202; 185.220.70.202; 539.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.172.4:80
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
data
lb34.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb34.s400.meetrics.net/data?/Lod4DeaAAKktFLkqFFlqwF23A52AwwALl1FDK2mFLkqFKlkyB23A52AwwA2qoFx1A11A04A0xA51A05AzzAw2An1F5wAu0FtBF/k0FWEmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A5wAz3Az0Ay0AmjEpkF9xAz4Ay2Az1Ay5A05AymAzpF6lF93A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9hEy0FprFlsFmhEwiF9iEhuFulFyyBmhEwjF90A45AwzA3zA0yA0mAhwFk9B04A5wAz3Az0Ay0AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEhyF0pFrlFslByGEihFuuFlyFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA11A10A40Ax5A32Aw0ALlnFBUkzFnBPkIAAZAwSAcAAAAPoPAAAAAAAB547APDAAFAA547TA5iAZCAAOA55A55A85B55A58E55A55AGAy0A1zAw1ArA5iAP0BAAAAAAAIA5iASksFtFjAAAAAAAAAAAAEAAA547AAAAAAAHAklFzrF0vFwBFHAhyF0pFrlFsBFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA33Aw4Ey1AxBEMAxzA4yA2zA1yA50A5yANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A5wAz3Az0Ay0AHAihFuuFlyFyBEKA04A5wAz3Az0Ay0AKA04A5wAz3Az0Ay0AyAlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGhFy0FprFlsFlyAGiFhuFulFyyBdAAAAAAAAAAAAFAAAA5iAAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFlIPpUA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.97 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h222.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:37 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 17-Apr-19 06:56:36 GMT
/
t4ft.de/bk/ Frame D569
33 B
235 B
Script
General
Full URL
https://t4ft.de/bk/?t=1555484197&ftgid=pJpzGfYydknzr6Bf&ls[]=https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&ls[]=https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&lss=dd&vid=0&x=aid%3D1289%26fcui%3D319%26fcun%3Deizo%26fcai%3D3732%26fcan%3DEIZO%2520flexscan%2520branding%25202019%26ffli%3DBusinessAD%2520Channel%2520B2B%2520%2526%2520IT%26ffln%3DBusinessAD%2520Channel%2520B2B%2520%2526%2520IT%26fpli%3D94192%26fpln%3DRun%2520of%2520Channel_300x600_Wide_Skyscraper%26adId%3D82791%26element%3Dasn484466p94192&cb=ftgu_558420385
Requested by
Host: c.t4ft.de
URL: https://c.t4ft.de/c/ftg_t_v_bk.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, CHACHA20_POLY1305
Server
85.10.200.83 Mörfelden-walldorf, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.85-10-200-83.clients.your-server.de
Software
nginx/1.10.3, ws-0601 /
Resource Hash
2aa84172203be25d21a2abb41e4c6115d3a3f84664fb9008709e01445763e81e

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:37 GMT
Cache-Control
no-store, must-revalidate
Server
nginx/1.10.3, ws-0601
Content-Length
33
Content-Type
text/javascript;charset=UTF-8
container.html
tpc.googlesyndication.com/safeframe/1-0-32/html/ Frame 8254
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-32/html/container.html?n=1
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:815::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/safeframe/1-0-32/html/container.html?n=1
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
3971
date
Wed, 13 Mar 2019 18:39:19 GMT
expires
Thu, 12 Mar 2020 18:39:19 GMT
last-modified
Wed, 06 Feb 2019 20:59:52 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
1; mode=block
cache-control
public, immutable, max-age=31536000
age
2981838
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
osd.js
www.googletagservices.com/activeview/js/current/ Frame 3820
77 KB
0
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019041101.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:806::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
030abf52b6ae97a39b654a1501817eabbd77224dea6175a9c7a6a61f45ee4008
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:36 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1555327092593175"
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,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
29092
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:36 GMT
bridge3.295.0_de.html
imasdk.googleapis.com/js/core/ Frame 1FFA
0
0
Document
General
Full URL
https://imasdk.googleapis.com/js/core/bridge3.295.0_de.html
Requested by
Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:820::200a , Ireland, 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.295.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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
184268
date
Mon, 15 Apr 2019 16:25:01 GMT
expires
Tue, 14 Apr 2020 16:25:01 GMT
last-modified
Mon, 15 Apr 2019 16:23:32 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
0
cache-control
public, max-age=31536000
age
138696
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
client.js
s0.2mdn.net/instream/video/
26 KB
10 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.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:821::2006 , Ireland, 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

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:37 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,44,43,39"
content-length
10523
x-xss-protection
0
expires
Wed, 17 Apr 2019 06:56:37 GMT
vevent
fra1-ib.adnxs.com/
0
815 B
Other
General
Full URL
https://fra1-ib.adnxs.com/vevent?referrer=https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&e=wqT_3QLrCfBC6wQAAAMA1gAFAQimnNvlBRDPlZW4tP3CtHcY4febo-DFnfokKjYJgnNGlPYG2z8RgnNGlPYG2z8ZAAAAwMzMCEAhgg0SACkRJPCWMQAAAKBH4eo_MIrjgQY46xtA6xtIAlDb6KtIWO6bWGAAaNTLfHjRjgWAAQGKAQNVU0SSAQNFVVKYAQGgAQGoAQGwAQC4AQLAAQTIAQLQAQnYAQDgAQDwAQCKApQBdWYoJ2EnLCAzMTYzOTg0LCAxNTU1NDg0MTk4KTt1ZignaScsIDEwODk5MzQsIDE1NTU0ODQxOTgpOwE6LGcnLCA3NjM0NzY5LEI6ACxjJywgMjgyOTM1NzhGHgAAcgFYGDUxNzEyODU6PQD0cgGSAuUCIUFsYXlnQWpLODc0TkVOdm9xMGdZQUNEdW0xZ3dCRGdBUUFSSTZ4dFFpdU9CQmxnQVlQX19fXzhQYUFCd0FYZ0JnQUVCaUFFQmtBRUJtQUVCb0FFUXFBRUtzQUVBdVFHZkNtR1pCZTNYUDhFQjhrNG9ZT1VHMnpfSkFRQUFBRUEzdC1zXzJRRnJuNDdIREZUc1AtQUJqc05DOVFFQUFENURtQUlBb0FJRXRRSUFBQUFBdlFJQUFBQV93QUlCeUFJQjBBSUIyQUlCNEFJQTZBSUEtQUlBZ0FNQm1BTUJvZ01VQ0lfMjB3VVFBaGdCTFFBQUFBQXlCR056WHpLaUF3NEkzX2JxQlJBRUdBRXRjT0dVT3FJREV3akp5OU1GRUFvWUFTMjZ1VjBfTWdOMWJtdW9BOHJ6dmcyNkF3bEdVa0V4T2pNM01URGdBNXdLZ0FULXhQY0JpQVMwcWY0QmtBUUJtQVFCmgJhITBoTzlaQTZoAdg3cHRZSUFRb0FERlN1QjZGNjFISVB6b0pSbEpCTVRvek56RXdRSndLU1d1ZmpzY01WT3dfVVFBIQAFAQBXHQzwrtgC5pMB4AKYk0bqAmhodHRwczovL3d3dy5nb2xlbS5kZS9uZXdzL3N1YmRvbWFpbi10YWtlb3Zlci1taWNyb3NvZnQtbG9zZXMtY29udHJvbC1vdmVyLXdpbmRvd3MtdGlsZXMtMTkwNC0xNDA3MTcuaHRtbPICEwoPQ1VTVE9NX01PREVMX0lEEgDyAhoKFkNVU1RPTV9NT0RFTF9MRUFGX05BTUUSAPICHgoaQ1UdM_B-TEFTVF9NT0RJRklFRBIAgAMBiAMBkAMAmAMUoAMBqgMAwAPgqAHIAwDYA964KOADAOgDAPgDA4AEAJIECS9vcGVucnRiMpgEAKgEALIEDAgAEAAYACAAMAA4ALgEAMAEAMgEANIEDjM1NjMjRlJBMTozNzEw2gQCCAHgBADwBGHgdPoEEgkAAABgbQ1JQBEAAADgTUIhQIgFAZgFAKAF_xEBaAGqBRE0MzA0ODg3OTI5OTAxOTA4OcAFAMkFAAUBEPA_0gUJAUgFATTYBQHgBQHwBdLGH_oFBAGWKJAGAZgGALgGAMEGBSIoAPA_yAYA2gYWChAJEBkBLBAAGADgBgzyBgIIAA..&s=0cdf2a4ba239ccd032de6736c3f589e39bb18305&type=nv&nvt=5&jm=1003&px=1058&py=3394&bw=235&bh=183&sid=8476289291203843189&vd=ct~0|rr~0&sv=162&tv=native1-18hs&ua=chrome52&pl=mac&x=v&tag_id=12611978&cid=3&cr=nv&sw=1600&sh=1200&pw=1603&ph=6248&ww=1600&wh=1200&ft=0
Requested by
Host: cdn.adnxs.com
URL: https://cdn.adnxs.com/v/s/162/trk.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
37.252.173.27 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
539.bm-nginx-loadbalancer.mgmt.fra1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
text/plain;charset=UTF-8

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:39 GMT
AN-X-Request-Uuid
8fc626fc-d4f6-40d4-9fbd-d926b9634c50
Content-Type
text/html; charset=utf-8
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
X-Proxy-Origin
185.220.70.202; 185.220.70.202; 539.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.172.203:80
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
vevent
fra1-ib.adnxs.com/
0
814 B
Other
General
Full URL
https://fra1-ib.adnxs.com/vevent?referrer=https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&e=wqT_3QLuCfBC7gQAAAMA1gAFAQimnNvlBRDbqfT488vNuUIY4febo-DFnfokKjYJMnctIR_04T8RMnctIR_04T8ZAAAAwMzMCEAhMg0SACkRJPCWMQAAAKBH4eo_MIrjgQY46xtA6xtIAlC2zOdEWO6bWGAAaNTLfHjRjgWAAQGKAQNVU0SSAQNFVVKYAQGgAQGoAQGwAQC4AQLAAQTIAQLQAQnYAQDgAQDwAQCKApQBdWYoJ2EnLCAyOTg2MzE5LCAxNTU1NDg0MTk4KTt1ZignaScsIDEwMzk1MDMsIDE1NTU0ODQxOTgpOwE6LGcnLCA3MzQ4NzE4LEI6ACxjJywgMjcyMTc2MzJGHgAAcgFYHDQ0MzAzNjcwNh8A9HcBkgLpAiFhRmRZdEFqZ25mME1FTGJNNTBRWUFDRHVtMWd3QkRnQVFBUkk2eHRRaXVPQkJsZ0FZUF9fX184UGFBQndBWGdCZ0FFQmlBRUJrQUVCbUFFQm9BRVFxQUVLc0FFQXVRRUtma1ZMZE1uZlA4RUJHV0JEM3hUMDRUX0pBUUFBQUlCOG5Pa18yUUZybjQ3SERGVHNQLUFCajdrXzlRRUFnRHRFbUFJQW9BSUV0UUlBQUFBQXZRSUFBQUFfd0FJQnlBSUIwQUlCMkFJQjRBSUE2QUlBLUFJQWdBTUJtQU1Cb2dNWENON2N0Z1VRQWhnQkxRQUFBQUF5QjJSbFptRjFiSFNpQXc0SW80YnJCUkFFR0FFdFlIbktPNklERXdqT29wY0ZFQW9ZQVMzazQwd19NZ04xYm11b0EtQ2RfUXk2QXdsR1VrRXhPak0zTVREZ0E1d0tnQVQ4eWV3QmlBVG0ydXdCa0FRQW1BUUKaAmEhX2hBUTRBajJsASg3cHRZSUFRb0FERQHYmEFBQURvUHpvSlJsSkJNVG96TnpFd1FKd0tTV3VmanNjTVZPd19VUQEoCQEEV1EJCAEB8K7YAuaTAeACmJNG6gJoaHR0cHM6Ly93d3cuZ29sZW0uZGUvbmV3cy9zdWJkb21haW4tdGFrZW92ZXItbWljcm9zb2Z0LWxvc2VzLWNvbnRyb2wtb3Zlci13aW5kb3dzLXRpbGVzLTE5MDQtMTQwNzE3Lmh0bWzyAhMKD0NVU1RPTV9NT0RFTF9JRBIA8gIaChZDVVNUT01fTU9ERUxfTEVBRl9OQU1FEgDyAh4KGkNVHTPwokxBU1RfTU9ESUZJRUQSAIADAYgDAZADAJgDFKADAaoDAMAD4KgByAMA2APeuCjgAwDoAwD4AwOABACSBAkvb3BlbnJ0YjKYBACoBACyBAwIABAAGAAgADAAOAC4BADABADIBADSBA4zNTYzI0ZSQTE6MzcxMNoEAggB4AQA8AS2zOdE-gQSCQAAAGBtDUlAEQAAAOBNQiFAiAUBmAUAoAX___8JA2gBqgURNDMwNDg4NzkyOTkwMTkwODnABQDJBQAFARTwP9IFCQkFCzwAAADYBQHgBQHwBa9E-gUEAZUokAYBmAYAuAYAwQYBICwAAPA_yAYA2gYWChAJEBkBLBAAGADgBgzyBgIIAA..&s=6db0720e4414c01457025b9e9173c8f70c38896e&type=nv&nvt=5&jm=1003&px=548&py=3394&bw=235&bh=164&sf=0&sid=8476289291203843189&vd=ct~0|rr~0&sv=162&tv=native1-18hs&ua=chrome52&pl=mac&x=v&tag_id=12611978&cid=3&cr=nv&sw=1600&sh=1200&pw=1603&ph=6248&ww=1600&wh=1200&ft=0
Requested by
Host: cdn.adnxs.com
URL: https://cdn.adnxs.com/v/s/162/trk.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
37.252.173.27 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
539.bm-nginx-loadbalancer.mgmt.fra1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
text/plain;charset=UTF-8

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:39 GMT
AN-X-Request-Uuid
00fdadb2-309b-4297-b7c2-09460be6701d
Content-Type
text/html; charset=utf-8
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
X-Proxy-Origin
185.220.70.202; 185.220.70.202; 539.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.172.11:80
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
truncated
/ Frame 3820
209 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
c7066f3d52d99699667c523192ccf1354d06672c2d21073177ea8d15043cddd2

Request headers

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

Response headers

Content-Type
image/png
data
lb34.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb34.s400.meetrics.net/data?/Lod4ENfAA/k0F4ImvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A5wAz3Az0Ay0AmjEpkF9xAz4Ay2Az1Ay5A05AymAzpF6lF93A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9hEy0FprFlsFmhEwiF9iEhuFulFyyBmhEwjF90A45AwzA3zA0yA0mAhwFk9B04A5wAz3Az0Ay0AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEhyF0pFrlFslByGEihFuuFlyFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA11A10A40Ax5A32Aw0AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A4wAxyA03AmjEpkF9xAz4Ay2A34A3yA23AxmAzpF6lF9zAwxA4yB1wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9hEy0FprFlsFmhEwiF9yEljF0hFunFslFymAhwFj9B04A45A4wAxyA03AmhEwkF90A44A54AwxAy0A3mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGhFy0FprFlsFlyAGyFljF0hFunFslFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA11A10A40Ax5A33A1wALlnFCUkzFYBPZAAAAAAAABGKWAPBAAFAAGKWThRjAZCAAOA55A55A85B55A58E55A55AFA5wA31A4BErhRjAPkAAAAAAAAIhRjASksF/FjAAAAAAAAAAAAEAAAGKWAAAAAAAHAklFzrF0vFwBFHAhyF0pFrlFsBFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAx4Ey1AwBEMAxzA4yA23A43Ay2A3xANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A4wAxyA03AKAylFj0FhuFnsFlyBKA04A45A4wAxyA03AKA04A45A4wAxyA03A1AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGhFy0FprFlsFlyAGyFljF0hFunFslFyBEdAAAAAAAAAAAAFAAAhRjAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFhJfrWA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.97 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h222.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:38 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 17-Apr-19 06:56:37 GMT
data
lb34.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb34.s400.meetrics.net/data?/Lod4FPfAA/k0FANmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A5wAz3Az0Ay0AmjEpkF9xAz4Ay2Az1Ay5A05AymAzpF6lF93A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9hEy0FprFlsFmhEwiF9iEhuFulFyyBmhEwjF90A45AwzA3zA0yA0mAhwFk9B04A5wAz3Az0Ay0AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEhyF0pFrlFslByGEihFuuFlyFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA11A10A40Ax5A32Aw0AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A4wAxyA03AmjEpkF9xAz4Ay2A34A3yA23AxmAzpF6lF9zAwxA4yB1wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9hEy0FprFlsFmhEwiF9yEljF0hFunFslFymAhwFj9B04A45A4wAxyA03AmhEwkF90A44A54AwxAy0A3mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGhFy0FprFlsFlyAGyFljF0hFunFslFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA11A10A40Ax5A33A1wAmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29Bx0A0xAw2Az3A1mAjwFpkF9kElzFr0FvwFmhEwhF91AwwAw3Az3Az3A2mAjpFk9BxzA4yA21A0xAz1A13AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9BhyF0pFrlFsmBhwFi9BzrF5mBhwFj9B1wAwwA3zA3zA32AmhEwkF91AwwAw3Az3Az3A2mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGhFy0FprFlsFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA11A10A40Ax5A4wA1yALlnFDTkzFePHEAAAAAAABh/4APAAAFAAh/4TbosASksFVFjAAAAAAAAAAAAEAAAh/4AAAAAAAHAklFzrF0vFwBFHAhyF0pFrlFsBFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAw4E2wAwBEMAxzA4yA21A0xAz1A13AGAkpFylFj0FAAAAJAx0A0xAw2Az3A1BEKA1wAwwA3zA3zA32ADAzrF5BFKA1wAwwA3zA3zA32AKA1wAwwA3zA3zA32AuAlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGhFy0FprFlsFlyAGzFr5FdXUAKAAsEAYJAFAAAbosAAAAAKAIhFsmFwhFnlFBkFAAAAAAAAAAAAAAAAQtjFkmxAZA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.97 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h222.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:38 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 17-Apr-19 06:56:37 GMT
submit
dc371.s79.research.de.com/bb-mx/
43 B
291 B
Image
General
Full URL
https://dc371.s79.research.de.com/bb-mx/submit?/dlmkBtBAA/whFoBo0F0wFz6BvvA33F3uBnvFslFtuBklFvuEl3FzvBz1FikFvtFhpFutB0hFrlFv2FlyFttEpjFyvFzvFm0FtsEvzFlzFtjEvuF0yFvsFtvE2lFytB3pFukFv3FztB0pFslFztBx5Aw0AtxA0wA3xA3uAo0FtsFfpyF+k2FmywAx5AtwA0tAxxAtxA16AwyAt5Ax0A02A2tAyuAxwA4tAw1AllF5lExjEMquFiHL2wFBLl1FCz2iFjsFpjFrfFqhFjrFpuFnfFpmFyhFtlF/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FUkzFKBFAAAAAAAZwSohBPAAAAAAAAAOAAAAGCAAAAAAZwSohBBPnBA1BAAAAdnuqAPDAAkBAAAAuyrPASksFQPdXUAKAAsEAYJAAAAAnuqAAAQAOPFfTFPVFSDFFfFyzA01A01ACAIQFAAAAAAAAAAAAAAGAJGFSBFNFFdJGAMCAgMA6DAAAAAkfLAAAPAOPFfTFPVFSDFFfF10Az4A4BECACCFAAAAAAAAAAAAAAGAJGFSBFNFFdhPACRAsEA6DAAAAAN8+AAAQAOPFfTFPVFSDFFfFxzAw1A12ACANSFAAAAAAAAAAAAAAGAJGFSBFNFFdlEAK4AoPA4BAAAAA2W7AAAPAOPFfTFPVFSDFFfF50A3wAzBECACCFAAAAAAAAAAAAAAGAJGFSBFNFFdhPArCBsEA9BAAAAAaO6AAAzAo0F0wFz6BvvA33F3uBnvFslFtuBklFvfEptFnvBx2Aw2AyyAt0ElhFzlFyfF0zEjvF00F5uBwuFnBFDANPFCBFAAAAAAAAAAAAAADAJNFHBFdlEAexAoPA0FAAAAAUX6AAABDo0F0wFz6BvvAtlFkpFhuBwsFpzF0hFujEvtFvNEzKElxB23Ew2F33AfjFUGFtoFOMFO1FzzBOTF4vF9vAzyAw4Ex4AwvAmpFs0FlyFz6BmvFytFh0Fo3EliFwpB6xE1hFspF05Fo4A1pAv2EjkFuuBhkFu4FzuBjvFtlByGEwlByGEjyFlhF0pF2lFtpEthFnlFlyAGkFilByGEh2BlyAGxBmlByGEzxAlyAGkFihF2xAmzBxtAyyAk4Bt0AyiEjtB4lEk0BtmEzzAmkFmjFz4A52AkuBqwFnBFDAQMFJBFAAAAAAAAAAAAAADAEJFWBFd7GA8ZA8KAKGAAAAAyrPAAAQBo0F0wFz6BvvA2pFklFvuBnvFslFtuBklFvkEv3FusFvhFkvByyA33Aw/Ax9BtlFkpF1tFmyEk9BysFytFwmBjwF4sF9wAmkEspFk4F9wAmyEh9Bx0Aw3Ax3AFAWQFBJFEBFAAAAAAAAAAAAAAFAWJFEFFPBFQtjFOz/MYA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
144.76.237.196 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h371.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:38 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Wed, 17 Apr 2019 06:56:37 GMT
data
lb34.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb34.s400.meetrics.net/data?/Lod4GUhAATkzFrZCAAOA55A55A85B55A58E55A55AGAyzAz0A0xArbosARksFAQtjFHdrNSA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.97 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h222.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:38 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 17-Apr-19 06:56:37 GMT
data
lb34.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb34.s400.meetrics.net/data?/Lod4HVhAA/k0FMRmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A5wAz3Az0Ay0AmjEpkF9xAz4Ay2Az1Ay5A05AymAzpF6lF93A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9hEy0FprFlsFmhEwiF9iEhuFulFyyBmhEwjF90A45AwzA3zA0yA0mAhwFk9B04A5wAz3Az0Ay0AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEhyF0pFrlFslByGEihFuuFlyFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA11A10A40Ax5A32Aw0AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A4wAxyA03AmjEpkF9xAz4Ay2A34A3yA23AxmAzpF6lF9zAwxA4yB1wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9hEy0FprFlsFmhEwiF9yEljF0hFunFslFymAhwFj9B04A45A4wAxyA03AmhEwkF90A44A54AwxAy0A3mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGhFy0FprFlsFlyAGyFljF0hFunFslFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA11A10A40Ax5A33A1wAmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29Bx0A0xAw2Az3A1mAjwFpkF9kElzFr0FvwFmhEwhF91AwwAw3Az3Az3A2mAjpFk9BxzA4yA21A0xAz1A13AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9BhyF0pFrlFsmBhwFi9BzrF5mBhwFj9B1wAwwA3zA3zA32AmhEwkF91AwwAw3Az3Az3A2mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGhFy0FprFlsFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA11A10A40Ax5A4wA1yAmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9zA0yA5wAw1A1mAjwFpkF9kElzFr0FvwFmhEwhF91AwxA44AywAz3AzmAjpFk9BxzA4yA22Ay0A20A0yAmzEp6Fl9B33Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9BhyF0pFrlFsmBhwFi9BihFuuFlyFmhEwjF91AwxA44AywAz3AzmAhwFk9B1wAx4A4yAwzA3zAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA11A10A40Ax5A4xA44ATkzFARksFAQtjF1Q8aZA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.97 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h222.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:38 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 17-Apr-19 06:56:37 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=6192948612
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGllSm9qdWFiemFpcm9oR3U9aWVKb2p1YWJ6YWlyb2hHdXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuTGV8fCh5LkxlPTApO3kuTGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5MZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5UYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEud2gobSksYS5DZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS4kcCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5ZYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wuc2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS54ZChjKTthLmt3KGwpO2EuaXcobSk7YS5adigpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlyPXRoaXMuYVs0XTt0aGlzLnh2PQp0aGlzLmFbN107dGhpcy5sPXRoaXMuYVs3XX1jLnN2PWI7Yi5wcm90b3R5cGU9e3hyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55cjp0aGlzLnd2KGEpfSx3djpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnh2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIga2E9Yy5zdnx8a2EsZGQ9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9ZGQueHIoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuJHA9ITE7dGhpcy5PYT0ic2V0dXAiO3RoaXMuQmM9W107dGhpcy5ZZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLkR2LmJpbmQodGhpcykpfWMucms9YjtiLnByb3RvdHlwZT17WWY6ZnVuY3Rpb24oKXt0aGlzLmNhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSwKb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LEpvOmZ1bmN0aW9uKGEpe3RoaXMuY2EuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG9hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxEdjpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5DdihhLmRhdGEpfSxDdjpmdW5jdGlvbihhKXtpZih0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPQp0aGlzLmNhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lciYmYS5ldmVudD09dGhpcy5jYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sVmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmNhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sYmc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lcyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuV2coYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGVzOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxIbzpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUuVXIoYSkpcmV0dXJuOyhiPXRoaXMuYmcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSxVcjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxtZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmCihiPXRoaXMuY2Eub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxCdDpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxOYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LHZnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxDaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT0KZG9jdW1lbnQuYm9keT8hMDohMX0sUGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSx1ZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoOwpkPXIud2lkdGg7Zj1yLmhlaWdodDswPnIudG9wJiYoZis9ci50b3ApO3IuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09ci5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sdmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy51ZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksMTAwKX0sdWI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LG9lOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0semg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxKPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLHAsbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBuPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLG4ucHVzaChjKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihuLnB1c2goZik7MTQhPW4ubGVuZ3RoJTE2OyluLnB1c2goMCk7bi5wdXNoKHA+Pj4yOSk7bi5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPG4ubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09blthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO3A9cjtsPUo7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfH5wJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKHBeCmxedikrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChwLDMwKSxwPWMsYz10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfHAmdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKHBebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKHAsMzApLHA9YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrcCY0Mjk0OTY3Mjk1O0o9SitsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihKKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LG5iOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+NixyPWMmNjMsaXNOYU4oZik/ZT1yPTY0OmlzTmFOKGMpJiYocj02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSx5dDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGZlOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHI9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IubGI/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8CmMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gobil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXI7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LCRyOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy5mZSgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFBhOmZ1bmN0aW9uKCl7dmFyIGE9e0lpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxPczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxibTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxUbjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5JaSgpfHxhLmRqKCl8fGEuT3MoKXx8YS5ibSgpfHxhLlRuKCl9fTtyZXR1cm4gYS5McCgpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGZkOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHNiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHBzOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxJcTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxHdzpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxxZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuT2goYikrIjoiK3RoaXMuT2goTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LE9oOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxZZTpmdW5jdGlvbihhKXt0aGlzLk9hPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLk9hO3RoaXMuTmYoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLAohMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxvYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlZCl7dmFyIHI9YTtkJiZiJiYoYj1rLlNhKGIsZCkpO2ImJihyPWsuU2EoYSxiKSk7ZiYmKHI9ay5TYShyLGYpKTtjJiYocj1rLlNhKHIsYykpO2gmJihyPWsuU2EocixoKSk7ZWQmJihyPWsuU2EocixoKSk7ZS5vYyhyKX0sRnY6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlJiYxMDIzIT1hLmNvZGUmJjEwMTghPWEuY29kZSl7dHJ5e2lmKGxhJiYoYi5zZXNzaW9uX2lkPWxhKSxiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiIsYS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpLGIuZXZlbnQ9CmEuY29kZSxiLnNpdGVfaHJlZj10aGlzLnBzKCksYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfX1jYXRjaChkKXt9cmV0dXJuIGJ9fSxOZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZ2KGEpO2lmKGIpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC52ZCgpKyI/aG9tYWRfYXQ9IitlbmNvZGVVUklDb21wb25lbnQoYik7bC53YShhLCEwKTthPWwud2EoYSwhMCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1lbmNvZGVVUklDb21wb25lbnQoYik7bC5IYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbHx8IWwuYmEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWErYjt0aGlzLkNjfHwodGhpcy5DYz17fSk7dGhpcy5DY1tmXXx8KHRoaXMuQ2NbZl09MCk7dGhpcy5DY1tmXSsrOzEwPHRoaXMuQ2NbZl18fChmPWwudmQoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpLGwud2EoZiwhMCksZj1sLndhKGYsITApLGYuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkhhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpKX19LERlOmZ1bmN0aW9uKCl7bCYmbC5iYT9sLmlzRW5hYmxlZCYmbC5ucSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZSgpfS5iaW5kKHRoaXMpLDUwMCl9LGxlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuYmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LG5lOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxiYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmdkKGEpOiIifSxnZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm5lKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sZXE6ZnVuY3Rpb24oYSxiLGQpe2Q9ITE7aWYoYi54ZShhKXx8dGhpcy5CdChhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LldlJiZ3aW5kb3cuc2FuZGJveC5XZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LldlWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwKc2FuZGJveC5XZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy5tZyhhKSlyZXR1cm4gdGhpcy5tZyhhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMubmIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtkJiYoZi5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtmLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2YuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjt2YXIgYz0hMTtkPSExO2Q9dGhpcy5UYShhLGIuR2EsZixmdW5jdGlvbihhKXtjPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2N8fChjPWQpLGM9SlNPTi5wYXJzZShjKX1jYXRjaChoKXtjPSExfWMudXJsJiZjLmhhc2gmJihjPWIubGQoKS5yZXBsYWNlKCJbaGFzaF0iLApjLmhhc2gpKTt0aGlzLkhvKGMsYSk7cmV0dXJuIGN9LFRhOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUscil7dmFyIGs9aHx8bDtoPSEwO3ImJihoPSExKTtpZihrJiZrLmJhKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7ay53YShhLGgpO2g9ay53YShhLGgpO2guZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuSGEoaCxmLGMsIiIsIiIsZSl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRhKGEsYixkLGYsYyxrLGUscil9LmJpbmQodGhpcyksNTAwKX0sV2c6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSl7dmFyIHI9ITA7ZSYmKHI9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7ZT1kO2Q9IiI7CmZvcih2YXIgayBpbiBlKWQrPSImIitrKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtrXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsciksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LCR0OmZ1bmN0aW9uKGEsYixkKXt0aGlzLldnKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLkJjKWZvcih2YXIgYyBpbiB0aGlzLkJjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuQmNbY10pOwpjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS5uYihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LFhnOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5uYihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuVGEoYSxmLkdhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT0KSlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuJHQoZi5sZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0scnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuQmM9YX0sTnk6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLlRhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLApiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGgpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LE1wOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSx3dDpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFE9Yy5ya3x8ClE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93LmtnPWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMucWs9YjtiLlNhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5wdj17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5zdT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi51eT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLkVyPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRnk9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5MZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuRWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLklmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLk1mPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi53bz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5HZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLll4PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5ydT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuRnI9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkF5PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlpmPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuQ3E9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLlpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuWWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLktmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLAptZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Iuem89e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLk1jPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5TZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5VZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IueW89e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlZoPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2Iud3U9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi5wZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07CmIubGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLiRmPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi50eT17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5WeD17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLnR1PXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfSxnZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX19fSkoYyk7dmFyIGs9Yy5xa3x8aztjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuanE9dGhpcy5hWzEwXTt0aGlzLiR3PXRoaXMuYVsxXTt0aGlzLlpuPXRoaXMuYVs2XTt0aGlzLkNrPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzhdfWMuZWk9YjtiLnByb3RvdHlwZT17aXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmpxOnRoaXMuWncoYSl9LFp3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kdzp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWm46dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNrOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgbWE9Yy5laXx8bWEsZmQ9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWZkLmlxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuc2s9YjtiLnByb3RvdHlwZT17b2U6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LG9iOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5BfHwieCIpfSxqczpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZSsKbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sZGQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmRkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuZGQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSx1YzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLm9lKHRoaXMub2IoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9CnRoaXMuZGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LHN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWMoKSsiMiJ9LE1nOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMub2UodGhpcy5qcygpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmRkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUj1jLnNrfHxSO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBvPXRoaXMuYVs0XTt0aGlzLnpwPXRoaXMuYVs2XTt0aGlzLlFuPXRoaXMuYVs4XTt0aGlzLnd5PXRoaXMuYVs2XTt0aGlzLnp5PXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzldfWMuRG49YjtiLnByb3RvdHlwZT17b286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT8KdGhpcy5wbzp0aGlzLnlwKGEpfSx5cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuenA6dGhpcy5QbihhKX0sUG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFuOnRoaXMudnkoYSl9LHZ5OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3k6dGhpcy55eShhKX0seXk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnp5OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgbmE9Yy5Ebnx8bmEsZ2Q9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9Z2Qub28oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsCmY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGYuZj9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5mOmZ1bmN0aW9uKCl7ZC5mLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnRmPWJ9KShjKTt2YXIgSz1jLnRmfHxLO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhpPXRoaXMuYVsxXTsKdGhpcy5Nbz10aGlzLmFbOF07dGhpcy5sPXRoaXMuYVs5XX1jLllzPWI7Yi5wcm90b3R5cGU9e0dpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSGk6dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1vOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgb2E9Yy5Zc3x8b2EsaGQ9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9aGQuR2koNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5xbT1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMueWM9MTAwO3RoaXMudmI9MDt0aGlzLklhPTE1MDt0aGlzLnliPTA7dGhpcy5sdyhiKX0sYzpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMudmI8PXRoaXMuSWE/KHRoaXMudmIrKywKdGhpcy55Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnljKSk6MD50aGlzLklhJiYodGhpcy55Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnljKSl9LGF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmI+dGhpcy5JYT8hMDohMX0sVmU6ZnVuY3Rpb24oKXt0aGlzLnZiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsdzpmdW5jdGlvbihiKXt0aGlzLkc9Yn0sZ3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxLOmZ1bmN0aW9uKGIpe3RoaXMuSmFbYi5vYigpXT1iO0wmJkwuVWcmJkwuSXcoYil9LHB6OmZ1bmN0aW9uKCl7cmV0dXJuIGUuTmEodGhpcy5KYSl9LEo6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYT09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVtiLm9iKCldPyEwOiExfSx4dDpmdW5jdGlvbihiKXtiPWIuRmEoKTtmb3IodmFyIGEgaW4gdGhpcy5KYSlpZihiLmlkPT0KdGhpcy5KYVthXS5GYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxEejpmdW5jdGlvbihiKXt0aGlzLkphW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLnFtfHx0OyhmdW5jdGlvbihjKXtjLnNtPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMueWM9MTA7dGhpcy52Yj0wO3RoaXMuSWE9NTA7dGhpcy5OPW51bGw7dGhpcy5tYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMucWI9IiI7dGhpcy5mZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHY6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkZhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7fSwKdnc6ZnVuY3Rpb24oYil7dGhpcy5OPWJ9LHF6OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTn0scHc6ZnVuY3Rpb24oYil7dGhpcy5IZT1ifSxvejpmdW5jdGlvbigpe3JldHVybiB0aGlzLkhlfSxHZTpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMudmI8PXRoaXMuSWEmJih0aGlzLnZiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy55YykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYil7fX0sdWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sb2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sWmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxFejpmdW5jdGlvbigpe30sVjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5HcygpfHx0aGlzLkVvKCk7dGhpcy5aZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHJ6OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEVvOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmdhKDEwKSl9LEdzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxTOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPQpifSxGYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxtZDpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sVWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0seHo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYX0sZmE6ZnVuY3Rpb24oKXt0aGlzLm1hPSEwfSxQYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxrYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHhoOmZ1bmN0aW9uKGIpe3RoaXMucWI9Yn0sbno6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYn0sc2g6ZnVuY3Rpb24oKXt0aGlzLnFiPW51bGx9LHV6OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5xYiYmKGI9ITApO3JldHVybiBifSx6ejpmdW5jdGlvbigpe3RoaXMuZmd8fCh0aGlzLmZnPSEwKX0scWM6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sa3o6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBuPWMuc218fG47KGZ1bmN0aW9uKGMpe2MuZ2k9Sy5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLkc9dGhpcy5wbGF5ZXI9IiI7dGhpcy5DZj0iMSI7dGhpcy5EZj0iMiI7dGhpcy5ybz0iMyI7dGhpcy5HYz0wO3RoaXMuJGc9CjMwO3RoaXMuRGI9W107dGhpcy5aYT1bXTt0aGlzLiRiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLk9mPXRoaXMuUmg9ITE7dGhpcy5zdGF0dXM9dGhpcy5HYzt0aGlzLmlkPWUuZ2EoMTApO3RoaXMueGQoYik7dGhpcy5udyhhKX0sYzpmdW5jdGlvbigpe30sZWE6ZnVuY3Rpb24oKXt0aGlzLlJofHwodGhpcy5SaD0hMCxlLkRlKCkpfSxLZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1MmJlMuS2ImJiFwYSYmKHBhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LEY6ZnVuY3Rpb24oYixhKXt2YXIgZz0hMDtiJiYoZz0hMSk7cmV0dXJuIHRoaXMuaGEoKT8hMToodGhpcy5zdygpLHRoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpLHRoaXMuS2goKSx0aGlzLk9mPSEwLGEmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCksITApfSxzOmZ1bmN0aW9uKGIsCmEpe3RoaXMuaGEoKXx8KHRoaXMuRGIucHVzaChiKSx0aGlzLlphLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxLaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuRGImJjA8dGhpcy5EYi5sZW5ndGgmJih0aGlzLkRiPWUudW5pcXVlKHRoaXMuRGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkRiLmpvaW4oIiwiKSkpO2lmKHRoaXMuWmEpe2Zvcih2YXIgZz0wO2c8dGhpcy5aYS5sZW5ndGg7ZysrKXRoaXMuJGJbdGhpcy5aYVtnXS5yZWFzb25dPT10aGlzLiRiW2JdJiZhLnB1c2godGhpcy5aYVtnXS5kZXRhaWwpLHRoaXMuJGJbdGhpcy5aYVtnXS5yZWFzb25dPHRoaXMuJGJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlphW2ddLmRldGFpbCksYj10aGlzLlphW2ddLnJlYXNvbik7dGhpcy4kYltiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihnPWUudW5pcXVlKGEpLGI9YisiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsCmIsITAsYSl9fSxzejpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9mfSxvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5DZn0sc3c6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkRmfSx0dzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMucm99LFJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5HY30sRmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuQ2Z9LGJ6OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkRmfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5HY30seGQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxudzpmdW5jdGlvbihiKXt0aGlzLkc9Yn0sZ3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxjdTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuZ2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRtPXRoaXMuYVs2XTt0aGlzLmNrPXRoaXMuYVs3XTt0aGlzLnhqPXRoaXMuYVsyXTt0aGlzLmxpPXRoaXMuYVs1XTt0aGlzLkJqPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsyXX1jLmZvPWI7Yi5wcm90b3R5cGU9e0NtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5EbTp0aGlzLmJrKGEpfSxiazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2s6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhqOnRoaXMua2koYSl9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5saTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQmo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYT1jLmZvfHxxYSxpZD1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9aWQuQ20oNCk7KGZ1bmN0aW9uKGMpe2MucWo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuZ2IoYil9LmJpbmQodGhpcykpfSxnYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5OJiZ0aGlzLk4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTsKdmFyIFQ9Yy5xanx8VDsoZnVuY3Rpb24oYyl7Yy5waj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2Q9bnVsbDt0aGlzLmN5PTFFMzt0aGlzLmpoPW51bGw7dGhpcy5weD0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cubGIpYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkYoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Oci5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuQ3MuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5CcyhhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuZnkoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmd5KGIpfS5iaW5kKHRoaXMpKSk7CmIub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLkFzKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5BcShhKX0uYmluZCh0aGlzKSl9LEFxOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkYoKX0sZnk6ZnVuY3Rpb24oYil7dGhpcy5LZHx8KHRoaXMuS2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmh5KGIpfS5iaW5kKHRoaXMpLHRoaXMuY3kpKX0saHk6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2QpO3RoaXMuRigpfSxneTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5LZCl9LEFzOmZ1bmN0aW9uKGIpe3RoaXMuaHooYik7dGhpcy5qaD1uZXcgRGF0ZTt0aGlzLmpoLXRoaXMuenY8dGhpcy5weD90aGlzLkYoKTp0aGlzLm8oKX0sQ3M6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy54ZChuZXcgVChhKSkpOwp0aGlzLkYoKX0sTnI6ZnVuY3Rpb24oKXt9LEJzOmZ1bmN0aW9uKCl7dGhpcy56dj1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLnBqfHxyYTsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLk5hKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5KKGcpfHwodGhpcy5LKGcpLChuZXcgcmEoZyx0aGlzLkcpKS5jKCkpfX10aGlzLkkoKX19fSl9KShjKTt2YXIgc2E9Yy5yanx8c2EsdGE9bmV3IHNhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZ3PXRoaXMuYVsyXTt0aGlzLkN5PQp0aGlzLmFbNV07dGhpcy5tbz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs4XX1jLnltPWI7Yi5wcm90b3R5cGU9e0V3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gdzp0aGlzLkJ5KGEpfSxCeTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3k6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgdWE9Yy55bXx8dWEsamQ9bmV3IHVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9amQuRXcoNCk7KGZ1bmN0aW9uKGMpe2MuUms9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5MYj0hMTt0aGlzLmxnKCk7dGhpcy5uZygpO3RoaXMuQnE9ITF9LGxnOmZ1bmN0aW9uKCl7dGhpcy5MYj0KITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLkxiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlMoYil9LG5nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTGIpe3ZhciBiPXRoaXMuRmEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkxiPSEwKTt0aGlzLlYoYSl9fSxsYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5OJiYoMCx0aGlzLk4pKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCwKY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLk4mJigwLHRoaXMuTikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLk4mJigwLHRoaXMuTikoKX0uYmluZCh0aGlzKSl9LEdlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuQWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkFkKGEpfS5iaW5kKHRoaXMpKX0sQWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsKYS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5IZSYmKDAsdGhpcy5IZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxrYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHZhPWMuUmt8fHZhOyhmdW5jdGlvbihjKXtjLlFrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE06ZnVuY3Rpb24oKXt9LFJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5HYzt0aGlzLmlzUGxheWluZz10aGlzLkljPSExO3RoaXMuVGQ9MTt0aGlzLktjPVtdO3RoaXMuamI9ITF9LGM6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLkljPSExO3RoaXMuVGQ9MTt0aGlzLktjPVtdO3RoaXMuamI9ITE7dGhpcy5nZXRQbGF5ZXIoKTsKdmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlRkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5qYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuamI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuamI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmpiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMuSWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMuS2UoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLiRnJiYKIXRoaXMuaGEoKSYmKHRoaXMuamI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMudSgpKToodGhpcy5zKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy51KCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLlJhKCksdGhpcy5nZXRQbGF5ZXIoKS5CcT0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkucWI7YSYmKGEucmQoKSxhLmNlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLkljPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMuS2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuJGcmJiF0aGlzLmhhKCkmJih0aGlzLmpiPyh0aGlzLnMoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5LYy5pbmRleE9mKGEpJiYKdGhpcy5LYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLmVhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5zKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuS2MubGVuZ3RoPj10aGlzLlRkJiZ0aGlzLnUoKSl9LGN1OmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sdTpmdW5jdGlvbihiKXtiP3RoaXMuaWU/dGhpcy5pZSsrOnRoaXMuaWU9MTp0aGlzLmhlP3RoaXMuaGUrKzp0aGlzLmhlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkNoKGEudmlkZW9UYWcpP2EuTGI/dGhpcy5vKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5JY3x8dGhpcy5pc1BsYXlpbmc/Cih0aGlzLmhlPnRoaXMuaWUmJihiPSExKSx0aGlzLkYoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDUwKTooYS5sZygpLGEubmcoKSxhLkxifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHdhPWMuUWt8fHdhOyhmdW5jdGlvbihjKXtjLlNrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuY3MoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPW5ldyB2YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSihnKXx8dGhpcy54dChnKXx8KHRoaXMuSyhnKSxnPW5ldyB3YShnLHRoaXMuRyksZy5NKCksZy5jKCkpfX10aGlzLkkoKX19LG16OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LApjczpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUubmIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHhhPWMuU2t8fHhhLHlhPW5ldyB4YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dT10aGlzLmFbNV07dGhpcy5keD10aGlzLmFbOV07dGhpcy5PcD10aGlzLmFbOV07dGhpcy51bT10aGlzLmFbOF07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5jcD10aGlzLmFbOF07dGhpcy51cj10aGlzLmFbMV07dGhpcy5JdD10aGlzLmFbNl07dGhpcy5vbT10aGlzLmFbNV07dGhpcy4kcz10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs0XX1jLnZvPWI7Yi5wcm90b3R5cGU9e3V1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52dTp0aGlzLmN4KGEpfSxjeDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZHg6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5PcDp0aGlzLnRtKGEpfSx0bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW06dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmZsOnRoaXMuYnAoYSl9LGJwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5jcDp0aGlzLnRyKGEpfSx0cjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudXI6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkl0OnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vbTp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHM6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6YT1jLnZvfHx6YSxrZD1uZXcgemEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT0Ka2QudXUoNCk7KGZ1bmN0aW9uKGMpe2MuYW89bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb19pZCk7dGhpcy5TKGIpO3ZhciBiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0sYT10aGlzLmdldFJhd1BsYXllcigpO2ImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlYoYik6dGhpcy5JKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlhPWkNPTSJ9fSl9KShjKTsKdmFyIEFhPWMuYW98fEFhOyhmdW5jdGlvbihjKXtjLiRuPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IudHJhY2tlci52YXN0X3ByZXJvbGx8fGIudHJhY2tlci52YXN0X3Bvc3Ryb2xsP3RoaXMubygpOih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLnUoKSl9LHU6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMuRigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEJhPWMuJG58fEJhOyhmdW5jdGlvbihjKXtjLmJvPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzJiYKMDxlLk5hKHdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcykpe3ZhciBiPXdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YlthXTtpZihnLmNvbnRyb2xzJiZnLmNvbnRyb2xzLnBsYXllcilnPW5ldyBBYShnKSx0aGlzLkooZyl8fCh0aGlzLksoZyksKG5ldyBCYShnLHRoaXMuRykpLmMoKSk7ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19KX0pKGMpO3ZhciBDYT1jLmJvfHxDYSxEYT1uZXcgQ2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRmk9dGhpcy5hWzRdO3RoaXMuSWs9dGhpcy5hWzVdO3RoaXMuRHU9dGhpcy5hWzhdO3RoaXMuWnE9dGhpcy5hWzRdO3RoaXMuVW09dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbNl19Yy5Laz1iO2IucHJvdG90eXBlPQp7RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZpOnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jazp0aGlzLkN1KGEpfSxDdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkR1OnRoaXMuWXEoYSl9LFlxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5acTp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBFYT1jLktrfHxFYSxsZD1uZXcgRWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1sZC5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5Gbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPQpiLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5WKGIpOnRoaXMuZmEoKSk6dGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuZ2IoYil9LmJpbmQodGhpcykpfSxnYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5OJiZ0aGlzLk4oKX0sbWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGcpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciBGYT1jLkZufHxGYTsoZnVuY3Rpb24oYyl7Yy5Fbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5XPXRoaXMuV3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnFhPXRoaXMudGM9dGhpcy54YT10aGlzLlFjPSExO3RoaXMucGg9ZS51YigxMCk7dGhpcy5RaD0hMDt0aGlzLmVjPXRoaXMuSmc9ITE7dGhpcy5laCgpO3RoaXMua3EoKTt0aGlzLlFhKCl9LEF6OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5vYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5aLCI7Iix0eXBlb2YgYi5aLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlo/Yi5aLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5aP3R5cGVvZiBiLlouc3RhdGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuUiwiOyIsdHlwZW9mIGIuUiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLlI/Yi5SLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuRGE6InVuZGVmaW5lZFgiLAoiOyIsYi5SP3R5cGVvZiBiLlIuRGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLkRhP2IuaW1hLkRhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuRGE/dHlwZW9mIGIuaW1hLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuUiYmYi5SLkRhP2IuUi5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5SJiZiLlIuRGE/dHlwZW9mIGIuUi5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5QZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5QZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuUj9iLlIuUGQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5QZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsCiI7IixiLmltYT9iLmltYS5RZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5RZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlFkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuUWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEudmE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEudmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuUj9iLlIudmE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi52YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuV2Q6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuV2Q6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLldkOgoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLldkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMucGgpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sSGI6ZnVuY3Rpb24oKXtpZighdGhpcy52YSl7dmFyIGI9dGhpcy5wYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudmE9CmIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnZhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnZhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnZhfSx5ZzpmdW5jdGlvbigpe2lmKCF0aGlzLnRjKXt2YXIgYj10aGlzLnBiKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMudGM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLnRjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMudGN9LHZ0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuSWcpe3ZhciBiPXRoaXMucGIoKSxhPXRoaXMudXQoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLklnPSEwKX1yZXR1cm4gdGhpcy5JZ30sdXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwohdGhpcy5RYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuUWM9ITApO3JldHVybiB0aGlzLlFjfSxRYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLlVlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcyksCjIwKX0sVWU6ZnVuY3Rpb24oKXt0aGlzLmVjPSEwO3ZhciBiPXRoaXMueWcoKTtpZihifHx0aGlzLmhhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5zKCJhZGVycm9yIiwKdGhpcy5XKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5QYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuZmM9ITA7aWYoZS5zYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5mY3x8KHRoaXMucygiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcyksCjIwKX0sbHo6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmFnJiZiLmFkcyYmKHRoaXMuYWc9Yi5hZHMpO3JldHVybiB0aGlzLmFnfSxrcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLmFhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLmFhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMuYWEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLmFhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubygpO3RoaXMuS2UoKX0uYmluZCh0aGlzKSl9LGRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy55ZygpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSw1MCl9LGVoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLnZ0KCkpe3ZhciBhPXRoaXMucGIoKSxnPXRoaXMuSGIoKTthJiZnJiYodGhpcy5wYigpLHRoaXMuSGIoKSx0aGlzLmVjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWM/dGhpcy5vKCk6KHRoaXMuYWEoITApLHRoaXMucygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLnBiKCl9ZWxzZSB0aGlzLkpnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGIoKSxiPXRoaXMuSGIoKTthJiYhYj8odGhpcy5zKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmFhKCkpOih0aGlzLmFhKCEwKSx0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5KZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVoKCl9LmJpbmQodGhpcyksNTApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LGxxOmZ1bmN0aW9uKCl7dGhpcy5rY3x8KHRoaXMua2M9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLmtjIT1iLmFkcy5zdGF0ZSYmKHRoaXMua2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLmtjKXt0aGlzLm8oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMua2M9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxxKCl9LmJpbmQodGhpcyksMTApfSx5YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpezA8PWUuZmQoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuVz90aGlzLnUoITApOih0aGlzLnFhPSEwLHRoaXMubygiZW1wdHkgdmFzdCIpKX0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMubygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuUWg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5GKHRoaXMuUWgsZnVuY3Rpb24oKXt0aGlzLmRnKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApxcTpmdW5jdGlvbigpe3RoaXMudnp8fCgxMDx0aGlzLmR5Pyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuZHkrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy4kdigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xcSgpfS5iaW5kKHRoaXMpLDUwKSkpfSwkdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5leSl7dGhpcy5leT0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5hYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBHYT1jLkVufHxHYTsoZnVuY3Rpb24oYyl7Yy5Hbj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApjOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuRGgod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLkRoKGJbZ10pfWNhdGNoKGQpe310aGlzLkkoKX19LERoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuTmEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgRmEoYltnXSksYS5tYXx8dGhpcy5KKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLksoYSksKG5ldyBHYShhLHRoaXMuRykpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy55Yj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy55Yyl9fSl9KShjKTt2YXIgSGE9Yy5Hbnx8SGEsSWE9bmV3IEhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk54PXRoaXMuYVs5XTt0aGlzLiR1PXRoaXMuYVszXTt0aGlzLkdrPXRoaXMuYVs4XTt0aGlzLnhxPXRoaXMuYVs4XTt0aGlzLldqPXRoaXMuYVs2XTt0aGlzLkp1PXRoaXMuYVs5XTt0aGlzLlJpPXRoaXMuYVsxMF07dGhpcy5Ldz10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs4XX1jLnR2PWI7Yi5wcm90b3R5cGU9e014OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTng6dGhpcy5adShhKX0sWnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR1OnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Hazp0aGlzLndxKGEpfSx3cTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnhxOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Xajp0aGlzLkl1KGEpfSxJdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSnU6dGhpcy5RaShhKX0sUWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJpOnRoaXMuSncoYSl9LEp3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS3c6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBKYT1jLnR2fHxKYSxtZD1uZXcgSmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1tZC5NeCg0KTsoZnVuY3Rpb24oYyl7Yy5ibj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5nZXRQbGF5ZXIoKS5pZCk7CmIuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlYoYSl9LGxhOmZ1bmN0aW9uKCl7fSxnYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksZz1iLmdldER1cmF0aW9uKCk7YSYmMDxhJiZnJiYwPGcmJmE+PWctMiYmdGhpcy5OJiYidW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkKCkmJnRoaXMuTigpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBhdXNlKCk6Yi5pc1BhdXNlZCgpfHxiLmdldFBsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQYXVzZWQoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGxheSgpOgpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT0xMDAqYi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgS2E9Yy5ibnx8S2E7KGZ1bmN0aW9uKGMpe2MuYW49dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuSWI9bnVsbDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGI9ITE7dGhpcy5yaCgpO2lmKGIuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGIuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgYT0KYi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5YYj0hMCx0aGlzLm8oKTt0aGlzLnMoImFkZXJyb3IiLGEpO2IuZ2V0UGxheWVyKCk7Yi5nZXRQbGF5ZXIoKTt0aGlzLlZjKCl9fWVsc2UiZmxhc2giPT1iLnBsYXllcl90eXBlP3RoaXMuV2YoKTp0aGlzLm8oKX0sVmM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuaGEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmdldFBsYXllcigpO2lmKCJwbGF5aW5nIj09YS5nZXRQbGF5ZXIoKS5zdGF0ZSlpZihhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBnPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7CmEuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLlhiPSEwLHRoaXMubygpO3RoaXMucygiYWRlcnJvciIsZyk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7dGhpcy5YYj90aGlzLmVhKCk6Yj9hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlP3RoaXMuRigxMDEyIT1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlKTphLmdldFBsYXllcigpLmFkc19sb2FkZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZjKCEwKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuRighMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZjKCEwKX0uYmluZCh0aGlzKSwxMDApfX1lbHNlIHRoaXMubygpO2Vsc2UgYS5nZXRQbGF5ZXIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlZjLmJpbmQodGhpcyksCjEwMCl9fSxXZjpmdW5jdGlvbigpe2lmKCF0aGlzLmhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkliKSx0aGlzLm8oKSk7ImZpcnN0UXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuSWIpLHRoaXMubygpKTsibWlkcG9pbnQiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuSWIpLHRoaXMubygpKTsidGhpcmRRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5JYiksdGhpcy5vKCkpOyJhZExvYWRpbmdFcnJvciI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmbnVsbD09dGhpcy5JYiYmKHRoaXMuSWI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhifHwKKHRoaXMucygiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy5GKCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2YuYmluZCh0aGlzKSw1MCl9fSxyaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7Yi5hZHNfbG9hZGVyP2IuYWRzX2xvYWRlciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YS5nZXRFcnJvcigpO2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKTtpZigxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKSl0aGlzLlhiPSEwLHRoaXMubygpOzkwMT09YS5nZXRFcnJvckNvZGUoKSYmCnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmgoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTGE9Yy5hbnx8TGE7KGZ1bmN0aW9uKGMpe2MuY249dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiZ2aWRlby5nZXRQbGF5ZXImJnZpZGVvLmdldFBsYXllcigpJiYodmlkZW8uZ2V0UGxheWVyKCkuZWx8fCJmbGFzaCI9PXZpZGVvLnBsYXllcl90eXBlKSl7dmFyIGI9bmV3IEthKHZpZGVvKTt0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBMYShiLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWE9Yy5jbnx8TWEsTmE9bmV3IE1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklyPXRoaXMuYVs3XTt0aGlzLnZzPXRoaXMuYVsxXTt0aGlzLnZwPQp0aGlzLmFbN107dGhpcy5Tbj10aGlzLmFbM107dGhpcy5HbD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsxMF19Yy5Xbz1iO2IucHJvdG90eXBlPXtIcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSXI6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZzOnRoaXMudXAoYSl9LHVwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52cDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU246dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgT2E9Yy5Xb3x8T2EsbmQ9bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9bmQuSHIoNCk7KGZ1bmN0aW9uKGMpe2MuWm09Cm4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmVsXzthfHwoImZ1bmN0aW9uIj09dHlwZW9mIGIuZWw/YT1iLmVsKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGIuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQoKSkpKTt0aGlzLlMoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJihiPWJbMF0pO3RoaXMuVihiKX0sZ2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuTiYmdGhpcy5OKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmKGE9Yi5wYXVzZWQoKSk7YXx8Yi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMTsiZnVuY3Rpb24iPT10eXBlb2YgYi5wYXVzZWQmJihhPWIucGF1c2VkKCkpO2EmJmIucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUyIn0sa2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5tdXRlZCYmImZ1bmN0aW9uIj09dHlwZW9mIGEubXV0ZWQmJihiPWEubXV0ZWQoKSk7cmV0dXJuIGJ9LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExO2Iudm9sdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgYi52b2x1bWUmJihhPTEwMCpiLnZvbHVtZSgpKTtyZXR1cm4gYX0sVWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9fSl9KShjKTt2YXIgUGE9Yy5abXx8UGE7KGZ1bmN0aW9uKGMpe2MuWW09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuVmYoKTtiLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwO3RoaXMueG98fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoInRpbWV1cGRhdGUiKTt0aGlzLkYoITApfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9GSVJTVF9RVUFSVElMRSIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX01JRFBPSU5UIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfVEhJUkRfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLnMoImFkc2Vycm9yIik7dGhpcy56cyhhKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LAp6czpmdW5jdGlvbihiKXt2YXIgYT05OTk5OTk7aWYoYi5kYXRhJiZiLmRhdGEuQWRFcnJvcilmb3IodmFyIGcgaW4gYi5kYXRhLkFkRXJyb3IpYi5kYXRhLkFkRXJyb3IuaGFzT3duUHJvcGVydHkoZykmJiJudW1iZXIiPT10eXBlb2YgYi5kYXRhLkFkRXJyb3JbZ10mJihhPWIuZGF0YS5BZEVycm9yW2ddLHRoaXMucyhhKSk7OTAxPT1hP3RoaXMubygpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLlhiPSEwLHRoaXMubygpLHRoaXMuZWEoKSk6dGhpcy5GKCl9LFZmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkcyYmYi5hZHMuaXNBZFBsYXlpbmcmJmIuYWRzLmlzQWRQbGF5aW5nKCk/KHRoaXMueG89ITAsdGhpcy5vKCkpOnRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5WZi5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZz8KdGhpcy5GKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgUWE9Yy5ZbXx8UWE7KGZ1bmN0aW9uKGMpe2MuJG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllckZyYW1ld29yayYmd2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlJiYiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKXt2YXIgYj13aW5kb3cucGxheWVyRnJhbWV3b3JrLmdldEJhc2UoKTtpZihiJiZiLmdldEFsbFBsYXllcnMmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFsbFBsYXllcnMpaWYoKGI9Yi5nZXRBbGxQbGF5ZXJzKCkpJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9bmV3IFBhKGJbYV0pO3RoaXMuSihnKXx8KHRoaXMuSyhnKSwobmV3IFFhKGcsdGhpcy5HKSkuYygpKX1lbHNlIHRoaXMuSSgpfWVsc2UgdGhpcy5WZSgpLAp0aGlzLkkoKX19KX0pKGMpO3ZhciBSYT1jLiRtfHxSYSxTYT1uZXcgUmEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzldO3RoaXMuemk9dGhpcy5hWzhdO3RoaXMuUXM9dGhpcy5hWzddO3RoaXMudHA9dGhpcy5hWzZdO3RoaXMuTXQ9dGhpcy5hWzRdO3RoaXMueXU9dGhpcy5hWzZdO3RoaXMucHU9dGhpcy5hWzRdO3RoaXMuTnM9dGhpcy5hWzddO3RoaXMua3Y9dGhpcy5hWzEwXTt0aGlzLkd4PXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsxMF19Yy5Obz1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTW06dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnppOnRoaXMuUHMoYSl9LFBzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Rczp0aGlzLnNwKGEpfSxzcDpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLnRwOnRoaXMuTHQoYSl9LEx0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NdDp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5vdShhKX0sb3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnB1OnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnM6dGhpcy5qdihhKX0sanY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmt2OnRoaXMuRngoYSl9LEZ4OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5HeDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIFRhPWMuTm98fFRhLG9kPW5ldyBUYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPW9kLkxtKDQpOyhmdW5jdGlvbihjKXtjLk1pPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsCmEpe3RoaXMuaShiKTt0aGlzLmRoPWF9LE06ZnVuY3Rpb24oKXt9LEVlOmZ1bmN0aW9uKGIpe3RoaXMuZGg9YjtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGgpLnBhcmVudE5vZGU7dGhpcy5TKGIpO3RoaXMuVihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIFVhPWMuTWl8fFVhOyhmdW5jdGlvbihjKXtjLkxpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmkoYixhKX0sRWU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTsKdmFyIGI9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUiksYT10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuQURWRVJUSVNJTkcpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuQkVHSU4sZnVuY3Rpb24oKXt0aGlzLnMoImNvbnRlbnRwbGF5Iik7dGhpcy5GKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMucygiY29udGVudHBsYXkiKTt0aGlzLkYoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBWYT1jLkxpfHxWYTsoZnVuY3Rpb24oYyl7Yy5OaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPQpicmlnaHRjb3ZlLmV4cGVyaWVuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1icmlnaHRjb3ZlLmdldEV4cGVyaWVuY2UoYSksZD0hMTtnJiYoZD1nLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUikpO2lmKGcmJmQmJmQuaXNQbGF5ZXJEZWZpbmVkKCkpZD1uZXcgVWEoZCxhKSx0aGlzLkooZCl8fChkLkVlKGEpLHRoaXMuSyhkKSxkPW5ldyBWYShkLHRoaXMuRyxnKSxkLkVlKGcpLGQuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFdhPWMuTml8fFdhLFhhPW5ldyBXYShpYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTHg9dGhpcy5hWzJdO3RoaXMuWXU9dGhpcy5hWzJdO3RoaXMuVXM9dGhpcy5hWzJdO3RoaXMuUXE9dGhpcy5hWzhdO3RoaXMuUnU9dGhpcy5hWzZdO3RoaXMuemo9dGhpcy5hWzddOwp0aGlzLmw9dGhpcy5hWzddfWMuZHU9YjtiLnByb3RvdHlwZT17S3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MeDp0aGlzLlh1KGEpfSxYdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWXU6dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuUHEoYSl9LFBxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5RcTp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnU6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnpqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgWWE9Yy5kdXx8WWEscGQ9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9cGQuS3goNCk7KGZ1bmN0aW9uKGMpe2MueGw9Cm4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLlMoYik7dGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sUGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sUDpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTsKdmFyIFphPWMueGx8fFphOyhmdW5jdGlvbihjKXtjLndsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlBhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMuSmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLkpjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLkpjKCl9LmJpbmQodGhpcykpKTp0aGlzLkpjKCl9LEpjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubygpOih0aGlzLnMoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksCjIwMCl9fSl9KShjKTt2YXIgJGE9Yy53bHx8JGE7KGZ1bmN0aW9uKGMpe2MueWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBaYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3ICRhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBhYj1jLnlsfHxhYixiYj1uZXcgYWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMueGs9dGhpcy5hWzFdO3RoaXMuQXI9dGhpcy5hWzFdO3RoaXMub3Y9dGhpcy5hWzhdO3RoaXMuUnQ9dGhpcy5hWzldO3RoaXMuWHE9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNV19Yy5Ybz1iO2IucHJvdG90eXBlPQp7cXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ0OnRoaXMud2soYSl9LHdrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54azp0aGlzLnpyKGEpfSx6cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXI6dGhpcy5udihhKX0sbnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm92OnRoaXMuUXQoYSl9LFF0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5SdDp0aGlzLldxKGEpfSxXcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWHE6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBjYj1jLlhvfHxjYixxZD1uZXcgY2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1xZC5xdCg0KTsoZnVuY3Rpb24oYyl7Yy5kbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLk1lPQowO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZmEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlYoYik6dGhpcy5mYSgpfSxBdjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnFiLGc9dGhpcy5vYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5LYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5yZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuTWU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/Cih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sVWE6ZnVuY3Rpb24oKXt0aGlzLk1lKys7aWYoMTA8dGhpcy5NZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSwKd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LApQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxsYTpmdW5jdGlvbigpe30sZ2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5OJiZ0aGlzLk4oKX19KX0pKGMpO3ZhciBkYj1jLmRtfHxkYjsoZnVuY3Rpb24oYyl7Yy5jbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLmtlKWlmKHRoaXMucmJ8fCh0aGlzLnJiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMucmIrKywxNTx0aGlzLnJiKXRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMua2U9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMueWEoKXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5XKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApfX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHwKNDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlc9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5XPXRoaXMuV3x8ITE7dGhpcy54YSgpO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50JiYhdGhpcy5Mcj8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5XKTt0aGlzLnUoKX0uYmluZCh0aGlzKSksdGhpcy5Mcj0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuQXYoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIGViPWMuY218fGViOyhmdW5jdGlvbihjKXtjLmVtPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLklhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IGRiKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLm1hfHx0aGlzLkooYSl8fCh0aGlzLksoYSksKG5ldyBlYihhLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgZmI9Yy5lbXx8ZmIsZ2I9bmV3IGZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5GcD10aGlzLmFbMl07dGhpcy5ldj10aGlzLmFbNl07dGhpcy5Vaz10aGlzLmFbNl07dGhpcy5Naj10aGlzLmFbMV07dGhpcy5Qdj10aGlzLmFbNV07dGhpcy5GdT10aGlzLmFbMl07dGhpcy5Jcz10aGlzLmFbMl07dGhpcy5rcj10aGlzLmFbMTBdO3RoaXMuVHk9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMl19Yy5FbT1iO2IucHJvdG90eXBlPXtFcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnA6dGhpcy5kdihhKX0sZHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ldjp0aGlzLlRrKGEpfSxUazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVWs6dGhpcy5MaihhKX0sTGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1qOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Qdjp0aGlzLkV1KGEpfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRnU6dGhpcy5IcyhhKX0sSHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5Jczp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua3I6dGhpcy5TeShhKX0sU3k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlR5OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgaGI9Yy5FbXx8aGIscmQ9bmV3IGhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9cmQuRXAoNCk7KGZ1bmN0aW9uKGMpe2MubGs9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYi5lbGVtZW50KTt0aGlzLlYoYi5lbGVtZW50KX0sUGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSwKa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIGliPWMubGt8fGliOyhmdW5jdGlvbihjKXtjLmtrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkYoKX19KX0pKGMpO3ZhciBqYj1jLmtrfHxqYjsoZnVuY3Rpb24oYyl7Yy5taz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsCmZ1bmN0aW9uKGIpe2I9bmV3IGliKGIuZGV0YWlsKTtiLm1hfHx0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBqYihiLHRoaXMuRykpLmMoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGtiPWMubWt8fGtiLG1iPW5ldyBrYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncj10aGlzLmFbN107dGhpcy5QeD10aGlzLmFbMV07dGhpcy5Sdj10aGlzLmFbN107dGhpcy51bz10aGlzLmFbMV07dGhpcy5ocD10aGlzLmFbN107dGhpcy5waT10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs4XX1jLkJyPWI7Yi5wcm90b3R5cGU9e2ZyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3I6dGhpcy5PeChhKX0sT3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5QeDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUnY6dGhpcy50byhhKX0sdG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy51bzp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaHA6dGhpcy5vaShhKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnBpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgbmI9Yy5Ccnx8bmIsc2Q9bmV3IG5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9c2QuZnIoNCk7KGZ1bmN0aW9uKGMpe2MuTWs9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUudmcoYiwiZWxlbWVudElEIik7dGhpcy5saD1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Cmcuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLmxoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToiYWZ0ZXIiPT10aGlzLmxoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYSk7dGhpcy5TKGcpO3RoaXMuVihnKTt0aGlzLmJkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5iZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYmQpfSxrYTpmdW5jdGlvbigpe3JldHVybiEwfSxwcTpmdW5jdGlvbigpe2UuUGcodGhpcy5iZCk7ZS51ZSh0aGlzLmJkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucHEoKX0uYmluZCh0aGlzKSwKNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgb2I9Yy5Na3x8b2I7KGZ1bmN0aW9uKGMpe2MuTGs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkYoITApfX0pfSkoYyk7dmFyIHBiPWMuTGt8fHBiOyhmdW5jdGlvbihjKXtjLk5rPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSWE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLnZnKGIsImVsZW1lbnRJRCIpO2UuUGcoYSkmJihiPW5ldyBvYihiKSx0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBwYihiLHRoaXMuRykpLmMoKSkpO3RoaXMueWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMueWI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBxYj1jLk5rfHxxYixyYj1uZXcgcWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnU9dGhpcy5hWzFdO3RoaXMuVnk9dGhpcy5hWzldO3RoaXMuRHc9dGhpcy5hWzhdO3RoaXMudm49dGhpcy5hWzddO3RoaXMubD10aGlzLmFbN119Yy5hcT1iO2IucHJvdG90eXBlPXtNdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTnU6dGhpcy5VeShhKX0sVXk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZ5OnRoaXMuQ3coYSl9LEN3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Edzp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudm46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBzYj1jLmFxfHxzYix0ZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9dGQuTXUoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnRrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LG93OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sRm86ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHg9Yy50a3x8eDsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGcsZCxjKXt0aGlzLlhhPWE7dGhpcy5wZz10aGlzLmFpPSExO3RoaXMuZmg9ZDt0aGlzLkVoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLlhhPW5ldyB4KGEpKTsKdmFyIGU9dGhpcy5CYj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9ZS5yZWFkeVN0YXRlfHwyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzfHxnKGUpO2lmKGQmJjQ9PWUucmVhZHlTdGF0ZSYmMjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1cylkKGUpO2Vsc2UgaWYoND09ZS5yZWFkeVN0YXRlJiYwPT1lLnN0YXR1cyYmbCYmbC55ZSh0aGlzLlhhLnVybCkmJmwuRmQpe3ZhciBoPW5ldyB4KGEudXJsKTtoLm93KCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwubmEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLm5hKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT0KZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMudWs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMucGcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkVoP3RoaXMuQmIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5CYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLmFpfHwodGhpcy5CYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuQmIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksdGhpcy5CYi5zZW5kKGEpfWNhdGNoKGMpe2wmJmwueWUodGhpcy5YYS51cmwpPwpsLkZkP2wubmEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwueWUodGhpcy5YYS51cmwpLHRoaXMuZmgmJnRoaXMuZmgoKX1yZXR1cm4gdGhpcy5CYn19fSkoYyk7dmFyIHRiPWMudWt8fHRiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zYT0hMTt0aGlzLmhjPSIiO3RoaXMuWGQ9dGhpcy5nYz10aGlzLmtiPW51bGw7dGhpcy5KcT10aGlzLndiPXRoaXMuVmc9ITE7dGhpcy5HYT0iIjt0aGlzLlJnPSExO3RoaXMuQ2E9dGhpcy5oZD0iIjt0aGlzLk5nPXRoaXMuYmE9dGhpcy5pc0VuYWJsZWQ9dGhpcy5TZT0hMTt0aGlzLkFhPVtdO3RoaXMuRWc9dGhpcy5SYj0iIjt0aGlzLmdlPSExO3RoaXMuZ2Y9MDt0aGlzLnhmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMudmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLkNiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5GYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy53Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuVGI9IiI7dGhpcy54Yj1bXTt0aGlzLlViPVtdO3RoaXMuU2I9IiI7dGhpcy5oZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnJlPSExO3RoaXMucnE9dGhpcy5HZD1udWxsO3RoaXMuQWg9dGhpcy5EYz10aGlzLmhnPXRoaXMubWY9dGhpcy5GZD10aGlzLllkPXRoaXMuSGM9ITE7dGhpcy4kYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5rZD0wO3RoaXMuR2c9ITE7dGhpcy5GZz0xRTN9Yy52az1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5zYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLmhjLGFkdGFnbW9kaWZpZXI6dGhpcy5rYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuZ2MsYWR0YWdyZWdleDp0aGlzLlhkLGpzcG9wdXBzOnRoaXMuVmcsCnNpZGVsb2Fkczp0aGlzLndiLGRpc2FibGV0ZXN0czp0aGlzLkpxLGhvbWFkQWxpYXM6dGhpcy5HYSxpc0luaXRpYWxpemVkOnRoaXMuUmcsZ2xvYmFsQ29uZmlnOnRoaXMuaGQsY2xpZW50Q29uZmlnOnRoaXMuQ2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5iYSxpc0Jsb2NrZWQ6dGhpcy5OZyxzZXJ2ZXI6dGhpcy5BYSxzdm1Db25maWc6dGhpcy5SYixob21hZEFkcGF0aDp0aGlzLkVnLGRpc2FibGVDb29raWVUZXN0OnRoaXMuZ2UsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuZ2YsSE9NQURfVkVSSUZJRUQ6dGhpcy54ZixIT01BRF9CTE9DS0VEOnRoaXMudmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuQ2IsSE9NQURfQURCTE9DS0VSOnRoaXMuRmMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLndmLHRlc3RIaWRlOnRoaXMuVGIsdGVzdFRhZ3M6dGhpcy54Yix0ZXN0VGFnc0pTOnRoaXMuVWIsdGVzdENvb2tpZTp0aGlzLlNiLHRocm90dGxlOnRoaXMuaGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsCmhvbWFkVGVzdGVkOnRoaXMucmUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5ycSxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5ZZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5GZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5tZixjb25maWdGYWlsdXJlczp0aGlzLiRhLHNpdGVDb25maWc6dGhpcy5RYixzZXJ2ZXJJZDp0aGlzLnZoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5uYyx2cGFpZDp0aGlzLkRjLHNraXBBbGxvd2VkOnRoaXMuQWgsdm1hcHM6dGhpcy5XaH19LEVzOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLiRhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuJGFbYl0mJjE9PXRoaXMuJGFbYl0mJihhPSEwKTtyZXR1cm4gYX0sWGU6ZnVuY3Rpb24oYSl7dGhpcy4kYVthXT0hMH0sZHM6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuJGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy4kYVtiXSYmCjE9PXRoaXMuJGFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sRGQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMudWIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5NcChhKX0sd2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLGU9IiIsaD0iIixrPSIiO2lmKCF0aGlzLnNhJiYhYilyZXR1cm4gbmV3IHgoYSk7Yz10aGlzLnhlKGEpO2U9dGhpcy56YShhKTtjPwoodGhpcy52YygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy52ZCgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLmhjfHx0aGlzLmtifHx0aGlzLmdjfHx0aGlzLlhkKSYmKGs9dGhpcy5udShrKSk7YT1uZXcgeChoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmZzKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLm5iKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0seGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsKKGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy52YygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sdmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQWEmJnRoaXMuQWEubGVuZ3RoJiYwPHRoaXMuQWEubGVuZ3RoJiYoYj10aGlzLkFhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LHllOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMueGUoYSk7cmV0dXJuIGJ9LGZzOmZ1bmN0aW9uKGEpe3ZhciBiPQoiIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuR2EmJjA8dGhpcy5HYS5sZW5ndGgpcmV0dXJuIHRoaXMuR2E7Zm9yKGQgaW4gdGhpcy5HYSlpZihiPXRoaXMuR2FbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5nejtyZXR1cm4ibm9uZSJ9LGxkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQWFbdGhpcy52aF19LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZCgpLGI9dGhpcy56aCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxhaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spOwpyZXR1cm4gYn0sbXU6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLnphKGEpLGM9IiIsYz0iIixoO2ZvcihoIGluIGIpe2lmKGJbaF0uc3VidmFsdWVzKXtmb3IodmFyIEI9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbaF0pLnNwbGl0KCImIiksYz17fSxrPTA7azxCLmxlbmd0aDtrKyspe3ZhciByPUJba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5haChjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pO0I9W107Zm9yKGwgaW4gYylCLnB1c2gobCsiPSIrY1tsXSk7Yz1CPWVuY29kZVVSSUNvbXBvbmVudChCLmpvaW4oIiYiKSl9ZWxzZSBjPXRoaXMuYWgoZC5xdWVyeUtleVtoXSxoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31sPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbC5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxudTpmdW5jdGlvbihhKXt0aGlzLmhjJiYKKGErPXRoaXMuaGMpO2lmKHRoaXMua2IpZm9yKHZhciBiIGluIHRoaXMua2IpdGhpcy5rYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5rYltiXSkpO3RoaXMuZ2MmJihhPXRoaXMubXUoYSx0aGlzLmdjKSk7cmV0dXJuIGF9LGY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLlJnPSEwO3RoaXMuaGQ9YTt0aGlzLkNhPWI7dGhpcy5TZT1kO3RoaXMuR2Q9Yzt0aGlzLmxjPWU7dGhpcy5RYj1ofHx7fTt0aGlzLlp0KCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkNhKXRoaXMuWHQoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuQ2EpdHJ5e3RoaXMuQ2E9YigpLHRoaXMuV2MoKX1jYXRjaChrKXt0aGlzLm5hKCJub0NsaWVudENvbmZpZyIpfX0sZmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwKITEpfXJldHVybiBifSxadDpmdW5jdGlvbigpe3RoaXMuSGEobmV3IHgodGhpcy5oZCt0aGlzLk9jKCJnbG9iYWwiKSksdGhpcy53cy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLldjKCl9LmJpbmQodGhpcyksITApfSxYdDpmdW5jdGlvbigpe25ldyB4KHRoaXMuQ2ErdGhpcy5PYygiY2xpZW50IikpO3RoaXMuSGEobmV3IHgodGhpcy5DYSt0aGlzLk9jKCJjbGllbnQiKSksdGhpcy5XYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiY2xpZW50Iik7dGhpcy5uYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sT2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMudWIoKTt0aGlzLlFiJiZ0aGlzLlFiLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5RYiYmdGhpcy5RYi5ub0NhY2hlQnVzdGVyJiYKKGI9IiIpO3JldHVybiBifSxuYTpmdW5jdGlvbihhKXtpZighdGhpcy5ZZCl7dGhpcy5ZZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLmZkKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5sYz0hMSk7dGhpcy5sYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmxjP3RoaXMubGMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuYmE9dGhpcy5OZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy52ZikpO3RoaXMuemIoKTtlLm9jKGsucHYpOyhiPWUuZmQodGhpcy5sZCgpKSl8fChiPWUuZmQoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHdzOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXt2YXIgYj0Ke307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5WYihiLmVuYWJsZWQpO3RoaXMuYmE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5DYXx8dGhpcy5SYnx8dGhpcy5HYXx8dGhpcy5XYygpOih0aGlzLnNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKSx0aGlzLnpiKCkpfX0sV2M6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5DYX1lbHNlIGE9dGhpcy5DYTt0aGlzLmlzRW5hYmxlZD10aGlzLlZiKGEuZW5hYmxlZCk7dGhpcy5iYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5BYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuQWEubGVuZ3RoO2IrKyl0aGlzLkFhW2JdPQp0aGlzLkFhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLlJiPWEuY29uZmlnfHwiIjt0aGlzLkdhPWEuYWxpYXN8fG51bGw7dGhpcy5FZz1hLmFkcGF0aHx8IiI7dGhpcy5nZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLnZoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLkFhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuUmImJnRoaXMuR2EmJnRoaXMuQWEubGVuZ3RoP3RoaXMub2QoITEpOih0aGlzLnNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKSx0aGlzLnpiKCkpfSxvZDpmdW5jdGlvbihhKXtpZighdGhpcy5iYSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHgodGhpcy52ZCgpKSxkPXRoaXMuemEodGhpcy5SYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjsKYi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHgodGhpcy5SYit0aGlzLk9jKCJjdXN0b21lciIpKTt0aGlzLkhhKGIsdGhpcy5Ndy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiY3VzdG9tZXIiKTthP3RoaXMuSW0/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5JbT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2QoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMub2QoITApfS5iaW5kKHRoaXMpLCEwKX19LE13OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fXRoaXMuRmQ9dGhpcy5WYihiLnN0cmljdCk7dGhpcy5tZj10aGlzLlZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLmhnPQpiLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMubmM9dGhpcy5WYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuVmIoYi5lbmFibGVkKTt0aGlzLlRiPWIudGVzdGhpZGV8fCIiO3RoaXMueGI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLlViPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuaGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5rYj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5nYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuWGQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVmc9Yi5qc3BvcHVwc3x8ITE7dGhpcy53Yj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5EYz1iLnZwYWlkfHwhMTt0aGlzLlFiLnZwYWlkPXRoaXMuRGM7dGhpcy5BaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLlRjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5XaD1iLnZtYXBzfHwiIjt0aGlzLlNiPWIudGVzdDNyZHBhcnR5Y29va2llJiYKYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLm9zKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5nZSYmKHRoaXMuU2I9bnVsbCk7dGhpcy5oZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnJlJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5yZT0hMCx0aGlzLm9kKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmt4KCkmJih0aGlzLlRifHx0aGlzLlVifHx0aGlzLnhifHx0aGlzLlNiKT90aGlzLlNlPyh0aGlzLnNhPXRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKSx0aGlzLmFlKCksdGhpcy56YigpKTp0aGlzLlF3KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuUncoKSl9fSxRdzpmdW5jdGlvbigpe3RoaXMuUHcoKTt0aGlzLlN3KCl9LFN3OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciKwphKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Mud2lkdGg9MTtjLmhlaWdodD0xO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7Yy5zcmM9ImFib3V0OmJsYW5rIjt2YXIgaD1lLmdhKDEwKSxCPWUuZ2EoMTApLGs9ZS5nYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoayxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwKIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKTtjLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShrKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShCKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS5uYihhKGgpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGwpe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYyk7aWYoMyE9ZCl7dmFyIGE9ZS5mZSgpOyFhLmlzQ2hyb21lJiYKIWEuaXNGaXJlZm94fHxhLmlzRWRnZXx8ZS5QYSgpfHx0aGlzLm5hKCJjc3BfIitiKTtlLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxSdzpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKTt0aGlzLnpiKCl9LEVkOmZ1bmN0aW9uKGEpe3RoaXMuSGM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9dGhpcy5zYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIoYSkpLHRoaXMuemIoKSx0aGlzLmFlKCkpfSxQdzpmdW5jdGlvbigpe2lmKHRoaXMuVGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuVGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5UYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTsKZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGMpe31hP3RoaXMuRWQodGhpcy5GYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuSWgoKX1lbHNlIHRoaXMuSWgoKX0sSGg6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMudWIoKSk7dGhpcy5WdyhmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuZGYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkVkKHRoaXMuRmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnhiPW51bGwsdGhpcy5kZigpfSxWdzpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmCmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSGEobmV3IHgoYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LEloOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLnViKCkpO3RoaXMuV3coZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLkhoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5FZCh0aGlzLkZjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlViJiZ0aGlzLlViLmxlbmd0aCl7dmFyIGM9dGhpcy5VYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLkhoKCl9LFd3OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmCmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpO2wuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0sZGY6ZnVuY3Rpb24oKXt0aGlzLlNiPyh0aGlzLmdmKyssdGhpcy5IYShuZXcgeCh0aGlzLlNiKSx0aGlzLk93LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuRmgoKX0sZWY6ZnVuY3Rpb24oYSl7dGhpcy5FZCh0aGlzLndmLAoibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LE93OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLmdmP3RoaXMuZGYoKTp0aGlzLmVmKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5GaCgpOnRoaXMuZWYoIkFBQSIpfSxGaDpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKTt0aGlzLnpiKCk7dGhpcy5hZSgpfSx6YjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5QYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLkhjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy54ZikpOwp0aGlzLkdkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuR2QmJnRoaXMuR2QoKX0sb3E6ZnVuY3Rpb24oKXtpZih0aGlzLm1mJiZ0aGlzLkVzKCkpe3ZhciBhPXRoaXMuZHMoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LEtoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSGE6ZnVuY3Rpb24oYSxiLGMsZixoLEIpe3RoaXMua2R8fCh0aGlzLmtkPTApO3RoaXMua2QrKzt0aGlzLmtkPnRoaXMuRmcmJiF0aGlzLkdnJiYodGhpcy5HZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuRmcsITApKTthPW5ldyB0YihhLGIsYyk7ZiYmKGEuYWk9ITApO2gmJmUueXQoKSYmKGEucGc9ITApO0ImJgooYS5FaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxUZjpmdW5jdGlvbigpe2UuUGEoKXx8ZS5UYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7dGhpcy5uYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy52YygpfHwKKGE9dGhpcy56YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMubmEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubmEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LE53OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLldofSxucTpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkhhKGEsdGhpcy5YeC5iaW5kKHRoaXMpLHRoaXMuV3guYmluZCh0aGlzKSl9LFh4OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5HcigpfSxXeDpmdW5jdGlvbigpe30sR3I6ZnVuY3Rpb24oKXtlLm9jKGsuRnIpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMubmEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAphZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLndiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMud2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy53YlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5UYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9bmV3IFI7d2luZG93W2MudWMoKV09dGhpcztlLlRhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LGt4OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuaGZ9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSx1YjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqCk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LFZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LG5iOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGYsZSxoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxmPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSx6aDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCx0PTMyODUzNzc1MjAscCxuLHYsdSx3O3A9YS5sZW5ndGg7dmFyIHg9W107Zm9yKGY9MDtmPHAtMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseC5wdXNoKGUpOwpzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHgucHVzaChmKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gocD4+PjI5KTt4LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT14W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7cD1sO249bTt2PXE7dT10O2ZvcihmPTA7MTk+PWY7ZisrKXc9YyhlLDUpKyhwJm58fnAmdikrdStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztmb3IoZj0yMDszOT49ZjtmKyspdz1jKGUsNSkrKHBebl52KSt1K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9dix2PW4sbj1jKHAsMzApLHA9ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhwJm58cCZ2fG4mdikrdStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXYsdj1uLG49YyhwLDMwKSxwPWUsZT13O2ZvcihmPTYwOzc5Pj1mO2YrKyl3PWMoZSw1KSsocF5uXnYpK3UraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK24mNDI5NDk2NzI5NTtxPXErdiY0Mjk0OTY3Mjk1O3Q9dCt1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYih0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIHViPWMudmt8fHViLGw9bmV3IHViO3dpbmRvdy5yZz1sO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybD10aGlzLmFbMTBdO3RoaXMuSHY9dGhpcy5hWzhdO3RoaXMua2w9dGhpcy5hWzZdO3RoaXMuUGs9dGhpcy5hWzhdO3RoaXMuUGk9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzddO3RoaXMuRHg9dGhpcy5hWzddO3RoaXMuWm89dGhpcy5hWzldO3RoaXMuSWw9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbMl19Yy5TdT1iO2IucHJvdG90eXBlPXtxbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucmw6dGhpcy5HdihhKX0sR3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkh2OnRoaXMuamwoYSl9LGpsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbDp0aGlzLk9rKGEpfSxPazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGs6dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlBpOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuS2k6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhxOnRoaXMuQ3goYSl9LEN4OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5EeDp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWm86dGhpcy5IbChhKX0sSGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgdmI9Yy5TdXx8dmIsdWQ9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9dWQucWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLlA/dGhpcy5WYT1hLm0uUCgpOnRoaXMuVmE9IiI7YS5tLkxnJiZhLm0uTGcoe3BhdXNlOnRoaXMucmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy50aC5iaW5kKHRoaXMpLAptdXRlOnRoaXMuSWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5KeC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmFiO3RoaXMucGxheWVyPXRoaXMuYi5tO3RoaXMuRmI9dGhpcy5SYz0hMTt0aGlzLktwPTFFMzt0aGlzLmphPW51bGw7dGhpcy5UPWI7dGhpcy51YT17fTt0aGlzLnZpZGVvPXt9O3RoaXMuQ2Q9e307dGhpcy5YcD1lLmdhKDEwKTt0aGlzLmFmPTA7dGhpcy5QYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLlBjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5tKSYmdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLlBjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLktvPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuQmQ9ITE7dGhpcy5ZZz1jJiZjLm1heFdyYXBwZXJEZXB0aD8KcGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuZz17fTt0aGlzLk5jPSExO3RoaXMuTmg9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5LYj0hMTt0aGlzLkRxPWUuZ2EoMTApO3RoaXMuTmI9ZS5nYSgxMCk7dGhpcy5NYj1lLmdhKDEwKTt0aGlzLkJoPWUuZ2EoMTApO3RoaXMuY29uZj17fTt0aGlzLm1jPXRoaXMudGI9ITE7dGhpcy5qZT1udWxsO3RoaXMuSmQ9dGhpcy5BYj10aGlzLnRlPXRoaXMuUGU9dGhpcy5iZT10aGlzLiRjPXRoaXMuY2Y9dGhpcy5aYj10aGlzLkxkPXRoaXMuaGg9dGhpcy5jZD10aGlzLnF4PXRoaXMuaWI9ITE7dGhpcy5jYz1bXTt0aGlzLldiPXt9O3RoaXMuamY9ITF9Yy5waz1iO2IucHJvdG90eXBlPXt3aDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlZhXSYmdGhpcy5jb25mW3RoaXMuVmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5WYV1bYV0pOwpyZXR1cm4gYn0sTGg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuT2EmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuVC5IYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLncoay56byx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpfSxDZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5pYj1jO2lmKHRoaXMuVC5iYSl0aGlzLmFmKyssdGhpcy5ULm9xKCksdGhpcy5ULnNhJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLkxoKCksbmV3IFUodGhpcyxhLHRoaXMuWWcse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5EYyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5tLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLm0uZ2V0Q3VycmVudFRpbWUoKX19KSk6CmI/KHRoaXMuTGgoKSxuZXcgVSh0aGlzLGEsdGhpcy5ZZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuVC5EYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLm0uZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIubS5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLkxhKCk7ZWxzZXt2YXIgZj10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkNlKGEsYixjKX0sNTApfX0sTmU6ZnVuY3Rpb24oYSl7dGhpcy5KZD10aGlzLkFiPXRoaXMuY2Q9ITE7dGhpcy5nPWE7dGhpcy53dyh0aGlzLmcpO3RoaXMuQmcoYSk7dGhpcy5jYz10aGlzLnNnKGEpO3RoaXMuV2I9e307dGhpcy5qZj0hMX0sQmc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuQ2Q9dGhpcy5ycyhhKSksdGhpcy5CZyhhLnBhcmVudCkpfSxzZzpmdW5jdGlvbihhKXt2YXIgYz0KW107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLnNnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuWnIoYSkpKTtyZXR1cm4gY30sWnI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlgmJmEuWC5nZXRBdHRyaWJ1dGUpe2I9YS5YLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LHJzOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5YKXtiPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWC5nZXRBdHRyaWJ1dGUoImlkIikmJgooaD1hLlguZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5YLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlguZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5iYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmh9fSxyYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuYWQmJmEuYWQuZXJyb3ImJmEuYWQuZXJyb3IuY29kZSYmKGI9YS5hZC5lcnJvci5jb2RlKSk7CnN3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5FYy5jb2RlOmI9PUQuTmQuY29kZT9lLncoay51eSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpOihlLkRlKCksYj09RC5BZi5jb2RlJiZlLncoay5ydSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKTtlLncoay5Fcix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHcueWYuY29kZTplLncoay5ZeCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHcuQmYuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLncoay5BeSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB3Lk9kLmNvZGU6ZS53KGsuRnksCnRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5NZC5jb2RlOmUudyhrLnN1LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMubWN8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3IudGEmJihjKz0iXyIrYS5lcnJvci50YSk7ZS50cmFjayhjLCIiLCEwKTt0aGlzLkdiKGEpO3RoaXMuTGEoKX0sR2I6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkthLmxlbmd0aDspdHJ5e3ZhciBjPQphLkthLnBvcCgpO3RoaXMuQmUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHd3OmZ1bmN0aW9uKGEpe3RoaXMuYmU9dGhpcy50ZT10aGlzLlBlPSExO3RoaXMudWE9dGhpcy5iLkw7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMudWEuekluZGV4PWI7Yj10aGlzLmIuSDtiLkJ6PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgYyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShjKSYmYi5zZXRBdHRyaWJ1dGUoYyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtjXSk7CnRoaXMuS28mJnRoaXMucGxheWVyLnFjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5xYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5VLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLlVbY10udHlwZSkmJnRoaXMuR28oYixhLlVbY10udXJsKyIiLGEuVVtjXS50eXBlKTt0aGlzLkpoKGIpPyh0aGlzLklvKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuamE9dGhpcy51YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuamEuYXBwZW5kQ2hpbGQoYikpOnRoaXMuZy55cSgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5qYT10aGlzLnVhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5qYS5hcHBlbmRDaGlsZChiKSx0aGlzLnV3KCkpOnRoaXMud2UoKT90aGlzLnloKCk6dGhpcy5nLm9yaWdpbi5pZyh3Lk1kKX0sdXc6ZnVuY3Rpb24oKXt0aGlzLlpiPXRoaXMuTGQ9ITE7dGhpcy5iLm0ua2EmJnRoaXMuYi5tLmthKCkmJihlLncoay4kZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMuWmI9ITApO2UuWWYoKTt0aGlzLmcmJnRoaXMuZy5vcmlnaW4mJnRoaXMuZy5vcmlnaW4uc2YmJmUuSm8odGhpcy5nLm9yaWdpbi5zZik7ZS5ZYSgic2V0VXBWcGFpZCIpO3ZhciBhPXRoaXMuYi5IO3RoaXMuYi5IPUMucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuSCwKYSk7dGhpcy5iLmloKCk7dGhpcy5iLkFjKCk7Zm9yKGE9dGhpcy5iLkw7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5BYygpO3RoaXMuamE9dGhpcy51YT10aGlzLmIuTDt0aGlzLm9mKCJ2cGFpZCIpO3RoaXMuWmImJihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1iKS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsucGQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk7dGhpcy5PPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5PLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5MLmFwcGVuZENoaWxkKHRoaXMuTyk7dGhpcy5PLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5tLmthJiZ0aGlzLmIubS5rYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5nLnRzKCksYz10aGlzLmcuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLndpZHRoKSwKaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLAoxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmVxKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5UKTt0aGlzLk8uc3JjPWE7ZS5WZCgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLkpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmNjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOwoiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLml5KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuankoKSx0aGlzLmIuSmIoITApLCF0aGlzLkFiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkFiPXtlbDp0aGlzLk8sY2I6ZnVuY3Rpb24oKXt0aGlzLkpkPSEwO2UudyhrLlZoLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLnZlKHRoaXMuQWIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmCih0aGlzLmIuSmIoITApLHRoaXMubnkoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLkpiKCEwKSx0aGlzLnJ5KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnB5KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnF5KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuc3koKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMub3koKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuWGgoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGg9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmcuamMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsuWmYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXt2YXIgYT0Kd2luZG93Lm9wZW4oIiIsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGIpe3dpbmRvdy5vcGVuKGgsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLm15KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5VZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt5KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLmx5KCk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5aYj0hMCxiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsucGQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk6KHRoaXMuWmI9ITEsYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay5sZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKSxlLncoay5VZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX19LmJpbmQodGhpcykpO2UuVmQoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuTGEoKX0uYmluZCh0aGlzKSk7ZS5WZCgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5EbyhmdW5jdGlvbihhKXtlLm9hKHRoaXMuTywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LApreTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMudHJhY2soInBhdXNlIik7ZS53KGsuU2QsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLkxkPSEwfSxseTpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuTWMsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLkxkPSExfSxueTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLkxmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LG15OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLktmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LApqeTpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLllhKCJpbXByZXNzaW9uIik7ZS53KGsuR2YsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0scnk6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuWWEoInN0YXJ0Iik7ZS53KGsuTWMsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0scHk6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLkVmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LHF5OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLllhKCJtaWRwb2ludCIpO2UudyhrLklmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSl9LHN5OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5NZix0aGlzLmcuQiwKdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0sb3k6ZnVuY3Rpb24oKXt0aGlzLkhkKCk7ZS5ZYSgiY29tcGxldGUiKX0sWGg6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5ZYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuY2E9ITE7dGhpcy5MYShhKX19LGl5OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2csZj1bXTshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csKGY9Yi5tYXRjaChjKSk/Zi5qb2luJiYoYj1mLmpvaW4oIi0iKSk6Yj1iLnN1YnN0cmluZygwLDIwKSk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIiwKYiwhMCk7ZS5ZYSgiZXJyIixiKTtlLncoay50eSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMuWGgoITApfSxHbzpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpLGY7Zj10aGlzLlQ7Zi5zYSYmZi5pc0VuYWJsZWQmJiFmLnZjKCk/KGY9Zi56YShiKSxmPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpmPWI7Yy5zcmM9ZjtjLm9uZXJyb3I9dGhpcy4keC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sSW86ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuVWguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5wZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucWYuYmluZCh0aGlzKSk7CmEuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuSGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5JZC5iaW5kKHRoaXMpKX0sd2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuVWguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5wZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5IZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLklkLmJpbmQodGhpcykpfSxVaDpmdW5jdGlvbihhKXt0aGlzLkZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmJ8fHRoaXMucGYoYSl9LmJpbmQodGhpcyksdGhpcy5LcCkpfSxwZjpmdW5jdGlvbihhKXtpZighdGhpcy5SYyYmCnRoaXMuSmgodGhpcy52aWRlbykmJiF0aGlzLnRiJiYhdGhpcy5GYil7dGhpcy5SYz0hMDt0cnl7aWYoIWUuUGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMudGJ8fCh0aGlzLnRiPSEwLHRoaXMud2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5ULmhnfHx0aGlzLlQubmEoInZpZGVvLW5vb3AiKSk7dGhpcy5MYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLlp4KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIuQWMoKTt0aGlzLlNoKCk7dGhpcy5vZigpO3RoaXMuUWYoKTt0aGlzLmIuaWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuYmYoKX19LGJmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT0KdGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuT2EpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuamQ9W107Zm9yKHZhciBiPXRoaXMuYi5MLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmpkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuTGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuTGMoKX1lbHNlIHRoaXMuTGMoKX0sTGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5qZClmb3IodmFyIGI9MDtiPHRoaXMuamQubGVuZ3RoO2IrKyl0aGlzLmpkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLiRjfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksCnRoaXMuTGEoKSxlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsYiwhMCkpOih0aGlzLkllKCEwKSx0aGlzLkxjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLnRlJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5QZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLk9iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuT2IuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuT2IuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLk5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5iZigpKX0uYmluZCh0aGlzKTt0aGlzLm1lKCkueGgodGhpcyl9LEhkOmZ1bmN0aW9uKCl7dGhpcy5ULm5jJiYhdGhpcy50YiYmZS50cmFjaygicXVhcnRpbGUiLAoiY29tcGxldGUiLCEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLndvLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy5MYSgpfSxMYTpmdW5jdGlvbihhKXtpZighdGhpcy5iZSlpZih0aGlzLmJlPSEwLHRoaXMuSmR8fChlLncoay53dSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5oYnx8dGhpcy5nLmFjKXt0aGlzLmFmKys7dGhpcy5GYj10aGlzLlJjPSExO3RyeXt0aGlzLndkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudWEucmVtb3ZlQ2hpbGQodGhpcy5qYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5CZD0hMTt0cnl7dGhpcy5iLlBoKCl9Y2F0Y2goaCl7fXRoaXMuY2Y9ITA7dGhpcy5iLnBlKCk7dGhpcy5LYj0KITE7dGhpcy5tZSgpLnNoKCk7dGhpcy5nLmhiJiZ0aGlzLmcub3JpZ2luLkplKCk7dGhpcy5nLmFjJiYoYT90aGlzLmcub3JpZ2luLmJoKCk6dGhpcy5jZSgpKX1lbHNlIHRoaXMuY2UoKX0sJHg6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy53ZCh0aGlzLnZpZGVvKSx0aGlzLndlKCk/dGhpcy55aCgpOnRoaXMuSWQoYSkpfSxJZDpmdW5jdGlvbihhKXt0aGlzLkZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLndlKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1jfHx0aGlzLlQuVGYoKX0uYmluZCh0aGlzKSwKMUUzKTp0aGlzLlQuVGYoKSk7dGhpcy5nLm9yaWdpbi5pZyh3Lk1kKX0scWY6ZnVuY3Rpb24oKXtpZih0aGlzLnF4KXRoaXMuTGEoKTtlbHNle3RoaXMuS2I9ITA7dGhpcy5iLm0uVWEmJiF0aGlzLmNmJiZ0aGlzLmIubS5VYSgpJiZlLncoay5ZYyx0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy54eChhKTtpZighdGhpcy5BYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkFiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5KZD0hMDtlLncoay5WaCx0aGlzLmcuQiwKdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UudmUodGhpcy5BYil9Yz0iIjt0aGlzLmcuJGUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmgpKSYmKGM9dGhpcy5nLiRlLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkJkfHwodGhpcy5CZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5LZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMuZy5oYj8odGhpcy5GYj10aGlzLlJjPSExLHRoaXMud2QodGhpcy52aWRlbyksdGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnVhLnJlbW92ZUNoaWxkKHRoaXMuamEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuQmQ9ITEsdGhpcy5iLlBoKCksdGhpcy5nLm9yaWdpbi5KZSgpKTp0aGlzLkxhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlBjLnJlcGxhY2UoIlt0aW1lXSIsZS5xZyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLk5jPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSx5aDpmdW5jdGlvbigpe3RoaXMubWM9ITA7dGhpcy51YT10aGlzLmIuTDt0aGlzLnVhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy51YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTsKYS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMubXMoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmphPXRoaXMudWEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLkFjKCk7dGhpcy52aWRlbz10aGlzLmphLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy51YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudWEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlRoLmJpbmQodGhpcyk7dGhpcy5qYS5hcHBlbmRDaGlsZChiKTt0aGlzLlNoKCk7dGhpcy5vZigpO3RoaXMuamU9c2V0SW50ZXJ2YWwodGhpcy5tcS5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LG1zOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpbXSxiPXt9LGM9MDtjPHRoaXMuZy5VLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlVbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuVDtoLnNhJiZoLmlzRW5hYmxlZCYmIWgudmMoKSYmKGU9aC56YShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LG1xOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5qZSksdGhpcy5IZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnFmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLmplKSx0aGlzLklkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6CnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LE1oOmZ1bmN0aW9uKCl7dGhpcy5oaHx8KHRoaXMuaGg9ITAsdGhpcy5jZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh4OmZ1bmN0aW9uKGEpe2UudyhrLlVkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7YT09dGhpcy5OaHx8dGhpcy50Ynx8KDA9PWEmJih0aGlzLmliJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmliKSx0aGlzLmliPSExKSx0aGlzLlBlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLnRlPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLk1oKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpKSwKdGhpcy5tYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMudGJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlBhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLncoay5HZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLGUudyhrLkxmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksdGhpcy5tYyYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5ULm5jJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5jZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLkVmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5uYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS53KGsuSWYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuVC5uYyYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudyhrLk1mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpLHRoaXMuTmg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMudGIpe3RyeXtpZih0aGlzLldiW2FdPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuV2IuaW1wcmVzc2lvbiYmdGhpcy5XYi5jb21wbGV0ZSYmIXRoaXMuamYpe3RoaXMuamY9ITA7dmFyIGM9dGhpcy5XYi5jb21wbGV0ZS0KdGhpcy5XYi5pbXByZXNzaW9uLGY9InN0YXRzX2hkX3RpbWVkaWZmIjt0aGlzLk8mJihmKz0idnBhaWQiKTs1RTM+YyYmZS50cmFjayhmLGMsITApfX1jYXRjaChoKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWM9W107dHJ5e2M9dGhpcy5zcyh0aGlzLmcuS2EsYSl9Y2F0Y2gobCl7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIG09Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuQ2QuaW1wcmVzc2lvbnMmJmUud3QobS51cmwsdGhpcy5DZC5pbXByZXNzaW9ucyk/dGhpcy5CZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS53KGsueW8sdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHthZElkOnRoaXMuQ2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LAp0aGlzLkQoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5CZShtLnVybCxtLnR5cGUpfWNhdGNoKHIpe31pZighYil0cnl7dGhpcy5nLkthPXRoaXMuSHEodGhpcy5nLkthLGEpfWNhdGNoKG4pe319fSxCZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQud2EoYSksYyYmYS5GbyhjKSxmfHwoZj10aGlzLmdnKSx0aGlzLlQuSGEoYSxmLHRoaXMuZ2csITEsITApKX0sc3M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxIcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxaeDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5UaC5iaW5kKHRoaXMpfSxUaDpmdW5jdGlvbigpe2UudyhrLlpmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5jZCYmZS5QYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS4kcigpLCEwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXt2YXIgYT13aW5kb3cub3BlbigiIix0aGlzLlQuc2E/Il90b3AiOiJfYmxhbmsiKTthLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7YS5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuZy5qY31jYXRjaChiKXt3aW5kb3cub3Blbih0aGlzLmcuamMsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9LFNoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0KImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlBjLnJlcGxhY2UoIlt0aW1lXSIsZS5xZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5ULlRjJiYoYj10aGlzLlQuVGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuamEuYXBwZW5kQ2hpbGQoYSl9fSxyYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8CnRoaXMuVC5UYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0seWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuVC5UYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlkPXRoaXMuRHE7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209CiIwcHgiKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnpkKCk7dGhpcy55ZCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLnJjKCl9LmJpbmQodGhpcykpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLk5iO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudXguYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMudHguYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy56ZCgpO3RoaXMueWQoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5yYygpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTWI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnN4LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLnJ4LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuemQoKTt0aGlzLnlkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMucmMoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGguc3R5bGUucG9zaXRpb249ImFic29sdXRlIixoLnN0eWxlLnRvcD0iLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuQmg7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7Yi5hcHBlbmRDaGlsZChjKTt0aGlzLmcuJGUmJmIuYXBwZW5kQ2hpbGQoaCk7Yi5hcHBlbmRDaGlsZChmKTtiLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuamEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuemQoKTt0aGlzLnlkKCl9LmJpbmQodGhpcykpO3RoaXMuamEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMucmMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmphLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmthJiZ0aGlzLmIubS5rYSgpJiYoZS53KGsuJGYsdGhpcy5nLkIsCnRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksdGhpcy5JZSgpKTt0aGlzLnNjKCl9fSxzYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHpkOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayJ9LHR4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5iLkgucGF1c2VkPyh0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLk1jLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpOih0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuU2QsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LHV4OmZ1bmN0aW9uKCl7dGhpcy5MZD9lLm9hKHRoaXMuTywKImNvbnRyb2wiLCJwbGF5Iik6ZS5vYSh0aGlzLk8sImNvbnRyb2wiLCJwYXVzZSIpfSxyZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMuYi5ILnBhdXNlZHx8KHRoaXMuYi5ILnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5TZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sdGg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLmIuSC5wYXVzZWQmJih0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLk1jLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpfSxyeDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYi5ILm11dGVkPwoodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay5sZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKToodGhpcy5iLkgubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsucGQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LHN4OmZ1bmN0aW9uKCl7dGhpcy5aYj9lLm9hKHRoaXMuTywiY29udHJvbCIsInVubXV0ZSIpOmUub2EodGhpcy5PLCJjb250cm9sIiwibXV0ZSIpfSxJZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYi5ILm11dGVkfHwodGhpcy5iLkgubXV0ZWQ9ITAsCmEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudyhrLnBkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpfSxKeDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYi5ILm11dGVkJiYodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5sZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sT2I6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5PYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5PYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLAp0aGlzLk9iKTt0aGlzLiRjfHx0aGlzLk5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5iZigpKX0sY2U6ZnVuY3Rpb24oKXt0aGlzLiRjPSEwO3RoaXMuaWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuaWIpLHRoaXMuaWI9ITEpO2lmKCgicHJlcm9sbCI9PWUuT2EmJnRoaXMuTmN8fCJwb3N0cm9sbCI9PWUuT2EpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuT2EpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2Zvcih2YXIgYj10aGlzLmIuTDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLkFjKCk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLAoiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLmVlKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuZWUoKX1lbHNlIHRoaXMuZWUoKX0sZWU6ZnVuY3Rpb24oKXt0aGlzLmNmPSEwO3RoaXMuYi5wZSgpO3RoaXMuYi5idygpO3RoaXMuS2I9ITE7ZS53KGsuQ3EsCnRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy5tZSgpLnNoKCl9LG1lOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5tJiYoYT10aGlzLmIubSk7cmV0dXJuIGF9LHdlOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJihhPSEwKX1yZXR1cm4gYX0sUWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkVhKCJtaW5WaXMiKTthJiYoZS51ZSh0aGlzLnZpZGVvLGEpP3RoaXMudGgoKTp0aGlzLnJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFmKCl9LmJpbmQodGhpcyksCjEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5nJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5nLmpjLGEuZHVyYXRpb249dGhpcy5nLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5nLmhiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuY2MmJjA8dGhpcy5jYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuY2MpKTtyZXR1cm4gYX0sRDpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuWHArIi0iK3RoaXMuYWY7dGhpcy5nJiZ0aGlzLmcud2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5nLndnKCkpO3JldHVybiBhfSxnZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFA9Yy5wa3x8UDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5QdD10aGlzLmFbMl07dGhpcy5jbD0KdGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzJdO3RoaXMuS2o9dGhpcy5hWzddO3RoaXMuVm89dGhpcy5hWzFdO3RoaXMubGo9dGhpcy5hWzddO3RoaXMuZ3Y9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNF19Yy5WcT1iO2IucHJvdG90eXBlPXtPdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUHQ6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNsOnRoaXMuT20oYSl9LE9tOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5QbTp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS2o6dGhpcy5VbyhhKX0sVW86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbzp0aGlzLmtqKGEpfSxrajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubGo6dGhpcy5mdihhKX0sZnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmd2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgd2I9CmMuVnF8fHdiLHZkPW5ldyB3YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXZkLk90KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuQmE9bnVsbDt0aGlzLlo9W107dGhpcy5YPW51bGw7dGhpcy5iYz10aGlzLmRjPSExO3RoaXMuc2Y9IiI7dGhpcy5yZj0hMTtkJiZkLmVtcHR5P3RoaXMuYnUoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy55bj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5mZSgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPQpiLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeCh0aGlzLnVybCk6bC53YShsLkRkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuUGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUuYmcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwKImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuRGQoYSkpKyImdHlwZT1qcyIsYj1sLndhKGwuRGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwud2EobC5EZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkhhKGIsdGhpcy5hdS5iaW5kKHRoaXMpLHRoaXMuWXQuYmluZCh0aGlzKSl9LHRnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5CYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5CYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuT2EpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuQmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLk9hfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5PYXx8dGhpcy5BdChhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5OdygpKXRyeXt2YXIgZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49ZC5sZW5ndGgmJihkPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2RbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtmW2JdPWcuZmlyc3RDaGlsZDtjLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfWVsc2UgZi5zcGxpY2UoYiwxKX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxBdDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKToKMDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGF1OmZ1bmN0aW9uKGEpe3RoaXMuU3YoYSk7dHJ5e3RoaXMuQmE9YS5yZXNwb25zZVhNTCx0aGlzLkJhfHwodGhpcy5CYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLk1hKHcuT2QpKX10aGlzLlo9dGhpcy50ZygpO3RoaXMuZGM9dGhpcy5mZigpO3RoaXMuYmM9dGhpcy5HaCgpO3RoaXMuWi5sZW5ndGg/dGhpcy54YygpOnRoaXMucmEodGhpcy5NYSh3LkVjLHtlcnJvcjp0aGlzLnJmP0QuTmQ6CkQuemZ9KSl9LGJ1OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkJhfHwodGhpcy5CYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuTWEody5PZCkpfXRoaXMuWj10aGlzLnRnKCk7dGhpcy5kYz10aGlzLmZmKCk7dGhpcy5iYz10aGlzLkdoKCk7dGhpcy5aLmxlbmd0aD90aGlzLnhjKCk6dGhpcy5yYSh0aGlzLk1hKHcuRWMse2Vycm9yOnRoaXMucmY/RC5OZDpELnpmfSkpfSxZdDpmdW5jdGlvbigpe3RoaXMucmEodGhpcy5NYSh3LnlmLHtkZXB0aDphfSkpfSx4YzpmdW5jdGlvbigpe3RoaXMuWD10aGlzLlouc2hpZnQoKTt0aGlzLkN0KCk/dGhpcy5YdygpPyhhKyssbmV3IGIodGhpcyx0aGlzLkNnKCksZyx7QWRTeXN0ZW06dGhpcy5ZcigpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnJhKHRoaXMuTWEody5CZikpOihhPTAsdGhpcy5VeCgpJiZ0aGlzLk5lKHRoaXMuRXEoKSkpfSxKZTpmdW5jdGlvbigpe3RoaXMuZGM/Cih0aGlzLmRjPTE8dGhpcy5aLmxlbmd0aCx0aGlzLloubGVuZ3RoJiZ0aGlzLnhjKCkpOnRoaXMucGFyZW50LkplKCl9LGJoOmZ1bmN0aW9uKCl7dGhpcy5iYz8odGhpcy5iYz0xPHRoaXMuWi5sZW5ndGgsdGhpcy5aLmxlbmd0aCYmdGhpcy54YygpKTp0aGlzLnBhcmVudC5iaCgpfSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlV3KCk/dGhpcy5UdygpPyEwOigtMSE9dGhpcy5wYygpP3RoaXMucmEodGhpcy5NYSh3LnVmKSk6dGhpcy5yYSh0aGlzLk1hKHcubWopKSwhMSk6KHRoaXMucmEodGhpcy5NYSh3LkVjLEQuQWYpKSwhMSl9LE5lOmZ1bmN0aW9uKGEpe2EuS2E9YS5LYS5jb25jYXQodGhpcy5GZSgpKTthLmhiPWEuaGI/YS5oYjp0aGlzLmRjO2EuYWM9YS5hYz9hLmFjOnRoaXMuYmM7dGhpcy5wYXJlbnQuTmUoYSl9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IHhiO2EuZHVyYXRpb249dGhpcy5wYygpO2EuVT10aGlzLnpnKCk7YS5qYz10aGlzLmFzKCk7YS5vcmlnaW49dGhpczsKYS5CPXRoaXMuWHIoKTthLiRlPXRoaXMucXMoYS5kdXJhdGlvbik7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGIpe3RoaXMuWCYmKGIuS2E9Yi5lcnJvci5jb2RlIT13LnVmLmNvZGU/Yi5LYS5jb25jYXQodGhpcy5icygpKTpiLkthLmNvbmNhdCh0aGlzLmtzKCkpKTt0aGlzLloubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuR2ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5HYiYmdGhpcy5wYXJlbnQuR2IoYiksYT0wLHRoaXMueGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShiKSxhPTApfSxHYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5HYihhKX0saWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuTWEoYSxiKSl9LE1hOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHliKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sWHc6ZnVuY3Rpb24oKXtyZXR1cm4gYTwKZ30sVXc6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnpnKCkubGVuZ3RofSxUdzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMucGMoKX0sZmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlouZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxHaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWiYmMjw9dGhpcy5aLmxlbmd0aCYmIXRoaXMuZmYoKSYmKGE9ITApO3JldHVybiBhfSxTdjpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuc2Y9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLnJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LEN0OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5DZygpLmxlbmd0aH0sCkNnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGUodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sWXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZSh0aGlzLlgsIkFkU3lzdGVtIil9LEZlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuT2coYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuYmIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxPZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09CmEubm9kZU5hbWU/ITA6dGhpcy5PZyhhLnBhcmVudE5vZGUpOiExfSxrczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxiczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sYXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYih0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0semc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxTYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLApoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGl6OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmJiKGFbY10pfSk7dHJ5e3ZhciBkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLlNjKS1NYXRoLmFicyg3MDAtYi5TYyl9KSxnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLlNjKS1NYXRoLmFicyg3MDAtYi5TYyl9KSxiPWQuY29uY2F0KGcpfWNhdGNoKGUpe31yZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTsKZm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMuZ2QoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LHBjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuYmIodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxxczpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkd3KGQsCmEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LGxlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5iYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sbmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGJiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuZ2QoYSk6IiJ9LGdkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubmUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVT1jLnlufHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRwPXRoaXMuYVs5XTsKdGhpcy5LbT10aGlzLmFbMV07dGhpcy5PcT10aGlzLmFbM107dGhpcy5VdD10aGlzLmFbOV07dGhpcy5CdT10aGlzLmFbMV07dGhpcy52cT10aGlzLmFbMl07dGhpcy5BbD10aGlzLmFbMTBdO3RoaXMua209dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbNF19Yy5FeD1iO2IucHJvdG90eXBlPXtDcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHA6dGhpcy5KbShhKX0sSm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkttOnRoaXMuTnEoYSl9LE5xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PcTp0aGlzLlR0KGEpfSxUdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXQ6dGhpcy5BdShhKX0sQXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJ1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52cTp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQWw6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5rbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMuRXh8fHpiLHdkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXdkLkNwKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuS2E9W107dGhpcy5VPVtdO3RoaXMuamM9IiI7dGhpcy5CPXRoaXMuYWM9dGhpcy5oYj0hMTt0aGlzLnFlPXRoaXMub3JpZ2luPW51bGx9Yy5wbT1iO2IucHJvdG90eXBlPXt5cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxoczpmdW5jdGlvbigpe2lmKCF0aGlzLnFlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uQmEpe3ZhciBhPXRoaXMub3JpZ2luLkJhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJgowPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnFlPWFbY10pfXJldHVybiB0aGlzLnFlfSx3ZzpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5ocygpO2ImJmIuZ2V0QXR0cmlidXRlJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpO3JldHVybiBhfSx0czpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuVVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIHhiPWMucG18fHhiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNzPXRoaXMuYVs0XTt0aGlzLlJ4PXRoaXMuYVsyXTt0aGlzLlRpPXRoaXMuYVs2XTt0aGlzLmJ4PXRoaXMuYVs0XTt0aGlzLmFsPXRoaXMuYVs2XTt0aGlzLmh4PXRoaXMuYVsxXTt0aGlzLldyPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzddfWMuT249YjtiLnByb3RvdHlwZT17UnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5TczoKdGhpcy5ReChhKX0sUXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJ4OnRoaXMuU2koYSl9LFNpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVGk6dGhpcy5heChhKX0sYXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ieDp0aGlzLiRrKGEpfSwkazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYWw6dGhpcy5neChhKX0sZ3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmh4OnRoaXMuVnIoYSl9LFZyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIEFiPWMuT258fEFiLHhkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXhkLlJzKDQpO3ZhciB3PXtPZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIiwKdGE6IlhNTF9QQVJTRV9FUlJPUiJ9LG1qOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix0YToiRFVSQVRJT05fRVJST1IifSxFYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsdGE6IkVNUFRZX1ZBU1QifSxCZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix0YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0seWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSwKbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLHRhOiJMT0FEX0VSUk9SIn0sTWQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHRhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sWnk6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsCnRhOiJNRURJQUZJTEVfRVJST1IifSx1Zjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIix0YToiRFVNTVlfQUQifX0sRD17emY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIix0YToiTk9fQURTIn0sQWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHRhOiJOT19NRURJQUZJTEVTIn0sYXo6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsdGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxOZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix0YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5wdD10aGlzLmFbMl07dGhpcy5Ubz10aGlzLmFbM107CnRoaXMuSnA9dGhpcy5hWzNdO3RoaXMubXI9dGhpcy5hWzVdO3RoaXMueG09dGhpcy5hWzVdO3RoaXMuQ2w9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbM119Yy5HeT1iO2IucHJvdG90eXBlPXtvdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucHQ6dGhpcy5TbyhhKX0sU286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlRvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5KcDp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXI6dGhpcy53bShhKX0sd206ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnhtOnRoaXMuQmwoYSl9LEJsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5DbDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEJiPWMuR3l8fEJiLHlkPW5ldyBCYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT15ZC5vdCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmFkPWI7dGhpcy5LYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLlBqfHx5YjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5scD10aGlzLmFbNF07dGhpcy54cD10aGlzLmFbNF07dGhpcy5LeT10aGlzLmFbOF07dGhpcy5veD10aGlzLmFbM107dGhpcy56eD10aGlzLmFbNl07dGhpcy5Paj10aGlzLmFbNl07dGhpcy5WbD10aGlzLmFbNV07dGhpcy5qdT10aGlzLmFbNV07dGhpcy5kdz10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs1XX1jLkNqPWI7Yi5wcm90b3R5cGU9e2twOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5scDp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnhwOnRoaXMuSnkoYSl9LEp5OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LeTp0aGlzLm54KGEpfSxueDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm94OnRoaXMueXgoYSl9LHl4OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56eDp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT2o6dGhpcy5VbChhKX0sVWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlZsOnRoaXMuaXUoYSl9LGl1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qdTp0aGlzLmN3KGEpfSxjdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBDYj1jLkNqfHxDYix6ZD1uZXcgQ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT0KemQua3AoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5tPWE7dGhpcy5hYj1hLnVnKCk7dGhpcy5MPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuTC5pZD1lLmdhKDEwKTt0aGlzLkg9Qy5wb3AoKTt0aGlzLkh8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuSC5pZD0iYWRYZGlzcGxheSIsdGhpcy5ILnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5BPXt9O3RoaXMuWmQ9ITE7dGhpcy5sYj1bXX1jLnNqPWI7Yi5wcm90b3R5cGU9e3JnOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LApnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnJnKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5KcyhhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpOwpoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sTHc6ZnVuY3Rpb24oKXt0aGlzLlpkPSEwfSxQaDpmdW5jdGlvbigpe3RoaXMuSD1DLnBvcCgpO3RoaXMuSHx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saWg6ZnVuY3Rpb24oKXt0aGlzLm0ucGF1c2UoKTtlLncoay5ZYyx0aGlzLm0udigpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLlpkfHwodGhpcy5tLnBsYXkoKSxlLncoay5aYyx0aGlzLm0udigpKSl9LEFjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkwuc3R5bGUuekluZGV4PWE7dGhpcy5MLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuTC5zdHlsZS5tYXJnaW5SaWdodD0KImF1dG8iO3RoaXMuTC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuTC5zdHlsZS5ib3hTaXppbmc9dGhpcy5hYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5MLnN0eWxlLndpZHRoPXRoaXMuYWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9dGhpcy5hYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLmFiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuYWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuYWIpO3RoaXMubS5QYiYmdGhpcy5tLlBiKCk/dGhpcy5tLnVnKCkuYXBwZW5kQ2hpbGQodGhpcy5MKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuTCk7d2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sSnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxrZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMua2codGhpcy5hYik7aWYoYi54IT10aGlzLkEueHx8Yi55IT10aGlzLkEueXx8Yi5wb3NpdGlvbiE9dGhpcy5BLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuQS53aWR0aCYmMDx0aGlzLkEuaGVpZ2h0JiYwPT0KYi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMucGUoKTtyZXR1cm59dGhpcy5BPWI7dGhpcy5tLlBiKCk/KHRoaXMuTC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuTC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkwuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkwuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkwuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLkwuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkguc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5sYi5sZW5ndGg7YSsrKXRoaXMubGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5DaCh0aGlzLkwpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMTApfSxEbzpmdW5jdGlvbihhKXt0aGlzLmxifHwodGhpcy5sYj1bXSk7ImZ1bmN0aW9uIj09CnR5cGVvZiBhJiZ0aGlzLmxiLnB1c2goYSl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5MJiZ0aGlzLkwucGFyZW50Tm9kZSYmdGhpcy5MLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuTC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTCk7dGhpcy5IJiZ0aGlzLkgucGF1c2UmJnRoaXMuSC5wYXVzZSgpfX19KShjKTtmb3IodmFyIE89Yy5zanx8TyxDPVtdLERiPTA7MTAwPkRiO0RiKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1lLmdhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgST0hMSxlYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5HcT10aGlzLmFbMTBdO3RoaXMudnY9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMTBdfWMuTnQ9YjtiLnByb3RvdHlwZT17RnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkdxOnRoaXMudXYoYSl9LHV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52djp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEViPWMuTnR8fEViLEFkPW5ldyBFYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUFkLkZxKDQpOyhmdW5jdGlvbihjKXtjLllsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7CmF8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuWmUoYik7dGhpcy5lZygpfSxaZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkZhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxVYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmCmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sbWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSx2OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5GYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIEZiPWMuWWx8fEZiOyhmdW5jdGlvbihjKXtjLlhsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj1mYSgpO3RoaXMuRWI9dGhpcy5FYnx8ITE7dGhpcy5IZj10aGlzLkpmPQp0aGlzLktnPXRoaXMucWE9dGhpcy5rZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLk1yKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5rZj0hMDt0aGlzLktnJiZ0aGlzLlhmKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkucWI7YSYmYS5LYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlVjKCk7dGhpcy5LZz0hMDt0aGlzLlhmKCl9LmJpbmQodGhpcykpOwp0aGlzLlNmKCl9LFhmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWIpe3RoaXMuVWMoKTtpZighdGhpcy5rZiYmIXRoaXMuVWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLmtmJiZ0aGlzLkhmJiYhdGhpcy5KZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCl9LmJpbmQodGhpcyksMTAwKX19LFVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5BZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxBZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxTZjpmdW5jdGlvbigpe2lmKHRoaXMuVWMoKSl7dmFyIGI9CnRoaXMuQWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5KZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLkhmPWIuZnp9dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2YoKX0uYmluZCh0aGlzKSwxMDApfSxqejpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi53eigpOiExfSxwYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IucGMoKTotMX0sbHM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sTXI6ZnVuY3Rpb24oYixhKXt0aGlzLkViPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLkVifHwzMDI9PXRoaXMuRWI/dGhpcy5xYT0hMDp0aGlzLnMoImFkZXJyb3IiLHRoaXMuRWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYygpfS5iaW5kKHRoaXMpLDEwMCl9LFhjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnFhPyh0aGlzLm8oKSx0aGlzLmVhKCkpOmIubWQoKT8odGhpcy5GKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5scyhiKT8odGhpcy5GKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBHYj1jLlhsfHxHYjsoZnVuY3Rpb24oYyl7Yy5abD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LHp0OmZ1bmN0aW9uKCl7d2luZG93Lk9PLnZtLnNvLnFvP3dpbmRvdy5PTy52bS5zby5xby5keihmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuenQoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5OYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgRmIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSihjKXx8KHRoaXMuSyhjKSwobmV3IEdiKGMsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBIYj1jLlpsfHxIYixJYj1uZXcgSGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzNdO3RoaXMuUnk9dGhpcy5hWzEwXTt0aGlzLmNxPXRoaXMuYVsyXTt0aGlzLmw9CnRoaXMuYVsyXX1jLkl2PWI7Yi5wcm90b3R5cGU9e1lwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5acDp0aGlzLlF5KGEpfSxReTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnk6dGhpcy5icShhKX0sYnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jcTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIEpiPWMuSXZ8fEpiLEJkPW5ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUJkLllwKDQpOyhmdW5jdGlvbihjKXtjLmJqPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMubWE9ITE7dGhpcy5EZygpfSxEZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpOwpifHwoYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5TKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sbGE6ZnVuY3Rpb24oKXt0aGlzLm5oKCl9LApuaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuTiYmKDAsdGhpcy5OKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIEtiPWMuYmp8fEtiOyhmdW5jdGlvbihjKXtjLmFqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMubygiZW1wdHkiKSx0aGlzLmVhKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT0KYj90aGlzLmVhKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nKCk/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTGI9Yy5hanx8TGI7KGZ1bmN0aW9uKGMpe2MuY2o9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxxaDpmdW5jdGlvbihiKXtiPW5ldyBLYihiKTtiLm1hP3RoaXMuSSgpOnRoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3IExiKGIsdGhpcy5HKSkuYygpKX0sYzpmdW5jdGlvbigpe3RoaXMuT3J8fCh0aGlzLk9yPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5xaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTsKaWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnFoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgTWI9Yy5janx8TWIsVj1uZXcgTWIocSk7Vi5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud3g9dGhpcy5hWzNdO3RoaXMucHA9dGhpcy5hWzldO3RoaXMuQWs9dGhpcy5hWzJdO3RoaXMuRXk9dGhpcy5hWzddO3RoaXMuVHg9dGhpcy5hWzNdO3RoaXMuc2k9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzldfWMubm89YjtiLnByb3RvdHlwZT17dng6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy53eDp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucHA6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFrOnRoaXMuRHkoYSl9LER5OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FeTp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlR4OnRoaXMucmkoYSl9LHJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5zaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIE5iPWMubm98fE5iLENkPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUNkLnZ4KDQpOyhmdW5jdGlvbihjKXtjLldtPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlMoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxQYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuV218fFc7KGZ1bmN0aW9uKGMpe2MuVm09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkuUGYoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm8uYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LlBmKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuenUoYSl9LmJpbmQodGhpcykpO3kuRHMoKX0senU6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5vKCk7dGhpcy5lYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5vKCk7dGhpcy5lYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkYoKX19KX0pKGMpOwp2YXIgWD1jLlZtfHxYOyhmdW5jdGlvbihjKXtjLlhtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnFkJiYoYj1lLklxKGIsdGhpcy5xZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLkooZCkpe3RoaXMuSyhkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD0KYy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnFkfHwodGhpcy5xZD1bXSksdGhpcy5xZC5wdXNoKGJbYV0pLGQ9bmV3IFcoaCksdGhpcy5KKGQpfHwodGhpcy5LKGQpLGY9bmV3IFgoZCx0aGlzLkcpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sUGY6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sWXc6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy53Y3x8KHRoaXMud2M9W10pLHRoaXMud2MucHVzaChiKSx0aGlzLmF3KCkmJih0aGlzLlZlKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYKKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxEczpmdW5jdGlvbigpe2lmKHRoaXMud2MpZm9yKHZhciBiPTA7Yjx0aGlzLndjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMud2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lll3KGIpfX0pfSkoYyk7CnZhciBPYj1jLlhtfHxPYix5PW5ldyBPYihxKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFyPXRoaXMuYVsxMF07dGhpcy5mcD10aGlzLmFbMl07dGhpcy5lbj10aGlzLmFbOV07dGhpcy5Mcz10aGlzLmFbOF07dGhpcy5rbz10aGlzLmFbMV07dGhpcy5sdD10aGlzLmFbN107dGhpcy5sbj10aGlzLmFbMl07dGhpcy5wbD10aGlzLmFbOV07dGhpcy5vcj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVsyXX1jLkprPWI7Yi5wcm90b3R5cGU9eyRxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hcjp0aGlzLmVwKGEpfSxlcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZnA6dGhpcy5kbihhKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmVuOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Mczp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmtvOnRoaXMua3QoYSl9LGt0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubHQ6dGhpcy5rbihhKX0sa246ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxuOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucGw6dGhpcy5ucihhKX0sbnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm9yOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgUGI9Yy5Ka3x8UGIsRGQ9bmV3IFBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9RGQuJHEoNCk7KGZ1bmN0aW9uKGMpe2MuV2k9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5TKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sVWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBRYj1jLldpfHxRYjsoZnVuY3Rpb24oYyl7Yy5YaT0KdS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5GKCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMueXZ8fCh0aGlzLnl2PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy5GKCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpOwp2YXIgUmI9Yy5YaXx8UmI7KGZ1bmN0aW9uKGMpe2MuWWk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBRYihkKTt0aGlzLkooZSl8fCh0aGlzLksoZSksKG5ldyBSYihlLHRoaXMuRykpLmMoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLkphKWlmKGE9PXRoaXMuSmFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7CnJldHVybiB0aGlzLkphW2Iub2IoKV0/ITA6ITF9fSl9KShjKTt2YXIgU2I9Yy5ZaXx8U2IsVGI9bmV3IFNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ0PXRoaXMuYVs3XTt0aGlzLlZuPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVsxMF07dGhpcy5ieT10aGlzLmFbMl07dGhpcy5SbD10aGlzLmFbMTBdO3RoaXMuaW09dGhpcy5hWzhdO3RoaXMucm49dGhpcy5hWzZdO3RoaXMuZnQ9dGhpcy5hWzFdO3RoaXMuRWw9dGhpcy5hWzZdO3RoaXMuSXg9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbOV19Yy5Ucj1iO2IucHJvdG90eXBlPXthdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJ0OnRoaXMuVW4oYSl9LFVuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVm46dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktyOnRoaXMuYXkoYSl9LApheTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnk6dGhpcy5RbChhKX0sUWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJsOnRoaXMuaG0oYSl9LGhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pbTp0aGlzLnFuKGEpfSxxbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJuOnRoaXMuZXQoYSl9LGV0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mdDp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWw6dGhpcy5IeChhKX0sSHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkl4OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgVWI9Yy5Ucnx8VWIsRWQ9bmV3IFViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9RWQuYXQoNCk7KGZ1bmN0aW9uKGMpe2MuT2w9Cm4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuUyhiKTt0aGlzLlYoYSk7dGhpcy5Vdih0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxVdjpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJnRoaXMuaWEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnBhdXNlJiZ0aGlzLmlhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmCnRoaXMuaWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5yZXN1bWUmJnRoaXMuaWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2ImJmIubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLm11dGUmJnRoaXMuaWEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJnRoaXMuaWEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS51bm11dGUmJnRoaXMuaWEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxMZzpmdW5jdGlvbihiKXt0aGlzLmlhPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBWYj1jLk9sfHxWYjsoZnVuY3Rpb24oYyl7Yy5ObD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLAphKTt0aGlzLiRoPSExfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXRoaXMuZ2V0UGxheWVyKCk7Yi5hdXRvc3RhcnQmJiF0aGlzLiRoJiYodGhpcy5GKCksdGhpcy4kaD0hMCx0aGlzLlJhKCkpO2EuRmEoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFdiPWMuTmx8fFdiOyhmdW5jdGlvbihjKXtjLlBsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgVmIoYltkXSksdGhpcy5KKGMpfHwodGhpcy5LKGMpLChuZXcgV2IoYyx0aGlzLkcpKS5jKCkpfX1lbHNlIHRoaXMuSSgpfX0pfSkoYyk7CnZhciBYYj1jLlBsfHxYYixZPW5ldyBYYihxKTtZLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcj10aGlzLmFbOV07dGhpcy5EaT10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVsxMF19Yy5uaT1iO2IucHJvdG90eXBlPXtQcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUXI6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkRpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgWWI9Yy5uaXx8WWIsRmQ9bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9RmQuUHIoNCk7KGZ1bmN0aW9uKGMpe2MuTW49bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxrYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sbGE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJgoxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5OPygwLHRoaXMuTikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIFpiPWMuTW58fFpiOyhmdW5jdGlvbihjKXtjLkxuPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxUdjpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuV2F8fCh0aGlzLldhPVtdKTt0aGlzLldhLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8CjMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuZWEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5lYz0hMDt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sYzpmdW5jdGlvbigpe3RoaXMudSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy54YT90aGlzLlR2KHRoaXMueGEpOih0aGlzLnhhPXRoaXMuSGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApKX0sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy54YSl7dGhpcy5GKCk7cmV0dXJufWlmKCF0aGlzLmVjKXt0aGlzLkYoKTtyZXR1cm59Yj0hMDtpZih0aGlzLldhJiYKdGhpcy5XYS5sZW5ndGgmJjE8dGhpcy5XYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLldhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLldhW2FdJiYzMDMhPXRoaXMuV2FbYV0mJjQwMyE9dGhpcy5XYVthXSYmKGI9ITEpO2lmKGIpdGhpcy5vKCJlbXB0eSIpLHRoaXMuZWEoKTtlbHNle3RoaXMuRigpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyICRiPWMuTG58fCRiOyhmdW5jdGlvbihjKXtjLk5uPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgWmIoYi5pdGVtKGEpKTt0aGlzLkooYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLksoYyksCihuZXcgJGIoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIGFjPWMuTm58fGFjLGJjPW5ldyBhYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qdD10aGlzLmFbN107dGhpcy5mdT10aGlzLmFbNl07dGhpcy5lcj10aGlzLmFbNV07dGhpcy5pbz10aGlzLmFbOV07dGhpcy5LdD10aGlzLmFbOF07dGhpcy5Bbj10aGlzLmFbOF07dGhpcy5Dbj10aGlzLmFbNF07dGhpcy5ndz10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs4XX1jLmppPWI7Yi5wcm90b3R5cGU9e2l0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qdDp0aGlzLmV1KGEpfSxldTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZ1OnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lcjp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaW86CnRoaXMuSnQoYSl9LEp0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5LdDp0aGlzLnpuKGEpfSx6bjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkFuOnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dbjp0aGlzLmZ3KGEpfSxmdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3c6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBjYz1jLmppfHxjYyxHZD1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1HZC5pdCg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sbGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLk4mJigwLHRoaXMuTikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5OJiYoMCx0aGlzLk4pKCEwKX0uYmluZCh0aGlzKSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgZGM9Yy5Za3x8ZGM7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLlloKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5vZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMub2coKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuQW8oKX0uYmluZCh0aGlzKSksdGhpcy5aaD0hMSx0aGlzLnh5PTFFMyx0aGlzLmtoPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxvZzpmdW5jdGlvbigpe3RoaXMua2guZG9uZXx8KHRoaXMua2guZG9uZT0hMCx0aGlzLlpoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZaCgpfS5iaW5kKHRoaXMpLAp0aGlzLnh5KSl9LEFvOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLlpoKTt0aGlzLm8oKX0sWWg6ZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMubygpLHRoaXMuZWEoKSk6KHRoaXMucygiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLkYoKSl9LHhnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBmPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHlhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy54Zyhtdy5lcnJvckRlbGVnYXRlcyk6CnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy54Zyh0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgZWM9Yy5Ya3x8ZWM7KGZ1bmN0aW9uKGMpe2MuWms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5OYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLk5hKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLk5hKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTsKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLk5hKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBkYyhjKSx0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBlYyhjLHRoaXMuRykpLmMoKSkpfX10aGlzLkkoKX19KX0pKGMpO3ZhciBmYz1jLlprfHxmYyxnYz1uZXcgZmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUHk9dGhpcy5hWzVdO3RoaXMuV3Q9dGhpcy5hWzEwXTt0aGlzLlZpPXRoaXMuYVs3XTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLm9qPXRoaXMuYVs4XTt0aGlzLmx1PXRoaXMuYVs5XTt0aGlzLm1tPQp0aGlzLmFbNV07dGhpcy52aj10aGlzLmFbNF07dGhpcy5QdT10aGlzLmFbNF07dGhpcy5Ecj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbNV19Yy54dz1iO2IucHJvdG90eXBlPXtPeTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUHk6dGhpcy5WdChhKX0sVnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLld0OnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVmk6dGhpcy5WayhhKX0sVms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLldrOnRoaXMubmooYSl9LG5qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vajp0aGlzLmt1KGEpfSxrdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubHU6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1tOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52ajp0aGlzLk91KGEpfSxPdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUHU6CnRoaXMuQ3IoYSl9LENyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ecjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGhjPWMueHd8fGhjLEhkPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUhkLk95KDQpOyhmdW5jdGlvbihjKXtjLlJtPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgaWM9Yy5SbXx8aWM7KGZ1bmN0aW9uKGMpe2MuUW09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm8oKSx0aGlzLmVhKCkpOih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLnUoKSkpOih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpO3RoaXMuaWMoKX0saWM6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy56ZSgpJiYKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnplKCkmJih0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmljKCl9LmJpbmQodGhpcyksMTApfSx6ZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgamM9Yy5RbXx8amM7KGZ1bmN0aW9uKGMpe2MuU209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJgoidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgaWMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3IGpjKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBrYz1jLlNtfHxrYyxsYz1uZXcga2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3I9dGhpcy5hWzddO3RoaXMueXM9dGhpcy5hWzRdO3RoaXMuUm89dGhpcy5hWzRdO3RoaXMueG49dGhpcy5hWzFdO3RoaXMudG49dGhpcy5hWzNdO3RoaXMuR2o9dGhpcy5hWzFdO3RoaXMubD10aGlzLmFbMV19Yy5oaz0KYjtiLnByb3RvdHlwZT17cnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNyOnRoaXMueHMoYSl9LHhzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55czp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUm86dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhuOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bjp0aGlzLkZqKGEpfSxGajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYz1jLmhrfHxtYyxJZD1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1JZC5ycig0KTsoZnVuY3Rpb24oYyl7Yy5HbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlMoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuT2U9ITF9LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkJ2KCl9LmJpbmQodGhpcyksNTAwKX0sQnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5OJiZ0aGlzLk4oKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksCmE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuT2UmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuT2UpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxIdzpmdW5jdGlvbigpe3RoaXMuT2U9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBuYz1jLkdtfHwKbmM7KGZ1bmN0aW9uKGMpe2MuRm09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKTt0aGlzLlliPTB9LGM6ZnVuY3Rpb24oKXt0aGlzLmh1PTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5ZYnx8KHRoaXMuWWI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8Cih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5ZYnx8dGhpcy5ZYisrLHRoaXMuWWI8PXRoaXMuaHU/KHRoaXMuWWIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSkpfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5IdygpLHRoaXMuRigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgb2M9Yy5GbXx8b2M7KGZ1bmN0aW9uKGMpe2MuSG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbmMod2luZG93LnBsYXllckFwaSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgb2MoYiwKdGhpcy5HKSkuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcGM9Yy5IbXx8cGMscWM9bmV3IHBjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNxPXRoaXMuYVs1XTt0aGlzLk1xPXRoaXMuYVs0XTt0aGlzLnp3PXRoaXMuYVsxXTt0aGlzLmpqPXRoaXMuYVs0XTt0aGlzLkh1PXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzldfWMuY3Y9YjtiLnByb3RvdHlwZT17UnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlNxOnRoaXMuTHEoYSl9LExxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NcTp0aGlzLnl3KGEpfSx5dzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuenc6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMuR3UoYSl9LEd1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5IdTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciByYz1jLmN2fHxyYyxKZD1uZXcgcmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1KZC5ScSg0KTsoZnVuY3Rpb24oYyl7Yy5BbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGxhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuTigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBzYz1jLkFtfHxzYzsoZnVuY3Rpb24oYyl7Yy56bT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCmZ1bmN0aW9uKCl7dGhpcy5SYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnpxKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuZWQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLlN0KCk6dGhpcy5pYygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZigpfHwodGhpcy5zKCJjb250ZW50cGxheSIpLHRoaXMudSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHpxOmZ1bmN0aW9uKCl7dGhpcy5GZigpfHx0aGlzLnUoITApfSxTdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZWQoKTshYi52YSYmCmIuWiYmYi5jeiYmYi5leiYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LGljOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMubygpLHRoaXMuZWEoKSk6KHRoaXMucygiYWRlcnJvciIsYiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWMoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe2lmKCF0aGlzLmdoKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT0KYSYmKHRoaXMuZ2g9YltjXSk7cmV0dXJuIHRoaXMuZ2h9LHplOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLmVkKCkuYWRzTG9hZGVyP3RoaXMuRighMCk6dGhpcy5GKCk6dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHRjPWMuem18fHRjOyhmdW5jdGlvbihjKXtjLkJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IHNjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5KKGMpfHwodGhpcy5LKGMpLChuZXcgdGMoYyx0aGlzLkcpKS5jKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgdWM9Yy5CbXx8dWMsdmM9bmV3IHVjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJwPXRoaXMuYVs2XTt0aGlzLlVxPXRoaXMuYVs5XTt0aGlzLll5PXRoaXMuYVsyXTt0aGlzLk15PXRoaXMuYVsxXTt0aGlzLlVwPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzEwXX1jLnlrPWI7Yi5wcm90b3R5cGU9e3FwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ycDp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVXE6dGhpcy5YeShhKX0sWHk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll5OnRoaXMuTHkoYSl9LEx5OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NeTp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLlVwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgd2M9Yy55a3x8d2MsS2Q9bmV3IHdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9S2QucXAoNCk7KGZ1bmN0aW9uKGMpe2MudWw9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5TKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlYoYSk6dGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxVYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sRmE6ZnVuY3Rpb24oKXt2YXIgYjtFPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTsKYiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWj1jLnVsfHxaOyhmdW5jdGlvbihjKXtjLnRsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlFlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuUWU9Yi5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5RZSYmYiE9dGhpcy5RZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5zKCJhZGVycm9yIixhLnl6KSx0aGlzLkYoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT0KYSYmKHRoaXMucygiYWRlcnJvciIpLHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBhYT1jLnRsfHxhYTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRSlmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFooYiksYi5tYT90aGlzLlZlKCk6dGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGFhKGIsdGhpcy5HKSxiLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRSx4Yz1jLnZsfHx4Yyx5Yz1uZXcgeGMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC53Yi5sZW5ndGgpe3ZhciBhPWwud2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUucncoeyJbTE9BRFNDUklQVF0iOmUuZ2EoMTApLCJbVVRJTFNdIjplLmdhKDEwKSwiW0NBTExCQUNLXSI6ZS5nYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuWGcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSltW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLlhnKGcsCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LGwpfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3A9dGhpcy5hWzhdO3RoaXMuam49dGhpcy5hWzJdO3RoaXMuZng9dGhpcy5hWzNdO3RoaXMuUmo9dGhpcy5hWzhdO3RoaXMud2k9dGhpcy5hWzRdO3RoaXMud3I9dGhpcy5hWzddO3RoaXMuUXA9dGhpcy5hWzFdO3RoaXMucnY9dGhpcy5hWzldO3RoaXMuang9dGhpcy5hWzVdO3RoaXMuS2w9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMV19Yy50aj1iO2IucHJvdG90eXBlPXtWcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3A6dGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpuOnRoaXMuZXgoYSl9LApleDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZng6dGhpcy5RaihhKX0sUWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlJqOnRoaXMudmkoYSl9LHZpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53aTp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3I6dGhpcy5QcChhKX0sUHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFwOnRoaXMucXYoYSl9LHF2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ydjp0aGlzLml4KGEpfSxpeDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuang6dGhpcy5KbChhKX0sSmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLktsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgemM9Yy50anx8emMsTGQ9bmV3IHpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUxkLlZwKDQpOyhmdW5jdGlvbihjKXtjLm5uPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5TKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMucXU9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9LGh3OmZ1bmN0aW9uKGIpe3RoaXMuUmQ9CmJ9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sbGE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuZ2IoYil9LmJpbmQodGhpcykpfSxnYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuTiYmdGhpcy5OKCksdGhpcy5SZCYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuUmQmJihuZXcgSCh0aGlzLHRoaXMuUmQpKS5jKCkpfX0pfSkoYyk7dmFyIE49Yy5ubnx8TjsoZnVuY3Rpb24oYyl7Yy5tbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSx4YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMua2UpaWYodGhpcy5yYnx8KHRoaXMucmI9MCksdGhpcy5yYisrLDE1PHRoaXMucmIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnR3KCk6dGhpcy51KCEwKSwhMDt0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnUoKTp0aGlzLnUoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5rZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLnlhKCl8fCh0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YSgpfS5iaW5kKHRoaXMpLDEwKX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sClk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVz1hLGIucygiYWRlcnJvciIsYSkpOmIucygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dGhpcy5XPXRoaXMuV3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnhhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSx1OmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRihiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSD1jLm1ufHxIOyhmdW5jdGlvbihjKXtjLnBuPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLklhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiLmh3KHRoaXMuRyksYj1uZXcgSChiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLnBufHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHA9CnRoaXMuYVsyXTt0aGlzLlRsPXRoaXMuYVszXTt0aGlzLmFtPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzJdfWMuS3E9YjtiLnByb3RvdHlwZT17R3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhwOnRoaXMuU2woYSl9LFNsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5UbDp0aGlzLiRsKGEpfSwkbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBDYz1jLktxfHxDYyxNZD1uZXcgQ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1NZC5HcCg0KTsoZnVuY3Rpb24oYyl7Yy5tbD1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy5jZz0KMDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVihhKTp0aGlzLmZhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jZ30sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLk4/KDAsdGhpcy5OKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse2ZxOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuY2c9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCntmcTpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sUDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIERjPWMubWx8fERjOyhmdW5jdGlvbihjKXtjLmxsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEN6OmZ1bmN0aW9uKCl7fSxXdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnRmKG5ldyBmdW5jdGlvbigpe30pO2EuJHk9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuV3YoYSk7d2luZG93LlpkPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLlZ2fHwodGhpcy5Wdj0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnNlfHwodGhpcy5zZT0xKTtpZigyMDx0aGlzLnNlKXRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLlFhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuc2UrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LFFhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLmFhKCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMuVWUoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5zKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLnBhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0sVWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc01hbmFnZXIpOwpiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpfSx5YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpe3RoaXMucWE9ITB9LGFhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YSgpPwoodGhpcy5vKCksdGhpcy5lYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkYoYil9fSl9KShjKTt2YXIgRWM9Yy5sbHx8RWM7KGZ1bmN0aW9uKGMpe2Mubmw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IERjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5tYXx8dGhpcy5KKGMpfHwodGhpcy5LKGMpLChuZXcgRWMoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEZjPWMubmx8fEZjLEdjPW5ldyBGYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubnQ9dGhpcy5hWzhdO3RoaXMuQng9dGhpcy5hWzddO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuSW49dGhpcy5hWzhdO3RoaXMuZ209dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbNl19Yy5zbD1iO2IucHJvdG90eXBlPXttdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnQ6dGhpcy5BeChhKX0sQXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJ4OnRoaXMuQXAoYSl9LEFwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5CcDp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSW46dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmdtOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgSGM9Yy5zbHx8SGMsTmQ9bmV3IEhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPU5kLm10KDQpOyhmdW5jdGlvbihjKXtjLmhsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIGJhPWMuaGx8fGJhOyhmdW5jdGlvbihjKXtjLmdsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LApjOmZ1bmN0aW9uKCl7dGhpcy5IZz0wO3RoaXMuVz10aGlzLld8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5xYT10aGlzLnRjPXRoaXMueGE9dGhpcy5RYz0hMTt0aGlzLnBoPWUudWIoMTApO3RoaXMuUWcoKX0sUWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudmE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLlFhKCksITA7dGhpcy5IZysrO2lmKDEwPHRoaXMuSGcpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMudSghMCk6dGhpcy51KCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5RZy5iaW5kKHRoaXMpLDEwMCksITF9LFFhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMudmE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMubygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuRihiKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNhPWMuZ2x8fGNhOyhmdW5jdGlvbihjKXtjLmlsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBjYShiLAp0aGlzLkcpLGIuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgSWM9Yy5pbHx8SWMsSmM9bmV3IEljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs4XTt0aGlzLlhuPXRoaXMuYVsxMF07dGhpcy5Dbz10aGlzLmFbNV07dGhpcy5oaj10aGlzLmFbMTBdO3RoaXMuZmo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzddfWMuWHM9YjtiLnByb3RvdHlwZT17Zm46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmduOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkNvOnRoaXMuZ2ooYSl9LGdqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5oajp0aGlzLmVqKGEpfSxlajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZmo6dGhpcy5qKGEpfSwKajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIEtjPWMuWHN8fEtjLE9kPW5ldyBLYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPU9kLmZuKDQpOyhmdW5jdGlvbihjKXtjLlRqPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yj8oYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllclByZWZpeCkpPyh0aGlzLlMoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5WKGIpOnRoaXMuZmEoKSk6dGhpcy5mYSgpOnRoaXMuZmEoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxtZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaXNGdWxsc2NyZWVuP2IuaXNGdWxsc2NyZWVuOiExfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLmR1cmF0aW9uP2IudmlkZW9pbmZvLmR1cmF0aW9uOjB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8ucGxheWhlYWQ/Yi52aWRlb2luZm8ucGxheWhlYWQ6MH0sCmV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgTGM9Yy5Uanx8TGM7KGZ1bmN0aW9uKGMpe2MuU2o9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVBsYXlpbmciLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLAp0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMucygiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksdGhpcy51KCkpfSx0ZXN0OmZ1bmN0aW9uKCl7fSx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtiLmlzUGxheWluZygpPyhiLnBhdXNlKCksdGhpcy5GKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBNYz1jLlNqfHxNYzsoZnVuY3Rpb24oYyl7Yy5Vaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApjOmZ1bmN0aW9uKCl7dGhpcy5JYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuTmEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyBMYyhkKSxkLm1hfHx0aGlzLkooZCl8fCh0aGlzLksoZCksKG5ldyBNYyhkLHRoaXMuRykpLmMoKSk7ZWxzZSBicmVha310aGlzLkkoKX19KX0pKGMpO3ZhciBOYz1jLlVqfHxOYyxPYz1uZXcgTmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub2s9dGhpcy5hWzFdO3RoaXMuYXA9dGhpcy5hWzldO3RoaXMuZWs9dGhpcy5hWzFdO3RoaXMudHE9dGhpcy5hWzEwXTt0aGlzLkx1PXRoaXMuYVsxXTsKdGhpcy5sPXRoaXMuYVszXX1jLkx2PWI7Yi5wcm90b3R5cGU9e25rOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vazp0aGlzLiRvKGEpfSwkbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXA6dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5lazp0aGlzLnNxKGEpfSxzcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudHE6dGhpcy5LdShhKX0sS3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkx1OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgUGM9Yy5Mdnx8UGMsUGQ9bmV3IFBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9UGQubmsoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5TKGIpLHRoaXMuVihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIFFjPWMuJGp8fFFjOyhmdW5jdGlvbihjKXtjLlpqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlVmKCl9LFVmOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5GKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZighMCl9LmJpbmQodGhpcyksCjEwMCkpfX0pfSkoYyk7dmFyIFJjPWMuWmp8fFJjOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBRYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5tYSl7dGhpcy5JKCk7cmV0dXJufWlmKCF0aGlzLkooYikpe3RoaXMuSyhiKTsobmV3IFJjKGIsdGhpcy5HKSkuYygpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgU2M9Yy5ha3x8U2MsVGM9bmV3IFNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNyPXRoaXMuYVsxMF07dGhpcy5FdD10aGlzLmFbNl07dGhpcy5NbD0KdGhpcy5hWzVdO3RoaXMubXg9dGhpcy5hWzZdO3RoaXMuaHQ9dGhpcy5hWzEwXTt0aGlzLmVvPXRoaXMuYVsxMF07dGhpcy5TcD10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOV19Yy54aT1iO2IucHJvdG90eXBlPXticjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3I6dGhpcy5EdChhKX0sRHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkV0OnRoaXMuTGwoYSl9LExsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5NbDp0aGlzLmx4KGEpfSxseDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubXg6dGhpcy5ndChhKX0sZ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5odDp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVvOnRoaXMuUnAoYSl9LFJwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5TcDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIFVjPWMueGl8fFVjLApRZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1RZC5icig0KTsoZnVuY3Rpb24oYyl7Yy5jaT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlMoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5WKGIpOnRoaXMuZmEoKSk6dGhpcy5mYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgVmM9Yy5jaXx8VmM7KGZ1bmN0aW9uKGMpe2MuYmk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYiwKYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy51LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcykpO3RoaXMuJGQoKTt0aGlzLlJmKCl9LFk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlc9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0scGE6ZnVuY3Rpb24oKXt0aGlzLnFhPSEwO3RoaXMubygiZW1wdHkgdmFzdCIpfSxSZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiYKYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8CjMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy5vKCksdGhpcy5lYSgpKTp0aGlzLnUoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlJmLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy4kZC5iaW5kKHRoaXMpLDEwMCl9LCRkOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaGEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5SYS5iaW5kKHRoaXMpLDEwKSx0aGlzLm8oKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLnUoKTp0aGlzLnUoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGQuYmluZCh0aGlzKSwxMDApfX0sdTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlJhLmJpbmQodGhpcyksCjFFNCk7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIFdjPWMuYml8fFdjOyhmdW5jdGlvbihjKXtjLmRpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sU2E6ZnVuY3Rpb24oYil7Yj1uZXcgVmMoYik7Yi5tYT90aGlzLkkoKTp0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBXYyhiLHRoaXMuRykpLmMoKSl9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5TYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuU2Eod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5JKCl9fSl9KShjKTt2YXIgWGM9Yy5kaXx8WGMsWWM9bmV3IFhjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5HdD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs3XX1jLk5tPWI7Yi5wcm90b3R5cGU9e0Z0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIFpjPWMuTm18fFpjLFJkPW5ldyBaYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVJkLkZ0KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlNnPXRoaXMuVWc9dGhpcy5UZz0hMTt0aGlzLnNkPVtdO3RoaXMuVGU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRjP251bGw6VGMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpjP251bGw6SmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/Cm51bGw6SWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlYsTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYmI/bnVsbDpiYixvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdiP251bGw6Z2IsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIHZjP251bGw6dmMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgeWE/bnVsbDp5YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgQmM/bnVsbDpCYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB5P251bGw6eSxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHljP251bGw6eWMsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRiP251bGw6VGIsU2ltcGxlVmlkZW9BbmRJbWE6InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgR2M/bnVsbDpHYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSWI/bnVsbDoKSWIsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE9jP251bGw6T2MsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBxYz9udWxsOnFjLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBtYj9udWxsOm1iLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiByYj9udWxsOnJiLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsWE9aQ09NOiJ1bmRlZmluZWQiPT09dHlwZW9mIERhP251bGw6RGEsQkNGbGFzaE9ubHk6InVuZGVmaW5lZCI9PT10eXBlb2YgWGE/bnVsbDpYYSxEZW1vVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB0YT9udWxsOnRhLFRPbmxpbmUyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNhP251bGw6U2EsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgWWM/bnVsbDpZYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWT8KbnVsbDpZfX1jLnJtPWI7Yi5wcm90b3R5cGU9e2M6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMubnMoYSk6W10sYjt0aGlzLlVnPSEwO2lmKGEubGVuZ3RoKXt0aGlzLlRnPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnVoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5UZSl7aWYodGhpcy5TZylicmVhaztiPXRoaXMuVGVbY107dGhpcy5uZihiKSYmKHRoaXMuc2QucHVzaChiKSx0aGlzLnVoKGIpKX19LG5mOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sbnM6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuVGVbY10sdGhpcy5uZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx1aDpmdW5jdGlvbihhKXt0aGlzLm5mKGEpJiZhLmMoKX0sSXc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIG4mJgohdGhpcy5UZylmb3IodGhpcy5TZz0hMCxhPTA7YTx0aGlzLnNkLmxlbmd0aDthKyspdGhpcy5zZFthXS55YiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnNkW2FdLnliKX19fSkoYyk7dmFyICRjPWMucm18fCRjLEw9bmV3ICRjO0wuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLllqPXRoaXMuYVs2XTt0aGlzLm12PXRoaXMuYVs4XTt0aGlzLmdrPXRoaXMuYVs0XTt0aGlzLmprPXRoaXMuYVs4XTt0aGlzLklqPXRoaXMuYVszXTt0aGlzLkVrPXRoaXMuYVszXTt0aGlzLmR0PXRoaXMuYVsxMF07dGhpcy5qcD10aGlzLmFbOF07dGhpcy5Tcj10aGlzLmFbOF07dGhpcy5xcj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVsxMF19Yy5taT1iO2IucHJvdG90eXBlPXtYajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWWo6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5tdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZ2s6dGhpcy5payhhKX0saWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmprOnRoaXMuSGooYSl9LEhqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Jajp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRWs6dGhpcy5jdChhKX0sY3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmR0OnRoaXMuaXAoYSl9LGlwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcDp0aGlzLlJyKGEpfSxScjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU3I6dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgYWQ9Yy5taXx8YWQsU2Q9bmV3IGFkKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVNkLlhqKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLm9jKGsuVngpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLm9jKGsudHUpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKRi53aWR0aD0xO0YuaGVpZ2h0PTE7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBUZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGhhPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBHPW5ldyBSLG09ITE7Ry51YygpO0cuTWcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLnVjKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5NZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0cudWMoKTt2YXIgVWQ9VGQoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csRy5zdCgpLHtpZDpVZH0pfSw1MDApLGxhPWUuZ2EoMTApO2dhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkl5PXRoaXMuYVs1XTt0aGlzLnVpPXRoaXMuYVs4XTt0aGlzLk52PXRoaXMuYVsxXTt0aGlzLkt2PXRoaXMuYVsxXTt0aGlzLmJ2PXRoaXMuYVs3XTt0aGlzLlV1PXRoaXMuYVs1XTt0aGlzLld1PXRoaXMuYVsyXTt0aGlzLiRpPXRoaXMuYVsxMF07dGhpcy5paT10aGlzLmFbMl07dGhpcy5Xcz10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs3XX1jLld5PWI7Yi5wcm90b3R5cGU9e0h5OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5JeTp0aGlzLnRpKGEpfSx0aTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudWk6dGhpcy5NdihhKX0sTXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk52OnRoaXMuSnYoYSl9LEp2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ldjp0aGlzLmF2KGEpfSxhdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYnY6dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlV1OnRoaXMuVnUoYSl9LFZ1OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuV3U6dGhpcy5aaShhKX0sWmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLiRpOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5paTp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuV3M6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBiZD1jLld5fHxiZCxWZD1uZXcgYmQoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1WZC5IeSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubWg9dGhpcy5jb25mPXRoaXMuZWI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLm5kPTA7dGhpcy5WYT0iIjt0aGlzLnRkPVtdO3RoaXMudWQ9MDt0aGlzLm9oPSExO3RoaXMuUmU9W119Yy5maT1iO2IucHJvdG90eXBlPXtxdzpmdW5jdGlvbihhKXt0aGlzLm1oPQphfSx4ZDpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuVmE9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGt3OmZ1bmN0aW9uKGEpe3RoaXMuZWI9YX0saXc6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEVhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5WYV0mJnRoaXMuY29uZlt0aGlzLlZhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuVmFdW2FdKTtyZXR1cm4gYn0semM6ZnVuY3Rpb24oYSxiKXtlLnNiKCJ3ZWx0LmRlIikmJmUuVGEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwKIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLmViKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMudHQoKSl0aGlzLmViLmYodGhpcy5lYi5oZCx0aGlzLmViLkNhLHRoaXMuZWIuU2UsZnVuY3Rpb24oKXt0aGlzLnpjKGEsYil9LmJpbmQodGhpcyksdGhpcy5lYi5sYyk7ZWxzZSBpZih0aGlzLkZzKCkpdGhpcy5ldyhmdW5jdGlvbigpe3RoaXMuemMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudyhrLlljLHRoaXMucGxheWVyLnYoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLkx3KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuZWIsaCk7bC53aCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuZ3UoYSkpfHwKZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuQWUmJihjPXRoaXMucGxheWVyLkFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkNlKGEsYyxmKTt0aGlzLnBsYXllci54aChsKX19LHR0OmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMubmQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5uZC5nZXRUaW1lKCksdGhpcy5uZD1hLDNFNTxiPyEwOiExO3RoaXMubmQ9YTtyZXR1cm4hMX0sQnc6ZnVuY3Rpb24oKXtlLlllKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5FYSgiYWRUYWciKTt0aGlzLkVhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5FYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuamcoYSkpP3RoaXMuemMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLAowKSxlLncoay5aYyx0aGlzLnBsYXllci52KCkpKX0sQXc6ZnVuY3Rpb24oYSl7ZS5ZZSgicG9zdHJvbGwiKTtpZighdGhpcy5taCl7dGhpcy5xdyghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5FYSgiYWRUYWciKTt0aGlzLkVhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuRWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5qZyhjKSk/dGhpcy56YyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5aYyx0aGlzLnBsYXllci52KCkpKX19LGpnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxZdjpmdW5jdGlvbigpe3RoaXMucGxheWVyLnZ3KHRoaXMuQXcuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGEoKX0sCkFkOmZ1bmN0aW9uKGEpe2UuWWUoIm1pZHJvbGwiKTtpZighdGhpcy5aZyl7dGhpcy5aZz0hMDt2YXIgYj10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkVhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy56YyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aZz0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5aYyx0aGlzLnBsYXllci52KCkpKX19LFh2OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucHcodGhpcy5BZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5HZSgpfSxjOmZ1bmN0aW9uKCl7dGhpcy5CdygpO3RoaXMucGxheWVyLkdlJiZ0aGlzLlh2KCk7dGhpcy5ZdigpfSxadjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOgphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy50ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuTnkoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnVkPXRoaXMudGQubGVuZ3RofSxGczpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy51ZCYmKGE9ITApO3JldHVybiBhfSxldzpmdW5jdGlvbihhKXt0aGlzLm9oPWE7Zm9yKGE9MDthPHRoaXMudGQubGVuZ3RoO2ErKyl0aGlzLnRkW2FdWyJmdW5jdGlvbiJdKHRoaXMuRXYuYmluZCh0aGlzKSl9LEV2OmZ1bmN0aW9uKGEpe3RoaXMudWQtLTthJiZ0aGlzLlJlLnB1c2goYSk7MD49dGhpcy51ZCYmdGhpcy5vaCgpfSxndTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5SZS5sZW5ndGg7YysrKWI9dGhpcy5SZVtjXSwKYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMuZml8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXI9dGhpcy5hWzddO3RoaXMuS249dGhpcy5hWzldO3RoaXMuQmk9dGhpcy5hWzVdO3RoaXMuUG89dGhpcy5hWzRdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuaXY9dGhpcy5hWzFdO3RoaXMubnA9dGhpcy5hWzFdO3RoaXMubD10aGlzLmFbMl19Yy5XbD1iO2IucHJvdG90eXBlPXtocjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXI6dGhpcy5KbihhKX0sSm46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktuOnRoaXMuQWkoYSl9LEFpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5CaTp0aGlzLk9vKGEpfSxPbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUG86dGhpcy5EaihhKX0sCkRqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Fajp0aGlzLmh2KGEpfSxodjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaXY6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5wOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgY2Q9Yy5XbHx8Y2QsV2Q9bmV3IGNkKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9V2QuaHIoNCl9KS5jYWxsKGllSm9qdWFiemFpcm9oR3UsaWVKb2p1YWJ6YWlyb2hHdSk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.129.101 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

Date
Wed, 17 Apr 2019 06:56:39 GMT
Last-Modified
Wed, 17 Apr 2019 04:47:04 GMT
Server
AmazonS3
x-amz-request-id
8B47DF282469AEC6
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
EXm40mXHV+abNUV8Tbak4ghZhomPwQ7ibu3KoHZJHI7hASLNsIb57iC6+eaZ2osmXSpZ+x+q1U8=
Expires
0
homadclienthttpsle-json.php
video.golem.de/staticrl/scripts/radiant/
291 B
682 B
XHR
General
Full URL
https://video.golem.de/staticrl/scripts/radiant/homadclienthttpsle-json.php?cache=8443317579
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGllSm9qdWFiemFpcm9oR3U9aWVKb2p1YWJ6YWlyb2hHdXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuTGV8fCh5LkxlPTApO3kuTGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5MZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5UYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEud2gobSksYS5DZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS4kcCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5ZYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wuc2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS54ZChjKTthLmt3KGwpO2EuaXcobSk7YS5adigpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlyPXRoaXMuYVs0XTt0aGlzLnh2PQp0aGlzLmFbN107dGhpcy5sPXRoaXMuYVs3XX1jLnN2PWI7Yi5wcm90b3R5cGU9e3hyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55cjp0aGlzLnd2KGEpfSx3djpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnh2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIga2E9Yy5zdnx8a2EsZGQ9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9ZGQueHIoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuJHA9ITE7dGhpcy5PYT0ic2V0dXAiO3RoaXMuQmM9W107dGhpcy5ZZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLkR2LmJpbmQodGhpcykpfWMucms9YjtiLnByb3RvdHlwZT17WWY6ZnVuY3Rpb24oKXt0aGlzLmNhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSwKb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LEpvOmZ1bmN0aW9uKGEpe3RoaXMuY2EuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG9hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxEdjpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5DdihhLmRhdGEpfSxDdjpmdW5jdGlvbihhKXtpZih0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPQp0aGlzLmNhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lciYmYS5ldmVudD09dGhpcy5jYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sVmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmNhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sYmc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lcyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuV2coYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGVzOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxIbzpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUuVXIoYSkpcmV0dXJuOyhiPXRoaXMuYmcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSxVcjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxtZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmCihiPXRoaXMuY2Eub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxCdDpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxOYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LHZnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxDaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT0KZG9jdW1lbnQuYm9keT8hMDohMX0sUGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSx1ZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoOwpkPXIud2lkdGg7Zj1yLmhlaWdodDswPnIudG9wJiYoZis9ci50b3ApO3IuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09ci5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sdmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy51ZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksMTAwKX0sdWI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LG9lOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0semg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxKPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLHAsbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBuPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLG4ucHVzaChjKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihuLnB1c2goZik7MTQhPW4ubGVuZ3RoJTE2OyluLnB1c2goMCk7bi5wdXNoKHA+Pj4yOSk7bi5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPG4ubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09blthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO3A9cjtsPUo7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfH5wJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKHBeCmxedikrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChwLDMwKSxwPWMsYz10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfHAmdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKHBebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKHAsMzApLHA9YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrcCY0Mjk0OTY3Mjk1O0o9SitsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihKKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LG5iOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+NixyPWMmNjMsaXNOYU4oZik/ZT1yPTY0OmlzTmFOKGMpJiYocj02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSx5dDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGZlOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHI9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IubGI/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8CmMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gobil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXI7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LCRyOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy5mZSgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFBhOmZ1bmN0aW9uKCl7dmFyIGE9e0lpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxPczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxibTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxUbjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5JaSgpfHxhLmRqKCl8fGEuT3MoKXx8YS5ibSgpfHxhLlRuKCl9fTtyZXR1cm4gYS5McCgpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGZkOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHNiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHBzOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxJcTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxHdzpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxxZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuT2goYikrIjoiK3RoaXMuT2goTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LE9oOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxZZTpmdW5jdGlvbihhKXt0aGlzLk9hPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLk9hO3RoaXMuTmYoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLAohMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxvYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlZCl7dmFyIHI9YTtkJiZiJiYoYj1rLlNhKGIsZCkpO2ImJihyPWsuU2EoYSxiKSk7ZiYmKHI9ay5TYShyLGYpKTtjJiYocj1rLlNhKHIsYykpO2gmJihyPWsuU2EocixoKSk7ZWQmJihyPWsuU2EocixoKSk7ZS5vYyhyKX0sRnY6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlJiYxMDIzIT1hLmNvZGUmJjEwMTghPWEuY29kZSl7dHJ5e2lmKGxhJiYoYi5zZXNzaW9uX2lkPWxhKSxiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiIsYS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpLGIuZXZlbnQ9CmEuY29kZSxiLnNpdGVfaHJlZj10aGlzLnBzKCksYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfX1jYXRjaChkKXt9cmV0dXJuIGJ9fSxOZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZ2KGEpO2lmKGIpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC52ZCgpKyI/aG9tYWRfYXQ9IitlbmNvZGVVUklDb21wb25lbnQoYik7bC53YShhLCEwKTthPWwud2EoYSwhMCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1lbmNvZGVVUklDb21wb25lbnQoYik7bC5IYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbHx8IWwuYmEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWErYjt0aGlzLkNjfHwodGhpcy5DYz17fSk7dGhpcy5DY1tmXXx8KHRoaXMuQ2NbZl09MCk7dGhpcy5DY1tmXSsrOzEwPHRoaXMuQ2NbZl18fChmPWwudmQoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpLGwud2EoZiwhMCksZj1sLndhKGYsITApLGYuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkhhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpKX19LERlOmZ1bmN0aW9uKCl7bCYmbC5iYT9sLmlzRW5hYmxlZCYmbC5ucSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZSgpfS5iaW5kKHRoaXMpLDUwMCl9LGxlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuYmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LG5lOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxiYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmdkKGEpOiIifSxnZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm5lKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sZXE6ZnVuY3Rpb24oYSxiLGQpe2Q9ITE7aWYoYi54ZShhKXx8dGhpcy5CdChhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LldlJiZ3aW5kb3cuc2FuZGJveC5XZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LldlWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwKc2FuZGJveC5XZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy5tZyhhKSlyZXR1cm4gdGhpcy5tZyhhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMubmIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtkJiYoZi5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtmLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2YuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjt2YXIgYz0hMTtkPSExO2Q9dGhpcy5UYShhLGIuR2EsZixmdW5jdGlvbihhKXtjPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2N8fChjPWQpLGM9SlNPTi5wYXJzZShjKX1jYXRjaChoKXtjPSExfWMudXJsJiZjLmhhc2gmJihjPWIubGQoKS5yZXBsYWNlKCJbaGFzaF0iLApjLmhhc2gpKTt0aGlzLkhvKGMsYSk7cmV0dXJuIGN9LFRhOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUscil7dmFyIGs9aHx8bDtoPSEwO3ImJihoPSExKTtpZihrJiZrLmJhKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7ay53YShhLGgpO2g9ay53YShhLGgpO2guZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuSGEoaCxmLGMsIiIsIiIsZSl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRhKGEsYixkLGYsYyxrLGUscil9LmJpbmQodGhpcyksNTAwKX0sV2c6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSl7dmFyIHI9ITA7ZSYmKHI9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7ZT1kO2Q9IiI7CmZvcih2YXIgayBpbiBlKWQrPSImIitrKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtrXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsciksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LCR0OmZ1bmN0aW9uKGEsYixkKXt0aGlzLldnKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLkJjKWZvcih2YXIgYyBpbiB0aGlzLkJjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuQmNbY10pOwpjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS5uYihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LFhnOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5uYihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuVGEoYSxmLkdhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT0KSlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuJHQoZi5sZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0scnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuQmM9YX0sTnk6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLlRhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLApiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGgpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LE1wOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSx3dDpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFE9Yy5ya3x8ClE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93LmtnPWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMucWs9YjtiLlNhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5wdj17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5zdT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi51eT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLkVyPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRnk9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5MZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuRWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLklmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLk1mPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi53bz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5HZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLll4PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5ydT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuRnI9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkF5PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlpmPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuQ3E9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLlpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuWWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLktmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLAptZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Iuem89e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLk1jPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5TZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5VZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IueW89e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlZoPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2Iud3U9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi5wZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07CmIubGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLiRmPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi50eT17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5WeD17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLnR1PXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfSxnZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX19fSkoYyk7dmFyIGs9Yy5xa3x8aztjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuanE9dGhpcy5hWzEwXTt0aGlzLiR3PXRoaXMuYVsxXTt0aGlzLlpuPXRoaXMuYVs2XTt0aGlzLkNrPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzhdfWMuZWk9YjtiLnByb3RvdHlwZT17aXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmpxOnRoaXMuWncoYSl9LFp3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kdzp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWm46dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNrOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgbWE9Yy5laXx8bWEsZmQ9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWZkLmlxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuc2s9YjtiLnByb3RvdHlwZT17b2U6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LG9iOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5BfHwieCIpfSxqczpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZSsKbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sZGQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmRkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuZGQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSx1YzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLm9lKHRoaXMub2IoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9CnRoaXMuZGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LHN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWMoKSsiMiJ9LE1nOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMub2UodGhpcy5qcygpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmRkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUj1jLnNrfHxSO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBvPXRoaXMuYVs0XTt0aGlzLnpwPXRoaXMuYVs2XTt0aGlzLlFuPXRoaXMuYVs4XTt0aGlzLnd5PXRoaXMuYVs2XTt0aGlzLnp5PXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzldfWMuRG49YjtiLnByb3RvdHlwZT17b286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT8KdGhpcy5wbzp0aGlzLnlwKGEpfSx5cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuenA6dGhpcy5QbihhKX0sUG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFuOnRoaXMudnkoYSl9LHZ5OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3k6dGhpcy55eShhKX0seXk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnp5OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgbmE9Yy5Ebnx8bmEsZ2Q9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9Z2Qub28oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsCmY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGYuZj9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5mOmZ1bmN0aW9uKCl7ZC5mLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnRmPWJ9KShjKTt2YXIgSz1jLnRmfHxLO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhpPXRoaXMuYVsxXTsKdGhpcy5Nbz10aGlzLmFbOF07dGhpcy5sPXRoaXMuYVs5XX1jLllzPWI7Yi5wcm90b3R5cGU9e0dpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSGk6dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1vOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgb2E9Yy5Zc3x8b2EsaGQ9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9aGQuR2koNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5xbT1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMueWM9MTAwO3RoaXMudmI9MDt0aGlzLklhPTE1MDt0aGlzLnliPTA7dGhpcy5sdyhiKX0sYzpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMudmI8PXRoaXMuSWE/KHRoaXMudmIrKywKdGhpcy55Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnljKSk6MD50aGlzLklhJiYodGhpcy55Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnljKSl9LGF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmI+dGhpcy5JYT8hMDohMX0sVmU6ZnVuY3Rpb24oKXt0aGlzLnZiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsdzpmdW5jdGlvbihiKXt0aGlzLkc9Yn0sZ3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxLOmZ1bmN0aW9uKGIpe3RoaXMuSmFbYi5vYigpXT1iO0wmJkwuVWcmJkwuSXcoYil9LHB6OmZ1bmN0aW9uKCl7cmV0dXJuIGUuTmEodGhpcy5KYSl9LEo6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYT09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVtiLm9iKCldPyEwOiExfSx4dDpmdW5jdGlvbihiKXtiPWIuRmEoKTtmb3IodmFyIGEgaW4gdGhpcy5KYSlpZihiLmlkPT0KdGhpcy5KYVthXS5GYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxEejpmdW5jdGlvbihiKXt0aGlzLkphW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLnFtfHx0OyhmdW5jdGlvbihjKXtjLnNtPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMueWM9MTA7dGhpcy52Yj0wO3RoaXMuSWE9NTA7dGhpcy5OPW51bGw7dGhpcy5tYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMucWI9IiI7dGhpcy5mZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHY6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkZhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7fSwKdnc6ZnVuY3Rpb24oYil7dGhpcy5OPWJ9LHF6OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTn0scHc6ZnVuY3Rpb24oYil7dGhpcy5IZT1ifSxvejpmdW5jdGlvbigpe3JldHVybiB0aGlzLkhlfSxHZTpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMudmI8PXRoaXMuSWEmJih0aGlzLnZiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy55YykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYil7fX0sdWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sb2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sWmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxFejpmdW5jdGlvbigpe30sVjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5HcygpfHx0aGlzLkVvKCk7dGhpcy5aZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHJ6OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEVvOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmdhKDEwKSl9LEdzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxTOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPQpifSxGYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxtZDpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sVWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0seHo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYX0sZmE6ZnVuY3Rpb24oKXt0aGlzLm1hPSEwfSxQYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxrYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHhoOmZ1bmN0aW9uKGIpe3RoaXMucWI9Yn0sbno6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYn0sc2g6ZnVuY3Rpb24oKXt0aGlzLnFiPW51bGx9LHV6OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5xYiYmKGI9ITApO3JldHVybiBifSx6ejpmdW5jdGlvbigpe3RoaXMuZmd8fCh0aGlzLmZnPSEwKX0scWM6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sa3o6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBuPWMuc218fG47KGZ1bmN0aW9uKGMpe2MuZ2k9Sy5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLkc9dGhpcy5wbGF5ZXI9IiI7dGhpcy5DZj0iMSI7dGhpcy5EZj0iMiI7dGhpcy5ybz0iMyI7dGhpcy5HYz0wO3RoaXMuJGc9CjMwO3RoaXMuRGI9W107dGhpcy5aYT1bXTt0aGlzLiRiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLk9mPXRoaXMuUmg9ITE7dGhpcy5zdGF0dXM9dGhpcy5HYzt0aGlzLmlkPWUuZ2EoMTApO3RoaXMueGQoYik7dGhpcy5udyhhKX0sYzpmdW5jdGlvbigpe30sZWE6ZnVuY3Rpb24oKXt0aGlzLlJofHwodGhpcy5SaD0hMCxlLkRlKCkpfSxLZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1MmJlMuS2ImJiFwYSYmKHBhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LEY6ZnVuY3Rpb24oYixhKXt2YXIgZz0hMDtiJiYoZz0hMSk7cmV0dXJuIHRoaXMuaGEoKT8hMToodGhpcy5zdygpLHRoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpLHRoaXMuS2goKSx0aGlzLk9mPSEwLGEmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCksITApfSxzOmZ1bmN0aW9uKGIsCmEpe3RoaXMuaGEoKXx8KHRoaXMuRGIucHVzaChiKSx0aGlzLlphLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxLaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuRGImJjA8dGhpcy5EYi5sZW5ndGgmJih0aGlzLkRiPWUudW5pcXVlKHRoaXMuRGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkRiLmpvaW4oIiwiKSkpO2lmKHRoaXMuWmEpe2Zvcih2YXIgZz0wO2c8dGhpcy5aYS5sZW5ndGg7ZysrKXRoaXMuJGJbdGhpcy5aYVtnXS5yZWFzb25dPT10aGlzLiRiW2JdJiZhLnB1c2godGhpcy5aYVtnXS5kZXRhaWwpLHRoaXMuJGJbdGhpcy5aYVtnXS5yZWFzb25dPHRoaXMuJGJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlphW2ddLmRldGFpbCksYj10aGlzLlphW2ddLnJlYXNvbik7dGhpcy4kYltiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihnPWUudW5pcXVlKGEpLGI9YisiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsCmIsITAsYSl9fSxzejpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9mfSxvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5DZn0sc3c6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkRmfSx0dzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMucm99LFJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5HY30sRmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuQ2Z9LGJ6OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkRmfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5HY30seGQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxudzpmdW5jdGlvbihiKXt0aGlzLkc9Yn0sZ3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxjdTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuZ2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRtPXRoaXMuYVs2XTt0aGlzLmNrPXRoaXMuYVs3XTt0aGlzLnhqPXRoaXMuYVsyXTt0aGlzLmxpPXRoaXMuYVs1XTt0aGlzLkJqPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsyXX1jLmZvPWI7Yi5wcm90b3R5cGU9e0NtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5EbTp0aGlzLmJrKGEpfSxiazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2s6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhqOnRoaXMua2koYSl9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5saTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQmo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYT1jLmZvfHxxYSxpZD1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9aWQuQ20oNCk7KGZ1bmN0aW9uKGMpe2MucWo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuZ2IoYil9LmJpbmQodGhpcykpfSxnYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5OJiZ0aGlzLk4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTsKdmFyIFQ9Yy5xanx8VDsoZnVuY3Rpb24oYyl7Yy5waj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2Q9bnVsbDt0aGlzLmN5PTFFMzt0aGlzLmpoPW51bGw7dGhpcy5weD0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cubGIpYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkYoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Oci5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuQ3MuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5CcyhhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuZnkoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmd5KGIpfS5iaW5kKHRoaXMpKSk7CmIub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLkFzKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5BcShhKX0uYmluZCh0aGlzKSl9LEFxOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkYoKX0sZnk6ZnVuY3Rpb24oYil7dGhpcy5LZHx8KHRoaXMuS2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmh5KGIpfS5iaW5kKHRoaXMpLHRoaXMuY3kpKX0saHk6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2QpO3RoaXMuRigpfSxneTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5LZCl9LEFzOmZ1bmN0aW9uKGIpe3RoaXMuaHooYik7dGhpcy5qaD1uZXcgRGF0ZTt0aGlzLmpoLXRoaXMuenY8dGhpcy5weD90aGlzLkYoKTp0aGlzLm8oKX0sQ3M6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy54ZChuZXcgVChhKSkpOwp0aGlzLkYoKX0sTnI6ZnVuY3Rpb24oKXt9LEJzOmZ1bmN0aW9uKCl7dGhpcy56dj1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLnBqfHxyYTsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLk5hKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5KKGcpfHwodGhpcy5LKGcpLChuZXcgcmEoZyx0aGlzLkcpKS5jKCkpfX10aGlzLkkoKX19fSl9KShjKTt2YXIgc2E9Yy5yanx8c2EsdGE9bmV3IHNhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZ3PXRoaXMuYVsyXTt0aGlzLkN5PQp0aGlzLmFbNV07dGhpcy5tbz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs4XX1jLnltPWI7Yi5wcm90b3R5cGU9e0V3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gdzp0aGlzLkJ5KGEpfSxCeTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3k6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgdWE9Yy55bXx8dWEsamQ9bmV3IHVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9amQuRXcoNCk7KGZ1bmN0aW9uKGMpe2MuUms9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5MYj0hMTt0aGlzLmxnKCk7dGhpcy5uZygpO3RoaXMuQnE9ITF9LGxnOmZ1bmN0aW9uKCl7dGhpcy5MYj0KITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLkxiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlMoYil9LG5nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTGIpe3ZhciBiPXRoaXMuRmEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkxiPSEwKTt0aGlzLlYoYSl9fSxsYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5OJiYoMCx0aGlzLk4pKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCwKY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLk4mJigwLHRoaXMuTikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLk4mJigwLHRoaXMuTikoKX0uYmluZCh0aGlzKSl9LEdlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuQWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkFkKGEpfS5iaW5kKHRoaXMpKX0sQWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsKYS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5IZSYmKDAsdGhpcy5IZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxrYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHZhPWMuUmt8fHZhOyhmdW5jdGlvbihjKXtjLlFrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE06ZnVuY3Rpb24oKXt9LFJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5HYzt0aGlzLmlzUGxheWluZz10aGlzLkljPSExO3RoaXMuVGQ9MTt0aGlzLktjPVtdO3RoaXMuamI9ITF9LGM6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLkljPSExO3RoaXMuVGQ9MTt0aGlzLktjPVtdO3RoaXMuamI9ITE7dGhpcy5nZXRQbGF5ZXIoKTsKdmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlRkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5qYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuamI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuamI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmpiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMuSWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMuS2UoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLiRnJiYKIXRoaXMuaGEoKSYmKHRoaXMuamI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMudSgpKToodGhpcy5zKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy51KCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLlJhKCksdGhpcy5nZXRQbGF5ZXIoKS5CcT0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkucWI7YSYmKGEucmQoKSxhLmNlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLkljPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMuS2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuJGcmJiF0aGlzLmhhKCkmJih0aGlzLmpiPyh0aGlzLnMoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5LYy5pbmRleE9mKGEpJiYKdGhpcy5LYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLmVhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5zKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuS2MubGVuZ3RoPj10aGlzLlRkJiZ0aGlzLnUoKSl9LGN1OmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sdTpmdW5jdGlvbihiKXtiP3RoaXMuaWU/dGhpcy5pZSsrOnRoaXMuaWU9MTp0aGlzLmhlP3RoaXMuaGUrKzp0aGlzLmhlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkNoKGEudmlkZW9UYWcpP2EuTGI/dGhpcy5vKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5JY3x8dGhpcy5pc1BsYXlpbmc/Cih0aGlzLmhlPnRoaXMuaWUmJihiPSExKSx0aGlzLkYoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDUwKTooYS5sZygpLGEubmcoKSxhLkxifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHdhPWMuUWt8fHdhOyhmdW5jdGlvbihjKXtjLlNrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuY3MoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPW5ldyB2YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSihnKXx8dGhpcy54dChnKXx8KHRoaXMuSyhnKSxnPW5ldyB3YShnLHRoaXMuRyksZy5NKCksZy5jKCkpfX10aGlzLkkoKX19LG16OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LApjczpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUubmIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHhhPWMuU2t8fHhhLHlhPW5ldyB4YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dT10aGlzLmFbNV07dGhpcy5keD10aGlzLmFbOV07dGhpcy5PcD10aGlzLmFbOV07dGhpcy51bT10aGlzLmFbOF07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5jcD10aGlzLmFbOF07dGhpcy51cj10aGlzLmFbMV07dGhpcy5JdD10aGlzLmFbNl07dGhpcy5vbT10aGlzLmFbNV07dGhpcy4kcz10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs0XX1jLnZvPWI7Yi5wcm90b3R5cGU9e3V1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52dTp0aGlzLmN4KGEpfSxjeDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZHg6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5PcDp0aGlzLnRtKGEpfSx0bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW06dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmZsOnRoaXMuYnAoYSl9LGJwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5jcDp0aGlzLnRyKGEpfSx0cjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudXI6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkl0OnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vbTp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHM6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6YT1jLnZvfHx6YSxrZD1uZXcgemEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT0Ka2QudXUoNCk7KGZ1bmN0aW9uKGMpe2MuYW89bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb19pZCk7dGhpcy5TKGIpO3ZhciBiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0sYT10aGlzLmdldFJhd1BsYXllcigpO2ImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlYoYik6dGhpcy5JKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlhPWkNPTSJ9fSl9KShjKTsKdmFyIEFhPWMuYW98fEFhOyhmdW5jdGlvbihjKXtjLiRuPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IudHJhY2tlci52YXN0X3ByZXJvbGx8fGIudHJhY2tlci52YXN0X3Bvc3Ryb2xsP3RoaXMubygpOih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLnUoKSl9LHU6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMuRigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEJhPWMuJG58fEJhOyhmdW5jdGlvbihjKXtjLmJvPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzJiYKMDxlLk5hKHdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcykpe3ZhciBiPXdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YlthXTtpZihnLmNvbnRyb2xzJiZnLmNvbnRyb2xzLnBsYXllcilnPW5ldyBBYShnKSx0aGlzLkooZyl8fCh0aGlzLksoZyksKG5ldyBCYShnLHRoaXMuRykpLmMoKSk7ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19KX0pKGMpO3ZhciBDYT1jLmJvfHxDYSxEYT1uZXcgQ2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRmk9dGhpcy5hWzRdO3RoaXMuSWs9dGhpcy5hWzVdO3RoaXMuRHU9dGhpcy5hWzhdO3RoaXMuWnE9dGhpcy5hWzRdO3RoaXMuVW09dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbNl19Yy5Laz1iO2IucHJvdG90eXBlPQp7RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZpOnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jazp0aGlzLkN1KGEpfSxDdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkR1OnRoaXMuWXEoYSl9LFlxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5acTp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBFYT1jLktrfHxFYSxsZD1uZXcgRWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1sZC5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5Gbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPQpiLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5WKGIpOnRoaXMuZmEoKSk6dGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuZ2IoYil9LmJpbmQodGhpcykpfSxnYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5OJiZ0aGlzLk4oKX0sbWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGcpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciBGYT1jLkZufHxGYTsoZnVuY3Rpb24oYyl7Yy5Fbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5XPXRoaXMuV3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnFhPXRoaXMudGM9dGhpcy54YT10aGlzLlFjPSExO3RoaXMucGg9ZS51YigxMCk7dGhpcy5RaD0hMDt0aGlzLmVjPXRoaXMuSmc9ITE7dGhpcy5laCgpO3RoaXMua3EoKTt0aGlzLlFhKCl9LEF6OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5vYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5aLCI7Iix0eXBlb2YgYi5aLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlo/Yi5aLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5aP3R5cGVvZiBiLlouc3RhdGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuUiwiOyIsdHlwZW9mIGIuUiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLlI/Yi5SLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuRGE6InVuZGVmaW5lZFgiLAoiOyIsYi5SP3R5cGVvZiBiLlIuRGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLkRhP2IuaW1hLkRhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuRGE/dHlwZW9mIGIuaW1hLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuUiYmYi5SLkRhP2IuUi5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5SJiZiLlIuRGE/dHlwZW9mIGIuUi5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5QZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5QZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuUj9iLlIuUGQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5QZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsCiI7IixiLmltYT9iLmltYS5RZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5RZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlFkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuUWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEudmE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEudmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuUj9iLlIudmE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi52YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuV2Q6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuV2Q6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLldkOgoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLldkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMucGgpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sSGI6ZnVuY3Rpb24oKXtpZighdGhpcy52YSl7dmFyIGI9dGhpcy5wYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudmE9CmIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnZhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnZhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnZhfSx5ZzpmdW5jdGlvbigpe2lmKCF0aGlzLnRjKXt2YXIgYj10aGlzLnBiKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMudGM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLnRjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMudGN9LHZ0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuSWcpe3ZhciBiPXRoaXMucGIoKSxhPXRoaXMudXQoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLklnPSEwKX1yZXR1cm4gdGhpcy5JZ30sdXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwohdGhpcy5RYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuUWM9ITApO3JldHVybiB0aGlzLlFjfSxRYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLlVlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcyksCjIwKX0sVWU6ZnVuY3Rpb24oKXt0aGlzLmVjPSEwO3ZhciBiPXRoaXMueWcoKTtpZihifHx0aGlzLmhhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5zKCJhZGVycm9yIiwKdGhpcy5XKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5QYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuZmM9ITA7aWYoZS5zYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5mY3x8KHRoaXMucygiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcyksCjIwKX0sbHo6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmFnJiZiLmFkcyYmKHRoaXMuYWc9Yi5hZHMpO3JldHVybiB0aGlzLmFnfSxrcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLmFhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLmFhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMuYWEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLmFhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubygpO3RoaXMuS2UoKX0uYmluZCh0aGlzKSl9LGRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy55ZygpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSw1MCl9LGVoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLnZ0KCkpe3ZhciBhPXRoaXMucGIoKSxnPXRoaXMuSGIoKTthJiZnJiYodGhpcy5wYigpLHRoaXMuSGIoKSx0aGlzLmVjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWM/dGhpcy5vKCk6KHRoaXMuYWEoITApLHRoaXMucygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLnBiKCl9ZWxzZSB0aGlzLkpnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGIoKSxiPXRoaXMuSGIoKTthJiYhYj8odGhpcy5zKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmFhKCkpOih0aGlzLmFhKCEwKSx0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5KZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVoKCl9LmJpbmQodGhpcyksNTApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LGxxOmZ1bmN0aW9uKCl7dGhpcy5rY3x8KHRoaXMua2M9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLmtjIT1iLmFkcy5zdGF0ZSYmKHRoaXMua2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLmtjKXt0aGlzLm8oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMua2M9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxxKCl9LmJpbmQodGhpcyksMTApfSx5YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpezA8PWUuZmQoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuVz90aGlzLnUoITApOih0aGlzLnFhPSEwLHRoaXMubygiZW1wdHkgdmFzdCIpKX0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMubygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuUWg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5GKHRoaXMuUWgsZnVuY3Rpb24oKXt0aGlzLmRnKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApxcTpmdW5jdGlvbigpe3RoaXMudnp8fCgxMDx0aGlzLmR5Pyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuZHkrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy4kdigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xcSgpfS5iaW5kKHRoaXMpLDUwKSkpfSwkdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5leSl7dGhpcy5leT0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5hYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBHYT1jLkVufHxHYTsoZnVuY3Rpb24oYyl7Yy5Hbj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApjOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuRGgod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLkRoKGJbZ10pfWNhdGNoKGQpe310aGlzLkkoKX19LERoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuTmEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgRmEoYltnXSksYS5tYXx8dGhpcy5KKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLksoYSksKG5ldyBHYShhLHRoaXMuRykpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy55Yj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy55Yyl9fSl9KShjKTt2YXIgSGE9Yy5Hbnx8SGEsSWE9bmV3IEhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk54PXRoaXMuYVs5XTt0aGlzLiR1PXRoaXMuYVszXTt0aGlzLkdrPXRoaXMuYVs4XTt0aGlzLnhxPXRoaXMuYVs4XTt0aGlzLldqPXRoaXMuYVs2XTt0aGlzLkp1PXRoaXMuYVs5XTt0aGlzLlJpPXRoaXMuYVsxMF07dGhpcy5Ldz10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs4XX1jLnR2PWI7Yi5wcm90b3R5cGU9e014OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTng6dGhpcy5adShhKX0sWnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR1OnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Hazp0aGlzLndxKGEpfSx3cTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnhxOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Xajp0aGlzLkl1KGEpfSxJdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSnU6dGhpcy5RaShhKX0sUWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJpOnRoaXMuSncoYSl9LEp3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS3c6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBKYT1jLnR2fHxKYSxtZD1uZXcgSmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1tZC5NeCg0KTsoZnVuY3Rpb24oYyl7Yy5ibj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5nZXRQbGF5ZXIoKS5pZCk7CmIuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlYoYSl9LGxhOmZ1bmN0aW9uKCl7fSxnYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksZz1iLmdldER1cmF0aW9uKCk7YSYmMDxhJiZnJiYwPGcmJmE+PWctMiYmdGhpcy5OJiYidW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkKCkmJnRoaXMuTigpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBhdXNlKCk6Yi5pc1BhdXNlZCgpfHxiLmdldFBsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQYXVzZWQoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGxheSgpOgpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT0xMDAqYi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgS2E9Yy5ibnx8S2E7KGZ1bmN0aW9uKGMpe2MuYW49dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuSWI9bnVsbDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGI9ITE7dGhpcy5yaCgpO2lmKGIuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGIuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgYT0KYi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5YYj0hMCx0aGlzLm8oKTt0aGlzLnMoImFkZXJyb3IiLGEpO2IuZ2V0UGxheWVyKCk7Yi5nZXRQbGF5ZXIoKTt0aGlzLlZjKCl9fWVsc2UiZmxhc2giPT1iLnBsYXllcl90eXBlP3RoaXMuV2YoKTp0aGlzLm8oKX0sVmM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuaGEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmdldFBsYXllcigpO2lmKCJwbGF5aW5nIj09YS5nZXRQbGF5ZXIoKS5zdGF0ZSlpZihhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBnPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7CmEuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLlhiPSEwLHRoaXMubygpO3RoaXMucygiYWRlcnJvciIsZyk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7dGhpcy5YYj90aGlzLmVhKCk6Yj9hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlP3RoaXMuRigxMDEyIT1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlKTphLmdldFBsYXllcigpLmFkc19sb2FkZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZjKCEwKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuRighMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZjKCEwKX0uYmluZCh0aGlzKSwxMDApfX1lbHNlIHRoaXMubygpO2Vsc2UgYS5nZXRQbGF5ZXIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlZjLmJpbmQodGhpcyksCjEwMCl9fSxXZjpmdW5jdGlvbigpe2lmKCF0aGlzLmhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkliKSx0aGlzLm8oKSk7ImZpcnN0UXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuSWIpLHRoaXMubygpKTsibWlkcG9pbnQiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuSWIpLHRoaXMubygpKTsidGhpcmRRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5JYiksdGhpcy5vKCkpOyJhZExvYWRpbmdFcnJvciI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmbnVsbD09dGhpcy5JYiYmKHRoaXMuSWI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhifHwKKHRoaXMucygiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy5GKCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2YuYmluZCh0aGlzKSw1MCl9fSxyaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7Yi5hZHNfbG9hZGVyP2IuYWRzX2xvYWRlciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YS5nZXRFcnJvcigpO2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKTtpZigxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKSl0aGlzLlhiPSEwLHRoaXMubygpOzkwMT09YS5nZXRFcnJvckNvZGUoKSYmCnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmgoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTGE9Yy5hbnx8TGE7KGZ1bmN0aW9uKGMpe2MuY249dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiZ2aWRlby5nZXRQbGF5ZXImJnZpZGVvLmdldFBsYXllcigpJiYodmlkZW8uZ2V0UGxheWVyKCkuZWx8fCJmbGFzaCI9PXZpZGVvLnBsYXllcl90eXBlKSl7dmFyIGI9bmV3IEthKHZpZGVvKTt0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBMYShiLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWE9Yy5jbnx8TWEsTmE9bmV3IE1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklyPXRoaXMuYVs3XTt0aGlzLnZzPXRoaXMuYVsxXTt0aGlzLnZwPQp0aGlzLmFbN107dGhpcy5Tbj10aGlzLmFbM107dGhpcy5HbD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsxMF19Yy5Xbz1iO2IucHJvdG90eXBlPXtIcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSXI6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZzOnRoaXMudXAoYSl9LHVwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52cDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU246dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgT2E9Yy5Xb3x8T2EsbmQ9bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9bmQuSHIoNCk7KGZ1bmN0aW9uKGMpe2MuWm09Cm4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmVsXzthfHwoImZ1bmN0aW9uIj09dHlwZW9mIGIuZWw/YT1iLmVsKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGIuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQoKSkpKTt0aGlzLlMoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJihiPWJbMF0pO3RoaXMuVihiKX0sZ2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuTiYmdGhpcy5OKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmKGE9Yi5wYXVzZWQoKSk7YXx8Yi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMTsiZnVuY3Rpb24iPT10eXBlb2YgYi5wYXVzZWQmJihhPWIucGF1c2VkKCkpO2EmJmIucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUyIn0sa2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5tdXRlZCYmImZ1bmN0aW9uIj09dHlwZW9mIGEubXV0ZWQmJihiPWEubXV0ZWQoKSk7cmV0dXJuIGJ9LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExO2Iudm9sdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgYi52b2x1bWUmJihhPTEwMCpiLnZvbHVtZSgpKTtyZXR1cm4gYX0sVWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9fSl9KShjKTt2YXIgUGE9Yy5abXx8UGE7KGZ1bmN0aW9uKGMpe2MuWW09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuVmYoKTtiLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwO3RoaXMueG98fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoInRpbWV1cGRhdGUiKTt0aGlzLkYoITApfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9GSVJTVF9RVUFSVElMRSIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX01JRFBPSU5UIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfVEhJUkRfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLnMoImFkc2Vycm9yIik7dGhpcy56cyhhKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LAp6czpmdW5jdGlvbihiKXt2YXIgYT05OTk5OTk7aWYoYi5kYXRhJiZiLmRhdGEuQWRFcnJvcilmb3IodmFyIGcgaW4gYi5kYXRhLkFkRXJyb3IpYi5kYXRhLkFkRXJyb3IuaGFzT3duUHJvcGVydHkoZykmJiJudW1iZXIiPT10eXBlb2YgYi5kYXRhLkFkRXJyb3JbZ10mJihhPWIuZGF0YS5BZEVycm9yW2ddLHRoaXMucyhhKSk7OTAxPT1hP3RoaXMubygpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLlhiPSEwLHRoaXMubygpLHRoaXMuZWEoKSk6dGhpcy5GKCl9LFZmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkcyYmYi5hZHMuaXNBZFBsYXlpbmcmJmIuYWRzLmlzQWRQbGF5aW5nKCk/KHRoaXMueG89ITAsdGhpcy5vKCkpOnRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5WZi5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZz8KdGhpcy5GKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgUWE9Yy5ZbXx8UWE7KGZ1bmN0aW9uKGMpe2MuJG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllckZyYW1ld29yayYmd2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlJiYiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKXt2YXIgYj13aW5kb3cucGxheWVyRnJhbWV3b3JrLmdldEJhc2UoKTtpZihiJiZiLmdldEFsbFBsYXllcnMmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFsbFBsYXllcnMpaWYoKGI9Yi5nZXRBbGxQbGF5ZXJzKCkpJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9bmV3IFBhKGJbYV0pO3RoaXMuSihnKXx8KHRoaXMuSyhnKSwobmV3IFFhKGcsdGhpcy5HKSkuYygpKX1lbHNlIHRoaXMuSSgpfWVsc2UgdGhpcy5WZSgpLAp0aGlzLkkoKX19KX0pKGMpO3ZhciBSYT1jLiRtfHxSYSxTYT1uZXcgUmEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzldO3RoaXMuemk9dGhpcy5hWzhdO3RoaXMuUXM9dGhpcy5hWzddO3RoaXMudHA9dGhpcy5hWzZdO3RoaXMuTXQ9dGhpcy5hWzRdO3RoaXMueXU9dGhpcy5hWzZdO3RoaXMucHU9dGhpcy5hWzRdO3RoaXMuTnM9dGhpcy5hWzddO3RoaXMua3Y9dGhpcy5hWzEwXTt0aGlzLkd4PXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsxMF19Yy5Obz1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTW06dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnppOnRoaXMuUHMoYSl9LFBzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Rczp0aGlzLnNwKGEpfSxzcDpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLnRwOnRoaXMuTHQoYSl9LEx0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NdDp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5vdShhKX0sb3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnB1OnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnM6dGhpcy5qdihhKX0sanY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmt2OnRoaXMuRngoYSl9LEZ4OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5HeDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIFRhPWMuTm98fFRhLG9kPW5ldyBUYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPW9kLkxtKDQpOyhmdW5jdGlvbihjKXtjLk1pPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsCmEpe3RoaXMuaShiKTt0aGlzLmRoPWF9LE06ZnVuY3Rpb24oKXt9LEVlOmZ1bmN0aW9uKGIpe3RoaXMuZGg9YjtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGgpLnBhcmVudE5vZGU7dGhpcy5TKGIpO3RoaXMuVihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIFVhPWMuTWl8fFVhOyhmdW5jdGlvbihjKXtjLkxpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmkoYixhKX0sRWU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTsKdmFyIGI9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUiksYT10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuQURWRVJUSVNJTkcpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuQkVHSU4sZnVuY3Rpb24oKXt0aGlzLnMoImNvbnRlbnRwbGF5Iik7dGhpcy5GKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMucygiY29udGVudHBsYXkiKTt0aGlzLkYoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBWYT1jLkxpfHxWYTsoZnVuY3Rpb24oYyl7Yy5OaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPQpicmlnaHRjb3ZlLmV4cGVyaWVuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1icmlnaHRjb3ZlLmdldEV4cGVyaWVuY2UoYSksZD0hMTtnJiYoZD1nLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUikpO2lmKGcmJmQmJmQuaXNQbGF5ZXJEZWZpbmVkKCkpZD1uZXcgVWEoZCxhKSx0aGlzLkooZCl8fChkLkVlKGEpLHRoaXMuSyhkKSxkPW5ldyBWYShkLHRoaXMuRyxnKSxkLkVlKGcpLGQuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFdhPWMuTml8fFdhLFhhPW5ldyBXYShpYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTHg9dGhpcy5hWzJdO3RoaXMuWXU9dGhpcy5hWzJdO3RoaXMuVXM9dGhpcy5hWzJdO3RoaXMuUXE9dGhpcy5hWzhdO3RoaXMuUnU9dGhpcy5hWzZdO3RoaXMuemo9dGhpcy5hWzddOwp0aGlzLmw9dGhpcy5hWzddfWMuZHU9YjtiLnByb3RvdHlwZT17S3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MeDp0aGlzLlh1KGEpfSxYdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWXU6dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuUHEoYSl9LFBxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5RcTp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnU6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnpqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgWWE9Yy5kdXx8WWEscGQ9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9cGQuS3goNCk7KGZ1bmN0aW9uKGMpe2MueGw9Cm4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLlMoYik7dGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sUGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sUDpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTsKdmFyIFphPWMueGx8fFphOyhmdW5jdGlvbihjKXtjLndsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlBhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMuSmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLkpjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLkpjKCl9LmJpbmQodGhpcykpKTp0aGlzLkpjKCl9LEpjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubygpOih0aGlzLnMoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksCjIwMCl9fSl9KShjKTt2YXIgJGE9Yy53bHx8JGE7KGZ1bmN0aW9uKGMpe2MueWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBaYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3ICRhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBhYj1jLnlsfHxhYixiYj1uZXcgYWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMueGs9dGhpcy5hWzFdO3RoaXMuQXI9dGhpcy5hWzFdO3RoaXMub3Y9dGhpcy5hWzhdO3RoaXMuUnQ9dGhpcy5hWzldO3RoaXMuWHE9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNV19Yy5Ybz1iO2IucHJvdG90eXBlPQp7cXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ0OnRoaXMud2soYSl9LHdrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54azp0aGlzLnpyKGEpfSx6cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXI6dGhpcy5udihhKX0sbnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm92OnRoaXMuUXQoYSl9LFF0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5SdDp0aGlzLldxKGEpfSxXcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWHE6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBjYj1jLlhvfHxjYixxZD1uZXcgY2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1xZC5xdCg0KTsoZnVuY3Rpb24oYyl7Yy5kbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLk1lPQowO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZmEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlYoYik6dGhpcy5mYSgpfSxBdjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnFiLGc9dGhpcy5vYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5LYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5yZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuTWU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/Cih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sVWE6ZnVuY3Rpb24oKXt0aGlzLk1lKys7aWYoMTA8dGhpcy5NZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSwKd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LApQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxsYTpmdW5jdGlvbigpe30sZ2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5OJiZ0aGlzLk4oKX19KX0pKGMpO3ZhciBkYj1jLmRtfHxkYjsoZnVuY3Rpb24oYyl7Yy5jbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLmtlKWlmKHRoaXMucmJ8fCh0aGlzLnJiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMucmIrKywxNTx0aGlzLnJiKXRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMua2U9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMueWEoKXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5XKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApfX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHwKNDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlc9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5XPXRoaXMuV3x8ITE7dGhpcy54YSgpO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50JiYhdGhpcy5Mcj8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5XKTt0aGlzLnUoKX0uYmluZCh0aGlzKSksdGhpcy5Mcj0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuQXYoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIGViPWMuY218fGViOyhmdW5jdGlvbihjKXtjLmVtPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLklhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IGRiKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLm1hfHx0aGlzLkooYSl8fCh0aGlzLksoYSksKG5ldyBlYihhLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgZmI9Yy5lbXx8ZmIsZ2I9bmV3IGZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5GcD10aGlzLmFbMl07dGhpcy5ldj10aGlzLmFbNl07dGhpcy5Vaz10aGlzLmFbNl07dGhpcy5Naj10aGlzLmFbMV07dGhpcy5Qdj10aGlzLmFbNV07dGhpcy5GdT10aGlzLmFbMl07dGhpcy5Jcz10aGlzLmFbMl07dGhpcy5rcj10aGlzLmFbMTBdO3RoaXMuVHk9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMl19Yy5FbT1iO2IucHJvdG90eXBlPXtFcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnA6dGhpcy5kdihhKX0sZHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ldjp0aGlzLlRrKGEpfSxUazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVWs6dGhpcy5MaihhKX0sTGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1qOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Qdjp0aGlzLkV1KGEpfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRnU6dGhpcy5IcyhhKX0sSHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5Jczp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua3I6dGhpcy5TeShhKX0sU3k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlR5OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgaGI9Yy5FbXx8aGIscmQ9bmV3IGhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9cmQuRXAoNCk7KGZ1bmN0aW9uKGMpe2MubGs9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYi5lbGVtZW50KTt0aGlzLlYoYi5lbGVtZW50KX0sUGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSwKa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIGliPWMubGt8fGliOyhmdW5jdGlvbihjKXtjLmtrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkYoKX19KX0pKGMpO3ZhciBqYj1jLmtrfHxqYjsoZnVuY3Rpb24oYyl7Yy5taz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsCmZ1bmN0aW9uKGIpe2I9bmV3IGliKGIuZGV0YWlsKTtiLm1hfHx0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBqYihiLHRoaXMuRykpLmMoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGtiPWMubWt8fGtiLG1iPW5ldyBrYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncj10aGlzLmFbN107dGhpcy5QeD10aGlzLmFbMV07dGhpcy5Sdj10aGlzLmFbN107dGhpcy51bz10aGlzLmFbMV07dGhpcy5ocD10aGlzLmFbN107dGhpcy5waT10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs4XX1jLkJyPWI7Yi5wcm90b3R5cGU9e2ZyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3I6dGhpcy5PeChhKX0sT3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5QeDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUnY6dGhpcy50byhhKX0sdG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy51bzp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaHA6dGhpcy5vaShhKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnBpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgbmI9Yy5Ccnx8bmIsc2Q9bmV3IG5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9c2QuZnIoNCk7KGZ1bmN0aW9uKGMpe2MuTWs9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUudmcoYiwiZWxlbWVudElEIik7dGhpcy5saD1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Cmcuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLmxoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToiYWZ0ZXIiPT10aGlzLmxoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYSk7dGhpcy5TKGcpO3RoaXMuVihnKTt0aGlzLmJkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5iZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYmQpfSxrYTpmdW5jdGlvbigpe3JldHVybiEwfSxwcTpmdW5jdGlvbigpe2UuUGcodGhpcy5iZCk7ZS51ZSh0aGlzLmJkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucHEoKX0uYmluZCh0aGlzKSwKNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgb2I9Yy5Na3x8b2I7KGZ1bmN0aW9uKGMpe2MuTGs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkYoITApfX0pfSkoYyk7dmFyIHBiPWMuTGt8fHBiOyhmdW5jdGlvbihjKXtjLk5rPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSWE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLnZnKGIsImVsZW1lbnRJRCIpO2UuUGcoYSkmJihiPW5ldyBvYihiKSx0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBwYihiLHRoaXMuRykpLmMoKSkpO3RoaXMueWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMueWI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBxYj1jLk5rfHxxYixyYj1uZXcgcWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnU9dGhpcy5hWzFdO3RoaXMuVnk9dGhpcy5hWzldO3RoaXMuRHc9dGhpcy5hWzhdO3RoaXMudm49dGhpcy5hWzddO3RoaXMubD10aGlzLmFbN119Yy5hcT1iO2IucHJvdG90eXBlPXtNdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTnU6dGhpcy5VeShhKX0sVXk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZ5OnRoaXMuQ3coYSl9LEN3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Edzp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudm46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBzYj1jLmFxfHxzYix0ZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9dGQuTXUoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnRrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LG93OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sRm86ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHg9Yy50a3x8eDsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGcsZCxjKXt0aGlzLlhhPWE7dGhpcy5wZz10aGlzLmFpPSExO3RoaXMuZmg9ZDt0aGlzLkVoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLlhhPW5ldyB4KGEpKTsKdmFyIGU9dGhpcy5CYj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9ZS5yZWFkeVN0YXRlfHwyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzfHxnKGUpO2lmKGQmJjQ9PWUucmVhZHlTdGF0ZSYmMjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1cylkKGUpO2Vsc2UgaWYoND09ZS5yZWFkeVN0YXRlJiYwPT1lLnN0YXR1cyYmbCYmbC55ZSh0aGlzLlhhLnVybCkmJmwuRmQpe3ZhciBoPW5ldyB4KGEudXJsKTtoLm93KCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwubmEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLm5hKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT0KZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMudWs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMucGcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkVoP3RoaXMuQmIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5CYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLmFpfHwodGhpcy5CYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuQmIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksdGhpcy5CYi5zZW5kKGEpfWNhdGNoKGMpe2wmJmwueWUodGhpcy5YYS51cmwpPwpsLkZkP2wubmEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwueWUodGhpcy5YYS51cmwpLHRoaXMuZmgmJnRoaXMuZmgoKX1yZXR1cm4gdGhpcy5CYn19fSkoYyk7dmFyIHRiPWMudWt8fHRiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zYT0hMTt0aGlzLmhjPSIiO3RoaXMuWGQ9dGhpcy5nYz10aGlzLmtiPW51bGw7dGhpcy5KcT10aGlzLndiPXRoaXMuVmc9ITE7dGhpcy5HYT0iIjt0aGlzLlJnPSExO3RoaXMuQ2E9dGhpcy5oZD0iIjt0aGlzLk5nPXRoaXMuYmE9dGhpcy5pc0VuYWJsZWQ9dGhpcy5TZT0hMTt0aGlzLkFhPVtdO3RoaXMuRWc9dGhpcy5SYj0iIjt0aGlzLmdlPSExO3RoaXMuZ2Y9MDt0aGlzLnhmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMudmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLkNiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5GYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy53Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuVGI9IiI7dGhpcy54Yj1bXTt0aGlzLlViPVtdO3RoaXMuU2I9IiI7dGhpcy5oZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnJlPSExO3RoaXMucnE9dGhpcy5HZD1udWxsO3RoaXMuQWg9dGhpcy5EYz10aGlzLmhnPXRoaXMubWY9dGhpcy5GZD10aGlzLllkPXRoaXMuSGM9ITE7dGhpcy4kYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5rZD0wO3RoaXMuR2c9ITE7dGhpcy5GZz0xRTN9Yy52az1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5zYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLmhjLGFkdGFnbW9kaWZpZXI6dGhpcy5rYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuZ2MsYWR0YWdyZWdleDp0aGlzLlhkLGpzcG9wdXBzOnRoaXMuVmcsCnNpZGVsb2Fkczp0aGlzLndiLGRpc2FibGV0ZXN0czp0aGlzLkpxLGhvbWFkQWxpYXM6dGhpcy5HYSxpc0luaXRpYWxpemVkOnRoaXMuUmcsZ2xvYmFsQ29uZmlnOnRoaXMuaGQsY2xpZW50Q29uZmlnOnRoaXMuQ2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5iYSxpc0Jsb2NrZWQ6dGhpcy5OZyxzZXJ2ZXI6dGhpcy5BYSxzdm1Db25maWc6dGhpcy5SYixob21hZEFkcGF0aDp0aGlzLkVnLGRpc2FibGVDb29raWVUZXN0OnRoaXMuZ2UsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuZ2YsSE9NQURfVkVSSUZJRUQ6dGhpcy54ZixIT01BRF9CTE9DS0VEOnRoaXMudmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuQ2IsSE9NQURfQURCTE9DS0VSOnRoaXMuRmMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLndmLHRlc3RIaWRlOnRoaXMuVGIsdGVzdFRhZ3M6dGhpcy54Yix0ZXN0VGFnc0pTOnRoaXMuVWIsdGVzdENvb2tpZTp0aGlzLlNiLHRocm90dGxlOnRoaXMuaGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsCmhvbWFkVGVzdGVkOnRoaXMucmUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5ycSxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5ZZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5GZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5tZixjb25maWdGYWlsdXJlczp0aGlzLiRhLHNpdGVDb25maWc6dGhpcy5RYixzZXJ2ZXJJZDp0aGlzLnZoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5uYyx2cGFpZDp0aGlzLkRjLHNraXBBbGxvd2VkOnRoaXMuQWgsdm1hcHM6dGhpcy5XaH19LEVzOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLiRhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuJGFbYl0mJjE9PXRoaXMuJGFbYl0mJihhPSEwKTtyZXR1cm4gYX0sWGU6ZnVuY3Rpb24oYSl7dGhpcy4kYVthXT0hMH0sZHM6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuJGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy4kYVtiXSYmCjE9PXRoaXMuJGFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sRGQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMudWIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5NcChhKX0sd2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLGU9IiIsaD0iIixrPSIiO2lmKCF0aGlzLnNhJiYhYilyZXR1cm4gbmV3IHgoYSk7Yz10aGlzLnhlKGEpO2U9dGhpcy56YShhKTtjPwoodGhpcy52YygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy52ZCgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLmhjfHx0aGlzLmtifHx0aGlzLmdjfHx0aGlzLlhkKSYmKGs9dGhpcy5udShrKSk7YT1uZXcgeChoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmZzKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLm5iKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0seGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsKKGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy52YygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sdmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQWEmJnRoaXMuQWEubGVuZ3RoJiYwPHRoaXMuQWEubGVuZ3RoJiYoYj10aGlzLkFhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LHllOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMueGUoYSk7cmV0dXJuIGJ9LGZzOmZ1bmN0aW9uKGEpe3ZhciBiPQoiIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuR2EmJjA8dGhpcy5HYS5sZW5ndGgpcmV0dXJuIHRoaXMuR2E7Zm9yKGQgaW4gdGhpcy5HYSlpZihiPXRoaXMuR2FbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5nejtyZXR1cm4ibm9uZSJ9LGxkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQWFbdGhpcy52aF19LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZCgpLGI9dGhpcy56aCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxhaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spOwpyZXR1cm4gYn0sbXU6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLnphKGEpLGM9IiIsYz0iIixoO2ZvcihoIGluIGIpe2lmKGJbaF0uc3VidmFsdWVzKXtmb3IodmFyIEI9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbaF0pLnNwbGl0KCImIiksYz17fSxrPTA7azxCLmxlbmd0aDtrKyspe3ZhciByPUJba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5haChjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pO0I9W107Zm9yKGwgaW4gYylCLnB1c2gobCsiPSIrY1tsXSk7Yz1CPWVuY29kZVVSSUNvbXBvbmVudChCLmpvaW4oIiYiKSl9ZWxzZSBjPXRoaXMuYWgoZC5xdWVyeUtleVtoXSxoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31sPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbC5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxudTpmdW5jdGlvbihhKXt0aGlzLmhjJiYKKGErPXRoaXMuaGMpO2lmKHRoaXMua2IpZm9yKHZhciBiIGluIHRoaXMua2IpdGhpcy5rYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5rYltiXSkpO3RoaXMuZ2MmJihhPXRoaXMubXUoYSx0aGlzLmdjKSk7cmV0dXJuIGF9LGY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLlJnPSEwO3RoaXMuaGQ9YTt0aGlzLkNhPWI7dGhpcy5TZT1kO3RoaXMuR2Q9Yzt0aGlzLmxjPWU7dGhpcy5RYj1ofHx7fTt0aGlzLlp0KCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkNhKXRoaXMuWHQoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuQ2EpdHJ5e3RoaXMuQ2E9YigpLHRoaXMuV2MoKX1jYXRjaChrKXt0aGlzLm5hKCJub0NsaWVudENvbmZpZyIpfX0sZmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwKITEpfXJldHVybiBifSxadDpmdW5jdGlvbigpe3RoaXMuSGEobmV3IHgodGhpcy5oZCt0aGlzLk9jKCJnbG9iYWwiKSksdGhpcy53cy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLldjKCl9LmJpbmQodGhpcyksITApfSxYdDpmdW5jdGlvbigpe25ldyB4KHRoaXMuQ2ErdGhpcy5PYygiY2xpZW50IikpO3RoaXMuSGEobmV3IHgodGhpcy5DYSt0aGlzLk9jKCJjbGllbnQiKSksdGhpcy5XYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiY2xpZW50Iik7dGhpcy5uYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sT2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMudWIoKTt0aGlzLlFiJiZ0aGlzLlFiLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5RYiYmdGhpcy5RYi5ub0NhY2hlQnVzdGVyJiYKKGI9IiIpO3JldHVybiBifSxuYTpmdW5jdGlvbihhKXtpZighdGhpcy5ZZCl7dGhpcy5ZZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLmZkKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5sYz0hMSk7dGhpcy5sYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmxjP3RoaXMubGMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuYmE9dGhpcy5OZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy52ZikpO3RoaXMuemIoKTtlLm9jKGsucHYpOyhiPWUuZmQodGhpcy5sZCgpKSl8fChiPWUuZmQoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHdzOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXt2YXIgYj0Ke307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5WYihiLmVuYWJsZWQpO3RoaXMuYmE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5DYXx8dGhpcy5SYnx8dGhpcy5HYXx8dGhpcy5XYygpOih0aGlzLnNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKSx0aGlzLnpiKCkpfX0sV2M6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5DYX1lbHNlIGE9dGhpcy5DYTt0aGlzLmlzRW5hYmxlZD10aGlzLlZiKGEuZW5hYmxlZCk7dGhpcy5iYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5BYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuQWEubGVuZ3RoO2IrKyl0aGlzLkFhW2JdPQp0aGlzLkFhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLlJiPWEuY29uZmlnfHwiIjt0aGlzLkdhPWEuYWxpYXN8fG51bGw7dGhpcy5FZz1hLmFkcGF0aHx8IiI7dGhpcy5nZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLnZoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLkFhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuUmImJnRoaXMuR2EmJnRoaXMuQWEubGVuZ3RoP3RoaXMub2QoITEpOih0aGlzLnNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKSx0aGlzLnpiKCkpfSxvZDpmdW5jdGlvbihhKXtpZighdGhpcy5iYSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHgodGhpcy52ZCgpKSxkPXRoaXMuemEodGhpcy5SYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjsKYi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHgodGhpcy5SYit0aGlzLk9jKCJjdXN0b21lciIpKTt0aGlzLkhhKGIsdGhpcy5Ndy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiY3VzdG9tZXIiKTthP3RoaXMuSW0/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5JbT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2QoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMub2QoITApfS5iaW5kKHRoaXMpLCEwKX19LE13OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fXRoaXMuRmQ9dGhpcy5WYihiLnN0cmljdCk7dGhpcy5tZj10aGlzLlZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLmhnPQpiLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMubmM9dGhpcy5WYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuVmIoYi5lbmFibGVkKTt0aGlzLlRiPWIudGVzdGhpZGV8fCIiO3RoaXMueGI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLlViPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuaGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5rYj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5nYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuWGQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVmc9Yi5qc3BvcHVwc3x8ITE7dGhpcy53Yj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5EYz1iLnZwYWlkfHwhMTt0aGlzLlFiLnZwYWlkPXRoaXMuRGM7dGhpcy5BaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLlRjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5XaD1iLnZtYXBzfHwiIjt0aGlzLlNiPWIudGVzdDNyZHBhcnR5Y29va2llJiYKYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLm9zKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5nZSYmKHRoaXMuU2I9bnVsbCk7dGhpcy5oZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnJlJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5yZT0hMCx0aGlzLm9kKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmt4KCkmJih0aGlzLlRifHx0aGlzLlVifHx0aGlzLnhifHx0aGlzLlNiKT90aGlzLlNlPyh0aGlzLnNhPXRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKSx0aGlzLmFlKCksdGhpcy56YigpKTp0aGlzLlF3KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuUncoKSl9fSxRdzpmdW5jdGlvbigpe3RoaXMuUHcoKTt0aGlzLlN3KCl9LFN3OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciKwphKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Mud2lkdGg9MTtjLmhlaWdodD0xO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7Yy5zcmM9ImFib3V0OmJsYW5rIjt2YXIgaD1lLmdhKDEwKSxCPWUuZ2EoMTApLGs9ZS5nYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoayxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwKIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKTtjLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShrKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShCKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS5uYihhKGgpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGwpe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYyk7aWYoMyE9ZCl7dmFyIGE9ZS5mZSgpOyFhLmlzQ2hyb21lJiYKIWEuaXNGaXJlZm94fHxhLmlzRWRnZXx8ZS5QYSgpfHx0aGlzLm5hKCJjc3BfIitiKTtlLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxSdzpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKTt0aGlzLnpiKCl9LEVkOmZ1bmN0aW9uKGEpe3RoaXMuSGM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9dGhpcy5zYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIoYSkpLHRoaXMuemIoKSx0aGlzLmFlKCkpfSxQdzpmdW5jdGlvbigpe2lmKHRoaXMuVGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuVGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5UYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTsKZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGMpe31hP3RoaXMuRWQodGhpcy5GYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuSWgoKX1lbHNlIHRoaXMuSWgoKX0sSGg6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMudWIoKSk7dGhpcy5WdyhmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuZGYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkVkKHRoaXMuRmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnhiPW51bGwsdGhpcy5kZigpfSxWdzpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmCmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSGEobmV3IHgoYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LEloOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLnViKCkpO3RoaXMuV3coZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLkhoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5FZCh0aGlzLkZjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlViJiZ0aGlzLlViLmxlbmd0aCl7dmFyIGM9dGhpcy5VYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLkhoKCl9LFd3OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmCmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpO2wuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0sZGY6ZnVuY3Rpb24oKXt0aGlzLlNiPyh0aGlzLmdmKyssdGhpcy5IYShuZXcgeCh0aGlzLlNiKSx0aGlzLk93LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuRmgoKX0sZWY6ZnVuY3Rpb24oYSl7dGhpcy5FZCh0aGlzLndmLAoibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LE93OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLmdmP3RoaXMuZGYoKTp0aGlzLmVmKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5GaCgpOnRoaXMuZWYoIkFBQSIpfSxGaDpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKTt0aGlzLnpiKCk7dGhpcy5hZSgpfSx6YjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5QYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLkhjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy54ZikpOwp0aGlzLkdkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuR2QmJnRoaXMuR2QoKX0sb3E6ZnVuY3Rpb24oKXtpZih0aGlzLm1mJiZ0aGlzLkVzKCkpe3ZhciBhPXRoaXMuZHMoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LEtoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSGE6ZnVuY3Rpb24oYSxiLGMsZixoLEIpe3RoaXMua2R8fCh0aGlzLmtkPTApO3RoaXMua2QrKzt0aGlzLmtkPnRoaXMuRmcmJiF0aGlzLkdnJiYodGhpcy5HZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuRmcsITApKTthPW5ldyB0YihhLGIsYyk7ZiYmKGEuYWk9ITApO2gmJmUueXQoKSYmKGEucGc9ITApO0ImJgooYS5FaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxUZjpmdW5jdGlvbigpe2UuUGEoKXx8ZS5UYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7dGhpcy5uYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy52YygpfHwKKGE9dGhpcy56YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMubmEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubmEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LE53OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLldofSxucTpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkhhKGEsdGhpcy5YeC5iaW5kKHRoaXMpLHRoaXMuV3guYmluZCh0aGlzKSl9LFh4OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5HcigpfSxXeDpmdW5jdGlvbigpe30sR3I6ZnVuY3Rpb24oKXtlLm9jKGsuRnIpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMubmEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAphZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLndiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMud2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy53YlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5UYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9bmV3IFI7d2luZG93W2MudWMoKV09dGhpcztlLlRhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LGt4OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuaGZ9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSx1YjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqCk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LFZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LG5iOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGYsZSxoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxmPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSx6aDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCx0PTMyODUzNzc1MjAscCxuLHYsdSx3O3A9YS5sZW5ndGg7dmFyIHg9W107Zm9yKGY9MDtmPHAtMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseC5wdXNoKGUpOwpzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHgucHVzaChmKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gocD4+PjI5KTt4LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT14W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7cD1sO249bTt2PXE7dT10O2ZvcihmPTA7MTk+PWY7ZisrKXc9YyhlLDUpKyhwJm58fnAmdikrdStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztmb3IoZj0yMDszOT49ZjtmKyspdz1jKGUsNSkrKHBebl52KSt1K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9dix2PW4sbj1jKHAsMzApLHA9ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhwJm58cCZ2fG4mdikrdStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXYsdj1uLG49YyhwLDMwKSxwPWUsZT13O2ZvcihmPTYwOzc5Pj1mO2YrKyl3PWMoZSw1KSsocF5uXnYpK3UraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK24mNDI5NDk2NzI5NTtxPXErdiY0Mjk0OTY3Mjk1O3Q9dCt1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYih0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIHViPWMudmt8fHViLGw9bmV3IHViO3dpbmRvdy5yZz1sO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybD10aGlzLmFbMTBdO3RoaXMuSHY9dGhpcy5hWzhdO3RoaXMua2w9dGhpcy5hWzZdO3RoaXMuUGs9dGhpcy5hWzhdO3RoaXMuUGk9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzddO3RoaXMuRHg9dGhpcy5hWzddO3RoaXMuWm89dGhpcy5hWzldO3RoaXMuSWw9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbMl19Yy5TdT1iO2IucHJvdG90eXBlPXtxbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucmw6dGhpcy5HdihhKX0sR3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkh2OnRoaXMuamwoYSl9LGpsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbDp0aGlzLk9rKGEpfSxPazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGs6dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlBpOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuS2k6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhxOnRoaXMuQ3goYSl9LEN4OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5EeDp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWm86dGhpcy5IbChhKX0sSGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgdmI9Yy5TdXx8dmIsdWQ9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9dWQucWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLlA/dGhpcy5WYT1hLm0uUCgpOnRoaXMuVmE9IiI7YS5tLkxnJiZhLm0uTGcoe3BhdXNlOnRoaXMucmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy50aC5iaW5kKHRoaXMpLAptdXRlOnRoaXMuSWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5KeC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmFiO3RoaXMucGxheWVyPXRoaXMuYi5tO3RoaXMuRmI9dGhpcy5SYz0hMTt0aGlzLktwPTFFMzt0aGlzLmphPW51bGw7dGhpcy5UPWI7dGhpcy51YT17fTt0aGlzLnZpZGVvPXt9O3RoaXMuQ2Q9e307dGhpcy5YcD1lLmdhKDEwKTt0aGlzLmFmPTA7dGhpcy5QYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLlBjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5tKSYmdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLlBjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLktvPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuQmQ9ITE7dGhpcy5ZZz1jJiZjLm1heFdyYXBwZXJEZXB0aD8KcGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuZz17fTt0aGlzLk5jPSExO3RoaXMuTmg9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5LYj0hMTt0aGlzLkRxPWUuZ2EoMTApO3RoaXMuTmI9ZS5nYSgxMCk7dGhpcy5NYj1lLmdhKDEwKTt0aGlzLkJoPWUuZ2EoMTApO3RoaXMuY29uZj17fTt0aGlzLm1jPXRoaXMudGI9ITE7dGhpcy5qZT1udWxsO3RoaXMuSmQ9dGhpcy5BYj10aGlzLnRlPXRoaXMuUGU9dGhpcy5iZT10aGlzLiRjPXRoaXMuY2Y9dGhpcy5aYj10aGlzLkxkPXRoaXMuaGg9dGhpcy5jZD10aGlzLnF4PXRoaXMuaWI9ITE7dGhpcy5jYz1bXTt0aGlzLldiPXt9O3RoaXMuamY9ITF9Yy5waz1iO2IucHJvdG90eXBlPXt3aDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlZhXSYmdGhpcy5jb25mW3RoaXMuVmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5WYV1bYV0pOwpyZXR1cm4gYn0sTGg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuT2EmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuVC5IYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLncoay56byx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpfSxDZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5pYj1jO2lmKHRoaXMuVC5iYSl0aGlzLmFmKyssdGhpcy5ULm9xKCksdGhpcy5ULnNhJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLkxoKCksbmV3IFUodGhpcyxhLHRoaXMuWWcse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5EYyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5tLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLm0uZ2V0Q3VycmVudFRpbWUoKX19KSk6CmI/KHRoaXMuTGgoKSxuZXcgVSh0aGlzLGEsdGhpcy5ZZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuVC5EYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLm0uZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIubS5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLkxhKCk7ZWxzZXt2YXIgZj10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkNlKGEsYixjKX0sNTApfX0sTmU6ZnVuY3Rpb24oYSl7dGhpcy5KZD10aGlzLkFiPXRoaXMuY2Q9ITE7dGhpcy5nPWE7dGhpcy53dyh0aGlzLmcpO3RoaXMuQmcoYSk7dGhpcy5jYz10aGlzLnNnKGEpO3RoaXMuV2I9e307dGhpcy5qZj0hMX0sQmc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuQ2Q9dGhpcy5ycyhhKSksdGhpcy5CZyhhLnBhcmVudCkpfSxzZzpmdW5jdGlvbihhKXt2YXIgYz0KW107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLnNnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuWnIoYSkpKTtyZXR1cm4gY30sWnI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlgmJmEuWC5nZXRBdHRyaWJ1dGUpe2I9YS5YLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LHJzOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5YKXtiPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWC5nZXRBdHRyaWJ1dGUoImlkIikmJgooaD1hLlguZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5YLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlguZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5iYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmh9fSxyYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuYWQmJmEuYWQuZXJyb3ImJmEuYWQuZXJyb3IuY29kZSYmKGI9YS5hZC5lcnJvci5jb2RlKSk7CnN3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5FYy5jb2RlOmI9PUQuTmQuY29kZT9lLncoay51eSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpOihlLkRlKCksYj09RC5BZi5jb2RlJiZlLncoay5ydSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKTtlLncoay5Fcix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHcueWYuY29kZTplLncoay5ZeCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHcuQmYuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLncoay5BeSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB3Lk9kLmNvZGU6ZS53KGsuRnksCnRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5NZC5jb2RlOmUudyhrLnN1LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMubWN8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3IudGEmJihjKz0iXyIrYS5lcnJvci50YSk7ZS50cmFjayhjLCIiLCEwKTt0aGlzLkdiKGEpO3RoaXMuTGEoKX0sR2I6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkthLmxlbmd0aDspdHJ5e3ZhciBjPQphLkthLnBvcCgpO3RoaXMuQmUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHd3OmZ1bmN0aW9uKGEpe3RoaXMuYmU9dGhpcy50ZT10aGlzLlBlPSExO3RoaXMudWE9dGhpcy5iLkw7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMudWEuekluZGV4PWI7Yj10aGlzLmIuSDtiLkJ6PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgYyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShjKSYmYi5zZXRBdHRyaWJ1dGUoYyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtjXSk7CnRoaXMuS28mJnRoaXMucGxheWVyLnFjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5xYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5VLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLlVbY10udHlwZSkmJnRoaXMuR28oYixhLlVbY10udXJsKyIiLGEuVVtjXS50eXBlKTt0aGlzLkpoKGIpPyh0aGlzLklvKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuamE9dGhpcy51YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuamEuYXBwZW5kQ2hpbGQoYikpOnRoaXMuZy55cSgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5qYT10aGlzLnVhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5qYS5hcHBlbmRDaGlsZChiKSx0aGlzLnV3KCkpOnRoaXMud2UoKT90aGlzLnloKCk6dGhpcy5nLm9yaWdpbi5pZyh3Lk1kKX0sdXc6ZnVuY3Rpb24oKXt0aGlzLlpiPXRoaXMuTGQ9ITE7dGhpcy5iLm0ua2EmJnRoaXMuYi5tLmthKCkmJihlLncoay4kZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMuWmI9ITApO2UuWWYoKTt0aGlzLmcmJnRoaXMuZy5vcmlnaW4mJnRoaXMuZy5vcmlnaW4uc2YmJmUuSm8odGhpcy5nLm9yaWdpbi5zZik7ZS5ZYSgic2V0VXBWcGFpZCIpO3ZhciBhPXRoaXMuYi5IO3RoaXMuYi5IPUMucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuSCwKYSk7dGhpcy5iLmloKCk7dGhpcy5iLkFjKCk7Zm9yKGE9dGhpcy5iLkw7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5BYygpO3RoaXMuamE9dGhpcy51YT10aGlzLmIuTDt0aGlzLm9mKCJ2cGFpZCIpO3RoaXMuWmImJihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1iKS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsucGQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk7dGhpcy5PPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5PLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5MLmFwcGVuZENoaWxkKHRoaXMuTyk7dGhpcy5PLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5tLmthJiZ0aGlzLmIubS5rYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5nLnRzKCksYz10aGlzLmcuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLndpZHRoKSwKaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLAoxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmVxKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5UKTt0aGlzLk8uc3JjPWE7ZS5WZCgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLkpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmNjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOwoiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLml5KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuankoKSx0aGlzLmIuSmIoITApLCF0aGlzLkFiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkFiPXtlbDp0aGlzLk8sY2I6ZnVuY3Rpb24oKXt0aGlzLkpkPSEwO2UudyhrLlZoLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLnZlKHRoaXMuQWIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmCih0aGlzLmIuSmIoITApLHRoaXMubnkoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLkpiKCEwKSx0aGlzLnJ5KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnB5KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnF5KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuc3koKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMub3koKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuWGgoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGg9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmcuamMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsuWmYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXt2YXIgYT0Kd2luZG93Lm9wZW4oIiIsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGIpe3dpbmRvdy5vcGVuKGgsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLm15KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5VZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt5KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLmx5KCk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5aYj0hMCxiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsucGQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk6KHRoaXMuWmI9ITEsYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay5sZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKSxlLncoay5VZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX19LmJpbmQodGhpcykpO2UuVmQoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuTGEoKX0uYmluZCh0aGlzKSk7ZS5WZCgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5EbyhmdW5jdGlvbihhKXtlLm9hKHRoaXMuTywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LApreTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMudHJhY2soInBhdXNlIik7ZS53KGsuU2QsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLkxkPSEwfSxseTpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuTWMsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLkxkPSExfSxueTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLkxmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LG15OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLktmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LApqeTpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLllhKCJpbXByZXNzaW9uIik7ZS53KGsuR2YsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0scnk6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuWWEoInN0YXJ0Iik7ZS53KGsuTWMsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0scHk6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLkVmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LHF5OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLllhKCJtaWRwb2ludCIpO2UudyhrLklmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSl9LHN5OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5NZix0aGlzLmcuQiwKdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0sb3k6ZnVuY3Rpb24oKXt0aGlzLkhkKCk7ZS5ZYSgiY29tcGxldGUiKX0sWGg6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5ZYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuY2E9ITE7dGhpcy5MYShhKX19LGl5OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2csZj1bXTshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csKGY9Yi5tYXRjaChjKSk/Zi5qb2luJiYoYj1mLmpvaW4oIi0iKSk6Yj1iLnN1YnN0cmluZygwLDIwKSk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIiwKYiwhMCk7ZS5ZYSgiZXJyIixiKTtlLncoay50eSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMuWGgoITApfSxHbzpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpLGY7Zj10aGlzLlQ7Zi5zYSYmZi5pc0VuYWJsZWQmJiFmLnZjKCk/KGY9Zi56YShiKSxmPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpmPWI7Yy5zcmM9ZjtjLm9uZXJyb3I9dGhpcy4keC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sSW86ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuVWguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5wZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucWYuYmluZCh0aGlzKSk7CmEuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuSGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5JZC5iaW5kKHRoaXMpKX0sd2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuVWguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5wZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5IZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLklkLmJpbmQodGhpcykpfSxVaDpmdW5jdGlvbihhKXt0aGlzLkZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmJ8fHRoaXMucGYoYSl9LmJpbmQodGhpcyksdGhpcy5LcCkpfSxwZjpmdW5jdGlvbihhKXtpZighdGhpcy5SYyYmCnRoaXMuSmgodGhpcy52aWRlbykmJiF0aGlzLnRiJiYhdGhpcy5GYil7dGhpcy5SYz0hMDt0cnl7aWYoIWUuUGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMudGJ8fCh0aGlzLnRiPSEwLHRoaXMud2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5ULmhnfHx0aGlzLlQubmEoInZpZGVvLW5vb3AiKSk7dGhpcy5MYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLlp4KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIuQWMoKTt0aGlzLlNoKCk7dGhpcy5vZigpO3RoaXMuUWYoKTt0aGlzLmIuaWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuYmYoKX19LGJmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT0KdGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuT2EpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuamQ9W107Zm9yKHZhciBiPXRoaXMuYi5MLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmpkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuTGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuTGMoKX1lbHNlIHRoaXMuTGMoKX0sTGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5qZClmb3IodmFyIGI9MDtiPHRoaXMuamQubGVuZ3RoO2IrKyl0aGlzLmpkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLiRjfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksCnRoaXMuTGEoKSxlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsYiwhMCkpOih0aGlzLkllKCEwKSx0aGlzLkxjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLnRlJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5QZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLk9iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuT2IuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuT2IuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLk5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5iZigpKX0uYmluZCh0aGlzKTt0aGlzLm1lKCkueGgodGhpcyl9LEhkOmZ1bmN0aW9uKCl7dGhpcy5ULm5jJiYhdGhpcy50YiYmZS50cmFjaygicXVhcnRpbGUiLAoiY29tcGxldGUiLCEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLndvLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy5MYSgpfSxMYTpmdW5jdGlvbihhKXtpZighdGhpcy5iZSlpZih0aGlzLmJlPSEwLHRoaXMuSmR8fChlLncoay53dSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5oYnx8dGhpcy5nLmFjKXt0aGlzLmFmKys7dGhpcy5GYj10aGlzLlJjPSExO3RyeXt0aGlzLndkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudWEucmVtb3ZlQ2hpbGQodGhpcy5qYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5CZD0hMTt0cnl7dGhpcy5iLlBoKCl9Y2F0Y2goaCl7fXRoaXMuY2Y9ITA7dGhpcy5iLnBlKCk7dGhpcy5LYj0KITE7dGhpcy5tZSgpLnNoKCk7dGhpcy5nLmhiJiZ0aGlzLmcub3JpZ2luLkplKCk7dGhpcy5nLmFjJiYoYT90aGlzLmcub3JpZ2luLmJoKCk6dGhpcy5jZSgpKX1lbHNlIHRoaXMuY2UoKX0sJHg6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy53ZCh0aGlzLnZpZGVvKSx0aGlzLndlKCk/dGhpcy55aCgpOnRoaXMuSWQoYSkpfSxJZDpmdW5jdGlvbihhKXt0aGlzLkZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLndlKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1jfHx0aGlzLlQuVGYoKX0uYmluZCh0aGlzKSwKMUUzKTp0aGlzLlQuVGYoKSk7dGhpcy5nLm9yaWdpbi5pZyh3Lk1kKX0scWY6ZnVuY3Rpb24oKXtpZih0aGlzLnF4KXRoaXMuTGEoKTtlbHNle3RoaXMuS2I9ITA7dGhpcy5iLm0uVWEmJiF0aGlzLmNmJiZ0aGlzLmIubS5VYSgpJiZlLncoay5ZYyx0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy54eChhKTtpZighdGhpcy5BYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkFiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5KZD0hMDtlLncoay5WaCx0aGlzLmcuQiwKdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UudmUodGhpcy5BYil9Yz0iIjt0aGlzLmcuJGUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmgpKSYmKGM9dGhpcy5nLiRlLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkJkfHwodGhpcy5CZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5LZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMuZy5oYj8odGhpcy5GYj10aGlzLlJjPSExLHRoaXMud2QodGhpcy52aWRlbyksdGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnVhLnJlbW92ZUNoaWxkKHRoaXMuamEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuQmQ9ITEsdGhpcy5iLlBoKCksdGhpcy5nLm9yaWdpbi5KZSgpKTp0aGlzLkxhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlBjLnJlcGxhY2UoIlt0aW1lXSIsZS5xZyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLk5jPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSx5aDpmdW5jdGlvbigpe3RoaXMubWM9ITA7dGhpcy51YT10aGlzLmIuTDt0aGlzLnVhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy51YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTsKYS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMubXMoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmphPXRoaXMudWEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLkFjKCk7dGhpcy52aWRlbz10aGlzLmphLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy51YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudWEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlRoLmJpbmQodGhpcyk7dGhpcy5qYS5hcHBlbmRDaGlsZChiKTt0aGlzLlNoKCk7dGhpcy5vZigpO3RoaXMuamU9c2V0SW50ZXJ2YWwodGhpcy5tcS5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LG1zOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpbXSxiPXt9LGM9MDtjPHRoaXMuZy5VLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlVbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuVDtoLnNhJiZoLmlzRW5hYmxlZCYmIWgudmMoKSYmKGU9aC56YShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LG1xOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5qZSksdGhpcy5IZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnFmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLmplKSx0aGlzLklkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6CnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LE1oOmZ1bmN0aW9uKCl7dGhpcy5oaHx8KHRoaXMuaGg9ITAsdGhpcy5jZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh4OmZ1bmN0aW9uKGEpe2UudyhrLlVkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7YT09dGhpcy5OaHx8dGhpcy50Ynx8KDA9PWEmJih0aGlzLmliJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmliKSx0aGlzLmliPSExKSx0aGlzLlBlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLnRlPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLk1oKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpKSwKdGhpcy5tYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMudGJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlBhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLncoay5HZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLGUudyhrLkxmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksdGhpcy5tYyYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5ULm5jJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5jZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLkVmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5uYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS53KGsuSWYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuVC5uYyYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudyhrLk1mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpLHRoaXMuTmg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMudGIpe3RyeXtpZih0aGlzLldiW2FdPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuV2IuaW1wcmVzc2lvbiYmdGhpcy5XYi5jb21wbGV0ZSYmIXRoaXMuamYpe3RoaXMuamY9ITA7dmFyIGM9dGhpcy5XYi5jb21wbGV0ZS0KdGhpcy5XYi5pbXByZXNzaW9uLGY9InN0YXRzX2hkX3RpbWVkaWZmIjt0aGlzLk8mJihmKz0idnBhaWQiKTs1RTM+YyYmZS50cmFjayhmLGMsITApfX1jYXRjaChoKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWM9W107dHJ5e2M9dGhpcy5zcyh0aGlzLmcuS2EsYSl9Y2F0Y2gobCl7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIG09Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuQ2QuaW1wcmVzc2lvbnMmJmUud3QobS51cmwsdGhpcy5DZC5pbXByZXNzaW9ucyk/dGhpcy5CZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS53KGsueW8sdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHthZElkOnRoaXMuQ2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LAp0aGlzLkQoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5CZShtLnVybCxtLnR5cGUpfWNhdGNoKHIpe31pZighYil0cnl7dGhpcy5nLkthPXRoaXMuSHEodGhpcy5nLkthLGEpfWNhdGNoKG4pe319fSxCZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQud2EoYSksYyYmYS5GbyhjKSxmfHwoZj10aGlzLmdnKSx0aGlzLlQuSGEoYSxmLHRoaXMuZ2csITEsITApKX0sc3M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxIcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxaeDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5UaC5iaW5kKHRoaXMpfSxUaDpmdW5jdGlvbigpe2UudyhrLlpmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5jZCYmZS5QYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS4kcigpLCEwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXt2YXIgYT13aW5kb3cub3BlbigiIix0aGlzLlQuc2E/Il90b3AiOiJfYmxhbmsiKTthLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7YS5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuZy5qY31jYXRjaChiKXt3aW5kb3cub3Blbih0aGlzLmcuamMsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9LFNoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0KImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlBjLnJlcGxhY2UoIlt0aW1lXSIsZS5xZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5ULlRjJiYoYj10aGlzLlQuVGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuamEuYXBwZW5kQ2hpbGQoYSl9fSxyYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8CnRoaXMuVC5UYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0seWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuVC5UYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlkPXRoaXMuRHE7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209CiIwcHgiKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnpkKCk7dGhpcy55ZCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLnJjKCl9LmJpbmQodGhpcykpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLk5iO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudXguYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMudHguYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy56ZCgpO3RoaXMueWQoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5yYygpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTWI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnN4LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLnJ4LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuemQoKTt0aGlzLnlkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMucmMoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGguc3R5bGUucG9zaXRpb249ImFic29sdXRlIixoLnN0eWxlLnRvcD0iLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuQmg7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7Yi5hcHBlbmRDaGlsZChjKTt0aGlzLmcuJGUmJmIuYXBwZW5kQ2hpbGQoaCk7Yi5hcHBlbmRDaGlsZChmKTtiLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuamEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuemQoKTt0aGlzLnlkKCl9LmJpbmQodGhpcykpO3RoaXMuamEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMucmMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmphLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmthJiZ0aGlzLmIubS5rYSgpJiYoZS53KGsuJGYsdGhpcy5nLkIsCnRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksdGhpcy5JZSgpKTt0aGlzLnNjKCl9fSxzYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHpkOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayJ9LHR4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5iLkgucGF1c2VkPyh0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLk1jLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpOih0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuU2QsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LHV4OmZ1bmN0aW9uKCl7dGhpcy5MZD9lLm9hKHRoaXMuTywKImNvbnRyb2wiLCJwbGF5Iik6ZS5vYSh0aGlzLk8sImNvbnRyb2wiLCJwYXVzZSIpfSxyZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMuYi5ILnBhdXNlZHx8KHRoaXMuYi5ILnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5TZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sdGg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLmIuSC5wYXVzZWQmJih0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLk1jLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpfSxyeDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYi5ILm11dGVkPwoodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay5sZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKToodGhpcy5iLkgubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsucGQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LHN4OmZ1bmN0aW9uKCl7dGhpcy5aYj9lLm9hKHRoaXMuTywiY29udHJvbCIsInVubXV0ZSIpOmUub2EodGhpcy5PLCJjb250cm9sIiwibXV0ZSIpfSxJZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYi5ILm11dGVkfHwodGhpcy5iLkgubXV0ZWQ9ITAsCmEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudyhrLnBkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpfSxKeDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYi5ILm11dGVkJiYodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5sZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sT2I6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5PYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5PYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLAp0aGlzLk9iKTt0aGlzLiRjfHx0aGlzLk5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5iZigpKX0sY2U6ZnVuY3Rpb24oKXt0aGlzLiRjPSEwO3RoaXMuaWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuaWIpLHRoaXMuaWI9ITEpO2lmKCgicHJlcm9sbCI9PWUuT2EmJnRoaXMuTmN8fCJwb3N0cm9sbCI9PWUuT2EpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuT2EpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2Zvcih2YXIgYj10aGlzLmIuTDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLkFjKCk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLAoiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLmVlKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuZWUoKX1lbHNlIHRoaXMuZWUoKX0sZWU6ZnVuY3Rpb24oKXt0aGlzLmNmPSEwO3RoaXMuYi5wZSgpO3RoaXMuYi5idygpO3RoaXMuS2I9ITE7ZS53KGsuQ3EsCnRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy5tZSgpLnNoKCl9LG1lOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5tJiYoYT10aGlzLmIubSk7cmV0dXJuIGF9LHdlOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJihhPSEwKX1yZXR1cm4gYX0sUWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkVhKCJtaW5WaXMiKTthJiYoZS51ZSh0aGlzLnZpZGVvLGEpP3RoaXMudGgoKTp0aGlzLnJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFmKCl9LmJpbmQodGhpcyksCjEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5nJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5nLmpjLGEuZHVyYXRpb249dGhpcy5nLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5nLmhiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuY2MmJjA8dGhpcy5jYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuY2MpKTtyZXR1cm4gYX0sRDpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuWHArIi0iK3RoaXMuYWY7dGhpcy5nJiZ0aGlzLmcud2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5nLndnKCkpO3JldHVybiBhfSxnZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFA9Yy5wa3x8UDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5QdD10aGlzLmFbMl07dGhpcy5jbD0KdGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzJdO3RoaXMuS2o9dGhpcy5hWzddO3RoaXMuVm89dGhpcy5hWzFdO3RoaXMubGo9dGhpcy5hWzddO3RoaXMuZ3Y9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNF19Yy5WcT1iO2IucHJvdG90eXBlPXtPdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUHQ6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNsOnRoaXMuT20oYSl9LE9tOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5QbTp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS2o6dGhpcy5VbyhhKX0sVW86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbzp0aGlzLmtqKGEpfSxrajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubGo6dGhpcy5mdihhKX0sZnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmd2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgd2I9CmMuVnF8fHdiLHZkPW5ldyB3YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXZkLk90KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuQmE9bnVsbDt0aGlzLlo9W107dGhpcy5YPW51bGw7dGhpcy5iYz10aGlzLmRjPSExO3RoaXMuc2Y9IiI7dGhpcy5yZj0hMTtkJiZkLmVtcHR5P3RoaXMuYnUoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy55bj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5mZSgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPQpiLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeCh0aGlzLnVybCk6bC53YShsLkRkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuUGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUuYmcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwKImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuRGQoYSkpKyImdHlwZT1qcyIsYj1sLndhKGwuRGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwud2EobC5EZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkhhKGIsdGhpcy5hdS5iaW5kKHRoaXMpLHRoaXMuWXQuYmluZCh0aGlzKSl9LHRnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5CYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5CYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuT2EpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuQmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLk9hfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5PYXx8dGhpcy5BdChhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5OdygpKXRyeXt2YXIgZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49ZC5sZW5ndGgmJihkPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2RbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtmW2JdPWcuZmlyc3RDaGlsZDtjLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfWVsc2UgZi5zcGxpY2UoYiwxKX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxBdDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKToKMDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGF1OmZ1bmN0aW9uKGEpe3RoaXMuU3YoYSk7dHJ5e3RoaXMuQmE9YS5yZXNwb25zZVhNTCx0aGlzLkJhfHwodGhpcy5CYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLk1hKHcuT2QpKX10aGlzLlo9dGhpcy50ZygpO3RoaXMuZGM9dGhpcy5mZigpO3RoaXMuYmM9dGhpcy5HaCgpO3RoaXMuWi5sZW5ndGg/dGhpcy54YygpOnRoaXMucmEodGhpcy5NYSh3LkVjLHtlcnJvcjp0aGlzLnJmP0QuTmQ6CkQuemZ9KSl9LGJ1OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkJhfHwodGhpcy5CYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuTWEody5PZCkpfXRoaXMuWj10aGlzLnRnKCk7dGhpcy5kYz10aGlzLmZmKCk7dGhpcy5iYz10aGlzLkdoKCk7dGhpcy5aLmxlbmd0aD90aGlzLnhjKCk6dGhpcy5yYSh0aGlzLk1hKHcuRWMse2Vycm9yOnRoaXMucmY/RC5OZDpELnpmfSkpfSxZdDpmdW5jdGlvbigpe3RoaXMucmEodGhpcy5NYSh3LnlmLHtkZXB0aDphfSkpfSx4YzpmdW5jdGlvbigpe3RoaXMuWD10aGlzLlouc2hpZnQoKTt0aGlzLkN0KCk/dGhpcy5YdygpPyhhKyssbmV3IGIodGhpcyx0aGlzLkNnKCksZyx7QWRTeXN0ZW06dGhpcy5ZcigpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnJhKHRoaXMuTWEody5CZikpOihhPTAsdGhpcy5VeCgpJiZ0aGlzLk5lKHRoaXMuRXEoKSkpfSxKZTpmdW5jdGlvbigpe3RoaXMuZGM/Cih0aGlzLmRjPTE8dGhpcy5aLmxlbmd0aCx0aGlzLloubGVuZ3RoJiZ0aGlzLnhjKCkpOnRoaXMucGFyZW50LkplKCl9LGJoOmZ1bmN0aW9uKCl7dGhpcy5iYz8odGhpcy5iYz0xPHRoaXMuWi5sZW5ndGgsdGhpcy5aLmxlbmd0aCYmdGhpcy54YygpKTp0aGlzLnBhcmVudC5iaCgpfSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlV3KCk/dGhpcy5UdygpPyEwOigtMSE9dGhpcy5wYygpP3RoaXMucmEodGhpcy5NYSh3LnVmKSk6dGhpcy5yYSh0aGlzLk1hKHcubWopKSwhMSk6KHRoaXMucmEodGhpcy5NYSh3LkVjLEQuQWYpKSwhMSl9LE5lOmZ1bmN0aW9uKGEpe2EuS2E9YS5LYS5jb25jYXQodGhpcy5GZSgpKTthLmhiPWEuaGI/YS5oYjp0aGlzLmRjO2EuYWM9YS5hYz9hLmFjOnRoaXMuYmM7dGhpcy5wYXJlbnQuTmUoYSl9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IHhiO2EuZHVyYXRpb249dGhpcy5wYygpO2EuVT10aGlzLnpnKCk7YS5qYz10aGlzLmFzKCk7YS5vcmlnaW49dGhpczsKYS5CPXRoaXMuWHIoKTthLiRlPXRoaXMucXMoYS5kdXJhdGlvbik7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGIpe3RoaXMuWCYmKGIuS2E9Yi5lcnJvci5jb2RlIT13LnVmLmNvZGU/Yi5LYS5jb25jYXQodGhpcy5icygpKTpiLkthLmNvbmNhdCh0aGlzLmtzKCkpKTt0aGlzLloubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuR2ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5HYiYmdGhpcy5wYXJlbnQuR2IoYiksYT0wLHRoaXMueGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShiKSxhPTApfSxHYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5HYihhKX0saWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuTWEoYSxiKSl9LE1hOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHliKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sWHc6ZnVuY3Rpb24oKXtyZXR1cm4gYTwKZ30sVXc6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnpnKCkubGVuZ3RofSxUdzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMucGMoKX0sZmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlouZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxHaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWiYmMjw9dGhpcy5aLmxlbmd0aCYmIXRoaXMuZmYoKSYmKGE9ITApO3JldHVybiBhfSxTdjpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuc2Y9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLnJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LEN0OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5DZygpLmxlbmd0aH0sCkNnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGUodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sWXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZSh0aGlzLlgsIkFkU3lzdGVtIil9LEZlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuT2coYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuYmIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxPZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09CmEubm9kZU5hbWU/ITA6dGhpcy5PZyhhLnBhcmVudE5vZGUpOiExfSxrczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxiczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sYXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYih0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0semc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxTYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLApoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGl6OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmJiKGFbY10pfSk7dHJ5e3ZhciBkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLlNjKS1NYXRoLmFicyg3MDAtYi5TYyl9KSxnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLlNjKS1NYXRoLmFicyg3MDAtYi5TYyl9KSxiPWQuY29uY2F0KGcpfWNhdGNoKGUpe31yZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTsKZm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMuZ2QoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LHBjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuYmIodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxxczpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkd3KGQsCmEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LGxlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5iYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sbmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGJiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuZ2QoYSk6IiJ9LGdkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubmUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVT1jLnlufHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRwPXRoaXMuYVs5XTsKdGhpcy5LbT10aGlzLmFbMV07dGhpcy5PcT10aGlzLmFbM107dGhpcy5VdD10aGlzLmFbOV07dGhpcy5CdT10aGlzLmFbMV07dGhpcy52cT10aGlzLmFbMl07dGhpcy5BbD10aGlzLmFbMTBdO3RoaXMua209dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbNF19Yy5FeD1iO2IucHJvdG90eXBlPXtDcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHA6dGhpcy5KbShhKX0sSm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkttOnRoaXMuTnEoYSl9LE5xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PcTp0aGlzLlR0KGEpfSxUdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXQ6dGhpcy5BdShhKX0sQXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJ1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52cTp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQWw6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5rbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMuRXh8fHpiLHdkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXdkLkNwKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuS2E9W107dGhpcy5VPVtdO3RoaXMuamM9IiI7dGhpcy5CPXRoaXMuYWM9dGhpcy5oYj0hMTt0aGlzLnFlPXRoaXMub3JpZ2luPW51bGx9Yy5wbT1iO2IucHJvdG90eXBlPXt5cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxoczpmdW5jdGlvbigpe2lmKCF0aGlzLnFlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uQmEpe3ZhciBhPXRoaXMub3JpZ2luLkJhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJgowPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnFlPWFbY10pfXJldHVybiB0aGlzLnFlfSx3ZzpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5ocygpO2ImJmIuZ2V0QXR0cmlidXRlJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpO3JldHVybiBhfSx0czpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuVVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIHhiPWMucG18fHhiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNzPXRoaXMuYVs0XTt0aGlzLlJ4PXRoaXMuYVsyXTt0aGlzLlRpPXRoaXMuYVs2XTt0aGlzLmJ4PXRoaXMuYVs0XTt0aGlzLmFsPXRoaXMuYVs2XTt0aGlzLmh4PXRoaXMuYVsxXTt0aGlzLldyPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzddfWMuT249YjtiLnByb3RvdHlwZT17UnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5TczoKdGhpcy5ReChhKX0sUXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJ4OnRoaXMuU2koYSl9LFNpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVGk6dGhpcy5heChhKX0sYXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ieDp0aGlzLiRrKGEpfSwkazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYWw6dGhpcy5neChhKX0sZ3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmh4OnRoaXMuVnIoYSl9LFZyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIEFiPWMuT258fEFiLHhkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXhkLlJzKDQpO3ZhciB3PXtPZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIiwKdGE6IlhNTF9QQVJTRV9FUlJPUiJ9LG1qOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix0YToiRFVSQVRJT05fRVJST1IifSxFYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsdGE6IkVNUFRZX1ZBU1QifSxCZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix0YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0seWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSwKbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLHRhOiJMT0FEX0VSUk9SIn0sTWQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHRhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sWnk6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsCnRhOiJNRURJQUZJTEVfRVJST1IifSx1Zjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIix0YToiRFVNTVlfQUQifX0sRD17emY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIix0YToiTk9fQURTIn0sQWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHRhOiJOT19NRURJQUZJTEVTIn0sYXo6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsdGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxOZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix0YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5wdD10aGlzLmFbMl07dGhpcy5Ubz10aGlzLmFbM107CnRoaXMuSnA9dGhpcy5hWzNdO3RoaXMubXI9dGhpcy5hWzVdO3RoaXMueG09dGhpcy5hWzVdO3RoaXMuQ2w9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbM119Yy5HeT1iO2IucHJvdG90eXBlPXtvdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucHQ6dGhpcy5TbyhhKX0sU286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlRvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5KcDp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXI6dGhpcy53bShhKX0sd206ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnhtOnRoaXMuQmwoYSl9LEJsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5DbDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEJiPWMuR3l8fEJiLHlkPW5ldyBCYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT15ZC5vdCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmFkPWI7dGhpcy5LYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLlBqfHx5YjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5scD10aGlzLmFbNF07dGhpcy54cD10aGlzLmFbNF07dGhpcy5LeT10aGlzLmFbOF07dGhpcy5veD10aGlzLmFbM107dGhpcy56eD10aGlzLmFbNl07dGhpcy5Paj10aGlzLmFbNl07dGhpcy5WbD10aGlzLmFbNV07dGhpcy5qdT10aGlzLmFbNV07dGhpcy5kdz10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs1XX1jLkNqPWI7Yi5wcm90b3R5cGU9e2twOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5scDp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnhwOnRoaXMuSnkoYSl9LEp5OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LeTp0aGlzLm54KGEpfSxueDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm94OnRoaXMueXgoYSl9LHl4OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56eDp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT2o6dGhpcy5VbChhKX0sVWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlZsOnRoaXMuaXUoYSl9LGl1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qdTp0aGlzLmN3KGEpfSxjdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBDYj1jLkNqfHxDYix6ZD1uZXcgQ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT0KemQua3AoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5tPWE7dGhpcy5hYj1hLnVnKCk7dGhpcy5MPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuTC5pZD1lLmdhKDEwKTt0aGlzLkg9Qy5wb3AoKTt0aGlzLkh8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuSC5pZD0iYWRYZGlzcGxheSIsdGhpcy5ILnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5BPXt9O3RoaXMuWmQ9ITE7dGhpcy5sYj1bXX1jLnNqPWI7Yi5wcm90b3R5cGU9e3JnOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LApnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnJnKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5KcyhhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpOwpoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sTHc6ZnVuY3Rpb24oKXt0aGlzLlpkPSEwfSxQaDpmdW5jdGlvbigpe3RoaXMuSD1DLnBvcCgpO3RoaXMuSHx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saWg6ZnVuY3Rpb24oKXt0aGlzLm0ucGF1c2UoKTtlLncoay5ZYyx0aGlzLm0udigpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLlpkfHwodGhpcy5tLnBsYXkoKSxlLncoay5aYyx0aGlzLm0udigpKSl9LEFjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkwuc3R5bGUuekluZGV4PWE7dGhpcy5MLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuTC5zdHlsZS5tYXJnaW5SaWdodD0KImF1dG8iO3RoaXMuTC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuTC5zdHlsZS5ib3hTaXppbmc9dGhpcy5hYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5MLnN0eWxlLndpZHRoPXRoaXMuYWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9dGhpcy5hYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLmFiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuYWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuYWIpO3RoaXMubS5QYiYmdGhpcy5tLlBiKCk/dGhpcy5tLnVnKCkuYXBwZW5kQ2hpbGQodGhpcy5MKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuTCk7d2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sSnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxrZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMua2codGhpcy5hYik7aWYoYi54IT10aGlzLkEueHx8Yi55IT10aGlzLkEueXx8Yi5wb3NpdGlvbiE9dGhpcy5BLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuQS53aWR0aCYmMDx0aGlzLkEuaGVpZ2h0JiYwPT0KYi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMucGUoKTtyZXR1cm59dGhpcy5BPWI7dGhpcy5tLlBiKCk/KHRoaXMuTC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuTC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkwuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkwuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkwuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLkwuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkguc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5sYi5sZW5ndGg7YSsrKXRoaXMubGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5DaCh0aGlzLkwpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMTApfSxEbzpmdW5jdGlvbihhKXt0aGlzLmxifHwodGhpcy5sYj1bXSk7ImZ1bmN0aW9uIj09CnR5cGVvZiBhJiZ0aGlzLmxiLnB1c2goYSl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5MJiZ0aGlzLkwucGFyZW50Tm9kZSYmdGhpcy5MLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuTC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTCk7dGhpcy5IJiZ0aGlzLkgucGF1c2UmJnRoaXMuSC5wYXVzZSgpfX19KShjKTtmb3IodmFyIE89Yy5zanx8TyxDPVtdLERiPTA7MTAwPkRiO0RiKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1lLmdhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgST0hMSxlYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5HcT10aGlzLmFbMTBdO3RoaXMudnY9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMTBdfWMuTnQ9YjtiLnByb3RvdHlwZT17RnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkdxOnRoaXMudXYoYSl9LHV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52djp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEViPWMuTnR8fEViLEFkPW5ldyBFYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUFkLkZxKDQpOyhmdW5jdGlvbihjKXtjLllsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7CmF8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuWmUoYik7dGhpcy5lZygpfSxaZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkZhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxVYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmCmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sbWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSx2OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5GYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIEZiPWMuWWx8fEZiOyhmdW5jdGlvbihjKXtjLlhsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj1mYSgpO3RoaXMuRWI9dGhpcy5FYnx8ITE7dGhpcy5IZj10aGlzLkpmPQp0aGlzLktnPXRoaXMucWE9dGhpcy5rZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLk1yKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5rZj0hMDt0aGlzLktnJiZ0aGlzLlhmKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkucWI7YSYmYS5LYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlVjKCk7dGhpcy5LZz0hMDt0aGlzLlhmKCl9LmJpbmQodGhpcykpOwp0aGlzLlNmKCl9LFhmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWIpe3RoaXMuVWMoKTtpZighdGhpcy5rZiYmIXRoaXMuVWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLmtmJiZ0aGlzLkhmJiYhdGhpcy5KZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCl9LmJpbmQodGhpcyksMTAwKX19LFVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5BZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxBZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxTZjpmdW5jdGlvbigpe2lmKHRoaXMuVWMoKSl7dmFyIGI9CnRoaXMuQWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5KZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLkhmPWIuZnp9dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2YoKX0uYmluZCh0aGlzKSwxMDApfSxqejpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi53eigpOiExfSxwYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IucGMoKTotMX0sbHM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sTXI6ZnVuY3Rpb24oYixhKXt0aGlzLkViPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLkVifHwzMDI9PXRoaXMuRWI/dGhpcy5xYT0hMDp0aGlzLnMoImFkZXJyb3IiLHRoaXMuRWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYygpfS5iaW5kKHRoaXMpLDEwMCl9LFhjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnFhPyh0aGlzLm8oKSx0aGlzLmVhKCkpOmIubWQoKT8odGhpcy5GKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5scyhiKT8odGhpcy5GKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBHYj1jLlhsfHxHYjsoZnVuY3Rpb24oYyl7Yy5abD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LHp0OmZ1bmN0aW9uKCl7d2luZG93Lk9PLnZtLnNvLnFvP3dpbmRvdy5PTy52bS5zby5xby5keihmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuenQoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5OYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgRmIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSihjKXx8KHRoaXMuSyhjKSwobmV3IEdiKGMsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBIYj1jLlpsfHxIYixJYj1uZXcgSGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzNdO3RoaXMuUnk9dGhpcy5hWzEwXTt0aGlzLmNxPXRoaXMuYVsyXTt0aGlzLmw9CnRoaXMuYVsyXX1jLkl2PWI7Yi5wcm90b3R5cGU9e1lwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5acDp0aGlzLlF5KGEpfSxReTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnk6dGhpcy5icShhKX0sYnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jcTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIEpiPWMuSXZ8fEpiLEJkPW5ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUJkLllwKDQpOyhmdW5jdGlvbihjKXtjLmJqPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMubWE9ITE7dGhpcy5EZygpfSxEZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpOwpifHwoYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5TKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sbGE6ZnVuY3Rpb24oKXt0aGlzLm5oKCl9LApuaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuTiYmKDAsdGhpcy5OKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIEtiPWMuYmp8fEtiOyhmdW5jdGlvbihjKXtjLmFqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMubygiZW1wdHkiKSx0aGlzLmVhKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT0KYj90aGlzLmVhKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nKCk/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTGI9Yy5hanx8TGI7KGZ1bmN0aW9uKGMpe2MuY2o9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxxaDpmdW5jdGlvbihiKXtiPW5ldyBLYihiKTtiLm1hP3RoaXMuSSgpOnRoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3IExiKGIsdGhpcy5HKSkuYygpKX0sYzpmdW5jdGlvbigpe3RoaXMuT3J8fCh0aGlzLk9yPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5xaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTsKaWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnFoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgTWI9Yy5janx8TWIsVj1uZXcgTWIocSk7Vi5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud3g9dGhpcy5hWzNdO3RoaXMucHA9dGhpcy5hWzldO3RoaXMuQWs9dGhpcy5hWzJdO3RoaXMuRXk9dGhpcy5hWzddO3RoaXMuVHg9dGhpcy5hWzNdO3RoaXMuc2k9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzldfWMubm89YjtiLnByb3RvdHlwZT17dng6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy53eDp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucHA6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFrOnRoaXMuRHkoYSl9LER5OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FeTp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlR4OnRoaXMucmkoYSl9LHJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5zaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIE5iPWMubm98fE5iLENkPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUNkLnZ4KDQpOyhmdW5jdGlvbihjKXtjLldtPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlMoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxQYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuV218fFc7KGZ1bmN0aW9uKGMpe2MuVm09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkuUGYoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm8uYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LlBmKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuenUoYSl9LmJpbmQodGhpcykpO3kuRHMoKX0senU6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5vKCk7dGhpcy5lYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5vKCk7dGhpcy5lYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkYoKX19KX0pKGMpOwp2YXIgWD1jLlZtfHxYOyhmdW5jdGlvbihjKXtjLlhtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnFkJiYoYj1lLklxKGIsdGhpcy5xZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLkooZCkpe3RoaXMuSyhkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD0KYy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnFkfHwodGhpcy5xZD1bXSksdGhpcy5xZC5wdXNoKGJbYV0pLGQ9bmV3IFcoaCksdGhpcy5KKGQpfHwodGhpcy5LKGQpLGY9bmV3IFgoZCx0aGlzLkcpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sUGY6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sWXc6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy53Y3x8KHRoaXMud2M9W10pLHRoaXMud2MucHVzaChiKSx0aGlzLmF3KCkmJih0aGlzLlZlKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYKKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxEczpmdW5jdGlvbigpe2lmKHRoaXMud2MpZm9yKHZhciBiPTA7Yjx0aGlzLndjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMud2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lll3KGIpfX0pfSkoYyk7CnZhciBPYj1jLlhtfHxPYix5PW5ldyBPYihxKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFyPXRoaXMuYVsxMF07dGhpcy5mcD10aGlzLmFbMl07dGhpcy5lbj10aGlzLmFbOV07dGhpcy5Mcz10aGlzLmFbOF07dGhpcy5rbz10aGlzLmFbMV07dGhpcy5sdD10aGlzLmFbN107dGhpcy5sbj10aGlzLmFbMl07dGhpcy5wbD10aGlzLmFbOV07dGhpcy5vcj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVsyXX1jLkprPWI7Yi5wcm90b3R5cGU9eyRxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hcjp0aGlzLmVwKGEpfSxlcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZnA6dGhpcy5kbihhKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmVuOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Mczp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmtvOnRoaXMua3QoYSl9LGt0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubHQ6dGhpcy5rbihhKX0sa246ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxuOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucGw6dGhpcy5ucihhKX0sbnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm9yOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgUGI9Yy5Ka3x8UGIsRGQ9bmV3IFBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9RGQuJHEoNCk7KGZ1bmN0aW9uKGMpe2MuV2k9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5TKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sVWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBRYj1jLldpfHxRYjsoZnVuY3Rpb24oYyl7Yy5YaT0KdS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5GKCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMueXZ8fCh0aGlzLnl2PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy5GKCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpOwp2YXIgUmI9Yy5YaXx8UmI7KGZ1bmN0aW9uKGMpe2MuWWk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBRYihkKTt0aGlzLkooZSl8fCh0aGlzLksoZSksKG5ldyBSYihlLHRoaXMuRykpLmMoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLkphKWlmKGE9PXRoaXMuSmFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7CnJldHVybiB0aGlzLkphW2Iub2IoKV0/ITA6ITF9fSl9KShjKTt2YXIgU2I9Yy5ZaXx8U2IsVGI9bmV3IFNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ0PXRoaXMuYVs3XTt0aGlzLlZuPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVsxMF07dGhpcy5ieT10aGlzLmFbMl07dGhpcy5SbD10aGlzLmFbMTBdO3RoaXMuaW09dGhpcy5hWzhdO3RoaXMucm49dGhpcy5hWzZdO3RoaXMuZnQ9dGhpcy5hWzFdO3RoaXMuRWw9dGhpcy5hWzZdO3RoaXMuSXg9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbOV19Yy5Ucj1iO2IucHJvdG90eXBlPXthdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJ0OnRoaXMuVW4oYSl9LFVuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVm46dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktyOnRoaXMuYXkoYSl9LApheTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnk6dGhpcy5RbChhKX0sUWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJsOnRoaXMuaG0oYSl9LGhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pbTp0aGlzLnFuKGEpfSxxbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJuOnRoaXMuZXQoYSl9LGV0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mdDp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWw6dGhpcy5IeChhKX0sSHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkl4OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgVWI9Yy5Ucnx8VWIsRWQ9bmV3IFViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9RWQuYXQoNCk7KGZ1bmN0aW9uKGMpe2MuT2w9Cm4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuUyhiKTt0aGlzLlYoYSk7dGhpcy5Vdih0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxVdjpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJnRoaXMuaWEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnBhdXNlJiZ0aGlzLmlhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmCnRoaXMuaWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5yZXN1bWUmJnRoaXMuaWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2ImJmIubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLm11dGUmJnRoaXMuaWEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJnRoaXMuaWEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS51bm11dGUmJnRoaXMuaWEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxMZzpmdW5jdGlvbihiKXt0aGlzLmlhPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBWYj1jLk9sfHxWYjsoZnVuY3Rpb24oYyl7Yy5ObD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLAphKTt0aGlzLiRoPSExfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXRoaXMuZ2V0UGxheWVyKCk7Yi5hdXRvc3RhcnQmJiF0aGlzLiRoJiYodGhpcy5GKCksdGhpcy4kaD0hMCx0aGlzLlJhKCkpO2EuRmEoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFdiPWMuTmx8fFdiOyhmdW5jdGlvbihjKXtjLlBsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgVmIoYltkXSksdGhpcy5KKGMpfHwodGhpcy5LKGMpLChuZXcgV2IoYyx0aGlzLkcpKS5jKCkpfX1lbHNlIHRoaXMuSSgpfX0pfSkoYyk7CnZhciBYYj1jLlBsfHxYYixZPW5ldyBYYihxKTtZLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcj10aGlzLmFbOV07dGhpcy5EaT10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVsxMF19Yy5uaT1iO2IucHJvdG90eXBlPXtQcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUXI6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkRpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgWWI9Yy5uaXx8WWIsRmQ9bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9RmQuUHIoNCk7KGZ1bmN0aW9uKGMpe2MuTW49bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxrYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sbGE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJgoxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5OPygwLHRoaXMuTikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIFpiPWMuTW58fFpiOyhmdW5jdGlvbihjKXtjLkxuPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxUdjpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuV2F8fCh0aGlzLldhPVtdKTt0aGlzLldhLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8CjMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuZWEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5lYz0hMDt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sYzpmdW5jdGlvbigpe3RoaXMudSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy54YT90aGlzLlR2KHRoaXMueGEpOih0aGlzLnhhPXRoaXMuSGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApKX0sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy54YSl7dGhpcy5GKCk7cmV0dXJufWlmKCF0aGlzLmVjKXt0aGlzLkYoKTtyZXR1cm59Yj0hMDtpZih0aGlzLldhJiYKdGhpcy5XYS5sZW5ndGgmJjE8dGhpcy5XYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLldhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLldhW2FdJiYzMDMhPXRoaXMuV2FbYV0mJjQwMyE9dGhpcy5XYVthXSYmKGI9ITEpO2lmKGIpdGhpcy5vKCJlbXB0eSIpLHRoaXMuZWEoKTtlbHNle3RoaXMuRigpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyICRiPWMuTG58fCRiOyhmdW5jdGlvbihjKXtjLk5uPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgWmIoYi5pdGVtKGEpKTt0aGlzLkooYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLksoYyksCihuZXcgJGIoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIGFjPWMuTm58fGFjLGJjPW5ldyBhYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qdD10aGlzLmFbN107dGhpcy5mdT10aGlzLmFbNl07dGhpcy5lcj10aGlzLmFbNV07dGhpcy5pbz10aGlzLmFbOV07dGhpcy5LdD10aGlzLmFbOF07dGhpcy5Bbj10aGlzLmFbOF07dGhpcy5Dbj10aGlzLmFbNF07dGhpcy5ndz10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs4XX1jLmppPWI7Yi5wcm90b3R5cGU9e2l0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qdDp0aGlzLmV1KGEpfSxldTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZ1OnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lcjp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaW86CnRoaXMuSnQoYSl9LEp0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5LdDp0aGlzLnpuKGEpfSx6bjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkFuOnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dbjp0aGlzLmZ3KGEpfSxmdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3c6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBjYz1jLmppfHxjYyxHZD1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1HZC5pdCg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sbGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLk4mJigwLHRoaXMuTikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5OJiYoMCx0aGlzLk4pKCEwKX0uYmluZCh0aGlzKSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgZGM9Yy5Za3x8ZGM7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLlloKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5vZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMub2coKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuQW8oKX0uYmluZCh0aGlzKSksdGhpcy5aaD0hMSx0aGlzLnh5PTFFMyx0aGlzLmtoPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxvZzpmdW5jdGlvbigpe3RoaXMua2guZG9uZXx8KHRoaXMua2guZG9uZT0hMCx0aGlzLlpoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZaCgpfS5iaW5kKHRoaXMpLAp0aGlzLnh5KSl9LEFvOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLlpoKTt0aGlzLm8oKX0sWWg6ZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMubygpLHRoaXMuZWEoKSk6KHRoaXMucygiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLkYoKSl9LHhnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBmPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHlhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy54Zyhtdy5lcnJvckRlbGVnYXRlcyk6CnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy54Zyh0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgZWM9Yy5Ya3x8ZWM7KGZ1bmN0aW9uKGMpe2MuWms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5OYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLk5hKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLk5hKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTsKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLk5hKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBkYyhjKSx0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBlYyhjLHRoaXMuRykpLmMoKSkpfX10aGlzLkkoKX19KX0pKGMpO3ZhciBmYz1jLlprfHxmYyxnYz1uZXcgZmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUHk9dGhpcy5hWzVdO3RoaXMuV3Q9dGhpcy5hWzEwXTt0aGlzLlZpPXRoaXMuYVs3XTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLm9qPXRoaXMuYVs4XTt0aGlzLmx1PXRoaXMuYVs5XTt0aGlzLm1tPQp0aGlzLmFbNV07dGhpcy52aj10aGlzLmFbNF07dGhpcy5QdT10aGlzLmFbNF07dGhpcy5Ecj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbNV19Yy54dz1iO2IucHJvdG90eXBlPXtPeTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUHk6dGhpcy5WdChhKX0sVnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLld0OnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVmk6dGhpcy5WayhhKX0sVms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLldrOnRoaXMubmooYSl9LG5qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vajp0aGlzLmt1KGEpfSxrdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubHU6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1tOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52ajp0aGlzLk91KGEpfSxPdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUHU6CnRoaXMuQ3IoYSl9LENyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ecjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGhjPWMueHd8fGhjLEhkPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUhkLk95KDQpOyhmdW5jdGlvbihjKXtjLlJtPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgaWM9Yy5SbXx8aWM7KGZ1bmN0aW9uKGMpe2MuUW09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm8oKSx0aGlzLmVhKCkpOih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLnUoKSkpOih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpO3RoaXMuaWMoKX0saWM6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy56ZSgpJiYKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnplKCkmJih0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmljKCl9LmJpbmQodGhpcyksMTApfSx6ZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgamM9Yy5RbXx8amM7KGZ1bmN0aW9uKGMpe2MuU209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJgoidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgaWMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3IGpjKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBrYz1jLlNtfHxrYyxsYz1uZXcga2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3I9dGhpcy5hWzddO3RoaXMueXM9dGhpcy5hWzRdO3RoaXMuUm89dGhpcy5hWzRdO3RoaXMueG49dGhpcy5hWzFdO3RoaXMudG49dGhpcy5hWzNdO3RoaXMuR2o9dGhpcy5hWzFdO3RoaXMubD10aGlzLmFbMV19Yy5oaz0KYjtiLnByb3RvdHlwZT17cnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNyOnRoaXMueHMoYSl9LHhzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55czp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUm86dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhuOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bjp0aGlzLkZqKGEpfSxGajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYz1jLmhrfHxtYyxJZD1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1JZC5ycig0KTsoZnVuY3Rpb24oYyl7Yy5HbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlMoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuT2U9ITF9LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkJ2KCl9LmJpbmQodGhpcyksNTAwKX0sQnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5OJiZ0aGlzLk4oKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksCmE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuT2UmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuT2UpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxIdzpmdW5jdGlvbigpe3RoaXMuT2U9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBuYz1jLkdtfHwKbmM7KGZ1bmN0aW9uKGMpe2MuRm09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKTt0aGlzLlliPTB9LGM6ZnVuY3Rpb24oKXt0aGlzLmh1PTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5ZYnx8KHRoaXMuWWI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8Cih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5ZYnx8dGhpcy5ZYisrLHRoaXMuWWI8PXRoaXMuaHU/KHRoaXMuWWIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSkpfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5IdygpLHRoaXMuRigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgb2M9Yy5GbXx8b2M7KGZ1bmN0aW9uKGMpe2MuSG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbmMod2luZG93LnBsYXllckFwaSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgb2MoYiwKdGhpcy5HKSkuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcGM9Yy5IbXx8cGMscWM9bmV3IHBjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNxPXRoaXMuYVs1XTt0aGlzLk1xPXRoaXMuYVs0XTt0aGlzLnp3PXRoaXMuYVsxXTt0aGlzLmpqPXRoaXMuYVs0XTt0aGlzLkh1PXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzldfWMuY3Y9YjtiLnByb3RvdHlwZT17UnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlNxOnRoaXMuTHEoYSl9LExxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NcTp0aGlzLnl3KGEpfSx5dzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuenc6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMuR3UoYSl9LEd1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5IdTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciByYz1jLmN2fHxyYyxKZD1uZXcgcmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1KZC5ScSg0KTsoZnVuY3Rpb24oYyl7Yy5BbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGxhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuTigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBzYz1jLkFtfHxzYzsoZnVuY3Rpb24oYyl7Yy56bT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCmZ1bmN0aW9uKCl7dGhpcy5SYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnpxKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuZWQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLlN0KCk6dGhpcy5pYygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZigpfHwodGhpcy5zKCJjb250ZW50cGxheSIpLHRoaXMudSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHpxOmZ1bmN0aW9uKCl7dGhpcy5GZigpfHx0aGlzLnUoITApfSxTdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZWQoKTshYi52YSYmCmIuWiYmYi5jeiYmYi5leiYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LGljOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMubygpLHRoaXMuZWEoKSk6KHRoaXMucygiYWRlcnJvciIsYiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWMoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe2lmKCF0aGlzLmdoKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT0KYSYmKHRoaXMuZ2g9YltjXSk7cmV0dXJuIHRoaXMuZ2h9LHplOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLmVkKCkuYWRzTG9hZGVyP3RoaXMuRighMCk6dGhpcy5GKCk6dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHRjPWMuem18fHRjOyhmdW5jdGlvbihjKXtjLkJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IHNjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5KKGMpfHwodGhpcy5LKGMpLChuZXcgdGMoYyx0aGlzLkcpKS5jKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgdWM9Yy5CbXx8dWMsdmM9bmV3IHVjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJwPXRoaXMuYVs2XTt0aGlzLlVxPXRoaXMuYVs5XTt0aGlzLll5PXRoaXMuYVsyXTt0aGlzLk15PXRoaXMuYVsxXTt0aGlzLlVwPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzEwXX1jLnlrPWI7Yi5wcm90b3R5cGU9e3FwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ycDp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVXE6dGhpcy5YeShhKX0sWHk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll5OnRoaXMuTHkoYSl9LEx5OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NeTp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLlVwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgd2M9Yy55a3x8d2MsS2Q9bmV3IHdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9S2QucXAoNCk7KGZ1bmN0aW9uKGMpe2MudWw9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5TKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlYoYSk6dGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxVYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sRmE6ZnVuY3Rpb24oKXt2YXIgYjtFPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTsKYiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWj1jLnVsfHxaOyhmdW5jdGlvbihjKXtjLnRsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlFlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuUWU9Yi5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5RZSYmYiE9dGhpcy5RZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5zKCJhZGVycm9yIixhLnl6KSx0aGlzLkYoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT0KYSYmKHRoaXMucygiYWRlcnJvciIpLHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBhYT1jLnRsfHxhYTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRSlmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFooYiksYi5tYT90aGlzLlZlKCk6dGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGFhKGIsdGhpcy5HKSxiLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRSx4Yz1jLnZsfHx4Yyx5Yz1uZXcgeGMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC53Yi5sZW5ndGgpe3ZhciBhPWwud2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUucncoeyJbTE9BRFNDUklQVF0iOmUuZ2EoMTApLCJbVVRJTFNdIjplLmdhKDEwKSwiW0NBTExCQUNLXSI6ZS5nYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuWGcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSltW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLlhnKGcsCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LGwpfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3A9dGhpcy5hWzhdO3RoaXMuam49dGhpcy5hWzJdO3RoaXMuZng9dGhpcy5hWzNdO3RoaXMuUmo9dGhpcy5hWzhdO3RoaXMud2k9dGhpcy5hWzRdO3RoaXMud3I9dGhpcy5hWzddO3RoaXMuUXA9dGhpcy5hWzFdO3RoaXMucnY9dGhpcy5hWzldO3RoaXMuang9dGhpcy5hWzVdO3RoaXMuS2w9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMV19Yy50aj1iO2IucHJvdG90eXBlPXtWcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3A6dGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpuOnRoaXMuZXgoYSl9LApleDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZng6dGhpcy5RaihhKX0sUWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlJqOnRoaXMudmkoYSl9LHZpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53aTp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3I6dGhpcy5QcChhKX0sUHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFwOnRoaXMucXYoYSl9LHF2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ydjp0aGlzLml4KGEpfSxpeDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuang6dGhpcy5KbChhKX0sSmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLktsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgemM9Yy50anx8emMsTGQ9bmV3IHpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUxkLlZwKDQpOyhmdW5jdGlvbihjKXtjLm5uPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5TKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMucXU9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9LGh3OmZ1bmN0aW9uKGIpe3RoaXMuUmQ9CmJ9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sbGE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuZ2IoYil9LmJpbmQodGhpcykpfSxnYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuTiYmdGhpcy5OKCksdGhpcy5SZCYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuUmQmJihuZXcgSCh0aGlzLHRoaXMuUmQpKS5jKCkpfX0pfSkoYyk7dmFyIE49Yy5ubnx8TjsoZnVuY3Rpb24oYyl7Yy5tbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSx4YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMua2UpaWYodGhpcy5yYnx8KHRoaXMucmI9MCksdGhpcy5yYisrLDE1PHRoaXMucmIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnR3KCk6dGhpcy51KCEwKSwhMDt0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnUoKTp0aGlzLnUoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5rZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLnlhKCl8fCh0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YSgpfS5iaW5kKHRoaXMpLDEwKX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sClk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVz1hLGIucygiYWRlcnJvciIsYSkpOmIucygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dGhpcy5XPXRoaXMuV3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnhhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSx1OmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRihiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSD1jLm1ufHxIOyhmdW5jdGlvbihjKXtjLnBuPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLklhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiLmh3KHRoaXMuRyksYj1uZXcgSChiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLnBufHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHA9CnRoaXMuYVsyXTt0aGlzLlRsPXRoaXMuYVszXTt0aGlzLmFtPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzJdfWMuS3E9YjtiLnByb3RvdHlwZT17R3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhwOnRoaXMuU2woYSl9LFNsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5UbDp0aGlzLiRsKGEpfSwkbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBDYz1jLktxfHxDYyxNZD1uZXcgQ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1NZC5HcCg0KTsoZnVuY3Rpb24oYyl7Yy5tbD1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy5jZz0KMDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVihhKTp0aGlzLmZhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jZ30sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLk4/KDAsdGhpcy5OKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse2ZxOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuY2c9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCntmcTpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sUDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIERjPWMubWx8fERjOyhmdW5jdGlvbihjKXtjLmxsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEN6OmZ1bmN0aW9uKCl7fSxXdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnRmKG5ldyBmdW5jdGlvbigpe30pO2EuJHk9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuV3YoYSk7d2luZG93LlpkPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLlZ2fHwodGhpcy5Wdj0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnNlfHwodGhpcy5zZT0xKTtpZigyMDx0aGlzLnNlKXRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLlFhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuc2UrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LFFhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLmFhKCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMuVWUoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5zKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLnBhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0sVWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc01hbmFnZXIpOwpiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpfSx5YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpe3RoaXMucWE9ITB9LGFhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YSgpPwoodGhpcy5vKCksdGhpcy5lYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkYoYil9fSl9KShjKTt2YXIgRWM9Yy5sbHx8RWM7KGZ1bmN0aW9uKGMpe2Mubmw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IERjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5tYXx8dGhpcy5KKGMpfHwodGhpcy5LKGMpLChuZXcgRWMoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEZjPWMubmx8fEZjLEdjPW5ldyBGYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubnQ9dGhpcy5hWzhdO3RoaXMuQng9dGhpcy5hWzddO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuSW49dGhpcy5hWzhdO3RoaXMuZ209dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbNl19Yy5zbD1iO2IucHJvdG90eXBlPXttdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnQ6dGhpcy5BeChhKX0sQXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJ4OnRoaXMuQXAoYSl9LEFwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5CcDp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSW46dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmdtOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgSGM9Yy5zbHx8SGMsTmQ9bmV3IEhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPU5kLm10KDQpOyhmdW5jdGlvbihjKXtjLmhsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIGJhPWMuaGx8fGJhOyhmdW5jdGlvbihjKXtjLmdsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LApjOmZ1bmN0aW9uKCl7dGhpcy5IZz0wO3RoaXMuVz10aGlzLld8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5xYT10aGlzLnRjPXRoaXMueGE9dGhpcy5RYz0hMTt0aGlzLnBoPWUudWIoMTApO3RoaXMuUWcoKX0sUWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudmE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLlFhKCksITA7dGhpcy5IZysrO2lmKDEwPHRoaXMuSGcpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMudSghMCk6dGhpcy51KCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5RZy5iaW5kKHRoaXMpLDEwMCksITF9LFFhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMudmE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMubygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuRihiKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNhPWMuZ2x8fGNhOyhmdW5jdGlvbihjKXtjLmlsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBjYShiLAp0aGlzLkcpLGIuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgSWM9Yy5pbHx8SWMsSmM9bmV3IEljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs4XTt0aGlzLlhuPXRoaXMuYVsxMF07dGhpcy5Dbz10aGlzLmFbNV07dGhpcy5oaj10aGlzLmFbMTBdO3RoaXMuZmo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzddfWMuWHM9YjtiLnByb3RvdHlwZT17Zm46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmduOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkNvOnRoaXMuZ2ooYSl9LGdqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5oajp0aGlzLmVqKGEpfSxlajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZmo6dGhpcy5qKGEpfSwKajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIEtjPWMuWHN8fEtjLE9kPW5ldyBLYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPU9kLmZuKDQpOyhmdW5jdGlvbihjKXtjLlRqPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yj8oYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllclByZWZpeCkpPyh0aGlzLlMoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5WKGIpOnRoaXMuZmEoKSk6dGhpcy5mYSgpOnRoaXMuZmEoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxtZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaXNGdWxsc2NyZWVuP2IuaXNGdWxsc2NyZWVuOiExfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLmR1cmF0aW9uP2IudmlkZW9pbmZvLmR1cmF0aW9uOjB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8ucGxheWhlYWQ/Yi52aWRlb2luZm8ucGxheWhlYWQ6MH0sCmV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgTGM9Yy5Uanx8TGM7KGZ1bmN0aW9uKGMpe2MuU2o9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVBsYXlpbmciLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLAp0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMucygiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksdGhpcy51KCkpfSx0ZXN0OmZ1bmN0aW9uKCl7fSx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtiLmlzUGxheWluZygpPyhiLnBhdXNlKCksdGhpcy5GKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBNYz1jLlNqfHxNYzsoZnVuY3Rpb24oYyl7Yy5Vaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApjOmZ1bmN0aW9uKCl7dGhpcy5JYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuTmEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyBMYyhkKSxkLm1hfHx0aGlzLkooZCl8fCh0aGlzLksoZCksKG5ldyBNYyhkLHRoaXMuRykpLmMoKSk7ZWxzZSBicmVha310aGlzLkkoKX19KX0pKGMpO3ZhciBOYz1jLlVqfHxOYyxPYz1uZXcgTmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub2s9dGhpcy5hWzFdO3RoaXMuYXA9dGhpcy5hWzldO3RoaXMuZWs9dGhpcy5hWzFdO3RoaXMudHE9dGhpcy5hWzEwXTt0aGlzLkx1PXRoaXMuYVsxXTsKdGhpcy5sPXRoaXMuYVszXX1jLkx2PWI7Yi5wcm90b3R5cGU9e25rOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vazp0aGlzLiRvKGEpfSwkbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXA6dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5lazp0aGlzLnNxKGEpfSxzcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudHE6dGhpcy5LdShhKX0sS3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkx1OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgUGM9Yy5Mdnx8UGMsUGQ9bmV3IFBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9UGQubmsoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5TKGIpLHRoaXMuVihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIFFjPWMuJGp8fFFjOyhmdW5jdGlvbihjKXtjLlpqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlVmKCl9LFVmOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5GKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZighMCl9LmJpbmQodGhpcyksCjEwMCkpfX0pfSkoYyk7dmFyIFJjPWMuWmp8fFJjOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBRYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5tYSl7dGhpcy5JKCk7cmV0dXJufWlmKCF0aGlzLkooYikpe3RoaXMuSyhiKTsobmV3IFJjKGIsdGhpcy5HKSkuYygpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgU2M9Yy5ha3x8U2MsVGM9bmV3IFNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNyPXRoaXMuYVsxMF07dGhpcy5FdD10aGlzLmFbNl07dGhpcy5NbD0KdGhpcy5hWzVdO3RoaXMubXg9dGhpcy5hWzZdO3RoaXMuaHQ9dGhpcy5hWzEwXTt0aGlzLmVvPXRoaXMuYVsxMF07dGhpcy5TcD10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOV19Yy54aT1iO2IucHJvdG90eXBlPXticjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3I6dGhpcy5EdChhKX0sRHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkV0OnRoaXMuTGwoYSl9LExsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5NbDp0aGlzLmx4KGEpfSxseDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubXg6dGhpcy5ndChhKX0sZ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5odDp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVvOnRoaXMuUnAoYSl9LFJwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5TcDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIFVjPWMueGl8fFVjLApRZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1RZC5icig0KTsoZnVuY3Rpb24oYyl7Yy5jaT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlMoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5WKGIpOnRoaXMuZmEoKSk6dGhpcy5mYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgVmM9Yy5jaXx8VmM7KGZ1bmN0aW9uKGMpe2MuYmk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYiwKYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy51LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcykpO3RoaXMuJGQoKTt0aGlzLlJmKCl9LFk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlc9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0scGE6ZnVuY3Rpb24oKXt0aGlzLnFhPSEwO3RoaXMubygiZW1wdHkgdmFzdCIpfSxSZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiYKYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8CjMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy5vKCksdGhpcy5lYSgpKTp0aGlzLnUoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlJmLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy4kZC5iaW5kKHRoaXMpLDEwMCl9LCRkOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaGEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5SYS5iaW5kKHRoaXMpLDEwKSx0aGlzLm8oKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLnUoKTp0aGlzLnUoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGQuYmluZCh0aGlzKSwxMDApfX0sdTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlJhLmJpbmQodGhpcyksCjFFNCk7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIFdjPWMuYml8fFdjOyhmdW5jdGlvbihjKXtjLmRpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sU2E6ZnVuY3Rpb24oYil7Yj1uZXcgVmMoYik7Yi5tYT90aGlzLkkoKTp0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBXYyhiLHRoaXMuRykpLmMoKSl9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5TYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuU2Eod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5JKCl9fSl9KShjKTt2YXIgWGM9Yy5kaXx8WGMsWWM9bmV3IFhjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5HdD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs3XX1jLk5tPWI7Yi5wcm90b3R5cGU9e0Z0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIFpjPWMuTm18fFpjLFJkPW5ldyBaYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVJkLkZ0KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlNnPXRoaXMuVWc9dGhpcy5UZz0hMTt0aGlzLnNkPVtdO3RoaXMuVGU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRjP251bGw6VGMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpjP251bGw6SmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/Cm51bGw6SWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlYsTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYmI/bnVsbDpiYixvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdiP251bGw6Z2IsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIHZjP251bGw6dmMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgeWE/bnVsbDp5YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgQmM/bnVsbDpCYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB5P251bGw6eSxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHljP251bGw6eWMsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRiP251bGw6VGIsU2ltcGxlVmlkZW9BbmRJbWE6InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgR2M/bnVsbDpHYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSWI/bnVsbDoKSWIsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE9jP251bGw6T2MsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBxYz9udWxsOnFjLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBtYj9udWxsOm1iLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiByYj9udWxsOnJiLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsWE9aQ09NOiJ1bmRlZmluZWQiPT09dHlwZW9mIERhP251bGw6RGEsQkNGbGFzaE9ubHk6InVuZGVmaW5lZCI9PT10eXBlb2YgWGE/bnVsbDpYYSxEZW1vVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB0YT9udWxsOnRhLFRPbmxpbmUyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNhP251bGw6U2EsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgWWM/bnVsbDpZYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWT8KbnVsbDpZfX1jLnJtPWI7Yi5wcm90b3R5cGU9e2M6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMubnMoYSk6W10sYjt0aGlzLlVnPSEwO2lmKGEubGVuZ3RoKXt0aGlzLlRnPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnVoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5UZSl7aWYodGhpcy5TZylicmVhaztiPXRoaXMuVGVbY107dGhpcy5uZihiKSYmKHRoaXMuc2QucHVzaChiKSx0aGlzLnVoKGIpKX19LG5mOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sbnM6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuVGVbY10sdGhpcy5uZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx1aDpmdW5jdGlvbihhKXt0aGlzLm5mKGEpJiZhLmMoKX0sSXc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIG4mJgohdGhpcy5UZylmb3IodGhpcy5TZz0hMCxhPTA7YTx0aGlzLnNkLmxlbmd0aDthKyspdGhpcy5zZFthXS55YiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnNkW2FdLnliKX19fSkoYyk7dmFyICRjPWMucm18fCRjLEw9bmV3ICRjO0wuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLllqPXRoaXMuYVs2XTt0aGlzLm12PXRoaXMuYVs4XTt0aGlzLmdrPXRoaXMuYVs0XTt0aGlzLmprPXRoaXMuYVs4XTt0aGlzLklqPXRoaXMuYVszXTt0aGlzLkVrPXRoaXMuYVszXTt0aGlzLmR0PXRoaXMuYVsxMF07dGhpcy5qcD10aGlzLmFbOF07dGhpcy5Tcj10aGlzLmFbOF07dGhpcy5xcj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVsxMF19Yy5taT1iO2IucHJvdG90eXBlPXtYajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWWo6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5tdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZ2s6dGhpcy5payhhKX0saWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmprOnRoaXMuSGooYSl9LEhqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Jajp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRWs6dGhpcy5jdChhKX0sY3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmR0OnRoaXMuaXAoYSl9LGlwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcDp0aGlzLlJyKGEpfSxScjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU3I6dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgYWQ9Yy5taXx8YWQsU2Q9bmV3IGFkKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVNkLlhqKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLm9jKGsuVngpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLm9jKGsudHUpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKRi53aWR0aD0xO0YuaGVpZ2h0PTE7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBUZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGhhPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBHPW5ldyBSLG09ITE7Ry51YygpO0cuTWcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLnVjKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5NZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0cudWMoKTt2YXIgVWQ9VGQoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csRy5zdCgpLHtpZDpVZH0pfSw1MDApLGxhPWUuZ2EoMTApO2dhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkl5PXRoaXMuYVs1XTt0aGlzLnVpPXRoaXMuYVs4XTt0aGlzLk52PXRoaXMuYVsxXTt0aGlzLkt2PXRoaXMuYVsxXTt0aGlzLmJ2PXRoaXMuYVs3XTt0aGlzLlV1PXRoaXMuYVs1XTt0aGlzLld1PXRoaXMuYVsyXTt0aGlzLiRpPXRoaXMuYVsxMF07dGhpcy5paT10aGlzLmFbMl07dGhpcy5Xcz10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs3XX1jLld5PWI7Yi5wcm90b3R5cGU9e0h5OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5JeTp0aGlzLnRpKGEpfSx0aTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudWk6dGhpcy5NdihhKX0sTXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk52OnRoaXMuSnYoYSl9LEp2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ldjp0aGlzLmF2KGEpfSxhdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYnY6dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlV1OnRoaXMuVnUoYSl9LFZ1OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuV3U6dGhpcy5aaShhKX0sWmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLiRpOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5paTp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuV3M6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBiZD1jLld5fHxiZCxWZD1uZXcgYmQoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1WZC5IeSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubWg9dGhpcy5jb25mPXRoaXMuZWI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLm5kPTA7dGhpcy5WYT0iIjt0aGlzLnRkPVtdO3RoaXMudWQ9MDt0aGlzLm9oPSExO3RoaXMuUmU9W119Yy5maT1iO2IucHJvdG90eXBlPXtxdzpmdW5jdGlvbihhKXt0aGlzLm1oPQphfSx4ZDpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuVmE9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGt3OmZ1bmN0aW9uKGEpe3RoaXMuZWI9YX0saXc6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEVhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5WYV0mJnRoaXMuY29uZlt0aGlzLlZhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuVmFdW2FdKTtyZXR1cm4gYn0semM6ZnVuY3Rpb24oYSxiKXtlLnNiKCJ3ZWx0LmRlIikmJmUuVGEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwKIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLmViKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMudHQoKSl0aGlzLmViLmYodGhpcy5lYi5oZCx0aGlzLmViLkNhLHRoaXMuZWIuU2UsZnVuY3Rpb24oKXt0aGlzLnpjKGEsYil9LmJpbmQodGhpcyksdGhpcy5lYi5sYyk7ZWxzZSBpZih0aGlzLkZzKCkpdGhpcy5ldyhmdW5jdGlvbigpe3RoaXMuemMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudyhrLlljLHRoaXMucGxheWVyLnYoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLkx3KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuZWIsaCk7bC53aCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuZ3UoYSkpfHwKZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuQWUmJihjPXRoaXMucGxheWVyLkFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkNlKGEsYyxmKTt0aGlzLnBsYXllci54aChsKX19LHR0OmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMubmQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5uZC5nZXRUaW1lKCksdGhpcy5uZD1hLDNFNTxiPyEwOiExO3RoaXMubmQ9YTtyZXR1cm4hMX0sQnc6ZnVuY3Rpb24oKXtlLlllKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5FYSgiYWRUYWciKTt0aGlzLkVhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5FYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuamcoYSkpP3RoaXMuemMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLAowKSxlLncoay5aYyx0aGlzLnBsYXllci52KCkpKX0sQXc6ZnVuY3Rpb24oYSl7ZS5ZZSgicG9zdHJvbGwiKTtpZighdGhpcy5taCl7dGhpcy5xdyghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5FYSgiYWRUYWciKTt0aGlzLkVhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuRWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5qZyhjKSk/dGhpcy56YyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5aYyx0aGlzLnBsYXllci52KCkpKX19LGpnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxZdjpmdW5jdGlvbigpe3RoaXMucGxheWVyLnZ3KHRoaXMuQXcuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGEoKX0sCkFkOmZ1bmN0aW9uKGEpe2UuWWUoIm1pZHJvbGwiKTtpZighdGhpcy5aZyl7dGhpcy5aZz0hMDt2YXIgYj10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkVhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy56YyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aZz0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5aYyx0aGlzLnBsYXllci52KCkpKX19LFh2OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucHcodGhpcy5BZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5HZSgpfSxjOmZ1bmN0aW9uKCl7dGhpcy5CdygpO3RoaXMucGxheWVyLkdlJiZ0aGlzLlh2KCk7dGhpcy5ZdigpfSxadjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOgphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy50ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuTnkoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnVkPXRoaXMudGQubGVuZ3RofSxGczpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy51ZCYmKGE9ITApO3JldHVybiBhfSxldzpmdW5jdGlvbihhKXt0aGlzLm9oPWE7Zm9yKGE9MDthPHRoaXMudGQubGVuZ3RoO2ErKyl0aGlzLnRkW2FdWyJmdW5jdGlvbiJdKHRoaXMuRXYuYmluZCh0aGlzKSl9LEV2OmZ1bmN0aW9uKGEpe3RoaXMudWQtLTthJiZ0aGlzLlJlLnB1c2goYSk7MD49dGhpcy51ZCYmdGhpcy5vaCgpfSxndTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5SZS5sZW5ndGg7YysrKWI9dGhpcy5SZVtjXSwKYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMuZml8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXI9dGhpcy5hWzddO3RoaXMuS249dGhpcy5hWzldO3RoaXMuQmk9dGhpcy5hWzVdO3RoaXMuUG89dGhpcy5hWzRdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuaXY9dGhpcy5hWzFdO3RoaXMubnA9dGhpcy5hWzFdO3RoaXMubD10aGlzLmFbMl19Yy5XbD1iO2IucHJvdG90eXBlPXtocjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXI6dGhpcy5KbihhKX0sSm46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktuOnRoaXMuQWkoYSl9LEFpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5CaTp0aGlzLk9vKGEpfSxPbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUG86dGhpcy5EaihhKX0sCkRqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Fajp0aGlzLmh2KGEpfSxodjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaXY6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5wOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgY2Q9Yy5XbHx8Y2QsV2Q9bmV3IGNkKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9V2QuaHIoNCl9KS5jYWxsKGllSm9qdWFiemFpcm9oR3UsaWVKb2p1YWJ6YWlyb2hHdSk7Cg==
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

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

Date
Wed, 17 Apr 2019 06:56:38 GMT
Last-Modified
Tue, 15 Jan 2019 19:37:43 GMT
Server
nginx
Vary
User-Agent, Accept-Encoding
Access-Control-Allow-Methods
POST, GET, OPTIONS
Content-Type
application/json;charset=utf-8
Access-Control-Allow-Origin
*
Cache-Control
private
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
288 B
955 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json?cache=8810350229
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGllSm9qdWFiemFpcm9oR3U9aWVKb2p1YWJ6YWlyb2hHdXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuTGV8fCh5LkxlPTApO3kuTGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5MZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5UYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEud2gobSksYS5DZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS4kcCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5ZYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wuc2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS54ZChjKTthLmt3KGwpO2EuaXcobSk7YS5adigpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlyPXRoaXMuYVs0XTt0aGlzLnh2PQp0aGlzLmFbN107dGhpcy5sPXRoaXMuYVs3XX1jLnN2PWI7Yi5wcm90b3R5cGU9e3hyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55cjp0aGlzLnd2KGEpfSx3djpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnh2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIga2E9Yy5zdnx8a2EsZGQ9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9ZGQueHIoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuJHA9ITE7dGhpcy5PYT0ic2V0dXAiO3RoaXMuQmM9W107dGhpcy5ZZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLkR2LmJpbmQodGhpcykpfWMucms9YjtiLnByb3RvdHlwZT17WWY6ZnVuY3Rpb24oKXt0aGlzLmNhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSwKb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LEpvOmZ1bmN0aW9uKGEpe3RoaXMuY2EuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG9hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxEdjpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5DdihhLmRhdGEpfSxDdjpmdW5jdGlvbihhKXtpZih0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPQp0aGlzLmNhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lciYmYS5ldmVudD09dGhpcy5jYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sVmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmNhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sYmc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lcyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuV2coYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGVzOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxIbzpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUuVXIoYSkpcmV0dXJuOyhiPXRoaXMuYmcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSxVcjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxtZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmCihiPXRoaXMuY2Eub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxCdDpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxOYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LHZnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxDaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT0KZG9jdW1lbnQuYm9keT8hMDohMX0sUGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSx1ZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoOwpkPXIud2lkdGg7Zj1yLmhlaWdodDswPnIudG9wJiYoZis9ci50b3ApO3IuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09ci5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sdmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy51ZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksMTAwKX0sdWI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LG9lOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0semg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxKPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLHAsbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBuPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLG4ucHVzaChjKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihuLnB1c2goZik7MTQhPW4ubGVuZ3RoJTE2OyluLnB1c2goMCk7bi5wdXNoKHA+Pj4yOSk7bi5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPG4ubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09blthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO3A9cjtsPUo7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfH5wJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKHBeCmxedikrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChwLDMwKSxwPWMsYz10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfHAmdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKHBebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKHAsMzApLHA9YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrcCY0Mjk0OTY3Mjk1O0o9SitsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihKKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LG5iOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+NixyPWMmNjMsaXNOYU4oZik/ZT1yPTY0OmlzTmFOKGMpJiYocj02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSx5dDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGZlOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHI9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IubGI/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8CmMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gobil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXI7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LCRyOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy5mZSgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFBhOmZ1bmN0aW9uKCl7dmFyIGE9e0lpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxPczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxibTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxUbjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5JaSgpfHxhLmRqKCl8fGEuT3MoKXx8YS5ibSgpfHxhLlRuKCl9fTtyZXR1cm4gYS5McCgpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGZkOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHNiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHBzOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxJcTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxHdzpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxxZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuT2goYikrIjoiK3RoaXMuT2goTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LE9oOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxZZTpmdW5jdGlvbihhKXt0aGlzLk9hPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLk9hO3RoaXMuTmYoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLAohMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxvYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlZCl7dmFyIHI9YTtkJiZiJiYoYj1rLlNhKGIsZCkpO2ImJihyPWsuU2EoYSxiKSk7ZiYmKHI9ay5TYShyLGYpKTtjJiYocj1rLlNhKHIsYykpO2gmJihyPWsuU2EocixoKSk7ZWQmJihyPWsuU2EocixoKSk7ZS5vYyhyKX0sRnY6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlJiYxMDIzIT1hLmNvZGUmJjEwMTghPWEuY29kZSl7dHJ5e2lmKGxhJiYoYi5zZXNzaW9uX2lkPWxhKSxiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiIsYS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpLGIuZXZlbnQ9CmEuY29kZSxiLnNpdGVfaHJlZj10aGlzLnBzKCksYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfX1jYXRjaChkKXt9cmV0dXJuIGJ9fSxOZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZ2KGEpO2lmKGIpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC52ZCgpKyI/aG9tYWRfYXQ9IitlbmNvZGVVUklDb21wb25lbnQoYik7bC53YShhLCEwKTthPWwud2EoYSwhMCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1lbmNvZGVVUklDb21wb25lbnQoYik7bC5IYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbHx8IWwuYmEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWErYjt0aGlzLkNjfHwodGhpcy5DYz17fSk7dGhpcy5DY1tmXXx8KHRoaXMuQ2NbZl09MCk7dGhpcy5DY1tmXSsrOzEwPHRoaXMuQ2NbZl18fChmPWwudmQoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpLGwud2EoZiwhMCksZj1sLndhKGYsITApLGYuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkhhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpKX19LERlOmZ1bmN0aW9uKCl7bCYmbC5iYT9sLmlzRW5hYmxlZCYmbC5ucSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZSgpfS5iaW5kKHRoaXMpLDUwMCl9LGxlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuYmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LG5lOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxiYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmdkKGEpOiIifSxnZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm5lKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sZXE6ZnVuY3Rpb24oYSxiLGQpe2Q9ITE7aWYoYi54ZShhKXx8dGhpcy5CdChhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LldlJiZ3aW5kb3cuc2FuZGJveC5XZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LldlWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwKc2FuZGJveC5XZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy5tZyhhKSlyZXR1cm4gdGhpcy5tZyhhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMubmIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtkJiYoZi5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtmLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2YuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjt2YXIgYz0hMTtkPSExO2Q9dGhpcy5UYShhLGIuR2EsZixmdW5jdGlvbihhKXtjPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2N8fChjPWQpLGM9SlNPTi5wYXJzZShjKX1jYXRjaChoKXtjPSExfWMudXJsJiZjLmhhc2gmJihjPWIubGQoKS5yZXBsYWNlKCJbaGFzaF0iLApjLmhhc2gpKTt0aGlzLkhvKGMsYSk7cmV0dXJuIGN9LFRhOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUscil7dmFyIGs9aHx8bDtoPSEwO3ImJihoPSExKTtpZihrJiZrLmJhKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7ay53YShhLGgpO2g9ay53YShhLGgpO2guZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuSGEoaCxmLGMsIiIsIiIsZSl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRhKGEsYixkLGYsYyxrLGUscil9LmJpbmQodGhpcyksNTAwKX0sV2c6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSl7dmFyIHI9ITA7ZSYmKHI9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7ZT1kO2Q9IiI7CmZvcih2YXIgayBpbiBlKWQrPSImIitrKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtrXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsciksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LCR0OmZ1bmN0aW9uKGEsYixkKXt0aGlzLldnKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLkJjKWZvcih2YXIgYyBpbiB0aGlzLkJjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuQmNbY10pOwpjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS5uYihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LFhnOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5uYihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuVGEoYSxmLkdhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT0KSlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuJHQoZi5sZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0scnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuQmM9YX0sTnk6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLlRhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLApiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGgpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LE1wOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSx3dDpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFE9Yy5ya3x8ClE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93LmtnPWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMucWs9YjtiLlNhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5wdj17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5zdT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi51eT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLkVyPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRnk9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5MZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuRWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLklmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLk1mPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi53bz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5HZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLll4PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5ydT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuRnI9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkF5PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlpmPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuQ3E9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLlpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuWWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLktmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLAptZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Iuem89e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLk1jPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5TZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5VZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IueW89e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlZoPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2Iud3U9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi5wZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07CmIubGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLiRmPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi50eT17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5WeD17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLnR1PXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfSxnZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX19fSkoYyk7dmFyIGs9Yy5xa3x8aztjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuanE9dGhpcy5hWzEwXTt0aGlzLiR3PXRoaXMuYVsxXTt0aGlzLlpuPXRoaXMuYVs2XTt0aGlzLkNrPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzhdfWMuZWk9YjtiLnByb3RvdHlwZT17aXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmpxOnRoaXMuWncoYSl9LFp3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kdzp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWm46dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNrOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgbWE9Yy5laXx8bWEsZmQ9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWZkLmlxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuc2s9YjtiLnByb3RvdHlwZT17b2U6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LG9iOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5BfHwieCIpfSxqczpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZSsKbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sZGQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmRkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuZGQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSx1YzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLm9lKHRoaXMub2IoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9CnRoaXMuZGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LHN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWMoKSsiMiJ9LE1nOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMub2UodGhpcy5qcygpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmRkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUj1jLnNrfHxSO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBvPXRoaXMuYVs0XTt0aGlzLnpwPXRoaXMuYVs2XTt0aGlzLlFuPXRoaXMuYVs4XTt0aGlzLnd5PXRoaXMuYVs2XTt0aGlzLnp5PXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzldfWMuRG49YjtiLnByb3RvdHlwZT17b286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT8KdGhpcy5wbzp0aGlzLnlwKGEpfSx5cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuenA6dGhpcy5QbihhKX0sUG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFuOnRoaXMudnkoYSl9LHZ5OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3k6dGhpcy55eShhKX0seXk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnp5OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgbmE9Yy5Ebnx8bmEsZ2Q9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9Z2Qub28oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsCmY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGYuZj9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5mOmZ1bmN0aW9uKCl7ZC5mLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnRmPWJ9KShjKTt2YXIgSz1jLnRmfHxLO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhpPXRoaXMuYVsxXTsKdGhpcy5Nbz10aGlzLmFbOF07dGhpcy5sPXRoaXMuYVs5XX1jLllzPWI7Yi5wcm90b3R5cGU9e0dpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSGk6dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1vOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgb2E9Yy5Zc3x8b2EsaGQ9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9aGQuR2koNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5xbT1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMueWM9MTAwO3RoaXMudmI9MDt0aGlzLklhPTE1MDt0aGlzLnliPTA7dGhpcy5sdyhiKX0sYzpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMudmI8PXRoaXMuSWE/KHRoaXMudmIrKywKdGhpcy55Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnljKSk6MD50aGlzLklhJiYodGhpcy55Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnljKSl9LGF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmI+dGhpcy5JYT8hMDohMX0sVmU6ZnVuY3Rpb24oKXt0aGlzLnZiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsdzpmdW5jdGlvbihiKXt0aGlzLkc9Yn0sZ3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxLOmZ1bmN0aW9uKGIpe3RoaXMuSmFbYi5vYigpXT1iO0wmJkwuVWcmJkwuSXcoYil9LHB6OmZ1bmN0aW9uKCl7cmV0dXJuIGUuTmEodGhpcy5KYSl9LEo6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYT09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVtiLm9iKCldPyEwOiExfSx4dDpmdW5jdGlvbihiKXtiPWIuRmEoKTtmb3IodmFyIGEgaW4gdGhpcy5KYSlpZihiLmlkPT0KdGhpcy5KYVthXS5GYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxEejpmdW5jdGlvbihiKXt0aGlzLkphW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLnFtfHx0OyhmdW5jdGlvbihjKXtjLnNtPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMueWM9MTA7dGhpcy52Yj0wO3RoaXMuSWE9NTA7dGhpcy5OPW51bGw7dGhpcy5tYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMucWI9IiI7dGhpcy5mZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHY6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkZhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7fSwKdnc6ZnVuY3Rpb24oYil7dGhpcy5OPWJ9LHF6OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTn0scHc6ZnVuY3Rpb24oYil7dGhpcy5IZT1ifSxvejpmdW5jdGlvbigpe3JldHVybiB0aGlzLkhlfSxHZTpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMudmI8PXRoaXMuSWEmJih0aGlzLnZiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy55YykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYil7fX0sdWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sb2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sWmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxFejpmdW5jdGlvbigpe30sVjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5HcygpfHx0aGlzLkVvKCk7dGhpcy5aZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHJ6OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEVvOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmdhKDEwKSl9LEdzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxTOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPQpifSxGYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxtZDpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sVWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0seHo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYX0sZmE6ZnVuY3Rpb24oKXt0aGlzLm1hPSEwfSxQYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxrYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHhoOmZ1bmN0aW9uKGIpe3RoaXMucWI9Yn0sbno6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYn0sc2g6ZnVuY3Rpb24oKXt0aGlzLnFiPW51bGx9LHV6OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5xYiYmKGI9ITApO3JldHVybiBifSx6ejpmdW5jdGlvbigpe3RoaXMuZmd8fCh0aGlzLmZnPSEwKX0scWM6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sa3o6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBuPWMuc218fG47KGZ1bmN0aW9uKGMpe2MuZ2k9Sy5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLkc9dGhpcy5wbGF5ZXI9IiI7dGhpcy5DZj0iMSI7dGhpcy5EZj0iMiI7dGhpcy5ybz0iMyI7dGhpcy5HYz0wO3RoaXMuJGc9CjMwO3RoaXMuRGI9W107dGhpcy5aYT1bXTt0aGlzLiRiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLk9mPXRoaXMuUmg9ITE7dGhpcy5zdGF0dXM9dGhpcy5HYzt0aGlzLmlkPWUuZ2EoMTApO3RoaXMueGQoYik7dGhpcy5udyhhKX0sYzpmdW5jdGlvbigpe30sZWE6ZnVuY3Rpb24oKXt0aGlzLlJofHwodGhpcy5SaD0hMCxlLkRlKCkpfSxLZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1MmJlMuS2ImJiFwYSYmKHBhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LEY6ZnVuY3Rpb24oYixhKXt2YXIgZz0hMDtiJiYoZz0hMSk7cmV0dXJuIHRoaXMuaGEoKT8hMToodGhpcy5zdygpLHRoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpLHRoaXMuS2goKSx0aGlzLk9mPSEwLGEmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCksITApfSxzOmZ1bmN0aW9uKGIsCmEpe3RoaXMuaGEoKXx8KHRoaXMuRGIucHVzaChiKSx0aGlzLlphLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxLaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuRGImJjA8dGhpcy5EYi5sZW5ndGgmJih0aGlzLkRiPWUudW5pcXVlKHRoaXMuRGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkRiLmpvaW4oIiwiKSkpO2lmKHRoaXMuWmEpe2Zvcih2YXIgZz0wO2c8dGhpcy5aYS5sZW5ndGg7ZysrKXRoaXMuJGJbdGhpcy5aYVtnXS5yZWFzb25dPT10aGlzLiRiW2JdJiZhLnB1c2godGhpcy5aYVtnXS5kZXRhaWwpLHRoaXMuJGJbdGhpcy5aYVtnXS5yZWFzb25dPHRoaXMuJGJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlphW2ddLmRldGFpbCksYj10aGlzLlphW2ddLnJlYXNvbik7dGhpcy4kYltiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihnPWUudW5pcXVlKGEpLGI9YisiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsCmIsITAsYSl9fSxzejpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9mfSxvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5DZn0sc3c6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkRmfSx0dzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMucm99LFJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5HY30sRmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuQ2Z9LGJ6OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkRmfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5HY30seGQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxudzpmdW5jdGlvbihiKXt0aGlzLkc9Yn0sZ3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxjdTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuZ2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRtPXRoaXMuYVs2XTt0aGlzLmNrPXRoaXMuYVs3XTt0aGlzLnhqPXRoaXMuYVsyXTt0aGlzLmxpPXRoaXMuYVs1XTt0aGlzLkJqPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsyXX1jLmZvPWI7Yi5wcm90b3R5cGU9e0NtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5EbTp0aGlzLmJrKGEpfSxiazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2s6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhqOnRoaXMua2koYSl9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5saTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQmo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYT1jLmZvfHxxYSxpZD1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9aWQuQ20oNCk7KGZ1bmN0aW9uKGMpe2MucWo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuZ2IoYil9LmJpbmQodGhpcykpfSxnYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5OJiZ0aGlzLk4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTsKdmFyIFQ9Yy5xanx8VDsoZnVuY3Rpb24oYyl7Yy5waj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2Q9bnVsbDt0aGlzLmN5PTFFMzt0aGlzLmpoPW51bGw7dGhpcy5weD0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cubGIpYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkYoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Oci5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuQ3MuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5CcyhhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuZnkoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmd5KGIpfS5iaW5kKHRoaXMpKSk7CmIub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLkFzKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5BcShhKX0uYmluZCh0aGlzKSl9LEFxOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkYoKX0sZnk6ZnVuY3Rpb24oYil7dGhpcy5LZHx8KHRoaXMuS2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmh5KGIpfS5iaW5kKHRoaXMpLHRoaXMuY3kpKX0saHk6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2QpO3RoaXMuRigpfSxneTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5LZCl9LEFzOmZ1bmN0aW9uKGIpe3RoaXMuaHooYik7dGhpcy5qaD1uZXcgRGF0ZTt0aGlzLmpoLXRoaXMuenY8dGhpcy5weD90aGlzLkYoKTp0aGlzLm8oKX0sQ3M6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy54ZChuZXcgVChhKSkpOwp0aGlzLkYoKX0sTnI6ZnVuY3Rpb24oKXt9LEJzOmZ1bmN0aW9uKCl7dGhpcy56dj1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLnBqfHxyYTsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLk5hKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5KKGcpfHwodGhpcy5LKGcpLChuZXcgcmEoZyx0aGlzLkcpKS5jKCkpfX10aGlzLkkoKX19fSl9KShjKTt2YXIgc2E9Yy5yanx8c2EsdGE9bmV3IHNhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZ3PXRoaXMuYVsyXTt0aGlzLkN5PQp0aGlzLmFbNV07dGhpcy5tbz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs4XX1jLnltPWI7Yi5wcm90b3R5cGU9e0V3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gdzp0aGlzLkJ5KGEpfSxCeTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3k6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgdWE9Yy55bXx8dWEsamQ9bmV3IHVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9amQuRXcoNCk7KGZ1bmN0aW9uKGMpe2MuUms9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5MYj0hMTt0aGlzLmxnKCk7dGhpcy5uZygpO3RoaXMuQnE9ITF9LGxnOmZ1bmN0aW9uKCl7dGhpcy5MYj0KITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLkxiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlMoYil9LG5nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTGIpe3ZhciBiPXRoaXMuRmEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkxiPSEwKTt0aGlzLlYoYSl9fSxsYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5OJiYoMCx0aGlzLk4pKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCwKY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLk4mJigwLHRoaXMuTikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLk4mJigwLHRoaXMuTikoKX0uYmluZCh0aGlzKSl9LEdlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuQWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkFkKGEpfS5iaW5kKHRoaXMpKX0sQWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsKYS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5IZSYmKDAsdGhpcy5IZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxrYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHZhPWMuUmt8fHZhOyhmdW5jdGlvbihjKXtjLlFrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE06ZnVuY3Rpb24oKXt9LFJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5HYzt0aGlzLmlzUGxheWluZz10aGlzLkljPSExO3RoaXMuVGQ9MTt0aGlzLktjPVtdO3RoaXMuamI9ITF9LGM6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLkljPSExO3RoaXMuVGQ9MTt0aGlzLktjPVtdO3RoaXMuamI9ITE7dGhpcy5nZXRQbGF5ZXIoKTsKdmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlRkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5qYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuamI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuamI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmpiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMuSWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMuS2UoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLiRnJiYKIXRoaXMuaGEoKSYmKHRoaXMuamI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMudSgpKToodGhpcy5zKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy51KCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLlJhKCksdGhpcy5nZXRQbGF5ZXIoKS5CcT0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkucWI7YSYmKGEucmQoKSxhLmNlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLkljPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMuS2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuJGcmJiF0aGlzLmhhKCkmJih0aGlzLmpiPyh0aGlzLnMoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5LYy5pbmRleE9mKGEpJiYKdGhpcy5LYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLmVhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5zKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuS2MubGVuZ3RoPj10aGlzLlRkJiZ0aGlzLnUoKSl9LGN1OmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sdTpmdW5jdGlvbihiKXtiP3RoaXMuaWU/dGhpcy5pZSsrOnRoaXMuaWU9MTp0aGlzLmhlP3RoaXMuaGUrKzp0aGlzLmhlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkNoKGEudmlkZW9UYWcpP2EuTGI/dGhpcy5vKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5JY3x8dGhpcy5pc1BsYXlpbmc/Cih0aGlzLmhlPnRoaXMuaWUmJihiPSExKSx0aGlzLkYoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDUwKTooYS5sZygpLGEubmcoKSxhLkxifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHdhPWMuUWt8fHdhOyhmdW5jdGlvbihjKXtjLlNrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuY3MoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPW5ldyB2YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSihnKXx8dGhpcy54dChnKXx8KHRoaXMuSyhnKSxnPW5ldyB3YShnLHRoaXMuRyksZy5NKCksZy5jKCkpfX10aGlzLkkoKX19LG16OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LApjczpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUubmIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHhhPWMuU2t8fHhhLHlhPW5ldyB4YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dT10aGlzLmFbNV07dGhpcy5keD10aGlzLmFbOV07dGhpcy5PcD10aGlzLmFbOV07dGhpcy51bT10aGlzLmFbOF07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5jcD10aGlzLmFbOF07dGhpcy51cj10aGlzLmFbMV07dGhpcy5JdD10aGlzLmFbNl07dGhpcy5vbT10aGlzLmFbNV07dGhpcy4kcz10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs0XX1jLnZvPWI7Yi5wcm90b3R5cGU9e3V1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52dTp0aGlzLmN4KGEpfSxjeDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZHg6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5PcDp0aGlzLnRtKGEpfSx0bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW06dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmZsOnRoaXMuYnAoYSl9LGJwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5jcDp0aGlzLnRyKGEpfSx0cjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudXI6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkl0OnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vbTp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHM6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6YT1jLnZvfHx6YSxrZD1uZXcgemEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT0Ka2QudXUoNCk7KGZ1bmN0aW9uKGMpe2MuYW89bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb19pZCk7dGhpcy5TKGIpO3ZhciBiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0sYT10aGlzLmdldFJhd1BsYXllcigpO2ImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlYoYik6dGhpcy5JKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlhPWkNPTSJ9fSl9KShjKTsKdmFyIEFhPWMuYW98fEFhOyhmdW5jdGlvbihjKXtjLiRuPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IudHJhY2tlci52YXN0X3ByZXJvbGx8fGIudHJhY2tlci52YXN0X3Bvc3Ryb2xsP3RoaXMubygpOih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLnUoKSl9LHU6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMuRigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEJhPWMuJG58fEJhOyhmdW5jdGlvbihjKXtjLmJvPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzJiYKMDxlLk5hKHdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcykpe3ZhciBiPXdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YlthXTtpZihnLmNvbnRyb2xzJiZnLmNvbnRyb2xzLnBsYXllcilnPW5ldyBBYShnKSx0aGlzLkooZyl8fCh0aGlzLksoZyksKG5ldyBCYShnLHRoaXMuRykpLmMoKSk7ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19KX0pKGMpO3ZhciBDYT1jLmJvfHxDYSxEYT1uZXcgQ2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRmk9dGhpcy5hWzRdO3RoaXMuSWs9dGhpcy5hWzVdO3RoaXMuRHU9dGhpcy5hWzhdO3RoaXMuWnE9dGhpcy5hWzRdO3RoaXMuVW09dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbNl19Yy5Laz1iO2IucHJvdG90eXBlPQp7RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZpOnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jazp0aGlzLkN1KGEpfSxDdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkR1OnRoaXMuWXEoYSl9LFlxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5acTp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBFYT1jLktrfHxFYSxsZD1uZXcgRWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1sZC5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5Gbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPQpiLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5WKGIpOnRoaXMuZmEoKSk6dGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuZ2IoYil9LmJpbmQodGhpcykpfSxnYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5OJiZ0aGlzLk4oKX0sbWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGcpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciBGYT1jLkZufHxGYTsoZnVuY3Rpb24oYyl7Yy5Fbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5XPXRoaXMuV3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnFhPXRoaXMudGM9dGhpcy54YT10aGlzLlFjPSExO3RoaXMucGg9ZS51YigxMCk7dGhpcy5RaD0hMDt0aGlzLmVjPXRoaXMuSmc9ITE7dGhpcy5laCgpO3RoaXMua3EoKTt0aGlzLlFhKCl9LEF6OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5vYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5aLCI7Iix0eXBlb2YgYi5aLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlo/Yi5aLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5aP3R5cGVvZiBiLlouc3RhdGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuUiwiOyIsdHlwZW9mIGIuUiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLlI/Yi5SLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuRGE6InVuZGVmaW5lZFgiLAoiOyIsYi5SP3R5cGVvZiBiLlIuRGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLkRhP2IuaW1hLkRhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuRGE/dHlwZW9mIGIuaW1hLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuUiYmYi5SLkRhP2IuUi5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5SJiZiLlIuRGE/dHlwZW9mIGIuUi5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5QZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5QZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuUj9iLlIuUGQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5QZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsCiI7IixiLmltYT9iLmltYS5RZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5RZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlFkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuUWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEudmE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEudmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuUj9iLlIudmE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi52YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuV2Q6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuV2Q6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLldkOgoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLldkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMucGgpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sSGI6ZnVuY3Rpb24oKXtpZighdGhpcy52YSl7dmFyIGI9dGhpcy5wYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudmE9CmIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnZhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnZhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnZhfSx5ZzpmdW5jdGlvbigpe2lmKCF0aGlzLnRjKXt2YXIgYj10aGlzLnBiKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMudGM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLnRjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMudGN9LHZ0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuSWcpe3ZhciBiPXRoaXMucGIoKSxhPXRoaXMudXQoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLklnPSEwKX1yZXR1cm4gdGhpcy5JZ30sdXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwohdGhpcy5RYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuUWM9ITApO3JldHVybiB0aGlzLlFjfSxRYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLlVlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcyksCjIwKX0sVWU6ZnVuY3Rpb24oKXt0aGlzLmVjPSEwO3ZhciBiPXRoaXMueWcoKTtpZihifHx0aGlzLmhhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5zKCJhZGVycm9yIiwKdGhpcy5XKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5QYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuZmM9ITA7aWYoZS5zYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5mY3x8KHRoaXMucygiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcyksCjIwKX0sbHo6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmFnJiZiLmFkcyYmKHRoaXMuYWc9Yi5hZHMpO3JldHVybiB0aGlzLmFnfSxrcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLmFhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLmFhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMuYWEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLmFhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubygpO3RoaXMuS2UoKX0uYmluZCh0aGlzKSl9LGRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy55ZygpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSw1MCl9LGVoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLnZ0KCkpe3ZhciBhPXRoaXMucGIoKSxnPXRoaXMuSGIoKTthJiZnJiYodGhpcy5wYigpLHRoaXMuSGIoKSx0aGlzLmVjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWM/dGhpcy5vKCk6KHRoaXMuYWEoITApLHRoaXMucygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLnBiKCl9ZWxzZSB0aGlzLkpnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGIoKSxiPXRoaXMuSGIoKTthJiYhYj8odGhpcy5zKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmFhKCkpOih0aGlzLmFhKCEwKSx0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5KZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVoKCl9LmJpbmQodGhpcyksNTApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LGxxOmZ1bmN0aW9uKCl7dGhpcy5rY3x8KHRoaXMua2M9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLmtjIT1iLmFkcy5zdGF0ZSYmKHRoaXMua2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLmtjKXt0aGlzLm8oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMua2M9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxxKCl9LmJpbmQodGhpcyksMTApfSx5YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpezA8PWUuZmQoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuVz90aGlzLnUoITApOih0aGlzLnFhPSEwLHRoaXMubygiZW1wdHkgdmFzdCIpKX0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMubygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuUWg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5GKHRoaXMuUWgsZnVuY3Rpb24oKXt0aGlzLmRnKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApxcTpmdW5jdGlvbigpe3RoaXMudnp8fCgxMDx0aGlzLmR5Pyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuZHkrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy4kdigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xcSgpfS5iaW5kKHRoaXMpLDUwKSkpfSwkdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5leSl7dGhpcy5leT0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5hYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBHYT1jLkVufHxHYTsoZnVuY3Rpb24oYyl7Yy5Hbj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApjOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuRGgod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLkRoKGJbZ10pfWNhdGNoKGQpe310aGlzLkkoKX19LERoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuTmEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgRmEoYltnXSksYS5tYXx8dGhpcy5KKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLksoYSksKG5ldyBHYShhLHRoaXMuRykpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy55Yj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy55Yyl9fSl9KShjKTt2YXIgSGE9Yy5Hbnx8SGEsSWE9bmV3IEhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk54PXRoaXMuYVs5XTt0aGlzLiR1PXRoaXMuYVszXTt0aGlzLkdrPXRoaXMuYVs4XTt0aGlzLnhxPXRoaXMuYVs4XTt0aGlzLldqPXRoaXMuYVs2XTt0aGlzLkp1PXRoaXMuYVs5XTt0aGlzLlJpPXRoaXMuYVsxMF07dGhpcy5Ldz10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs4XX1jLnR2PWI7Yi5wcm90b3R5cGU9e014OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTng6dGhpcy5adShhKX0sWnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR1OnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Hazp0aGlzLndxKGEpfSx3cTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnhxOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Xajp0aGlzLkl1KGEpfSxJdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSnU6dGhpcy5RaShhKX0sUWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJpOnRoaXMuSncoYSl9LEp3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS3c6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBKYT1jLnR2fHxKYSxtZD1uZXcgSmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1tZC5NeCg0KTsoZnVuY3Rpb24oYyl7Yy5ibj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5nZXRQbGF5ZXIoKS5pZCk7CmIuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlYoYSl9LGxhOmZ1bmN0aW9uKCl7fSxnYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksZz1iLmdldER1cmF0aW9uKCk7YSYmMDxhJiZnJiYwPGcmJmE+PWctMiYmdGhpcy5OJiYidW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkKCkmJnRoaXMuTigpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBhdXNlKCk6Yi5pc1BhdXNlZCgpfHxiLmdldFBsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQYXVzZWQoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGxheSgpOgpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT0xMDAqYi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgS2E9Yy5ibnx8S2E7KGZ1bmN0aW9uKGMpe2MuYW49dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuSWI9bnVsbDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGI9ITE7dGhpcy5yaCgpO2lmKGIuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGIuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgYT0KYi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5YYj0hMCx0aGlzLm8oKTt0aGlzLnMoImFkZXJyb3IiLGEpO2IuZ2V0UGxheWVyKCk7Yi5nZXRQbGF5ZXIoKTt0aGlzLlZjKCl9fWVsc2UiZmxhc2giPT1iLnBsYXllcl90eXBlP3RoaXMuV2YoKTp0aGlzLm8oKX0sVmM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuaGEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmdldFBsYXllcigpO2lmKCJwbGF5aW5nIj09YS5nZXRQbGF5ZXIoKS5zdGF0ZSlpZihhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBnPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7CmEuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLlhiPSEwLHRoaXMubygpO3RoaXMucygiYWRlcnJvciIsZyk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7dGhpcy5YYj90aGlzLmVhKCk6Yj9hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlP3RoaXMuRigxMDEyIT1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlKTphLmdldFBsYXllcigpLmFkc19sb2FkZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZjKCEwKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuRighMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZjKCEwKX0uYmluZCh0aGlzKSwxMDApfX1lbHNlIHRoaXMubygpO2Vsc2UgYS5nZXRQbGF5ZXIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlZjLmJpbmQodGhpcyksCjEwMCl9fSxXZjpmdW5jdGlvbigpe2lmKCF0aGlzLmhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkliKSx0aGlzLm8oKSk7ImZpcnN0UXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuSWIpLHRoaXMubygpKTsibWlkcG9pbnQiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuSWIpLHRoaXMubygpKTsidGhpcmRRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5JYiksdGhpcy5vKCkpOyJhZExvYWRpbmdFcnJvciI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmbnVsbD09dGhpcy5JYiYmKHRoaXMuSWI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhifHwKKHRoaXMucygiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy5GKCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2YuYmluZCh0aGlzKSw1MCl9fSxyaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7Yi5hZHNfbG9hZGVyP2IuYWRzX2xvYWRlciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YS5nZXRFcnJvcigpO2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKTtpZigxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKSl0aGlzLlhiPSEwLHRoaXMubygpOzkwMT09YS5nZXRFcnJvckNvZGUoKSYmCnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmgoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTGE9Yy5hbnx8TGE7KGZ1bmN0aW9uKGMpe2MuY249dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiZ2aWRlby5nZXRQbGF5ZXImJnZpZGVvLmdldFBsYXllcigpJiYodmlkZW8uZ2V0UGxheWVyKCkuZWx8fCJmbGFzaCI9PXZpZGVvLnBsYXllcl90eXBlKSl7dmFyIGI9bmV3IEthKHZpZGVvKTt0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBMYShiLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWE9Yy5jbnx8TWEsTmE9bmV3IE1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklyPXRoaXMuYVs3XTt0aGlzLnZzPXRoaXMuYVsxXTt0aGlzLnZwPQp0aGlzLmFbN107dGhpcy5Tbj10aGlzLmFbM107dGhpcy5HbD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsxMF19Yy5Xbz1iO2IucHJvdG90eXBlPXtIcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSXI6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZzOnRoaXMudXAoYSl9LHVwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52cDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU246dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgT2E9Yy5Xb3x8T2EsbmQ9bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9bmQuSHIoNCk7KGZ1bmN0aW9uKGMpe2MuWm09Cm4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmVsXzthfHwoImZ1bmN0aW9uIj09dHlwZW9mIGIuZWw/YT1iLmVsKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGIuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQoKSkpKTt0aGlzLlMoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJihiPWJbMF0pO3RoaXMuVihiKX0sZ2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuTiYmdGhpcy5OKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmKGE9Yi5wYXVzZWQoKSk7YXx8Yi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMTsiZnVuY3Rpb24iPT10eXBlb2YgYi5wYXVzZWQmJihhPWIucGF1c2VkKCkpO2EmJmIucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUyIn0sa2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5tdXRlZCYmImZ1bmN0aW9uIj09dHlwZW9mIGEubXV0ZWQmJihiPWEubXV0ZWQoKSk7cmV0dXJuIGJ9LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExO2Iudm9sdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgYi52b2x1bWUmJihhPTEwMCpiLnZvbHVtZSgpKTtyZXR1cm4gYX0sVWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9fSl9KShjKTt2YXIgUGE9Yy5abXx8UGE7KGZ1bmN0aW9uKGMpe2MuWW09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuVmYoKTtiLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwO3RoaXMueG98fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoInRpbWV1cGRhdGUiKTt0aGlzLkYoITApfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9GSVJTVF9RVUFSVElMRSIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX01JRFBPSU5UIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfVEhJUkRfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLnMoImFkc2Vycm9yIik7dGhpcy56cyhhKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LAp6czpmdW5jdGlvbihiKXt2YXIgYT05OTk5OTk7aWYoYi5kYXRhJiZiLmRhdGEuQWRFcnJvcilmb3IodmFyIGcgaW4gYi5kYXRhLkFkRXJyb3IpYi5kYXRhLkFkRXJyb3IuaGFzT3duUHJvcGVydHkoZykmJiJudW1iZXIiPT10eXBlb2YgYi5kYXRhLkFkRXJyb3JbZ10mJihhPWIuZGF0YS5BZEVycm9yW2ddLHRoaXMucyhhKSk7OTAxPT1hP3RoaXMubygpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLlhiPSEwLHRoaXMubygpLHRoaXMuZWEoKSk6dGhpcy5GKCl9LFZmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkcyYmYi5hZHMuaXNBZFBsYXlpbmcmJmIuYWRzLmlzQWRQbGF5aW5nKCk/KHRoaXMueG89ITAsdGhpcy5vKCkpOnRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5WZi5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZz8KdGhpcy5GKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgUWE9Yy5ZbXx8UWE7KGZ1bmN0aW9uKGMpe2MuJG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllckZyYW1ld29yayYmd2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlJiYiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKXt2YXIgYj13aW5kb3cucGxheWVyRnJhbWV3b3JrLmdldEJhc2UoKTtpZihiJiZiLmdldEFsbFBsYXllcnMmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFsbFBsYXllcnMpaWYoKGI9Yi5nZXRBbGxQbGF5ZXJzKCkpJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9bmV3IFBhKGJbYV0pO3RoaXMuSihnKXx8KHRoaXMuSyhnKSwobmV3IFFhKGcsdGhpcy5HKSkuYygpKX1lbHNlIHRoaXMuSSgpfWVsc2UgdGhpcy5WZSgpLAp0aGlzLkkoKX19KX0pKGMpO3ZhciBSYT1jLiRtfHxSYSxTYT1uZXcgUmEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzldO3RoaXMuemk9dGhpcy5hWzhdO3RoaXMuUXM9dGhpcy5hWzddO3RoaXMudHA9dGhpcy5hWzZdO3RoaXMuTXQ9dGhpcy5hWzRdO3RoaXMueXU9dGhpcy5hWzZdO3RoaXMucHU9dGhpcy5hWzRdO3RoaXMuTnM9dGhpcy5hWzddO3RoaXMua3Y9dGhpcy5hWzEwXTt0aGlzLkd4PXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsxMF19Yy5Obz1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTW06dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnppOnRoaXMuUHMoYSl9LFBzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Rczp0aGlzLnNwKGEpfSxzcDpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLnRwOnRoaXMuTHQoYSl9LEx0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NdDp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5vdShhKX0sb3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnB1OnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnM6dGhpcy5qdihhKX0sanY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmt2OnRoaXMuRngoYSl9LEZ4OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5HeDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIFRhPWMuTm98fFRhLG9kPW5ldyBUYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPW9kLkxtKDQpOyhmdW5jdGlvbihjKXtjLk1pPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsCmEpe3RoaXMuaShiKTt0aGlzLmRoPWF9LE06ZnVuY3Rpb24oKXt9LEVlOmZ1bmN0aW9uKGIpe3RoaXMuZGg9YjtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGgpLnBhcmVudE5vZGU7dGhpcy5TKGIpO3RoaXMuVihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIFVhPWMuTWl8fFVhOyhmdW5jdGlvbihjKXtjLkxpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmkoYixhKX0sRWU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTsKdmFyIGI9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUiksYT10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuQURWRVJUSVNJTkcpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuQkVHSU4sZnVuY3Rpb24oKXt0aGlzLnMoImNvbnRlbnRwbGF5Iik7dGhpcy5GKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMucygiY29udGVudHBsYXkiKTt0aGlzLkYoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBWYT1jLkxpfHxWYTsoZnVuY3Rpb24oYyl7Yy5OaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPQpicmlnaHRjb3ZlLmV4cGVyaWVuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1icmlnaHRjb3ZlLmdldEV4cGVyaWVuY2UoYSksZD0hMTtnJiYoZD1nLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUikpO2lmKGcmJmQmJmQuaXNQbGF5ZXJEZWZpbmVkKCkpZD1uZXcgVWEoZCxhKSx0aGlzLkooZCl8fChkLkVlKGEpLHRoaXMuSyhkKSxkPW5ldyBWYShkLHRoaXMuRyxnKSxkLkVlKGcpLGQuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFdhPWMuTml8fFdhLFhhPW5ldyBXYShpYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTHg9dGhpcy5hWzJdO3RoaXMuWXU9dGhpcy5hWzJdO3RoaXMuVXM9dGhpcy5hWzJdO3RoaXMuUXE9dGhpcy5hWzhdO3RoaXMuUnU9dGhpcy5hWzZdO3RoaXMuemo9dGhpcy5hWzddOwp0aGlzLmw9dGhpcy5hWzddfWMuZHU9YjtiLnByb3RvdHlwZT17S3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MeDp0aGlzLlh1KGEpfSxYdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWXU6dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuUHEoYSl9LFBxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5RcTp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnU6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnpqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgWWE9Yy5kdXx8WWEscGQ9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9cGQuS3goNCk7KGZ1bmN0aW9uKGMpe2MueGw9Cm4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLlMoYik7dGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sUGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sUDpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTsKdmFyIFphPWMueGx8fFphOyhmdW5jdGlvbihjKXtjLndsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlBhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMuSmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLkpjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLkpjKCl9LmJpbmQodGhpcykpKTp0aGlzLkpjKCl9LEpjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubygpOih0aGlzLnMoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksCjIwMCl9fSl9KShjKTt2YXIgJGE9Yy53bHx8JGE7KGZ1bmN0aW9uKGMpe2MueWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBaYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3ICRhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBhYj1jLnlsfHxhYixiYj1uZXcgYWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMueGs9dGhpcy5hWzFdO3RoaXMuQXI9dGhpcy5hWzFdO3RoaXMub3Y9dGhpcy5hWzhdO3RoaXMuUnQ9dGhpcy5hWzldO3RoaXMuWHE9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNV19Yy5Ybz1iO2IucHJvdG90eXBlPQp7cXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ0OnRoaXMud2soYSl9LHdrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54azp0aGlzLnpyKGEpfSx6cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXI6dGhpcy5udihhKX0sbnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm92OnRoaXMuUXQoYSl9LFF0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5SdDp0aGlzLldxKGEpfSxXcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWHE6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBjYj1jLlhvfHxjYixxZD1uZXcgY2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1xZC5xdCg0KTsoZnVuY3Rpb24oYyl7Yy5kbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLk1lPQowO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZmEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlYoYik6dGhpcy5mYSgpfSxBdjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnFiLGc9dGhpcy5vYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5LYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5yZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuTWU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/Cih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sVWE6ZnVuY3Rpb24oKXt0aGlzLk1lKys7aWYoMTA8dGhpcy5NZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSwKd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LApQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxsYTpmdW5jdGlvbigpe30sZ2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5OJiZ0aGlzLk4oKX19KX0pKGMpO3ZhciBkYj1jLmRtfHxkYjsoZnVuY3Rpb24oYyl7Yy5jbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLmtlKWlmKHRoaXMucmJ8fCh0aGlzLnJiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMucmIrKywxNTx0aGlzLnJiKXRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMua2U9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMueWEoKXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5XKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApfX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHwKNDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlc9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5XPXRoaXMuV3x8ITE7dGhpcy54YSgpO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50JiYhdGhpcy5Mcj8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5XKTt0aGlzLnUoKX0uYmluZCh0aGlzKSksdGhpcy5Mcj0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuQXYoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIGViPWMuY218fGViOyhmdW5jdGlvbihjKXtjLmVtPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLklhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IGRiKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLm1hfHx0aGlzLkooYSl8fCh0aGlzLksoYSksKG5ldyBlYihhLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgZmI9Yy5lbXx8ZmIsZ2I9bmV3IGZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5GcD10aGlzLmFbMl07dGhpcy5ldj10aGlzLmFbNl07dGhpcy5Vaz10aGlzLmFbNl07dGhpcy5Naj10aGlzLmFbMV07dGhpcy5Qdj10aGlzLmFbNV07dGhpcy5GdT10aGlzLmFbMl07dGhpcy5Jcz10aGlzLmFbMl07dGhpcy5rcj10aGlzLmFbMTBdO3RoaXMuVHk9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMl19Yy5FbT1iO2IucHJvdG90eXBlPXtFcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnA6dGhpcy5kdihhKX0sZHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ldjp0aGlzLlRrKGEpfSxUazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVWs6dGhpcy5MaihhKX0sTGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1qOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Qdjp0aGlzLkV1KGEpfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRnU6dGhpcy5IcyhhKX0sSHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5Jczp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua3I6dGhpcy5TeShhKX0sU3k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlR5OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgaGI9Yy5FbXx8aGIscmQ9bmV3IGhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9cmQuRXAoNCk7KGZ1bmN0aW9uKGMpe2MubGs9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYi5lbGVtZW50KTt0aGlzLlYoYi5lbGVtZW50KX0sUGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSwKa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIGliPWMubGt8fGliOyhmdW5jdGlvbihjKXtjLmtrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkYoKX19KX0pKGMpO3ZhciBqYj1jLmtrfHxqYjsoZnVuY3Rpb24oYyl7Yy5taz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsCmZ1bmN0aW9uKGIpe2I9bmV3IGliKGIuZGV0YWlsKTtiLm1hfHx0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBqYihiLHRoaXMuRykpLmMoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGtiPWMubWt8fGtiLG1iPW5ldyBrYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncj10aGlzLmFbN107dGhpcy5QeD10aGlzLmFbMV07dGhpcy5Sdj10aGlzLmFbN107dGhpcy51bz10aGlzLmFbMV07dGhpcy5ocD10aGlzLmFbN107dGhpcy5waT10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs4XX1jLkJyPWI7Yi5wcm90b3R5cGU9e2ZyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3I6dGhpcy5PeChhKX0sT3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5QeDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUnY6dGhpcy50byhhKX0sdG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy51bzp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaHA6dGhpcy5vaShhKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnBpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgbmI9Yy5Ccnx8bmIsc2Q9bmV3IG5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9c2QuZnIoNCk7KGZ1bmN0aW9uKGMpe2MuTWs9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUudmcoYiwiZWxlbWVudElEIik7dGhpcy5saD1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Cmcuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLmxoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToiYWZ0ZXIiPT10aGlzLmxoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYSk7dGhpcy5TKGcpO3RoaXMuVihnKTt0aGlzLmJkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5iZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYmQpfSxrYTpmdW5jdGlvbigpe3JldHVybiEwfSxwcTpmdW5jdGlvbigpe2UuUGcodGhpcy5iZCk7ZS51ZSh0aGlzLmJkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucHEoKX0uYmluZCh0aGlzKSwKNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgb2I9Yy5Na3x8b2I7KGZ1bmN0aW9uKGMpe2MuTGs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkYoITApfX0pfSkoYyk7dmFyIHBiPWMuTGt8fHBiOyhmdW5jdGlvbihjKXtjLk5rPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSWE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLnZnKGIsImVsZW1lbnRJRCIpO2UuUGcoYSkmJihiPW5ldyBvYihiKSx0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBwYihiLHRoaXMuRykpLmMoKSkpO3RoaXMueWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMueWI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBxYj1jLk5rfHxxYixyYj1uZXcgcWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnU9dGhpcy5hWzFdO3RoaXMuVnk9dGhpcy5hWzldO3RoaXMuRHc9dGhpcy5hWzhdO3RoaXMudm49dGhpcy5hWzddO3RoaXMubD10aGlzLmFbN119Yy5hcT1iO2IucHJvdG90eXBlPXtNdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTnU6dGhpcy5VeShhKX0sVXk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZ5OnRoaXMuQ3coYSl9LEN3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Edzp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudm46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBzYj1jLmFxfHxzYix0ZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9dGQuTXUoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnRrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LG93OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sRm86ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHg9Yy50a3x8eDsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGcsZCxjKXt0aGlzLlhhPWE7dGhpcy5wZz10aGlzLmFpPSExO3RoaXMuZmg9ZDt0aGlzLkVoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLlhhPW5ldyB4KGEpKTsKdmFyIGU9dGhpcy5CYj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9ZS5yZWFkeVN0YXRlfHwyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzfHxnKGUpO2lmKGQmJjQ9PWUucmVhZHlTdGF0ZSYmMjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1cylkKGUpO2Vsc2UgaWYoND09ZS5yZWFkeVN0YXRlJiYwPT1lLnN0YXR1cyYmbCYmbC55ZSh0aGlzLlhhLnVybCkmJmwuRmQpe3ZhciBoPW5ldyB4KGEudXJsKTtoLm93KCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwubmEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLm5hKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT0KZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMudWs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMucGcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkVoP3RoaXMuQmIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5CYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLmFpfHwodGhpcy5CYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuQmIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksdGhpcy5CYi5zZW5kKGEpfWNhdGNoKGMpe2wmJmwueWUodGhpcy5YYS51cmwpPwpsLkZkP2wubmEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwueWUodGhpcy5YYS51cmwpLHRoaXMuZmgmJnRoaXMuZmgoKX1yZXR1cm4gdGhpcy5CYn19fSkoYyk7dmFyIHRiPWMudWt8fHRiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zYT0hMTt0aGlzLmhjPSIiO3RoaXMuWGQ9dGhpcy5nYz10aGlzLmtiPW51bGw7dGhpcy5KcT10aGlzLndiPXRoaXMuVmc9ITE7dGhpcy5HYT0iIjt0aGlzLlJnPSExO3RoaXMuQ2E9dGhpcy5oZD0iIjt0aGlzLk5nPXRoaXMuYmE9dGhpcy5pc0VuYWJsZWQ9dGhpcy5TZT0hMTt0aGlzLkFhPVtdO3RoaXMuRWc9dGhpcy5SYj0iIjt0aGlzLmdlPSExO3RoaXMuZ2Y9MDt0aGlzLnhmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMudmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLkNiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5GYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy53Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuVGI9IiI7dGhpcy54Yj1bXTt0aGlzLlViPVtdO3RoaXMuU2I9IiI7dGhpcy5oZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnJlPSExO3RoaXMucnE9dGhpcy5HZD1udWxsO3RoaXMuQWg9dGhpcy5EYz10aGlzLmhnPXRoaXMubWY9dGhpcy5GZD10aGlzLllkPXRoaXMuSGM9ITE7dGhpcy4kYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5rZD0wO3RoaXMuR2c9ITE7dGhpcy5GZz0xRTN9Yy52az1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5zYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLmhjLGFkdGFnbW9kaWZpZXI6dGhpcy5rYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuZ2MsYWR0YWdyZWdleDp0aGlzLlhkLGpzcG9wdXBzOnRoaXMuVmcsCnNpZGVsb2Fkczp0aGlzLndiLGRpc2FibGV0ZXN0czp0aGlzLkpxLGhvbWFkQWxpYXM6dGhpcy5HYSxpc0luaXRpYWxpemVkOnRoaXMuUmcsZ2xvYmFsQ29uZmlnOnRoaXMuaGQsY2xpZW50Q29uZmlnOnRoaXMuQ2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5iYSxpc0Jsb2NrZWQ6dGhpcy5OZyxzZXJ2ZXI6dGhpcy5BYSxzdm1Db25maWc6dGhpcy5SYixob21hZEFkcGF0aDp0aGlzLkVnLGRpc2FibGVDb29raWVUZXN0OnRoaXMuZ2UsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuZ2YsSE9NQURfVkVSSUZJRUQ6dGhpcy54ZixIT01BRF9CTE9DS0VEOnRoaXMudmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuQ2IsSE9NQURfQURCTE9DS0VSOnRoaXMuRmMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLndmLHRlc3RIaWRlOnRoaXMuVGIsdGVzdFRhZ3M6dGhpcy54Yix0ZXN0VGFnc0pTOnRoaXMuVWIsdGVzdENvb2tpZTp0aGlzLlNiLHRocm90dGxlOnRoaXMuaGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsCmhvbWFkVGVzdGVkOnRoaXMucmUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5ycSxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5ZZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5GZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5tZixjb25maWdGYWlsdXJlczp0aGlzLiRhLHNpdGVDb25maWc6dGhpcy5RYixzZXJ2ZXJJZDp0aGlzLnZoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5uYyx2cGFpZDp0aGlzLkRjLHNraXBBbGxvd2VkOnRoaXMuQWgsdm1hcHM6dGhpcy5XaH19LEVzOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLiRhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuJGFbYl0mJjE9PXRoaXMuJGFbYl0mJihhPSEwKTtyZXR1cm4gYX0sWGU6ZnVuY3Rpb24oYSl7dGhpcy4kYVthXT0hMH0sZHM6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuJGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy4kYVtiXSYmCjE9PXRoaXMuJGFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sRGQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMudWIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5NcChhKX0sd2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLGU9IiIsaD0iIixrPSIiO2lmKCF0aGlzLnNhJiYhYilyZXR1cm4gbmV3IHgoYSk7Yz10aGlzLnhlKGEpO2U9dGhpcy56YShhKTtjPwoodGhpcy52YygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy52ZCgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLmhjfHx0aGlzLmtifHx0aGlzLmdjfHx0aGlzLlhkKSYmKGs9dGhpcy5udShrKSk7YT1uZXcgeChoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmZzKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLm5iKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0seGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsKKGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy52YygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sdmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQWEmJnRoaXMuQWEubGVuZ3RoJiYwPHRoaXMuQWEubGVuZ3RoJiYoYj10aGlzLkFhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LHllOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMueGUoYSk7cmV0dXJuIGJ9LGZzOmZ1bmN0aW9uKGEpe3ZhciBiPQoiIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuR2EmJjA8dGhpcy5HYS5sZW5ndGgpcmV0dXJuIHRoaXMuR2E7Zm9yKGQgaW4gdGhpcy5HYSlpZihiPXRoaXMuR2FbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5nejtyZXR1cm4ibm9uZSJ9LGxkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQWFbdGhpcy52aF19LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZCgpLGI9dGhpcy56aCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxhaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spOwpyZXR1cm4gYn0sbXU6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLnphKGEpLGM9IiIsYz0iIixoO2ZvcihoIGluIGIpe2lmKGJbaF0uc3VidmFsdWVzKXtmb3IodmFyIEI9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbaF0pLnNwbGl0KCImIiksYz17fSxrPTA7azxCLmxlbmd0aDtrKyspe3ZhciByPUJba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5haChjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pO0I9W107Zm9yKGwgaW4gYylCLnB1c2gobCsiPSIrY1tsXSk7Yz1CPWVuY29kZVVSSUNvbXBvbmVudChCLmpvaW4oIiYiKSl9ZWxzZSBjPXRoaXMuYWgoZC5xdWVyeUtleVtoXSxoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31sPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbC5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxudTpmdW5jdGlvbihhKXt0aGlzLmhjJiYKKGErPXRoaXMuaGMpO2lmKHRoaXMua2IpZm9yKHZhciBiIGluIHRoaXMua2IpdGhpcy5rYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5rYltiXSkpO3RoaXMuZ2MmJihhPXRoaXMubXUoYSx0aGlzLmdjKSk7cmV0dXJuIGF9LGY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLlJnPSEwO3RoaXMuaGQ9YTt0aGlzLkNhPWI7dGhpcy5TZT1kO3RoaXMuR2Q9Yzt0aGlzLmxjPWU7dGhpcy5RYj1ofHx7fTt0aGlzLlp0KCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkNhKXRoaXMuWHQoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuQ2EpdHJ5e3RoaXMuQ2E9YigpLHRoaXMuV2MoKX1jYXRjaChrKXt0aGlzLm5hKCJub0NsaWVudENvbmZpZyIpfX0sZmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwKITEpfXJldHVybiBifSxadDpmdW5jdGlvbigpe3RoaXMuSGEobmV3IHgodGhpcy5oZCt0aGlzLk9jKCJnbG9iYWwiKSksdGhpcy53cy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLldjKCl9LmJpbmQodGhpcyksITApfSxYdDpmdW5jdGlvbigpe25ldyB4KHRoaXMuQ2ErdGhpcy5PYygiY2xpZW50IikpO3RoaXMuSGEobmV3IHgodGhpcy5DYSt0aGlzLk9jKCJjbGllbnQiKSksdGhpcy5XYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiY2xpZW50Iik7dGhpcy5uYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sT2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMudWIoKTt0aGlzLlFiJiZ0aGlzLlFiLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5RYiYmdGhpcy5RYi5ub0NhY2hlQnVzdGVyJiYKKGI9IiIpO3JldHVybiBifSxuYTpmdW5jdGlvbihhKXtpZighdGhpcy5ZZCl7dGhpcy5ZZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLmZkKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5sYz0hMSk7dGhpcy5sYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmxjP3RoaXMubGMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuYmE9dGhpcy5OZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy52ZikpO3RoaXMuemIoKTtlLm9jKGsucHYpOyhiPWUuZmQodGhpcy5sZCgpKSl8fChiPWUuZmQoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHdzOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXt2YXIgYj0Ke307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5WYihiLmVuYWJsZWQpO3RoaXMuYmE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5DYXx8dGhpcy5SYnx8dGhpcy5HYXx8dGhpcy5XYygpOih0aGlzLnNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKSx0aGlzLnpiKCkpfX0sV2M6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5DYX1lbHNlIGE9dGhpcy5DYTt0aGlzLmlzRW5hYmxlZD10aGlzLlZiKGEuZW5hYmxlZCk7dGhpcy5iYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5BYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuQWEubGVuZ3RoO2IrKyl0aGlzLkFhW2JdPQp0aGlzLkFhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLlJiPWEuY29uZmlnfHwiIjt0aGlzLkdhPWEuYWxpYXN8fG51bGw7dGhpcy5FZz1hLmFkcGF0aHx8IiI7dGhpcy5nZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLnZoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLkFhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuUmImJnRoaXMuR2EmJnRoaXMuQWEubGVuZ3RoP3RoaXMub2QoITEpOih0aGlzLnNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKSx0aGlzLnpiKCkpfSxvZDpmdW5jdGlvbihhKXtpZighdGhpcy5iYSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHgodGhpcy52ZCgpKSxkPXRoaXMuemEodGhpcy5SYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjsKYi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHgodGhpcy5SYit0aGlzLk9jKCJjdXN0b21lciIpKTt0aGlzLkhhKGIsdGhpcy5Ndy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiY3VzdG9tZXIiKTthP3RoaXMuSW0/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5JbT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2QoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMub2QoITApfS5iaW5kKHRoaXMpLCEwKX19LE13OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fXRoaXMuRmQ9dGhpcy5WYihiLnN0cmljdCk7dGhpcy5tZj10aGlzLlZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLmhnPQpiLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMubmM9dGhpcy5WYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuVmIoYi5lbmFibGVkKTt0aGlzLlRiPWIudGVzdGhpZGV8fCIiO3RoaXMueGI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLlViPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuaGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5rYj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5nYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuWGQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVmc9Yi5qc3BvcHVwc3x8ITE7dGhpcy53Yj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5EYz1iLnZwYWlkfHwhMTt0aGlzLlFiLnZwYWlkPXRoaXMuRGM7dGhpcy5BaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLlRjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5XaD1iLnZtYXBzfHwiIjt0aGlzLlNiPWIudGVzdDNyZHBhcnR5Y29va2llJiYKYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLm9zKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5nZSYmKHRoaXMuU2I9bnVsbCk7dGhpcy5oZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnJlJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5yZT0hMCx0aGlzLm9kKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmt4KCkmJih0aGlzLlRifHx0aGlzLlVifHx0aGlzLnhifHx0aGlzLlNiKT90aGlzLlNlPyh0aGlzLnNhPXRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKSx0aGlzLmFlKCksdGhpcy56YigpKTp0aGlzLlF3KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuUncoKSl9fSxRdzpmdW5jdGlvbigpe3RoaXMuUHcoKTt0aGlzLlN3KCl9LFN3OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciKwphKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Mud2lkdGg9MTtjLmhlaWdodD0xO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7Yy5zcmM9ImFib3V0OmJsYW5rIjt2YXIgaD1lLmdhKDEwKSxCPWUuZ2EoMTApLGs9ZS5nYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoayxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwKIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKTtjLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShrKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShCKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS5uYihhKGgpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGwpe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYyk7aWYoMyE9ZCl7dmFyIGE9ZS5mZSgpOyFhLmlzQ2hyb21lJiYKIWEuaXNGaXJlZm94fHxhLmlzRWRnZXx8ZS5QYSgpfHx0aGlzLm5hKCJjc3BfIitiKTtlLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxSdzpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKTt0aGlzLnpiKCl9LEVkOmZ1bmN0aW9uKGEpe3RoaXMuSGM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9dGhpcy5zYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIoYSkpLHRoaXMuemIoKSx0aGlzLmFlKCkpfSxQdzpmdW5jdGlvbigpe2lmKHRoaXMuVGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuVGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5UYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTsKZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGMpe31hP3RoaXMuRWQodGhpcy5GYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuSWgoKX1lbHNlIHRoaXMuSWgoKX0sSGg6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMudWIoKSk7dGhpcy5WdyhmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuZGYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkVkKHRoaXMuRmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnhiPW51bGwsdGhpcy5kZigpfSxWdzpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmCmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSGEobmV3IHgoYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LEloOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLnViKCkpO3RoaXMuV3coZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLkhoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5FZCh0aGlzLkZjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlViJiZ0aGlzLlViLmxlbmd0aCl7dmFyIGM9dGhpcy5VYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLkhoKCl9LFd3OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmCmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpO2wuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0sZGY6ZnVuY3Rpb24oKXt0aGlzLlNiPyh0aGlzLmdmKyssdGhpcy5IYShuZXcgeCh0aGlzLlNiKSx0aGlzLk93LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuRmgoKX0sZWY6ZnVuY3Rpb24oYSl7dGhpcy5FZCh0aGlzLndmLAoibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LE93OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLmdmP3RoaXMuZGYoKTp0aGlzLmVmKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5GaCgpOnRoaXMuZWYoIkFBQSIpfSxGaDpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKTt0aGlzLnpiKCk7dGhpcy5hZSgpfSx6YjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5QYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLkhjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy54ZikpOwp0aGlzLkdkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuR2QmJnRoaXMuR2QoKX0sb3E6ZnVuY3Rpb24oKXtpZih0aGlzLm1mJiZ0aGlzLkVzKCkpe3ZhciBhPXRoaXMuZHMoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LEtoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSGE6ZnVuY3Rpb24oYSxiLGMsZixoLEIpe3RoaXMua2R8fCh0aGlzLmtkPTApO3RoaXMua2QrKzt0aGlzLmtkPnRoaXMuRmcmJiF0aGlzLkdnJiYodGhpcy5HZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuRmcsITApKTthPW5ldyB0YihhLGIsYyk7ZiYmKGEuYWk9ITApO2gmJmUueXQoKSYmKGEucGc9ITApO0ImJgooYS5FaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxUZjpmdW5jdGlvbigpe2UuUGEoKXx8ZS5UYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7dGhpcy5uYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy52YygpfHwKKGE9dGhpcy56YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMubmEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubmEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LE53OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLldofSxucTpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkhhKGEsdGhpcy5YeC5iaW5kKHRoaXMpLHRoaXMuV3guYmluZCh0aGlzKSl9LFh4OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5HcigpfSxXeDpmdW5jdGlvbigpe30sR3I6ZnVuY3Rpb24oKXtlLm9jKGsuRnIpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMubmEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAphZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLndiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMud2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy53YlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5UYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9bmV3IFI7d2luZG93W2MudWMoKV09dGhpcztlLlRhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LGt4OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuaGZ9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSx1YjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqCk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LFZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LG5iOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGYsZSxoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxmPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSx6aDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCx0PTMyODUzNzc1MjAscCxuLHYsdSx3O3A9YS5sZW5ndGg7dmFyIHg9W107Zm9yKGY9MDtmPHAtMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseC5wdXNoKGUpOwpzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHgucHVzaChmKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gocD4+PjI5KTt4LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT14W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7cD1sO249bTt2PXE7dT10O2ZvcihmPTA7MTk+PWY7ZisrKXc9YyhlLDUpKyhwJm58fnAmdikrdStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztmb3IoZj0yMDszOT49ZjtmKyspdz1jKGUsNSkrKHBebl52KSt1K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9dix2PW4sbj1jKHAsMzApLHA9ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhwJm58cCZ2fG4mdikrdStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXYsdj1uLG49YyhwLDMwKSxwPWUsZT13O2ZvcihmPTYwOzc5Pj1mO2YrKyl3PWMoZSw1KSsocF5uXnYpK3UraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK24mNDI5NDk2NzI5NTtxPXErdiY0Mjk0OTY3Mjk1O3Q9dCt1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYih0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIHViPWMudmt8fHViLGw9bmV3IHViO3dpbmRvdy5yZz1sO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybD10aGlzLmFbMTBdO3RoaXMuSHY9dGhpcy5hWzhdO3RoaXMua2w9dGhpcy5hWzZdO3RoaXMuUGs9dGhpcy5hWzhdO3RoaXMuUGk9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzddO3RoaXMuRHg9dGhpcy5hWzddO3RoaXMuWm89dGhpcy5hWzldO3RoaXMuSWw9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbMl19Yy5TdT1iO2IucHJvdG90eXBlPXtxbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucmw6dGhpcy5HdihhKX0sR3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkh2OnRoaXMuamwoYSl9LGpsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbDp0aGlzLk9rKGEpfSxPazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGs6dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlBpOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuS2k6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhxOnRoaXMuQ3goYSl9LEN4OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5EeDp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWm86dGhpcy5IbChhKX0sSGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgdmI9Yy5TdXx8dmIsdWQ9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9dWQucWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLlA/dGhpcy5WYT1hLm0uUCgpOnRoaXMuVmE9IiI7YS5tLkxnJiZhLm0uTGcoe3BhdXNlOnRoaXMucmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy50aC5iaW5kKHRoaXMpLAptdXRlOnRoaXMuSWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5KeC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmFiO3RoaXMucGxheWVyPXRoaXMuYi5tO3RoaXMuRmI9dGhpcy5SYz0hMTt0aGlzLktwPTFFMzt0aGlzLmphPW51bGw7dGhpcy5UPWI7dGhpcy51YT17fTt0aGlzLnZpZGVvPXt9O3RoaXMuQ2Q9e307dGhpcy5YcD1lLmdhKDEwKTt0aGlzLmFmPTA7dGhpcy5QYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLlBjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5tKSYmdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLlBjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLktvPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuQmQ9ITE7dGhpcy5ZZz1jJiZjLm1heFdyYXBwZXJEZXB0aD8KcGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuZz17fTt0aGlzLk5jPSExO3RoaXMuTmg9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5LYj0hMTt0aGlzLkRxPWUuZ2EoMTApO3RoaXMuTmI9ZS5nYSgxMCk7dGhpcy5NYj1lLmdhKDEwKTt0aGlzLkJoPWUuZ2EoMTApO3RoaXMuY29uZj17fTt0aGlzLm1jPXRoaXMudGI9ITE7dGhpcy5qZT1udWxsO3RoaXMuSmQ9dGhpcy5BYj10aGlzLnRlPXRoaXMuUGU9dGhpcy5iZT10aGlzLiRjPXRoaXMuY2Y9dGhpcy5aYj10aGlzLkxkPXRoaXMuaGg9dGhpcy5jZD10aGlzLnF4PXRoaXMuaWI9ITE7dGhpcy5jYz1bXTt0aGlzLldiPXt9O3RoaXMuamY9ITF9Yy5waz1iO2IucHJvdG90eXBlPXt3aDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlZhXSYmdGhpcy5jb25mW3RoaXMuVmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5WYV1bYV0pOwpyZXR1cm4gYn0sTGg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuT2EmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuVC5IYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLncoay56byx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpfSxDZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5pYj1jO2lmKHRoaXMuVC5iYSl0aGlzLmFmKyssdGhpcy5ULm9xKCksdGhpcy5ULnNhJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLkxoKCksbmV3IFUodGhpcyxhLHRoaXMuWWcse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5EYyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5tLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLm0uZ2V0Q3VycmVudFRpbWUoKX19KSk6CmI/KHRoaXMuTGgoKSxuZXcgVSh0aGlzLGEsdGhpcy5ZZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuVC5EYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLm0uZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIubS5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLkxhKCk7ZWxzZXt2YXIgZj10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkNlKGEsYixjKX0sNTApfX0sTmU6ZnVuY3Rpb24oYSl7dGhpcy5KZD10aGlzLkFiPXRoaXMuY2Q9ITE7dGhpcy5nPWE7dGhpcy53dyh0aGlzLmcpO3RoaXMuQmcoYSk7dGhpcy5jYz10aGlzLnNnKGEpO3RoaXMuV2I9e307dGhpcy5qZj0hMX0sQmc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuQ2Q9dGhpcy5ycyhhKSksdGhpcy5CZyhhLnBhcmVudCkpfSxzZzpmdW5jdGlvbihhKXt2YXIgYz0KW107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLnNnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuWnIoYSkpKTtyZXR1cm4gY30sWnI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlgmJmEuWC5nZXRBdHRyaWJ1dGUpe2I9YS5YLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LHJzOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5YKXtiPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWC5nZXRBdHRyaWJ1dGUoImlkIikmJgooaD1hLlguZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5YLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlguZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5iYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmh9fSxyYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuYWQmJmEuYWQuZXJyb3ImJmEuYWQuZXJyb3IuY29kZSYmKGI9YS5hZC5lcnJvci5jb2RlKSk7CnN3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5FYy5jb2RlOmI9PUQuTmQuY29kZT9lLncoay51eSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpOihlLkRlKCksYj09RC5BZi5jb2RlJiZlLncoay5ydSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKTtlLncoay5Fcix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHcueWYuY29kZTplLncoay5ZeCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHcuQmYuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLncoay5BeSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB3Lk9kLmNvZGU6ZS53KGsuRnksCnRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5NZC5jb2RlOmUudyhrLnN1LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMubWN8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3IudGEmJihjKz0iXyIrYS5lcnJvci50YSk7ZS50cmFjayhjLCIiLCEwKTt0aGlzLkdiKGEpO3RoaXMuTGEoKX0sR2I6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkthLmxlbmd0aDspdHJ5e3ZhciBjPQphLkthLnBvcCgpO3RoaXMuQmUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHd3OmZ1bmN0aW9uKGEpe3RoaXMuYmU9dGhpcy50ZT10aGlzLlBlPSExO3RoaXMudWE9dGhpcy5iLkw7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMudWEuekluZGV4PWI7Yj10aGlzLmIuSDtiLkJ6PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgYyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShjKSYmYi5zZXRBdHRyaWJ1dGUoYyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtjXSk7CnRoaXMuS28mJnRoaXMucGxheWVyLnFjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5xYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5VLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLlVbY10udHlwZSkmJnRoaXMuR28oYixhLlVbY10udXJsKyIiLGEuVVtjXS50eXBlKTt0aGlzLkpoKGIpPyh0aGlzLklvKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuamE9dGhpcy51YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuamEuYXBwZW5kQ2hpbGQoYikpOnRoaXMuZy55cSgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5qYT10aGlzLnVhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5qYS5hcHBlbmRDaGlsZChiKSx0aGlzLnV3KCkpOnRoaXMud2UoKT90aGlzLnloKCk6dGhpcy5nLm9yaWdpbi5pZyh3Lk1kKX0sdXc6ZnVuY3Rpb24oKXt0aGlzLlpiPXRoaXMuTGQ9ITE7dGhpcy5iLm0ua2EmJnRoaXMuYi5tLmthKCkmJihlLncoay4kZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMuWmI9ITApO2UuWWYoKTt0aGlzLmcmJnRoaXMuZy5vcmlnaW4mJnRoaXMuZy5vcmlnaW4uc2YmJmUuSm8odGhpcy5nLm9yaWdpbi5zZik7ZS5ZYSgic2V0VXBWcGFpZCIpO3ZhciBhPXRoaXMuYi5IO3RoaXMuYi5IPUMucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuSCwKYSk7dGhpcy5iLmloKCk7dGhpcy5iLkFjKCk7Zm9yKGE9dGhpcy5iLkw7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5BYygpO3RoaXMuamE9dGhpcy51YT10aGlzLmIuTDt0aGlzLm9mKCJ2cGFpZCIpO3RoaXMuWmImJihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1iKS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsucGQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk7dGhpcy5PPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5PLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5MLmFwcGVuZENoaWxkKHRoaXMuTyk7dGhpcy5PLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5tLmthJiZ0aGlzLmIubS5rYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5nLnRzKCksYz10aGlzLmcuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLndpZHRoKSwKaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLAoxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmVxKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5UKTt0aGlzLk8uc3JjPWE7ZS5WZCgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLkpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmNjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOwoiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLml5KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuankoKSx0aGlzLmIuSmIoITApLCF0aGlzLkFiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkFiPXtlbDp0aGlzLk8sY2I6ZnVuY3Rpb24oKXt0aGlzLkpkPSEwO2UudyhrLlZoLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLnZlKHRoaXMuQWIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmCih0aGlzLmIuSmIoITApLHRoaXMubnkoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLkpiKCEwKSx0aGlzLnJ5KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnB5KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnF5KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuc3koKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMub3koKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuWGgoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGg9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmcuamMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsuWmYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXt2YXIgYT0Kd2luZG93Lm9wZW4oIiIsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGIpe3dpbmRvdy5vcGVuKGgsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLm15KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5VZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt5KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLmx5KCk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5aYj0hMCxiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsucGQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk6KHRoaXMuWmI9ITEsYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay5sZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKSxlLncoay5VZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX19LmJpbmQodGhpcykpO2UuVmQoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuTGEoKX0uYmluZCh0aGlzKSk7ZS5WZCgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5EbyhmdW5jdGlvbihhKXtlLm9hKHRoaXMuTywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LApreTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMudHJhY2soInBhdXNlIik7ZS53KGsuU2QsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLkxkPSEwfSxseTpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuTWMsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLkxkPSExfSxueTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLkxmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LG15OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLktmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LApqeTpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLllhKCJpbXByZXNzaW9uIik7ZS53KGsuR2YsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0scnk6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuWWEoInN0YXJ0Iik7ZS53KGsuTWMsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0scHk6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLkVmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LHF5OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLllhKCJtaWRwb2ludCIpO2UudyhrLklmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSl9LHN5OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5NZix0aGlzLmcuQiwKdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0sb3k6ZnVuY3Rpb24oKXt0aGlzLkhkKCk7ZS5ZYSgiY29tcGxldGUiKX0sWGg6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5ZYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuY2E9ITE7dGhpcy5MYShhKX19LGl5OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2csZj1bXTshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csKGY9Yi5tYXRjaChjKSk/Zi5qb2luJiYoYj1mLmpvaW4oIi0iKSk6Yj1iLnN1YnN0cmluZygwLDIwKSk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIiwKYiwhMCk7ZS5ZYSgiZXJyIixiKTtlLncoay50eSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMuWGgoITApfSxHbzpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpLGY7Zj10aGlzLlQ7Zi5zYSYmZi5pc0VuYWJsZWQmJiFmLnZjKCk/KGY9Zi56YShiKSxmPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpmPWI7Yy5zcmM9ZjtjLm9uZXJyb3I9dGhpcy4keC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sSW86ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuVWguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5wZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucWYuYmluZCh0aGlzKSk7CmEuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuSGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5JZC5iaW5kKHRoaXMpKX0sd2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuVWguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5wZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5IZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLklkLmJpbmQodGhpcykpfSxVaDpmdW5jdGlvbihhKXt0aGlzLkZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmJ8fHRoaXMucGYoYSl9LmJpbmQodGhpcyksdGhpcy5LcCkpfSxwZjpmdW5jdGlvbihhKXtpZighdGhpcy5SYyYmCnRoaXMuSmgodGhpcy52aWRlbykmJiF0aGlzLnRiJiYhdGhpcy5GYil7dGhpcy5SYz0hMDt0cnl7aWYoIWUuUGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMudGJ8fCh0aGlzLnRiPSEwLHRoaXMud2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5ULmhnfHx0aGlzLlQubmEoInZpZGVvLW5vb3AiKSk7dGhpcy5MYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLlp4KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIuQWMoKTt0aGlzLlNoKCk7dGhpcy5vZigpO3RoaXMuUWYoKTt0aGlzLmIuaWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuYmYoKX19LGJmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT0KdGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuT2EpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuamQ9W107Zm9yKHZhciBiPXRoaXMuYi5MLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmpkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuTGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuTGMoKX1lbHNlIHRoaXMuTGMoKX0sTGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5qZClmb3IodmFyIGI9MDtiPHRoaXMuamQubGVuZ3RoO2IrKyl0aGlzLmpkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLiRjfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksCnRoaXMuTGEoKSxlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsYiwhMCkpOih0aGlzLkllKCEwKSx0aGlzLkxjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLnRlJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5QZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLk9iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuT2IuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuT2IuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLk5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5iZigpKX0uYmluZCh0aGlzKTt0aGlzLm1lKCkueGgodGhpcyl9LEhkOmZ1bmN0aW9uKCl7dGhpcy5ULm5jJiYhdGhpcy50YiYmZS50cmFjaygicXVhcnRpbGUiLAoiY29tcGxldGUiLCEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLndvLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy5MYSgpfSxMYTpmdW5jdGlvbihhKXtpZighdGhpcy5iZSlpZih0aGlzLmJlPSEwLHRoaXMuSmR8fChlLncoay53dSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5oYnx8dGhpcy5nLmFjKXt0aGlzLmFmKys7dGhpcy5GYj10aGlzLlJjPSExO3RyeXt0aGlzLndkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudWEucmVtb3ZlQ2hpbGQodGhpcy5qYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5CZD0hMTt0cnl7dGhpcy5iLlBoKCl9Y2F0Y2goaCl7fXRoaXMuY2Y9ITA7dGhpcy5iLnBlKCk7dGhpcy5LYj0KITE7dGhpcy5tZSgpLnNoKCk7dGhpcy5nLmhiJiZ0aGlzLmcub3JpZ2luLkplKCk7dGhpcy5nLmFjJiYoYT90aGlzLmcub3JpZ2luLmJoKCk6dGhpcy5jZSgpKX1lbHNlIHRoaXMuY2UoKX0sJHg6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy53ZCh0aGlzLnZpZGVvKSx0aGlzLndlKCk/dGhpcy55aCgpOnRoaXMuSWQoYSkpfSxJZDpmdW5jdGlvbihhKXt0aGlzLkZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLndlKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1jfHx0aGlzLlQuVGYoKX0uYmluZCh0aGlzKSwKMUUzKTp0aGlzLlQuVGYoKSk7dGhpcy5nLm9yaWdpbi5pZyh3Lk1kKX0scWY6ZnVuY3Rpb24oKXtpZih0aGlzLnF4KXRoaXMuTGEoKTtlbHNle3RoaXMuS2I9ITA7dGhpcy5iLm0uVWEmJiF0aGlzLmNmJiZ0aGlzLmIubS5VYSgpJiZlLncoay5ZYyx0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy54eChhKTtpZighdGhpcy5BYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkFiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5KZD0hMDtlLncoay5WaCx0aGlzLmcuQiwKdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UudmUodGhpcy5BYil9Yz0iIjt0aGlzLmcuJGUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmgpKSYmKGM9dGhpcy5nLiRlLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkJkfHwodGhpcy5CZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5LZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMuZy5oYj8odGhpcy5GYj10aGlzLlJjPSExLHRoaXMud2QodGhpcy52aWRlbyksdGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnVhLnJlbW92ZUNoaWxkKHRoaXMuamEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuQmQ9ITEsdGhpcy5iLlBoKCksdGhpcy5nLm9yaWdpbi5KZSgpKTp0aGlzLkxhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlBjLnJlcGxhY2UoIlt0aW1lXSIsZS5xZyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLk5jPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSx5aDpmdW5jdGlvbigpe3RoaXMubWM9ITA7dGhpcy51YT10aGlzLmIuTDt0aGlzLnVhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy51YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTsKYS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMubXMoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmphPXRoaXMudWEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLkFjKCk7dGhpcy52aWRlbz10aGlzLmphLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy51YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudWEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlRoLmJpbmQodGhpcyk7dGhpcy5qYS5hcHBlbmRDaGlsZChiKTt0aGlzLlNoKCk7dGhpcy5vZigpO3RoaXMuamU9c2V0SW50ZXJ2YWwodGhpcy5tcS5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LG1zOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpbXSxiPXt9LGM9MDtjPHRoaXMuZy5VLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlVbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuVDtoLnNhJiZoLmlzRW5hYmxlZCYmIWgudmMoKSYmKGU9aC56YShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LG1xOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5qZSksdGhpcy5IZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnFmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLmplKSx0aGlzLklkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6CnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LE1oOmZ1bmN0aW9uKCl7dGhpcy5oaHx8KHRoaXMuaGg9ITAsdGhpcy5jZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh4OmZ1bmN0aW9uKGEpe2UudyhrLlVkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7YT09dGhpcy5OaHx8dGhpcy50Ynx8KDA9PWEmJih0aGlzLmliJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmliKSx0aGlzLmliPSExKSx0aGlzLlBlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLnRlPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLk1oKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpKSwKdGhpcy5tYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMudGJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlBhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLncoay5HZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLGUudyhrLkxmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksdGhpcy5tYyYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5ULm5jJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5jZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLkVmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5uYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS53KGsuSWYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuVC5uYyYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudyhrLk1mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpLHRoaXMuTmg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMudGIpe3RyeXtpZih0aGlzLldiW2FdPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuV2IuaW1wcmVzc2lvbiYmdGhpcy5XYi5jb21wbGV0ZSYmIXRoaXMuamYpe3RoaXMuamY9ITA7dmFyIGM9dGhpcy5XYi5jb21wbGV0ZS0KdGhpcy5XYi5pbXByZXNzaW9uLGY9InN0YXRzX2hkX3RpbWVkaWZmIjt0aGlzLk8mJihmKz0idnBhaWQiKTs1RTM+YyYmZS50cmFjayhmLGMsITApfX1jYXRjaChoKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWM9W107dHJ5e2M9dGhpcy5zcyh0aGlzLmcuS2EsYSl9Y2F0Y2gobCl7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIG09Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuQ2QuaW1wcmVzc2lvbnMmJmUud3QobS51cmwsdGhpcy5DZC5pbXByZXNzaW9ucyk/dGhpcy5CZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS53KGsueW8sdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHthZElkOnRoaXMuQ2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LAp0aGlzLkQoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5CZShtLnVybCxtLnR5cGUpfWNhdGNoKHIpe31pZighYil0cnl7dGhpcy5nLkthPXRoaXMuSHEodGhpcy5nLkthLGEpfWNhdGNoKG4pe319fSxCZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQud2EoYSksYyYmYS5GbyhjKSxmfHwoZj10aGlzLmdnKSx0aGlzLlQuSGEoYSxmLHRoaXMuZ2csITEsITApKX0sc3M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxIcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxaeDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5UaC5iaW5kKHRoaXMpfSxUaDpmdW5jdGlvbigpe2UudyhrLlpmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5jZCYmZS5QYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS4kcigpLCEwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXt2YXIgYT13aW5kb3cub3BlbigiIix0aGlzLlQuc2E/Il90b3AiOiJfYmxhbmsiKTthLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7YS5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuZy5qY31jYXRjaChiKXt3aW5kb3cub3Blbih0aGlzLmcuamMsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9LFNoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0KImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlBjLnJlcGxhY2UoIlt0aW1lXSIsZS5xZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5ULlRjJiYoYj10aGlzLlQuVGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuamEuYXBwZW5kQ2hpbGQoYSl9fSxyYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8CnRoaXMuVC5UYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0seWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuVC5UYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlkPXRoaXMuRHE7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209CiIwcHgiKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnpkKCk7dGhpcy55ZCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLnJjKCl9LmJpbmQodGhpcykpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLk5iO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudXguYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMudHguYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy56ZCgpO3RoaXMueWQoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5yYygpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTWI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnN4LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLnJ4LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuemQoKTt0aGlzLnlkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMucmMoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGguc3R5bGUucG9zaXRpb249ImFic29sdXRlIixoLnN0eWxlLnRvcD0iLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuQmg7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7Yi5hcHBlbmRDaGlsZChjKTt0aGlzLmcuJGUmJmIuYXBwZW5kQ2hpbGQoaCk7Yi5hcHBlbmRDaGlsZChmKTtiLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuamEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuemQoKTt0aGlzLnlkKCl9LmJpbmQodGhpcykpO3RoaXMuamEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMucmMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmphLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmthJiZ0aGlzLmIubS5rYSgpJiYoZS53KGsuJGYsdGhpcy5nLkIsCnRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksdGhpcy5JZSgpKTt0aGlzLnNjKCl9fSxzYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHpkOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayJ9LHR4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5iLkgucGF1c2VkPyh0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLk1jLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpOih0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuU2QsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LHV4OmZ1bmN0aW9uKCl7dGhpcy5MZD9lLm9hKHRoaXMuTywKImNvbnRyb2wiLCJwbGF5Iik6ZS5vYSh0aGlzLk8sImNvbnRyb2wiLCJwYXVzZSIpfSxyZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMuYi5ILnBhdXNlZHx8KHRoaXMuYi5ILnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5TZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sdGg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLmIuSC5wYXVzZWQmJih0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLk1jLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpfSxyeDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYi5ILm11dGVkPwoodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay5sZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKToodGhpcy5iLkgubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsucGQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LHN4OmZ1bmN0aW9uKCl7dGhpcy5aYj9lLm9hKHRoaXMuTywiY29udHJvbCIsInVubXV0ZSIpOmUub2EodGhpcy5PLCJjb250cm9sIiwibXV0ZSIpfSxJZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYi5ILm11dGVkfHwodGhpcy5iLkgubXV0ZWQ9ITAsCmEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudyhrLnBkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpfSxKeDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYi5ILm11dGVkJiYodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5sZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sT2I6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5PYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5PYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLAp0aGlzLk9iKTt0aGlzLiRjfHx0aGlzLk5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5iZigpKX0sY2U6ZnVuY3Rpb24oKXt0aGlzLiRjPSEwO3RoaXMuaWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuaWIpLHRoaXMuaWI9ITEpO2lmKCgicHJlcm9sbCI9PWUuT2EmJnRoaXMuTmN8fCJwb3N0cm9sbCI9PWUuT2EpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuT2EpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2Zvcih2YXIgYj10aGlzLmIuTDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLkFjKCk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLAoiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLmVlKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuZWUoKX1lbHNlIHRoaXMuZWUoKX0sZWU6ZnVuY3Rpb24oKXt0aGlzLmNmPSEwO3RoaXMuYi5wZSgpO3RoaXMuYi5idygpO3RoaXMuS2I9ITE7ZS53KGsuQ3EsCnRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy5tZSgpLnNoKCl9LG1lOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5tJiYoYT10aGlzLmIubSk7cmV0dXJuIGF9LHdlOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJihhPSEwKX1yZXR1cm4gYX0sUWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkVhKCJtaW5WaXMiKTthJiYoZS51ZSh0aGlzLnZpZGVvLGEpP3RoaXMudGgoKTp0aGlzLnJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFmKCl9LmJpbmQodGhpcyksCjEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5nJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5nLmpjLGEuZHVyYXRpb249dGhpcy5nLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5nLmhiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuY2MmJjA8dGhpcy5jYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuY2MpKTtyZXR1cm4gYX0sRDpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuWHArIi0iK3RoaXMuYWY7dGhpcy5nJiZ0aGlzLmcud2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5nLndnKCkpO3JldHVybiBhfSxnZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFA9Yy5wa3x8UDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5QdD10aGlzLmFbMl07dGhpcy5jbD0KdGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzJdO3RoaXMuS2o9dGhpcy5hWzddO3RoaXMuVm89dGhpcy5hWzFdO3RoaXMubGo9dGhpcy5hWzddO3RoaXMuZ3Y9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNF19Yy5WcT1iO2IucHJvdG90eXBlPXtPdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUHQ6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNsOnRoaXMuT20oYSl9LE9tOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5QbTp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS2o6dGhpcy5VbyhhKX0sVW86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbzp0aGlzLmtqKGEpfSxrajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubGo6dGhpcy5mdihhKX0sZnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmd2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgd2I9CmMuVnF8fHdiLHZkPW5ldyB3YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXZkLk90KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuQmE9bnVsbDt0aGlzLlo9W107dGhpcy5YPW51bGw7dGhpcy5iYz10aGlzLmRjPSExO3RoaXMuc2Y9IiI7dGhpcy5yZj0hMTtkJiZkLmVtcHR5P3RoaXMuYnUoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy55bj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5mZSgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPQpiLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeCh0aGlzLnVybCk6bC53YShsLkRkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuUGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUuYmcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwKImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuRGQoYSkpKyImdHlwZT1qcyIsYj1sLndhKGwuRGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwud2EobC5EZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkhhKGIsdGhpcy5hdS5iaW5kKHRoaXMpLHRoaXMuWXQuYmluZCh0aGlzKSl9LHRnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5CYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5CYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuT2EpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuQmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLk9hfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5PYXx8dGhpcy5BdChhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5OdygpKXRyeXt2YXIgZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49ZC5sZW5ndGgmJihkPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2RbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtmW2JdPWcuZmlyc3RDaGlsZDtjLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfWVsc2UgZi5zcGxpY2UoYiwxKX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxBdDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKToKMDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGF1OmZ1bmN0aW9uKGEpe3RoaXMuU3YoYSk7dHJ5e3RoaXMuQmE9YS5yZXNwb25zZVhNTCx0aGlzLkJhfHwodGhpcy5CYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLk1hKHcuT2QpKX10aGlzLlo9dGhpcy50ZygpO3RoaXMuZGM9dGhpcy5mZigpO3RoaXMuYmM9dGhpcy5HaCgpO3RoaXMuWi5sZW5ndGg/dGhpcy54YygpOnRoaXMucmEodGhpcy5NYSh3LkVjLHtlcnJvcjp0aGlzLnJmP0QuTmQ6CkQuemZ9KSl9LGJ1OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkJhfHwodGhpcy5CYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuTWEody5PZCkpfXRoaXMuWj10aGlzLnRnKCk7dGhpcy5kYz10aGlzLmZmKCk7dGhpcy5iYz10aGlzLkdoKCk7dGhpcy5aLmxlbmd0aD90aGlzLnhjKCk6dGhpcy5yYSh0aGlzLk1hKHcuRWMse2Vycm9yOnRoaXMucmY/RC5OZDpELnpmfSkpfSxZdDpmdW5jdGlvbigpe3RoaXMucmEodGhpcy5NYSh3LnlmLHtkZXB0aDphfSkpfSx4YzpmdW5jdGlvbigpe3RoaXMuWD10aGlzLlouc2hpZnQoKTt0aGlzLkN0KCk/dGhpcy5YdygpPyhhKyssbmV3IGIodGhpcyx0aGlzLkNnKCksZyx7QWRTeXN0ZW06dGhpcy5ZcigpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnJhKHRoaXMuTWEody5CZikpOihhPTAsdGhpcy5VeCgpJiZ0aGlzLk5lKHRoaXMuRXEoKSkpfSxKZTpmdW5jdGlvbigpe3RoaXMuZGM/Cih0aGlzLmRjPTE8dGhpcy5aLmxlbmd0aCx0aGlzLloubGVuZ3RoJiZ0aGlzLnhjKCkpOnRoaXMucGFyZW50LkplKCl9LGJoOmZ1bmN0aW9uKCl7dGhpcy5iYz8odGhpcy5iYz0xPHRoaXMuWi5sZW5ndGgsdGhpcy5aLmxlbmd0aCYmdGhpcy54YygpKTp0aGlzLnBhcmVudC5iaCgpfSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlV3KCk/dGhpcy5UdygpPyEwOigtMSE9dGhpcy5wYygpP3RoaXMucmEodGhpcy5NYSh3LnVmKSk6dGhpcy5yYSh0aGlzLk1hKHcubWopKSwhMSk6KHRoaXMucmEodGhpcy5NYSh3LkVjLEQuQWYpKSwhMSl9LE5lOmZ1bmN0aW9uKGEpe2EuS2E9YS5LYS5jb25jYXQodGhpcy5GZSgpKTthLmhiPWEuaGI/YS5oYjp0aGlzLmRjO2EuYWM9YS5hYz9hLmFjOnRoaXMuYmM7dGhpcy5wYXJlbnQuTmUoYSl9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IHhiO2EuZHVyYXRpb249dGhpcy5wYygpO2EuVT10aGlzLnpnKCk7YS5qYz10aGlzLmFzKCk7YS5vcmlnaW49dGhpczsKYS5CPXRoaXMuWHIoKTthLiRlPXRoaXMucXMoYS5kdXJhdGlvbik7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGIpe3RoaXMuWCYmKGIuS2E9Yi5lcnJvci5jb2RlIT13LnVmLmNvZGU/Yi5LYS5jb25jYXQodGhpcy5icygpKTpiLkthLmNvbmNhdCh0aGlzLmtzKCkpKTt0aGlzLloubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuR2ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5HYiYmdGhpcy5wYXJlbnQuR2IoYiksYT0wLHRoaXMueGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShiKSxhPTApfSxHYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5HYihhKX0saWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuTWEoYSxiKSl9LE1hOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHliKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sWHc6ZnVuY3Rpb24oKXtyZXR1cm4gYTwKZ30sVXc6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnpnKCkubGVuZ3RofSxUdzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMucGMoKX0sZmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlouZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxHaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWiYmMjw9dGhpcy5aLmxlbmd0aCYmIXRoaXMuZmYoKSYmKGE9ITApO3JldHVybiBhfSxTdjpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuc2Y9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLnJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LEN0OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5DZygpLmxlbmd0aH0sCkNnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGUodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sWXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZSh0aGlzLlgsIkFkU3lzdGVtIil9LEZlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuT2coYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuYmIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxPZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09CmEubm9kZU5hbWU/ITA6dGhpcy5PZyhhLnBhcmVudE5vZGUpOiExfSxrczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxiczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sYXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYih0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0semc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxTYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLApoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGl6OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmJiKGFbY10pfSk7dHJ5e3ZhciBkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLlNjKS1NYXRoLmFicyg3MDAtYi5TYyl9KSxnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLlNjKS1NYXRoLmFicyg3MDAtYi5TYyl9KSxiPWQuY29uY2F0KGcpfWNhdGNoKGUpe31yZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTsKZm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMuZ2QoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LHBjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuYmIodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxxczpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkd3KGQsCmEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LGxlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5iYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sbmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGJiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuZ2QoYSk6IiJ9LGdkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubmUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVT1jLnlufHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRwPXRoaXMuYVs5XTsKdGhpcy5LbT10aGlzLmFbMV07dGhpcy5PcT10aGlzLmFbM107dGhpcy5VdD10aGlzLmFbOV07dGhpcy5CdT10aGlzLmFbMV07dGhpcy52cT10aGlzLmFbMl07dGhpcy5BbD10aGlzLmFbMTBdO3RoaXMua209dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbNF19Yy5FeD1iO2IucHJvdG90eXBlPXtDcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHA6dGhpcy5KbShhKX0sSm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkttOnRoaXMuTnEoYSl9LE5xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PcTp0aGlzLlR0KGEpfSxUdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXQ6dGhpcy5BdShhKX0sQXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJ1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52cTp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQWw6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5rbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMuRXh8fHpiLHdkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXdkLkNwKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuS2E9W107dGhpcy5VPVtdO3RoaXMuamM9IiI7dGhpcy5CPXRoaXMuYWM9dGhpcy5oYj0hMTt0aGlzLnFlPXRoaXMub3JpZ2luPW51bGx9Yy5wbT1iO2IucHJvdG90eXBlPXt5cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxoczpmdW5jdGlvbigpe2lmKCF0aGlzLnFlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uQmEpe3ZhciBhPXRoaXMub3JpZ2luLkJhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJgowPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnFlPWFbY10pfXJldHVybiB0aGlzLnFlfSx3ZzpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5ocygpO2ImJmIuZ2V0QXR0cmlidXRlJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpO3JldHVybiBhfSx0czpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuVVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIHhiPWMucG18fHhiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNzPXRoaXMuYVs0XTt0aGlzLlJ4PXRoaXMuYVsyXTt0aGlzLlRpPXRoaXMuYVs2XTt0aGlzLmJ4PXRoaXMuYVs0XTt0aGlzLmFsPXRoaXMuYVs2XTt0aGlzLmh4PXRoaXMuYVsxXTt0aGlzLldyPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzddfWMuT249YjtiLnByb3RvdHlwZT17UnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5TczoKdGhpcy5ReChhKX0sUXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJ4OnRoaXMuU2koYSl9LFNpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVGk6dGhpcy5heChhKX0sYXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ieDp0aGlzLiRrKGEpfSwkazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYWw6dGhpcy5neChhKX0sZ3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmh4OnRoaXMuVnIoYSl9LFZyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIEFiPWMuT258fEFiLHhkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXhkLlJzKDQpO3ZhciB3PXtPZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIiwKdGE6IlhNTF9QQVJTRV9FUlJPUiJ9LG1qOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix0YToiRFVSQVRJT05fRVJST1IifSxFYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsdGE6IkVNUFRZX1ZBU1QifSxCZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix0YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0seWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSwKbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLHRhOiJMT0FEX0VSUk9SIn0sTWQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHRhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sWnk6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsCnRhOiJNRURJQUZJTEVfRVJST1IifSx1Zjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIix0YToiRFVNTVlfQUQifX0sRD17emY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIix0YToiTk9fQURTIn0sQWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHRhOiJOT19NRURJQUZJTEVTIn0sYXo6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsdGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxOZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix0YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5wdD10aGlzLmFbMl07dGhpcy5Ubz10aGlzLmFbM107CnRoaXMuSnA9dGhpcy5hWzNdO3RoaXMubXI9dGhpcy5hWzVdO3RoaXMueG09dGhpcy5hWzVdO3RoaXMuQ2w9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbM119Yy5HeT1iO2IucHJvdG90eXBlPXtvdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucHQ6dGhpcy5TbyhhKX0sU286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlRvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5KcDp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXI6dGhpcy53bShhKX0sd206ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnhtOnRoaXMuQmwoYSl9LEJsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5DbDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEJiPWMuR3l8fEJiLHlkPW5ldyBCYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT15ZC5vdCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmFkPWI7dGhpcy5LYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLlBqfHx5YjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5scD10aGlzLmFbNF07dGhpcy54cD10aGlzLmFbNF07dGhpcy5LeT10aGlzLmFbOF07dGhpcy5veD10aGlzLmFbM107dGhpcy56eD10aGlzLmFbNl07dGhpcy5Paj10aGlzLmFbNl07dGhpcy5WbD10aGlzLmFbNV07dGhpcy5qdT10aGlzLmFbNV07dGhpcy5kdz10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs1XX1jLkNqPWI7Yi5wcm90b3R5cGU9e2twOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5scDp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnhwOnRoaXMuSnkoYSl9LEp5OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LeTp0aGlzLm54KGEpfSxueDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm94OnRoaXMueXgoYSl9LHl4OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56eDp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT2o6dGhpcy5VbChhKX0sVWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlZsOnRoaXMuaXUoYSl9LGl1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qdTp0aGlzLmN3KGEpfSxjdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBDYj1jLkNqfHxDYix6ZD1uZXcgQ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT0KemQua3AoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5tPWE7dGhpcy5hYj1hLnVnKCk7dGhpcy5MPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuTC5pZD1lLmdhKDEwKTt0aGlzLkg9Qy5wb3AoKTt0aGlzLkh8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuSC5pZD0iYWRYZGlzcGxheSIsdGhpcy5ILnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5BPXt9O3RoaXMuWmQ9ITE7dGhpcy5sYj1bXX1jLnNqPWI7Yi5wcm90b3R5cGU9e3JnOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LApnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnJnKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5KcyhhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpOwpoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sTHc6ZnVuY3Rpb24oKXt0aGlzLlpkPSEwfSxQaDpmdW5jdGlvbigpe3RoaXMuSD1DLnBvcCgpO3RoaXMuSHx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saWg6ZnVuY3Rpb24oKXt0aGlzLm0ucGF1c2UoKTtlLncoay5ZYyx0aGlzLm0udigpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLlpkfHwodGhpcy5tLnBsYXkoKSxlLncoay5aYyx0aGlzLm0udigpKSl9LEFjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkwuc3R5bGUuekluZGV4PWE7dGhpcy5MLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuTC5zdHlsZS5tYXJnaW5SaWdodD0KImF1dG8iO3RoaXMuTC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuTC5zdHlsZS5ib3hTaXppbmc9dGhpcy5hYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5MLnN0eWxlLndpZHRoPXRoaXMuYWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9dGhpcy5hYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLmFiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuYWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuYWIpO3RoaXMubS5QYiYmdGhpcy5tLlBiKCk/dGhpcy5tLnVnKCkuYXBwZW5kQ2hpbGQodGhpcy5MKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuTCk7d2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sSnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxrZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMua2codGhpcy5hYik7aWYoYi54IT10aGlzLkEueHx8Yi55IT10aGlzLkEueXx8Yi5wb3NpdGlvbiE9dGhpcy5BLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuQS53aWR0aCYmMDx0aGlzLkEuaGVpZ2h0JiYwPT0KYi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMucGUoKTtyZXR1cm59dGhpcy5BPWI7dGhpcy5tLlBiKCk/KHRoaXMuTC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuTC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkwuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkwuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkwuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLkwuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkguc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5sYi5sZW5ndGg7YSsrKXRoaXMubGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5DaCh0aGlzLkwpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMTApfSxEbzpmdW5jdGlvbihhKXt0aGlzLmxifHwodGhpcy5sYj1bXSk7ImZ1bmN0aW9uIj09CnR5cGVvZiBhJiZ0aGlzLmxiLnB1c2goYSl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5MJiZ0aGlzLkwucGFyZW50Tm9kZSYmdGhpcy5MLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuTC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTCk7dGhpcy5IJiZ0aGlzLkgucGF1c2UmJnRoaXMuSC5wYXVzZSgpfX19KShjKTtmb3IodmFyIE89Yy5zanx8TyxDPVtdLERiPTA7MTAwPkRiO0RiKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1lLmdhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgST0hMSxlYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5HcT10aGlzLmFbMTBdO3RoaXMudnY9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMTBdfWMuTnQ9YjtiLnByb3RvdHlwZT17RnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkdxOnRoaXMudXYoYSl9LHV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52djp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEViPWMuTnR8fEViLEFkPW5ldyBFYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUFkLkZxKDQpOyhmdW5jdGlvbihjKXtjLllsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7CmF8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuWmUoYik7dGhpcy5lZygpfSxaZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkZhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxVYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmCmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sbWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSx2OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5GYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIEZiPWMuWWx8fEZiOyhmdW5jdGlvbihjKXtjLlhsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj1mYSgpO3RoaXMuRWI9dGhpcy5FYnx8ITE7dGhpcy5IZj10aGlzLkpmPQp0aGlzLktnPXRoaXMucWE9dGhpcy5rZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLk1yKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5rZj0hMDt0aGlzLktnJiZ0aGlzLlhmKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkucWI7YSYmYS5LYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlVjKCk7dGhpcy5LZz0hMDt0aGlzLlhmKCl9LmJpbmQodGhpcykpOwp0aGlzLlNmKCl9LFhmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWIpe3RoaXMuVWMoKTtpZighdGhpcy5rZiYmIXRoaXMuVWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLmtmJiZ0aGlzLkhmJiYhdGhpcy5KZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCl9LmJpbmQodGhpcyksMTAwKX19LFVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5BZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxBZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxTZjpmdW5jdGlvbigpe2lmKHRoaXMuVWMoKSl7dmFyIGI9CnRoaXMuQWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5KZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLkhmPWIuZnp9dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2YoKX0uYmluZCh0aGlzKSwxMDApfSxqejpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi53eigpOiExfSxwYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IucGMoKTotMX0sbHM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sTXI6ZnVuY3Rpb24oYixhKXt0aGlzLkViPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLkVifHwzMDI9PXRoaXMuRWI/dGhpcy5xYT0hMDp0aGlzLnMoImFkZXJyb3IiLHRoaXMuRWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYygpfS5iaW5kKHRoaXMpLDEwMCl9LFhjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnFhPyh0aGlzLm8oKSx0aGlzLmVhKCkpOmIubWQoKT8odGhpcy5GKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5scyhiKT8odGhpcy5GKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBHYj1jLlhsfHxHYjsoZnVuY3Rpb24oYyl7Yy5abD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LHp0OmZ1bmN0aW9uKCl7d2luZG93Lk9PLnZtLnNvLnFvP3dpbmRvdy5PTy52bS5zby5xby5keihmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuenQoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5OYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgRmIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSihjKXx8KHRoaXMuSyhjKSwobmV3IEdiKGMsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBIYj1jLlpsfHxIYixJYj1uZXcgSGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzNdO3RoaXMuUnk9dGhpcy5hWzEwXTt0aGlzLmNxPXRoaXMuYVsyXTt0aGlzLmw9CnRoaXMuYVsyXX1jLkl2PWI7Yi5wcm90b3R5cGU9e1lwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5acDp0aGlzLlF5KGEpfSxReTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnk6dGhpcy5icShhKX0sYnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jcTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIEpiPWMuSXZ8fEpiLEJkPW5ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUJkLllwKDQpOyhmdW5jdGlvbihjKXtjLmJqPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMubWE9ITE7dGhpcy5EZygpfSxEZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpOwpifHwoYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5TKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sbGE6ZnVuY3Rpb24oKXt0aGlzLm5oKCl9LApuaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuTiYmKDAsdGhpcy5OKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIEtiPWMuYmp8fEtiOyhmdW5jdGlvbihjKXtjLmFqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMubygiZW1wdHkiKSx0aGlzLmVhKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT0KYj90aGlzLmVhKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nKCk/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTGI9Yy5hanx8TGI7KGZ1bmN0aW9uKGMpe2MuY2o9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxxaDpmdW5jdGlvbihiKXtiPW5ldyBLYihiKTtiLm1hP3RoaXMuSSgpOnRoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3IExiKGIsdGhpcy5HKSkuYygpKX0sYzpmdW5jdGlvbigpe3RoaXMuT3J8fCh0aGlzLk9yPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5xaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTsKaWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnFoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgTWI9Yy5janx8TWIsVj1uZXcgTWIocSk7Vi5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud3g9dGhpcy5hWzNdO3RoaXMucHA9dGhpcy5hWzldO3RoaXMuQWs9dGhpcy5hWzJdO3RoaXMuRXk9dGhpcy5hWzddO3RoaXMuVHg9dGhpcy5hWzNdO3RoaXMuc2k9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzldfWMubm89YjtiLnByb3RvdHlwZT17dng6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy53eDp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucHA6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFrOnRoaXMuRHkoYSl9LER5OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FeTp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlR4OnRoaXMucmkoYSl9LHJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5zaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIE5iPWMubm98fE5iLENkPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUNkLnZ4KDQpOyhmdW5jdGlvbihjKXtjLldtPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlMoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxQYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuV218fFc7KGZ1bmN0aW9uKGMpe2MuVm09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkuUGYoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm8uYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LlBmKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuenUoYSl9LmJpbmQodGhpcykpO3kuRHMoKX0senU6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5vKCk7dGhpcy5lYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5vKCk7dGhpcy5lYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkYoKX19KX0pKGMpOwp2YXIgWD1jLlZtfHxYOyhmdW5jdGlvbihjKXtjLlhtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnFkJiYoYj1lLklxKGIsdGhpcy5xZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLkooZCkpe3RoaXMuSyhkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD0KYy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnFkfHwodGhpcy5xZD1bXSksdGhpcy5xZC5wdXNoKGJbYV0pLGQ9bmV3IFcoaCksdGhpcy5KKGQpfHwodGhpcy5LKGQpLGY9bmV3IFgoZCx0aGlzLkcpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sUGY6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sWXc6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy53Y3x8KHRoaXMud2M9W10pLHRoaXMud2MucHVzaChiKSx0aGlzLmF3KCkmJih0aGlzLlZlKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYKKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxEczpmdW5jdGlvbigpe2lmKHRoaXMud2MpZm9yKHZhciBiPTA7Yjx0aGlzLndjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMud2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lll3KGIpfX0pfSkoYyk7CnZhciBPYj1jLlhtfHxPYix5PW5ldyBPYihxKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFyPXRoaXMuYVsxMF07dGhpcy5mcD10aGlzLmFbMl07dGhpcy5lbj10aGlzLmFbOV07dGhpcy5Mcz10aGlzLmFbOF07dGhpcy5rbz10aGlzLmFbMV07dGhpcy5sdD10aGlzLmFbN107dGhpcy5sbj10aGlzLmFbMl07dGhpcy5wbD10aGlzLmFbOV07dGhpcy5vcj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVsyXX1jLkprPWI7Yi5wcm90b3R5cGU9eyRxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hcjp0aGlzLmVwKGEpfSxlcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZnA6dGhpcy5kbihhKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmVuOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Mczp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmtvOnRoaXMua3QoYSl9LGt0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubHQ6dGhpcy5rbihhKX0sa246ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxuOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucGw6dGhpcy5ucihhKX0sbnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm9yOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgUGI9Yy5Ka3x8UGIsRGQ9bmV3IFBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9RGQuJHEoNCk7KGZ1bmN0aW9uKGMpe2MuV2k9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5TKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sVWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBRYj1jLldpfHxRYjsoZnVuY3Rpb24oYyl7Yy5YaT0KdS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5GKCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMueXZ8fCh0aGlzLnl2PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy5GKCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpOwp2YXIgUmI9Yy5YaXx8UmI7KGZ1bmN0aW9uKGMpe2MuWWk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBRYihkKTt0aGlzLkooZSl8fCh0aGlzLksoZSksKG5ldyBSYihlLHRoaXMuRykpLmMoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLkphKWlmKGE9PXRoaXMuSmFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7CnJldHVybiB0aGlzLkphW2Iub2IoKV0/ITA6ITF9fSl9KShjKTt2YXIgU2I9Yy5ZaXx8U2IsVGI9bmV3IFNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ0PXRoaXMuYVs3XTt0aGlzLlZuPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVsxMF07dGhpcy5ieT10aGlzLmFbMl07dGhpcy5SbD10aGlzLmFbMTBdO3RoaXMuaW09dGhpcy5hWzhdO3RoaXMucm49dGhpcy5hWzZdO3RoaXMuZnQ9dGhpcy5hWzFdO3RoaXMuRWw9dGhpcy5hWzZdO3RoaXMuSXg9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbOV19Yy5Ucj1iO2IucHJvdG90eXBlPXthdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJ0OnRoaXMuVW4oYSl9LFVuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVm46dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktyOnRoaXMuYXkoYSl9LApheTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnk6dGhpcy5RbChhKX0sUWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJsOnRoaXMuaG0oYSl9LGhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pbTp0aGlzLnFuKGEpfSxxbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJuOnRoaXMuZXQoYSl9LGV0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mdDp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWw6dGhpcy5IeChhKX0sSHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkl4OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgVWI9Yy5Ucnx8VWIsRWQ9bmV3IFViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9RWQuYXQoNCk7KGZ1bmN0aW9uKGMpe2MuT2w9Cm4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuUyhiKTt0aGlzLlYoYSk7dGhpcy5Vdih0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxVdjpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJnRoaXMuaWEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnBhdXNlJiZ0aGlzLmlhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmCnRoaXMuaWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5yZXN1bWUmJnRoaXMuaWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2ImJmIubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLm11dGUmJnRoaXMuaWEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJnRoaXMuaWEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS51bm11dGUmJnRoaXMuaWEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxMZzpmdW5jdGlvbihiKXt0aGlzLmlhPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBWYj1jLk9sfHxWYjsoZnVuY3Rpb24oYyl7Yy5ObD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLAphKTt0aGlzLiRoPSExfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXRoaXMuZ2V0UGxheWVyKCk7Yi5hdXRvc3RhcnQmJiF0aGlzLiRoJiYodGhpcy5GKCksdGhpcy4kaD0hMCx0aGlzLlJhKCkpO2EuRmEoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFdiPWMuTmx8fFdiOyhmdW5jdGlvbihjKXtjLlBsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgVmIoYltkXSksdGhpcy5KKGMpfHwodGhpcy5LKGMpLChuZXcgV2IoYyx0aGlzLkcpKS5jKCkpfX1lbHNlIHRoaXMuSSgpfX0pfSkoYyk7CnZhciBYYj1jLlBsfHxYYixZPW5ldyBYYihxKTtZLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcj10aGlzLmFbOV07dGhpcy5EaT10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVsxMF19Yy5uaT1iO2IucHJvdG90eXBlPXtQcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUXI6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkRpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgWWI9Yy5uaXx8WWIsRmQ9bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9RmQuUHIoNCk7KGZ1bmN0aW9uKGMpe2MuTW49bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxrYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sbGE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJgoxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5OPygwLHRoaXMuTikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIFpiPWMuTW58fFpiOyhmdW5jdGlvbihjKXtjLkxuPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxUdjpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuV2F8fCh0aGlzLldhPVtdKTt0aGlzLldhLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8CjMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuZWEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5lYz0hMDt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sYzpmdW5jdGlvbigpe3RoaXMudSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy54YT90aGlzLlR2KHRoaXMueGEpOih0aGlzLnhhPXRoaXMuSGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApKX0sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy54YSl7dGhpcy5GKCk7cmV0dXJufWlmKCF0aGlzLmVjKXt0aGlzLkYoKTtyZXR1cm59Yj0hMDtpZih0aGlzLldhJiYKdGhpcy5XYS5sZW5ndGgmJjE8dGhpcy5XYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLldhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLldhW2FdJiYzMDMhPXRoaXMuV2FbYV0mJjQwMyE9dGhpcy5XYVthXSYmKGI9ITEpO2lmKGIpdGhpcy5vKCJlbXB0eSIpLHRoaXMuZWEoKTtlbHNle3RoaXMuRigpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyICRiPWMuTG58fCRiOyhmdW5jdGlvbihjKXtjLk5uPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgWmIoYi5pdGVtKGEpKTt0aGlzLkooYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLksoYyksCihuZXcgJGIoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIGFjPWMuTm58fGFjLGJjPW5ldyBhYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qdD10aGlzLmFbN107dGhpcy5mdT10aGlzLmFbNl07dGhpcy5lcj10aGlzLmFbNV07dGhpcy5pbz10aGlzLmFbOV07dGhpcy5LdD10aGlzLmFbOF07dGhpcy5Bbj10aGlzLmFbOF07dGhpcy5Dbj10aGlzLmFbNF07dGhpcy5ndz10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs4XX1jLmppPWI7Yi5wcm90b3R5cGU9e2l0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qdDp0aGlzLmV1KGEpfSxldTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZ1OnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lcjp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaW86CnRoaXMuSnQoYSl9LEp0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5LdDp0aGlzLnpuKGEpfSx6bjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkFuOnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dbjp0aGlzLmZ3KGEpfSxmdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3c6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBjYz1jLmppfHxjYyxHZD1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1HZC5pdCg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sbGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLk4mJigwLHRoaXMuTikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5OJiYoMCx0aGlzLk4pKCEwKX0uYmluZCh0aGlzKSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgZGM9Yy5Za3x8ZGM7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLlloKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5vZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMub2coKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuQW8oKX0uYmluZCh0aGlzKSksdGhpcy5aaD0hMSx0aGlzLnh5PTFFMyx0aGlzLmtoPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxvZzpmdW5jdGlvbigpe3RoaXMua2guZG9uZXx8KHRoaXMua2guZG9uZT0hMCx0aGlzLlpoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZaCgpfS5iaW5kKHRoaXMpLAp0aGlzLnh5KSl9LEFvOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLlpoKTt0aGlzLm8oKX0sWWg6ZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMubygpLHRoaXMuZWEoKSk6KHRoaXMucygiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLkYoKSl9LHhnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBmPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHlhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy54Zyhtdy5lcnJvckRlbGVnYXRlcyk6CnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy54Zyh0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgZWM9Yy5Ya3x8ZWM7KGZ1bmN0aW9uKGMpe2MuWms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5OYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLk5hKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLk5hKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTsKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLk5hKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBkYyhjKSx0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBlYyhjLHRoaXMuRykpLmMoKSkpfX10aGlzLkkoKX19KX0pKGMpO3ZhciBmYz1jLlprfHxmYyxnYz1uZXcgZmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUHk9dGhpcy5hWzVdO3RoaXMuV3Q9dGhpcy5hWzEwXTt0aGlzLlZpPXRoaXMuYVs3XTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLm9qPXRoaXMuYVs4XTt0aGlzLmx1PXRoaXMuYVs5XTt0aGlzLm1tPQp0aGlzLmFbNV07dGhpcy52aj10aGlzLmFbNF07dGhpcy5QdT10aGlzLmFbNF07dGhpcy5Ecj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbNV19Yy54dz1iO2IucHJvdG90eXBlPXtPeTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUHk6dGhpcy5WdChhKX0sVnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLld0OnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVmk6dGhpcy5WayhhKX0sVms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLldrOnRoaXMubmooYSl9LG5qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vajp0aGlzLmt1KGEpfSxrdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubHU6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1tOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52ajp0aGlzLk91KGEpfSxPdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUHU6CnRoaXMuQ3IoYSl9LENyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ecjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGhjPWMueHd8fGhjLEhkPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUhkLk95KDQpOyhmdW5jdGlvbihjKXtjLlJtPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgaWM9Yy5SbXx8aWM7KGZ1bmN0aW9uKGMpe2MuUW09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm8oKSx0aGlzLmVhKCkpOih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLnUoKSkpOih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpO3RoaXMuaWMoKX0saWM6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy56ZSgpJiYKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnplKCkmJih0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmljKCl9LmJpbmQodGhpcyksMTApfSx6ZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgamM9Yy5RbXx8amM7KGZ1bmN0aW9uKGMpe2MuU209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJgoidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgaWMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3IGpjKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBrYz1jLlNtfHxrYyxsYz1uZXcga2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3I9dGhpcy5hWzddO3RoaXMueXM9dGhpcy5hWzRdO3RoaXMuUm89dGhpcy5hWzRdO3RoaXMueG49dGhpcy5hWzFdO3RoaXMudG49dGhpcy5hWzNdO3RoaXMuR2o9dGhpcy5hWzFdO3RoaXMubD10aGlzLmFbMV19Yy5oaz0KYjtiLnByb3RvdHlwZT17cnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNyOnRoaXMueHMoYSl9LHhzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55czp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUm86dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhuOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bjp0aGlzLkZqKGEpfSxGajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYz1jLmhrfHxtYyxJZD1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1JZC5ycig0KTsoZnVuY3Rpb24oYyl7Yy5HbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlMoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuT2U9ITF9LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkJ2KCl9LmJpbmQodGhpcyksNTAwKX0sQnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5OJiZ0aGlzLk4oKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksCmE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuT2UmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuT2UpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxIdzpmdW5jdGlvbigpe3RoaXMuT2U9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBuYz1jLkdtfHwKbmM7KGZ1bmN0aW9uKGMpe2MuRm09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKTt0aGlzLlliPTB9LGM6ZnVuY3Rpb24oKXt0aGlzLmh1PTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5ZYnx8KHRoaXMuWWI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8Cih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5ZYnx8dGhpcy5ZYisrLHRoaXMuWWI8PXRoaXMuaHU/KHRoaXMuWWIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSkpfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5IdygpLHRoaXMuRigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgb2M9Yy5GbXx8b2M7KGZ1bmN0aW9uKGMpe2MuSG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbmMod2luZG93LnBsYXllckFwaSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgb2MoYiwKdGhpcy5HKSkuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcGM9Yy5IbXx8cGMscWM9bmV3IHBjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNxPXRoaXMuYVs1XTt0aGlzLk1xPXRoaXMuYVs0XTt0aGlzLnp3PXRoaXMuYVsxXTt0aGlzLmpqPXRoaXMuYVs0XTt0aGlzLkh1PXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzldfWMuY3Y9YjtiLnByb3RvdHlwZT17UnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlNxOnRoaXMuTHEoYSl9LExxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NcTp0aGlzLnl3KGEpfSx5dzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuenc6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMuR3UoYSl9LEd1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5IdTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciByYz1jLmN2fHxyYyxKZD1uZXcgcmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1KZC5ScSg0KTsoZnVuY3Rpb24oYyl7Yy5BbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGxhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuTigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBzYz1jLkFtfHxzYzsoZnVuY3Rpb24oYyl7Yy56bT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCmZ1bmN0aW9uKCl7dGhpcy5SYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnpxKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuZWQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLlN0KCk6dGhpcy5pYygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZigpfHwodGhpcy5zKCJjb250ZW50cGxheSIpLHRoaXMudSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHpxOmZ1bmN0aW9uKCl7dGhpcy5GZigpfHx0aGlzLnUoITApfSxTdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZWQoKTshYi52YSYmCmIuWiYmYi5jeiYmYi5leiYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LGljOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMubygpLHRoaXMuZWEoKSk6KHRoaXMucygiYWRlcnJvciIsYiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWMoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe2lmKCF0aGlzLmdoKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT0KYSYmKHRoaXMuZ2g9YltjXSk7cmV0dXJuIHRoaXMuZ2h9LHplOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLmVkKCkuYWRzTG9hZGVyP3RoaXMuRighMCk6dGhpcy5GKCk6dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHRjPWMuem18fHRjOyhmdW5jdGlvbihjKXtjLkJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IHNjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5KKGMpfHwodGhpcy5LKGMpLChuZXcgdGMoYyx0aGlzLkcpKS5jKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgdWM9Yy5CbXx8dWMsdmM9bmV3IHVjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJwPXRoaXMuYVs2XTt0aGlzLlVxPXRoaXMuYVs5XTt0aGlzLll5PXRoaXMuYVsyXTt0aGlzLk15PXRoaXMuYVsxXTt0aGlzLlVwPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzEwXX1jLnlrPWI7Yi5wcm90b3R5cGU9e3FwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ycDp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVXE6dGhpcy5YeShhKX0sWHk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll5OnRoaXMuTHkoYSl9LEx5OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NeTp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLlVwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgd2M9Yy55a3x8d2MsS2Q9bmV3IHdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9S2QucXAoNCk7KGZ1bmN0aW9uKGMpe2MudWw9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5TKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlYoYSk6dGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxVYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sRmE6ZnVuY3Rpb24oKXt2YXIgYjtFPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTsKYiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWj1jLnVsfHxaOyhmdW5jdGlvbihjKXtjLnRsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlFlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuUWU9Yi5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5RZSYmYiE9dGhpcy5RZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5zKCJhZGVycm9yIixhLnl6KSx0aGlzLkYoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT0KYSYmKHRoaXMucygiYWRlcnJvciIpLHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBhYT1jLnRsfHxhYTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRSlmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFooYiksYi5tYT90aGlzLlZlKCk6dGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGFhKGIsdGhpcy5HKSxiLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRSx4Yz1jLnZsfHx4Yyx5Yz1uZXcgeGMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC53Yi5sZW5ndGgpe3ZhciBhPWwud2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUucncoeyJbTE9BRFNDUklQVF0iOmUuZ2EoMTApLCJbVVRJTFNdIjplLmdhKDEwKSwiW0NBTExCQUNLXSI6ZS5nYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuWGcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSltW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLlhnKGcsCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LGwpfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3A9dGhpcy5hWzhdO3RoaXMuam49dGhpcy5hWzJdO3RoaXMuZng9dGhpcy5hWzNdO3RoaXMuUmo9dGhpcy5hWzhdO3RoaXMud2k9dGhpcy5hWzRdO3RoaXMud3I9dGhpcy5hWzddO3RoaXMuUXA9dGhpcy5hWzFdO3RoaXMucnY9dGhpcy5hWzldO3RoaXMuang9dGhpcy5hWzVdO3RoaXMuS2w9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMV19Yy50aj1iO2IucHJvdG90eXBlPXtWcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3A6dGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpuOnRoaXMuZXgoYSl9LApleDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZng6dGhpcy5RaihhKX0sUWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlJqOnRoaXMudmkoYSl9LHZpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53aTp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3I6dGhpcy5QcChhKX0sUHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFwOnRoaXMucXYoYSl9LHF2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ydjp0aGlzLml4KGEpfSxpeDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuang6dGhpcy5KbChhKX0sSmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLktsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgemM9Yy50anx8emMsTGQ9bmV3IHpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUxkLlZwKDQpOyhmdW5jdGlvbihjKXtjLm5uPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5TKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMucXU9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9LGh3OmZ1bmN0aW9uKGIpe3RoaXMuUmQ9CmJ9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sbGE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuZ2IoYil9LmJpbmQodGhpcykpfSxnYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuTiYmdGhpcy5OKCksdGhpcy5SZCYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuUmQmJihuZXcgSCh0aGlzLHRoaXMuUmQpKS5jKCkpfX0pfSkoYyk7dmFyIE49Yy5ubnx8TjsoZnVuY3Rpb24oYyl7Yy5tbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSx4YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMua2UpaWYodGhpcy5yYnx8KHRoaXMucmI9MCksdGhpcy5yYisrLDE1PHRoaXMucmIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnR3KCk6dGhpcy51KCEwKSwhMDt0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnUoKTp0aGlzLnUoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5rZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLnlhKCl8fCh0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YSgpfS5iaW5kKHRoaXMpLDEwKX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sClk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVz1hLGIucygiYWRlcnJvciIsYSkpOmIucygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dGhpcy5XPXRoaXMuV3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnhhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSx1OmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRihiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSD1jLm1ufHxIOyhmdW5jdGlvbihjKXtjLnBuPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLklhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiLmh3KHRoaXMuRyksYj1uZXcgSChiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLnBufHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHA9CnRoaXMuYVsyXTt0aGlzLlRsPXRoaXMuYVszXTt0aGlzLmFtPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzJdfWMuS3E9YjtiLnByb3RvdHlwZT17R3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhwOnRoaXMuU2woYSl9LFNsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5UbDp0aGlzLiRsKGEpfSwkbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBDYz1jLktxfHxDYyxNZD1uZXcgQ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1NZC5HcCg0KTsoZnVuY3Rpb24oYyl7Yy5tbD1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy5jZz0KMDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVihhKTp0aGlzLmZhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jZ30sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLk4/KDAsdGhpcy5OKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse2ZxOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuY2c9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCntmcTpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sUDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIERjPWMubWx8fERjOyhmdW5jdGlvbihjKXtjLmxsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEN6OmZ1bmN0aW9uKCl7fSxXdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnRmKG5ldyBmdW5jdGlvbigpe30pO2EuJHk9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuV3YoYSk7d2luZG93LlpkPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLlZ2fHwodGhpcy5Wdj0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnNlfHwodGhpcy5zZT0xKTtpZigyMDx0aGlzLnNlKXRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLlFhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuc2UrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LFFhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLmFhKCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMuVWUoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5zKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLnBhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0sVWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc01hbmFnZXIpOwpiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpfSx5YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpe3RoaXMucWE9ITB9LGFhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YSgpPwoodGhpcy5vKCksdGhpcy5lYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkYoYil9fSl9KShjKTt2YXIgRWM9Yy5sbHx8RWM7KGZ1bmN0aW9uKGMpe2Mubmw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IERjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5tYXx8dGhpcy5KKGMpfHwodGhpcy5LKGMpLChuZXcgRWMoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEZjPWMubmx8fEZjLEdjPW5ldyBGYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubnQ9dGhpcy5hWzhdO3RoaXMuQng9dGhpcy5hWzddO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuSW49dGhpcy5hWzhdO3RoaXMuZ209dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbNl19Yy5zbD1iO2IucHJvdG90eXBlPXttdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnQ6dGhpcy5BeChhKX0sQXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJ4OnRoaXMuQXAoYSl9LEFwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5CcDp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSW46dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmdtOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgSGM9Yy5zbHx8SGMsTmQ9bmV3IEhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPU5kLm10KDQpOyhmdW5jdGlvbihjKXtjLmhsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIGJhPWMuaGx8fGJhOyhmdW5jdGlvbihjKXtjLmdsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LApjOmZ1bmN0aW9uKCl7dGhpcy5IZz0wO3RoaXMuVz10aGlzLld8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5xYT10aGlzLnRjPXRoaXMueGE9dGhpcy5RYz0hMTt0aGlzLnBoPWUudWIoMTApO3RoaXMuUWcoKX0sUWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudmE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLlFhKCksITA7dGhpcy5IZysrO2lmKDEwPHRoaXMuSGcpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMudSghMCk6dGhpcy51KCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5RZy5iaW5kKHRoaXMpLDEwMCksITF9LFFhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMudmE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMubygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuRihiKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNhPWMuZ2x8fGNhOyhmdW5jdGlvbihjKXtjLmlsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBjYShiLAp0aGlzLkcpLGIuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgSWM9Yy5pbHx8SWMsSmM9bmV3IEljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs4XTt0aGlzLlhuPXRoaXMuYVsxMF07dGhpcy5Dbz10aGlzLmFbNV07dGhpcy5oaj10aGlzLmFbMTBdO3RoaXMuZmo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzddfWMuWHM9YjtiLnByb3RvdHlwZT17Zm46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmduOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkNvOnRoaXMuZ2ooYSl9LGdqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5oajp0aGlzLmVqKGEpfSxlajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZmo6dGhpcy5qKGEpfSwKajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIEtjPWMuWHN8fEtjLE9kPW5ldyBLYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPU9kLmZuKDQpOyhmdW5jdGlvbihjKXtjLlRqPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yj8oYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllclByZWZpeCkpPyh0aGlzLlMoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5WKGIpOnRoaXMuZmEoKSk6dGhpcy5mYSgpOnRoaXMuZmEoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxtZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaXNGdWxsc2NyZWVuP2IuaXNGdWxsc2NyZWVuOiExfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLmR1cmF0aW9uP2IudmlkZW9pbmZvLmR1cmF0aW9uOjB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8ucGxheWhlYWQ/Yi52aWRlb2luZm8ucGxheWhlYWQ6MH0sCmV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgTGM9Yy5Uanx8TGM7KGZ1bmN0aW9uKGMpe2MuU2o9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVBsYXlpbmciLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLAp0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMucygiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksdGhpcy51KCkpfSx0ZXN0OmZ1bmN0aW9uKCl7fSx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtiLmlzUGxheWluZygpPyhiLnBhdXNlKCksdGhpcy5GKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBNYz1jLlNqfHxNYzsoZnVuY3Rpb24oYyl7Yy5Vaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApjOmZ1bmN0aW9uKCl7dGhpcy5JYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuTmEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyBMYyhkKSxkLm1hfHx0aGlzLkooZCl8fCh0aGlzLksoZCksKG5ldyBNYyhkLHRoaXMuRykpLmMoKSk7ZWxzZSBicmVha310aGlzLkkoKX19KX0pKGMpO3ZhciBOYz1jLlVqfHxOYyxPYz1uZXcgTmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub2s9dGhpcy5hWzFdO3RoaXMuYXA9dGhpcy5hWzldO3RoaXMuZWs9dGhpcy5hWzFdO3RoaXMudHE9dGhpcy5hWzEwXTt0aGlzLkx1PXRoaXMuYVsxXTsKdGhpcy5sPXRoaXMuYVszXX1jLkx2PWI7Yi5wcm90b3R5cGU9e25rOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vazp0aGlzLiRvKGEpfSwkbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXA6dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5lazp0aGlzLnNxKGEpfSxzcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudHE6dGhpcy5LdShhKX0sS3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkx1OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgUGM9Yy5Mdnx8UGMsUGQ9bmV3IFBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9UGQubmsoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5TKGIpLHRoaXMuVihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIFFjPWMuJGp8fFFjOyhmdW5jdGlvbihjKXtjLlpqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlVmKCl9LFVmOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5GKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZighMCl9LmJpbmQodGhpcyksCjEwMCkpfX0pfSkoYyk7dmFyIFJjPWMuWmp8fFJjOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBRYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5tYSl7dGhpcy5JKCk7cmV0dXJufWlmKCF0aGlzLkooYikpe3RoaXMuSyhiKTsobmV3IFJjKGIsdGhpcy5HKSkuYygpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgU2M9Yy5ha3x8U2MsVGM9bmV3IFNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNyPXRoaXMuYVsxMF07dGhpcy5FdD10aGlzLmFbNl07dGhpcy5NbD0KdGhpcy5hWzVdO3RoaXMubXg9dGhpcy5hWzZdO3RoaXMuaHQ9dGhpcy5hWzEwXTt0aGlzLmVvPXRoaXMuYVsxMF07dGhpcy5TcD10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOV19Yy54aT1iO2IucHJvdG90eXBlPXticjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3I6dGhpcy5EdChhKX0sRHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkV0OnRoaXMuTGwoYSl9LExsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5NbDp0aGlzLmx4KGEpfSxseDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubXg6dGhpcy5ndChhKX0sZ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5odDp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVvOnRoaXMuUnAoYSl9LFJwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5TcDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIFVjPWMueGl8fFVjLApRZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1RZC5icig0KTsoZnVuY3Rpb24oYyl7Yy5jaT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlMoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5WKGIpOnRoaXMuZmEoKSk6dGhpcy5mYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgVmM9Yy5jaXx8VmM7KGZ1bmN0aW9uKGMpe2MuYmk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYiwKYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy51LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcykpO3RoaXMuJGQoKTt0aGlzLlJmKCl9LFk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlc9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0scGE6ZnVuY3Rpb24oKXt0aGlzLnFhPSEwO3RoaXMubygiZW1wdHkgdmFzdCIpfSxSZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiYKYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8CjMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy5vKCksdGhpcy5lYSgpKTp0aGlzLnUoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlJmLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy4kZC5iaW5kKHRoaXMpLDEwMCl9LCRkOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaGEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5SYS5iaW5kKHRoaXMpLDEwKSx0aGlzLm8oKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLnUoKTp0aGlzLnUoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGQuYmluZCh0aGlzKSwxMDApfX0sdTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlJhLmJpbmQodGhpcyksCjFFNCk7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIFdjPWMuYml8fFdjOyhmdW5jdGlvbihjKXtjLmRpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sU2E6ZnVuY3Rpb24oYil7Yj1uZXcgVmMoYik7Yi5tYT90aGlzLkkoKTp0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBXYyhiLHRoaXMuRykpLmMoKSl9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5TYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuU2Eod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5JKCl9fSl9KShjKTt2YXIgWGM9Yy5kaXx8WGMsWWM9bmV3IFhjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5HdD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs3XX1jLk5tPWI7Yi5wcm90b3R5cGU9e0Z0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIFpjPWMuTm18fFpjLFJkPW5ldyBaYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVJkLkZ0KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlNnPXRoaXMuVWc9dGhpcy5UZz0hMTt0aGlzLnNkPVtdO3RoaXMuVGU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRjP251bGw6VGMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpjP251bGw6SmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/Cm51bGw6SWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlYsTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYmI/bnVsbDpiYixvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdiP251bGw6Z2IsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIHZjP251bGw6dmMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgeWE/bnVsbDp5YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgQmM/bnVsbDpCYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB5P251bGw6eSxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHljP251bGw6eWMsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRiP251bGw6VGIsU2ltcGxlVmlkZW9BbmRJbWE6InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgR2M/bnVsbDpHYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSWI/bnVsbDoKSWIsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE9jP251bGw6T2MsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBxYz9udWxsOnFjLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBtYj9udWxsOm1iLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiByYj9udWxsOnJiLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsWE9aQ09NOiJ1bmRlZmluZWQiPT09dHlwZW9mIERhP251bGw6RGEsQkNGbGFzaE9ubHk6InVuZGVmaW5lZCI9PT10eXBlb2YgWGE/bnVsbDpYYSxEZW1vVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB0YT9udWxsOnRhLFRPbmxpbmUyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNhP251bGw6U2EsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgWWM/bnVsbDpZYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWT8KbnVsbDpZfX1jLnJtPWI7Yi5wcm90b3R5cGU9e2M6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMubnMoYSk6W10sYjt0aGlzLlVnPSEwO2lmKGEubGVuZ3RoKXt0aGlzLlRnPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnVoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5UZSl7aWYodGhpcy5TZylicmVhaztiPXRoaXMuVGVbY107dGhpcy5uZihiKSYmKHRoaXMuc2QucHVzaChiKSx0aGlzLnVoKGIpKX19LG5mOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sbnM6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuVGVbY10sdGhpcy5uZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx1aDpmdW5jdGlvbihhKXt0aGlzLm5mKGEpJiZhLmMoKX0sSXc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIG4mJgohdGhpcy5UZylmb3IodGhpcy5TZz0hMCxhPTA7YTx0aGlzLnNkLmxlbmd0aDthKyspdGhpcy5zZFthXS55YiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnNkW2FdLnliKX19fSkoYyk7dmFyICRjPWMucm18fCRjLEw9bmV3ICRjO0wuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLllqPXRoaXMuYVs2XTt0aGlzLm12PXRoaXMuYVs4XTt0aGlzLmdrPXRoaXMuYVs0XTt0aGlzLmprPXRoaXMuYVs4XTt0aGlzLklqPXRoaXMuYVszXTt0aGlzLkVrPXRoaXMuYVszXTt0aGlzLmR0PXRoaXMuYVsxMF07dGhpcy5qcD10aGlzLmFbOF07dGhpcy5Tcj10aGlzLmFbOF07dGhpcy5xcj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVsxMF19Yy5taT1iO2IucHJvdG90eXBlPXtYajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWWo6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5tdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZ2s6dGhpcy5payhhKX0saWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmprOnRoaXMuSGooYSl9LEhqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Jajp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRWs6dGhpcy5jdChhKX0sY3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmR0OnRoaXMuaXAoYSl9LGlwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcDp0aGlzLlJyKGEpfSxScjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU3I6dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgYWQ9Yy5taXx8YWQsU2Q9bmV3IGFkKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVNkLlhqKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLm9jKGsuVngpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLm9jKGsudHUpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKRi53aWR0aD0xO0YuaGVpZ2h0PTE7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBUZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGhhPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBHPW5ldyBSLG09ITE7Ry51YygpO0cuTWcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLnVjKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5NZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0cudWMoKTt2YXIgVWQ9VGQoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csRy5zdCgpLHtpZDpVZH0pfSw1MDApLGxhPWUuZ2EoMTApO2dhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkl5PXRoaXMuYVs1XTt0aGlzLnVpPXRoaXMuYVs4XTt0aGlzLk52PXRoaXMuYVsxXTt0aGlzLkt2PXRoaXMuYVsxXTt0aGlzLmJ2PXRoaXMuYVs3XTt0aGlzLlV1PXRoaXMuYVs1XTt0aGlzLld1PXRoaXMuYVsyXTt0aGlzLiRpPXRoaXMuYVsxMF07dGhpcy5paT10aGlzLmFbMl07dGhpcy5Xcz10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs3XX1jLld5PWI7Yi5wcm90b3R5cGU9e0h5OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5JeTp0aGlzLnRpKGEpfSx0aTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudWk6dGhpcy5NdihhKX0sTXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk52OnRoaXMuSnYoYSl9LEp2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ldjp0aGlzLmF2KGEpfSxhdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYnY6dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlV1OnRoaXMuVnUoYSl9LFZ1OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuV3U6dGhpcy5aaShhKX0sWmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLiRpOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5paTp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuV3M6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBiZD1jLld5fHxiZCxWZD1uZXcgYmQoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1WZC5IeSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubWg9dGhpcy5jb25mPXRoaXMuZWI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLm5kPTA7dGhpcy5WYT0iIjt0aGlzLnRkPVtdO3RoaXMudWQ9MDt0aGlzLm9oPSExO3RoaXMuUmU9W119Yy5maT1iO2IucHJvdG90eXBlPXtxdzpmdW5jdGlvbihhKXt0aGlzLm1oPQphfSx4ZDpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuVmE9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGt3OmZ1bmN0aW9uKGEpe3RoaXMuZWI9YX0saXc6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEVhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5WYV0mJnRoaXMuY29uZlt0aGlzLlZhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuVmFdW2FdKTtyZXR1cm4gYn0semM6ZnVuY3Rpb24oYSxiKXtlLnNiKCJ3ZWx0LmRlIikmJmUuVGEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwKIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLmViKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMudHQoKSl0aGlzLmViLmYodGhpcy5lYi5oZCx0aGlzLmViLkNhLHRoaXMuZWIuU2UsZnVuY3Rpb24oKXt0aGlzLnpjKGEsYil9LmJpbmQodGhpcyksdGhpcy5lYi5sYyk7ZWxzZSBpZih0aGlzLkZzKCkpdGhpcy5ldyhmdW5jdGlvbigpe3RoaXMuemMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudyhrLlljLHRoaXMucGxheWVyLnYoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLkx3KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuZWIsaCk7bC53aCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuZ3UoYSkpfHwKZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuQWUmJihjPXRoaXMucGxheWVyLkFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkNlKGEsYyxmKTt0aGlzLnBsYXllci54aChsKX19LHR0OmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMubmQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5uZC5nZXRUaW1lKCksdGhpcy5uZD1hLDNFNTxiPyEwOiExO3RoaXMubmQ9YTtyZXR1cm4hMX0sQnc6ZnVuY3Rpb24oKXtlLlllKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5FYSgiYWRUYWciKTt0aGlzLkVhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5FYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuamcoYSkpP3RoaXMuemMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLAowKSxlLncoay5aYyx0aGlzLnBsYXllci52KCkpKX0sQXc6ZnVuY3Rpb24oYSl7ZS5ZZSgicG9zdHJvbGwiKTtpZighdGhpcy5taCl7dGhpcy5xdyghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5FYSgiYWRUYWciKTt0aGlzLkVhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuRWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5qZyhjKSk/dGhpcy56YyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5aYyx0aGlzLnBsYXllci52KCkpKX19LGpnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxZdjpmdW5jdGlvbigpe3RoaXMucGxheWVyLnZ3KHRoaXMuQXcuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGEoKX0sCkFkOmZ1bmN0aW9uKGEpe2UuWWUoIm1pZHJvbGwiKTtpZighdGhpcy5aZyl7dGhpcy5aZz0hMDt2YXIgYj10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkVhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy56YyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aZz0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5aYyx0aGlzLnBsYXllci52KCkpKX19LFh2OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucHcodGhpcy5BZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5HZSgpfSxjOmZ1bmN0aW9uKCl7dGhpcy5CdygpO3RoaXMucGxheWVyLkdlJiZ0aGlzLlh2KCk7dGhpcy5ZdigpfSxadjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOgphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy50ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuTnkoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnVkPXRoaXMudGQubGVuZ3RofSxGczpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy51ZCYmKGE9ITApO3JldHVybiBhfSxldzpmdW5jdGlvbihhKXt0aGlzLm9oPWE7Zm9yKGE9MDthPHRoaXMudGQubGVuZ3RoO2ErKyl0aGlzLnRkW2FdWyJmdW5jdGlvbiJdKHRoaXMuRXYuYmluZCh0aGlzKSl9LEV2OmZ1bmN0aW9uKGEpe3RoaXMudWQtLTthJiZ0aGlzLlJlLnB1c2goYSk7MD49dGhpcy51ZCYmdGhpcy5vaCgpfSxndTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5SZS5sZW5ndGg7YysrKWI9dGhpcy5SZVtjXSwKYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMuZml8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXI9dGhpcy5hWzddO3RoaXMuS249dGhpcy5hWzldO3RoaXMuQmk9dGhpcy5hWzVdO3RoaXMuUG89dGhpcy5hWzRdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuaXY9dGhpcy5hWzFdO3RoaXMubnA9dGhpcy5hWzFdO3RoaXMubD10aGlzLmFbMl19Yy5XbD1iO2IucHJvdG90eXBlPXtocjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXI6dGhpcy5KbihhKX0sSm46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktuOnRoaXMuQWkoYSl9LEFpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5CaTp0aGlzLk9vKGEpfSxPbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUG86dGhpcy5EaihhKX0sCkRqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Fajp0aGlzLmh2KGEpfSxodjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaXY6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5wOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgY2Q9Yy5XbHx8Y2QsV2Q9bmV3IGNkKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9V2QuaHIoNCl9KS5jYWxsKGllSm9qdWFiemFpcm9oR3UsaWVKb2p1YWJ6YWlyb2hHdSk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.192.94.8 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-54-192-94-8.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
640f0a03cd1e9c721ac8844b006b9047b070a9f7d13a3278b98fb0461947dd8f

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

Date
Wed, 17 Apr 2019 06:56:09 GMT
Via
1.1 7e6ac12144acebd1fc302708f2ecfad6.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
67
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
288
Last-Modified
Wed, 27 Mar 2019 14:25:44 GMT
Server
AmazonS3
ETag
"54c7dbe42d2e906013c324c59a35e181"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
X-Amz-Cf-Id
J95eCIJN1gmlzACF_7CxSyJtj5jTblZexqf130v28a8K1l9AYm8xtQ==
Expires
0
/
ssl.1.damoh.golem.de/ada38514af68b43a8da23b6ef8021ddef99c198a/
288 B
1 KB
XHR
General
Full URL
https://ssl.1.damoh.golem.de/ada38514af68b43a8da23b6ef8021ddef99c198a/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGllSm9qdWFiemFpcm9oR3U9aWVKb2p1YWJ6YWlyb2hHdXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuTGV8fCh5LkxlPTApO3kuTGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5MZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5UYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEud2gobSksYS5DZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS4kcCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5ZYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wuc2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS54ZChjKTthLmt3KGwpO2EuaXcobSk7YS5adigpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlyPXRoaXMuYVs0XTt0aGlzLnh2PQp0aGlzLmFbN107dGhpcy5sPXRoaXMuYVs3XX1jLnN2PWI7Yi5wcm90b3R5cGU9e3hyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55cjp0aGlzLnd2KGEpfSx3djpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnh2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIga2E9Yy5zdnx8a2EsZGQ9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9ZGQueHIoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuJHA9ITE7dGhpcy5PYT0ic2V0dXAiO3RoaXMuQmM9W107dGhpcy5ZZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLkR2LmJpbmQodGhpcykpfWMucms9YjtiLnByb3RvdHlwZT17WWY6ZnVuY3Rpb24oKXt0aGlzLmNhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSwKb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LEpvOmZ1bmN0aW9uKGEpe3RoaXMuY2EuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG9hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxEdjpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5DdihhLmRhdGEpfSxDdjpmdW5jdGlvbihhKXtpZih0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPQp0aGlzLmNhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lciYmYS5ldmVudD09dGhpcy5jYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sVmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmNhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sYmc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lcyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuV2coYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGVzOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxIbzpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUuVXIoYSkpcmV0dXJuOyhiPXRoaXMuYmcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSxVcjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxtZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmCihiPXRoaXMuY2Eub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxCdDpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxOYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LHZnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxDaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT0KZG9jdW1lbnQuYm9keT8hMDohMX0sUGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSx1ZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoOwpkPXIud2lkdGg7Zj1yLmhlaWdodDswPnIudG9wJiYoZis9ci50b3ApO3IuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09ci5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sdmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy51ZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksMTAwKX0sdWI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LG9lOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0semg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxKPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLHAsbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBuPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLG4ucHVzaChjKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihuLnB1c2goZik7MTQhPW4ubGVuZ3RoJTE2OyluLnB1c2goMCk7bi5wdXNoKHA+Pj4yOSk7bi5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPG4ubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09blthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO3A9cjtsPUo7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfH5wJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKHBeCmxedikrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChwLDMwKSxwPWMsYz10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfHAmdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKHBebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKHAsMzApLHA9YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrcCY0Mjk0OTY3Mjk1O0o9SitsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihKKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LG5iOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+NixyPWMmNjMsaXNOYU4oZik/ZT1yPTY0OmlzTmFOKGMpJiYocj02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSx5dDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGZlOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHI9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IubGI/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8CmMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gobil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXI7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LCRyOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy5mZSgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFBhOmZ1bmN0aW9uKCl7dmFyIGE9e0lpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxPczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxibTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxUbjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5JaSgpfHxhLmRqKCl8fGEuT3MoKXx8YS5ibSgpfHxhLlRuKCl9fTtyZXR1cm4gYS5McCgpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGZkOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHNiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHBzOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxJcTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxHdzpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxxZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuT2goYikrIjoiK3RoaXMuT2goTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LE9oOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxZZTpmdW5jdGlvbihhKXt0aGlzLk9hPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLk9hO3RoaXMuTmYoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLAohMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxvYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlZCl7dmFyIHI9YTtkJiZiJiYoYj1rLlNhKGIsZCkpO2ImJihyPWsuU2EoYSxiKSk7ZiYmKHI9ay5TYShyLGYpKTtjJiYocj1rLlNhKHIsYykpO2gmJihyPWsuU2EocixoKSk7ZWQmJihyPWsuU2EocixoKSk7ZS5vYyhyKX0sRnY6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlJiYxMDIzIT1hLmNvZGUmJjEwMTghPWEuY29kZSl7dHJ5e2lmKGxhJiYoYi5zZXNzaW9uX2lkPWxhKSxiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiIsYS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpLGIuZXZlbnQ9CmEuY29kZSxiLnNpdGVfaHJlZj10aGlzLnBzKCksYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfX1jYXRjaChkKXt9cmV0dXJuIGJ9fSxOZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZ2KGEpO2lmKGIpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC52ZCgpKyI/aG9tYWRfYXQ9IitlbmNvZGVVUklDb21wb25lbnQoYik7bC53YShhLCEwKTthPWwud2EoYSwhMCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1lbmNvZGVVUklDb21wb25lbnQoYik7bC5IYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbHx8IWwuYmEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWErYjt0aGlzLkNjfHwodGhpcy5DYz17fSk7dGhpcy5DY1tmXXx8KHRoaXMuQ2NbZl09MCk7dGhpcy5DY1tmXSsrOzEwPHRoaXMuQ2NbZl18fChmPWwudmQoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpLGwud2EoZiwhMCksZj1sLndhKGYsITApLGYuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkhhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpKX19LERlOmZ1bmN0aW9uKCl7bCYmbC5iYT9sLmlzRW5hYmxlZCYmbC5ucSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZSgpfS5iaW5kKHRoaXMpLDUwMCl9LGxlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuYmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LG5lOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxiYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmdkKGEpOiIifSxnZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm5lKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sZXE6ZnVuY3Rpb24oYSxiLGQpe2Q9ITE7aWYoYi54ZShhKXx8dGhpcy5CdChhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LldlJiZ3aW5kb3cuc2FuZGJveC5XZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LldlWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwKc2FuZGJveC5XZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy5tZyhhKSlyZXR1cm4gdGhpcy5tZyhhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMubmIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtkJiYoZi5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtmLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2YuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjt2YXIgYz0hMTtkPSExO2Q9dGhpcy5UYShhLGIuR2EsZixmdW5jdGlvbihhKXtjPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2N8fChjPWQpLGM9SlNPTi5wYXJzZShjKX1jYXRjaChoKXtjPSExfWMudXJsJiZjLmhhc2gmJihjPWIubGQoKS5yZXBsYWNlKCJbaGFzaF0iLApjLmhhc2gpKTt0aGlzLkhvKGMsYSk7cmV0dXJuIGN9LFRhOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUscil7dmFyIGs9aHx8bDtoPSEwO3ImJihoPSExKTtpZihrJiZrLmJhKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7ay53YShhLGgpO2g9ay53YShhLGgpO2guZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuSGEoaCxmLGMsIiIsIiIsZSl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRhKGEsYixkLGYsYyxrLGUscil9LmJpbmQodGhpcyksNTAwKX0sV2c6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSl7dmFyIHI9ITA7ZSYmKHI9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7ZT1kO2Q9IiI7CmZvcih2YXIgayBpbiBlKWQrPSImIitrKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtrXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsciksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LCR0OmZ1bmN0aW9uKGEsYixkKXt0aGlzLldnKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLkJjKWZvcih2YXIgYyBpbiB0aGlzLkJjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuQmNbY10pOwpjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS5uYihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LFhnOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5uYihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuVGEoYSxmLkdhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT0KSlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuJHQoZi5sZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0scnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuQmM9YX0sTnk6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLlRhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLApiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGgpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LE1wOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSx3dDpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFE9Yy5ya3x8ClE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93LmtnPWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMucWs9YjtiLlNhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5wdj17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5zdT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi51eT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLkVyPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRnk9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5MZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuRWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLklmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLk1mPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi53bz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5HZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLll4PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5ydT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuRnI9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkF5PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlpmPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuQ3E9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLlpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuWWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLktmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLAptZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Iuem89e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLk1jPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5TZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5VZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IueW89e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlZoPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2Iud3U9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi5wZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07CmIubGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLiRmPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi50eT17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5WeD17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLnR1PXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfSxnZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX19fSkoYyk7dmFyIGs9Yy5xa3x8aztjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuanE9dGhpcy5hWzEwXTt0aGlzLiR3PXRoaXMuYVsxXTt0aGlzLlpuPXRoaXMuYVs2XTt0aGlzLkNrPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzhdfWMuZWk9YjtiLnByb3RvdHlwZT17aXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmpxOnRoaXMuWncoYSl9LFp3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kdzp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWm46dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNrOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgbWE9Yy5laXx8bWEsZmQ9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWZkLmlxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuc2s9YjtiLnByb3RvdHlwZT17b2U6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LG9iOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5BfHwieCIpfSxqczpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZSsKbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sZGQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmRkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuZGQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSx1YzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLm9lKHRoaXMub2IoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9CnRoaXMuZGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LHN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWMoKSsiMiJ9LE1nOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMub2UodGhpcy5qcygpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmRkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUj1jLnNrfHxSO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBvPXRoaXMuYVs0XTt0aGlzLnpwPXRoaXMuYVs2XTt0aGlzLlFuPXRoaXMuYVs4XTt0aGlzLnd5PXRoaXMuYVs2XTt0aGlzLnp5PXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzldfWMuRG49YjtiLnByb3RvdHlwZT17b286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT8KdGhpcy5wbzp0aGlzLnlwKGEpfSx5cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuenA6dGhpcy5QbihhKX0sUG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFuOnRoaXMudnkoYSl9LHZ5OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3k6dGhpcy55eShhKX0seXk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnp5OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgbmE9Yy5Ebnx8bmEsZ2Q9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9Z2Qub28oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsCmY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGYuZj9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5mOmZ1bmN0aW9uKCl7ZC5mLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnRmPWJ9KShjKTt2YXIgSz1jLnRmfHxLO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhpPXRoaXMuYVsxXTsKdGhpcy5Nbz10aGlzLmFbOF07dGhpcy5sPXRoaXMuYVs5XX1jLllzPWI7Yi5wcm90b3R5cGU9e0dpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSGk6dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1vOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgb2E9Yy5Zc3x8b2EsaGQ9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9aGQuR2koNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5xbT1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMueWM9MTAwO3RoaXMudmI9MDt0aGlzLklhPTE1MDt0aGlzLnliPTA7dGhpcy5sdyhiKX0sYzpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMudmI8PXRoaXMuSWE/KHRoaXMudmIrKywKdGhpcy55Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnljKSk6MD50aGlzLklhJiYodGhpcy55Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnljKSl9LGF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmI+dGhpcy5JYT8hMDohMX0sVmU6ZnVuY3Rpb24oKXt0aGlzLnZiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsdzpmdW5jdGlvbihiKXt0aGlzLkc9Yn0sZ3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxLOmZ1bmN0aW9uKGIpe3RoaXMuSmFbYi5vYigpXT1iO0wmJkwuVWcmJkwuSXcoYil9LHB6OmZ1bmN0aW9uKCl7cmV0dXJuIGUuTmEodGhpcy5KYSl9LEo6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYT09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVtiLm9iKCldPyEwOiExfSx4dDpmdW5jdGlvbihiKXtiPWIuRmEoKTtmb3IodmFyIGEgaW4gdGhpcy5KYSlpZihiLmlkPT0KdGhpcy5KYVthXS5GYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxEejpmdW5jdGlvbihiKXt0aGlzLkphW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLnFtfHx0OyhmdW5jdGlvbihjKXtjLnNtPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMueWM9MTA7dGhpcy52Yj0wO3RoaXMuSWE9NTA7dGhpcy5OPW51bGw7dGhpcy5tYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMucWI9IiI7dGhpcy5mZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHY6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkZhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7fSwKdnc6ZnVuY3Rpb24oYil7dGhpcy5OPWJ9LHF6OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTn0scHc6ZnVuY3Rpb24oYil7dGhpcy5IZT1ifSxvejpmdW5jdGlvbigpe3JldHVybiB0aGlzLkhlfSxHZTpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMudmI8PXRoaXMuSWEmJih0aGlzLnZiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy55YykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYil7fX0sdWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sb2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sWmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxFejpmdW5jdGlvbigpe30sVjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5HcygpfHx0aGlzLkVvKCk7dGhpcy5aZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHJ6OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEVvOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmdhKDEwKSl9LEdzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxTOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPQpifSxGYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxtZDpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sVWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0seHo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYX0sZmE6ZnVuY3Rpb24oKXt0aGlzLm1hPSEwfSxQYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxrYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHhoOmZ1bmN0aW9uKGIpe3RoaXMucWI9Yn0sbno6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYn0sc2g6ZnVuY3Rpb24oKXt0aGlzLnFiPW51bGx9LHV6OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5xYiYmKGI9ITApO3JldHVybiBifSx6ejpmdW5jdGlvbigpe3RoaXMuZmd8fCh0aGlzLmZnPSEwKX0scWM6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sa3o6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBuPWMuc218fG47KGZ1bmN0aW9uKGMpe2MuZ2k9Sy5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLkc9dGhpcy5wbGF5ZXI9IiI7dGhpcy5DZj0iMSI7dGhpcy5EZj0iMiI7dGhpcy5ybz0iMyI7dGhpcy5HYz0wO3RoaXMuJGc9CjMwO3RoaXMuRGI9W107dGhpcy5aYT1bXTt0aGlzLiRiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLk9mPXRoaXMuUmg9ITE7dGhpcy5zdGF0dXM9dGhpcy5HYzt0aGlzLmlkPWUuZ2EoMTApO3RoaXMueGQoYik7dGhpcy5udyhhKX0sYzpmdW5jdGlvbigpe30sZWE6ZnVuY3Rpb24oKXt0aGlzLlJofHwodGhpcy5SaD0hMCxlLkRlKCkpfSxLZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1MmJlMuS2ImJiFwYSYmKHBhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LEY6ZnVuY3Rpb24oYixhKXt2YXIgZz0hMDtiJiYoZz0hMSk7cmV0dXJuIHRoaXMuaGEoKT8hMToodGhpcy5zdygpLHRoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpLHRoaXMuS2goKSx0aGlzLk9mPSEwLGEmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCksITApfSxzOmZ1bmN0aW9uKGIsCmEpe3RoaXMuaGEoKXx8KHRoaXMuRGIucHVzaChiKSx0aGlzLlphLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxLaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuRGImJjA8dGhpcy5EYi5sZW5ndGgmJih0aGlzLkRiPWUudW5pcXVlKHRoaXMuRGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkRiLmpvaW4oIiwiKSkpO2lmKHRoaXMuWmEpe2Zvcih2YXIgZz0wO2c8dGhpcy5aYS5sZW5ndGg7ZysrKXRoaXMuJGJbdGhpcy5aYVtnXS5yZWFzb25dPT10aGlzLiRiW2JdJiZhLnB1c2godGhpcy5aYVtnXS5kZXRhaWwpLHRoaXMuJGJbdGhpcy5aYVtnXS5yZWFzb25dPHRoaXMuJGJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlphW2ddLmRldGFpbCksYj10aGlzLlphW2ddLnJlYXNvbik7dGhpcy4kYltiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihnPWUudW5pcXVlKGEpLGI9YisiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsCmIsITAsYSl9fSxzejpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9mfSxvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5DZn0sc3c6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkRmfSx0dzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMucm99LFJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5HY30sRmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuQ2Z9LGJ6OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkRmfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5HY30seGQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxudzpmdW5jdGlvbihiKXt0aGlzLkc9Yn0sZ3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxjdTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuZ2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRtPXRoaXMuYVs2XTt0aGlzLmNrPXRoaXMuYVs3XTt0aGlzLnhqPXRoaXMuYVsyXTt0aGlzLmxpPXRoaXMuYVs1XTt0aGlzLkJqPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsyXX1jLmZvPWI7Yi5wcm90b3R5cGU9e0NtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5EbTp0aGlzLmJrKGEpfSxiazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2s6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhqOnRoaXMua2koYSl9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5saTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQmo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYT1jLmZvfHxxYSxpZD1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9aWQuQ20oNCk7KGZ1bmN0aW9uKGMpe2MucWo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuZ2IoYil9LmJpbmQodGhpcykpfSxnYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5OJiZ0aGlzLk4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTsKdmFyIFQ9Yy5xanx8VDsoZnVuY3Rpb24oYyl7Yy5waj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2Q9bnVsbDt0aGlzLmN5PTFFMzt0aGlzLmpoPW51bGw7dGhpcy5weD0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cubGIpYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkYoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Oci5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuQ3MuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5CcyhhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuZnkoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmd5KGIpfS5iaW5kKHRoaXMpKSk7CmIub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLkFzKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5BcShhKX0uYmluZCh0aGlzKSl9LEFxOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkYoKX0sZnk6ZnVuY3Rpb24oYil7dGhpcy5LZHx8KHRoaXMuS2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmh5KGIpfS5iaW5kKHRoaXMpLHRoaXMuY3kpKX0saHk6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2QpO3RoaXMuRigpfSxneTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5LZCl9LEFzOmZ1bmN0aW9uKGIpe3RoaXMuaHooYik7dGhpcy5qaD1uZXcgRGF0ZTt0aGlzLmpoLXRoaXMuenY8dGhpcy5weD90aGlzLkYoKTp0aGlzLm8oKX0sQ3M6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy54ZChuZXcgVChhKSkpOwp0aGlzLkYoKX0sTnI6ZnVuY3Rpb24oKXt9LEJzOmZ1bmN0aW9uKCl7dGhpcy56dj1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLnBqfHxyYTsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLk5hKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5KKGcpfHwodGhpcy5LKGcpLChuZXcgcmEoZyx0aGlzLkcpKS5jKCkpfX10aGlzLkkoKX19fSl9KShjKTt2YXIgc2E9Yy5yanx8c2EsdGE9bmV3IHNhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZ3PXRoaXMuYVsyXTt0aGlzLkN5PQp0aGlzLmFbNV07dGhpcy5tbz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs4XX1jLnltPWI7Yi5wcm90b3R5cGU9e0V3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gdzp0aGlzLkJ5KGEpfSxCeTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3k6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgdWE9Yy55bXx8dWEsamQ9bmV3IHVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9amQuRXcoNCk7KGZ1bmN0aW9uKGMpe2MuUms9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5MYj0hMTt0aGlzLmxnKCk7dGhpcy5uZygpO3RoaXMuQnE9ITF9LGxnOmZ1bmN0aW9uKCl7dGhpcy5MYj0KITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLkxiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlMoYil9LG5nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTGIpe3ZhciBiPXRoaXMuRmEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkxiPSEwKTt0aGlzLlYoYSl9fSxsYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5OJiYoMCx0aGlzLk4pKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCwKY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLk4mJigwLHRoaXMuTikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLk4mJigwLHRoaXMuTikoKX0uYmluZCh0aGlzKSl9LEdlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuQWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkFkKGEpfS5iaW5kKHRoaXMpKX0sQWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsKYS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5IZSYmKDAsdGhpcy5IZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxrYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHZhPWMuUmt8fHZhOyhmdW5jdGlvbihjKXtjLlFrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE06ZnVuY3Rpb24oKXt9LFJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5HYzt0aGlzLmlzUGxheWluZz10aGlzLkljPSExO3RoaXMuVGQ9MTt0aGlzLktjPVtdO3RoaXMuamI9ITF9LGM6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLkljPSExO3RoaXMuVGQ9MTt0aGlzLktjPVtdO3RoaXMuamI9ITE7dGhpcy5nZXRQbGF5ZXIoKTsKdmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlRkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5qYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuamI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuamI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmpiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMuSWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMuS2UoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLiRnJiYKIXRoaXMuaGEoKSYmKHRoaXMuamI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMudSgpKToodGhpcy5zKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy51KCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLlJhKCksdGhpcy5nZXRQbGF5ZXIoKS5CcT0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkucWI7YSYmKGEucmQoKSxhLmNlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLkljPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMuS2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuJGcmJiF0aGlzLmhhKCkmJih0aGlzLmpiPyh0aGlzLnMoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5LYy5pbmRleE9mKGEpJiYKdGhpcy5LYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLmVhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5zKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuS2MubGVuZ3RoPj10aGlzLlRkJiZ0aGlzLnUoKSl9LGN1OmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sdTpmdW5jdGlvbihiKXtiP3RoaXMuaWU/dGhpcy5pZSsrOnRoaXMuaWU9MTp0aGlzLmhlP3RoaXMuaGUrKzp0aGlzLmhlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkNoKGEudmlkZW9UYWcpP2EuTGI/dGhpcy5vKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5JY3x8dGhpcy5pc1BsYXlpbmc/Cih0aGlzLmhlPnRoaXMuaWUmJihiPSExKSx0aGlzLkYoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDUwKTooYS5sZygpLGEubmcoKSxhLkxifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHdhPWMuUWt8fHdhOyhmdW5jdGlvbihjKXtjLlNrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuY3MoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPW5ldyB2YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSihnKXx8dGhpcy54dChnKXx8KHRoaXMuSyhnKSxnPW5ldyB3YShnLHRoaXMuRyksZy5NKCksZy5jKCkpfX10aGlzLkkoKX19LG16OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LApjczpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUubmIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHhhPWMuU2t8fHhhLHlhPW5ldyB4YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dT10aGlzLmFbNV07dGhpcy5keD10aGlzLmFbOV07dGhpcy5PcD10aGlzLmFbOV07dGhpcy51bT10aGlzLmFbOF07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5jcD10aGlzLmFbOF07dGhpcy51cj10aGlzLmFbMV07dGhpcy5JdD10aGlzLmFbNl07dGhpcy5vbT10aGlzLmFbNV07dGhpcy4kcz10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs0XX1jLnZvPWI7Yi5wcm90b3R5cGU9e3V1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52dTp0aGlzLmN4KGEpfSxjeDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZHg6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5PcDp0aGlzLnRtKGEpfSx0bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW06dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmZsOnRoaXMuYnAoYSl9LGJwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5jcDp0aGlzLnRyKGEpfSx0cjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudXI6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkl0OnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vbTp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHM6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6YT1jLnZvfHx6YSxrZD1uZXcgemEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT0Ka2QudXUoNCk7KGZ1bmN0aW9uKGMpe2MuYW89bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb19pZCk7dGhpcy5TKGIpO3ZhciBiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0sYT10aGlzLmdldFJhd1BsYXllcigpO2ImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlYoYik6dGhpcy5JKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlhPWkNPTSJ9fSl9KShjKTsKdmFyIEFhPWMuYW98fEFhOyhmdW5jdGlvbihjKXtjLiRuPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IudHJhY2tlci52YXN0X3ByZXJvbGx8fGIudHJhY2tlci52YXN0X3Bvc3Ryb2xsP3RoaXMubygpOih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLnUoKSl9LHU6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMuRigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEJhPWMuJG58fEJhOyhmdW5jdGlvbihjKXtjLmJvPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzJiYKMDxlLk5hKHdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcykpe3ZhciBiPXdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YlthXTtpZihnLmNvbnRyb2xzJiZnLmNvbnRyb2xzLnBsYXllcilnPW5ldyBBYShnKSx0aGlzLkooZyl8fCh0aGlzLksoZyksKG5ldyBCYShnLHRoaXMuRykpLmMoKSk7ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19KX0pKGMpO3ZhciBDYT1jLmJvfHxDYSxEYT1uZXcgQ2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRmk9dGhpcy5hWzRdO3RoaXMuSWs9dGhpcy5hWzVdO3RoaXMuRHU9dGhpcy5hWzhdO3RoaXMuWnE9dGhpcy5hWzRdO3RoaXMuVW09dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbNl19Yy5Laz1iO2IucHJvdG90eXBlPQp7RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZpOnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jazp0aGlzLkN1KGEpfSxDdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkR1OnRoaXMuWXEoYSl9LFlxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5acTp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBFYT1jLktrfHxFYSxsZD1uZXcgRWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1sZC5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5Gbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPQpiLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5WKGIpOnRoaXMuZmEoKSk6dGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuZ2IoYil9LmJpbmQodGhpcykpfSxnYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5OJiZ0aGlzLk4oKX0sbWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGcpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciBGYT1jLkZufHxGYTsoZnVuY3Rpb24oYyl7Yy5Fbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5XPXRoaXMuV3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnFhPXRoaXMudGM9dGhpcy54YT10aGlzLlFjPSExO3RoaXMucGg9ZS51YigxMCk7dGhpcy5RaD0hMDt0aGlzLmVjPXRoaXMuSmc9ITE7dGhpcy5laCgpO3RoaXMua3EoKTt0aGlzLlFhKCl9LEF6OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5vYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5aLCI7Iix0eXBlb2YgYi5aLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlo/Yi5aLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5aP3R5cGVvZiBiLlouc3RhdGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuUiwiOyIsdHlwZW9mIGIuUiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLlI/Yi5SLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuRGE6InVuZGVmaW5lZFgiLAoiOyIsYi5SP3R5cGVvZiBiLlIuRGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLkRhP2IuaW1hLkRhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuRGE/dHlwZW9mIGIuaW1hLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuUiYmYi5SLkRhP2IuUi5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5SJiZiLlIuRGE/dHlwZW9mIGIuUi5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5QZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5QZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuUj9iLlIuUGQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5QZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsCiI7IixiLmltYT9iLmltYS5RZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5RZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlFkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuUWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEudmE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEudmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuUj9iLlIudmE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi52YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuV2Q6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuV2Q6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLldkOgoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLldkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMucGgpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sSGI6ZnVuY3Rpb24oKXtpZighdGhpcy52YSl7dmFyIGI9dGhpcy5wYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudmE9CmIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnZhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnZhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnZhfSx5ZzpmdW5jdGlvbigpe2lmKCF0aGlzLnRjKXt2YXIgYj10aGlzLnBiKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMudGM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLnRjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMudGN9LHZ0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuSWcpe3ZhciBiPXRoaXMucGIoKSxhPXRoaXMudXQoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLklnPSEwKX1yZXR1cm4gdGhpcy5JZ30sdXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwohdGhpcy5RYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuUWM9ITApO3JldHVybiB0aGlzLlFjfSxRYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLlVlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcyksCjIwKX0sVWU6ZnVuY3Rpb24oKXt0aGlzLmVjPSEwO3ZhciBiPXRoaXMueWcoKTtpZihifHx0aGlzLmhhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5zKCJhZGVycm9yIiwKdGhpcy5XKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5QYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuZmM9ITA7aWYoZS5zYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5mY3x8KHRoaXMucygiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcyksCjIwKX0sbHo6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmFnJiZiLmFkcyYmKHRoaXMuYWc9Yi5hZHMpO3JldHVybiB0aGlzLmFnfSxrcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLmFhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLmFhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMuYWEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLmFhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubygpO3RoaXMuS2UoKX0uYmluZCh0aGlzKSl9LGRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy55ZygpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSw1MCl9LGVoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLnZ0KCkpe3ZhciBhPXRoaXMucGIoKSxnPXRoaXMuSGIoKTthJiZnJiYodGhpcy5wYigpLHRoaXMuSGIoKSx0aGlzLmVjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWM/dGhpcy5vKCk6KHRoaXMuYWEoITApLHRoaXMucygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLnBiKCl9ZWxzZSB0aGlzLkpnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGIoKSxiPXRoaXMuSGIoKTthJiYhYj8odGhpcy5zKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmFhKCkpOih0aGlzLmFhKCEwKSx0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5KZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVoKCl9LmJpbmQodGhpcyksNTApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LGxxOmZ1bmN0aW9uKCl7dGhpcy5rY3x8KHRoaXMua2M9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLmtjIT1iLmFkcy5zdGF0ZSYmKHRoaXMua2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLmtjKXt0aGlzLm8oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMua2M9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxxKCl9LmJpbmQodGhpcyksMTApfSx5YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpezA8PWUuZmQoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuVz90aGlzLnUoITApOih0aGlzLnFhPSEwLHRoaXMubygiZW1wdHkgdmFzdCIpKX0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMubygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuUWg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5GKHRoaXMuUWgsZnVuY3Rpb24oKXt0aGlzLmRnKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApxcTpmdW5jdGlvbigpe3RoaXMudnp8fCgxMDx0aGlzLmR5Pyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuZHkrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy4kdigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xcSgpfS5iaW5kKHRoaXMpLDUwKSkpfSwkdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5leSl7dGhpcy5leT0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5hYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBHYT1jLkVufHxHYTsoZnVuY3Rpb24oYyl7Yy5Hbj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApjOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuRGgod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLkRoKGJbZ10pfWNhdGNoKGQpe310aGlzLkkoKX19LERoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuTmEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgRmEoYltnXSksYS5tYXx8dGhpcy5KKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLksoYSksKG5ldyBHYShhLHRoaXMuRykpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy55Yj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy55Yyl9fSl9KShjKTt2YXIgSGE9Yy5Hbnx8SGEsSWE9bmV3IEhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk54PXRoaXMuYVs5XTt0aGlzLiR1PXRoaXMuYVszXTt0aGlzLkdrPXRoaXMuYVs4XTt0aGlzLnhxPXRoaXMuYVs4XTt0aGlzLldqPXRoaXMuYVs2XTt0aGlzLkp1PXRoaXMuYVs5XTt0aGlzLlJpPXRoaXMuYVsxMF07dGhpcy5Ldz10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs4XX1jLnR2PWI7Yi5wcm90b3R5cGU9e014OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTng6dGhpcy5adShhKX0sWnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR1OnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Hazp0aGlzLndxKGEpfSx3cTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnhxOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Xajp0aGlzLkl1KGEpfSxJdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSnU6dGhpcy5RaShhKX0sUWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJpOnRoaXMuSncoYSl9LEp3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS3c6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBKYT1jLnR2fHxKYSxtZD1uZXcgSmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1tZC5NeCg0KTsoZnVuY3Rpb24oYyl7Yy5ibj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5nZXRQbGF5ZXIoKS5pZCk7CmIuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlYoYSl9LGxhOmZ1bmN0aW9uKCl7fSxnYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksZz1iLmdldER1cmF0aW9uKCk7YSYmMDxhJiZnJiYwPGcmJmE+PWctMiYmdGhpcy5OJiYidW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkKCkmJnRoaXMuTigpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBhdXNlKCk6Yi5pc1BhdXNlZCgpfHxiLmdldFBsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQYXVzZWQoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGxheSgpOgpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT0xMDAqYi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgS2E9Yy5ibnx8S2E7KGZ1bmN0aW9uKGMpe2MuYW49dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuSWI9bnVsbDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGI9ITE7dGhpcy5yaCgpO2lmKGIuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGIuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgYT0KYi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5YYj0hMCx0aGlzLm8oKTt0aGlzLnMoImFkZXJyb3IiLGEpO2IuZ2V0UGxheWVyKCk7Yi5nZXRQbGF5ZXIoKTt0aGlzLlZjKCl9fWVsc2UiZmxhc2giPT1iLnBsYXllcl90eXBlP3RoaXMuV2YoKTp0aGlzLm8oKX0sVmM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuaGEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmdldFBsYXllcigpO2lmKCJwbGF5aW5nIj09YS5nZXRQbGF5ZXIoKS5zdGF0ZSlpZihhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBnPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7CmEuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLlhiPSEwLHRoaXMubygpO3RoaXMucygiYWRlcnJvciIsZyk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7dGhpcy5YYj90aGlzLmVhKCk6Yj9hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlP3RoaXMuRigxMDEyIT1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlKTphLmdldFBsYXllcigpLmFkc19sb2FkZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZjKCEwKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuRighMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZjKCEwKX0uYmluZCh0aGlzKSwxMDApfX1lbHNlIHRoaXMubygpO2Vsc2UgYS5nZXRQbGF5ZXIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlZjLmJpbmQodGhpcyksCjEwMCl9fSxXZjpmdW5jdGlvbigpe2lmKCF0aGlzLmhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkliKSx0aGlzLm8oKSk7ImZpcnN0UXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuSWIpLHRoaXMubygpKTsibWlkcG9pbnQiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuSWIpLHRoaXMubygpKTsidGhpcmRRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5JYiksdGhpcy5vKCkpOyJhZExvYWRpbmdFcnJvciI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmbnVsbD09dGhpcy5JYiYmKHRoaXMuSWI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhifHwKKHRoaXMucygiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy5GKCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2YuYmluZCh0aGlzKSw1MCl9fSxyaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7Yi5hZHNfbG9hZGVyP2IuYWRzX2xvYWRlciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YS5nZXRFcnJvcigpO2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKTtpZigxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKSl0aGlzLlhiPSEwLHRoaXMubygpOzkwMT09YS5nZXRFcnJvckNvZGUoKSYmCnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmgoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTGE9Yy5hbnx8TGE7KGZ1bmN0aW9uKGMpe2MuY249dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiZ2aWRlby5nZXRQbGF5ZXImJnZpZGVvLmdldFBsYXllcigpJiYodmlkZW8uZ2V0UGxheWVyKCkuZWx8fCJmbGFzaCI9PXZpZGVvLnBsYXllcl90eXBlKSl7dmFyIGI9bmV3IEthKHZpZGVvKTt0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBMYShiLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWE9Yy5jbnx8TWEsTmE9bmV3IE1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklyPXRoaXMuYVs3XTt0aGlzLnZzPXRoaXMuYVsxXTt0aGlzLnZwPQp0aGlzLmFbN107dGhpcy5Tbj10aGlzLmFbM107dGhpcy5HbD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsxMF19Yy5Xbz1iO2IucHJvdG90eXBlPXtIcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSXI6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZzOnRoaXMudXAoYSl9LHVwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52cDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU246dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgT2E9Yy5Xb3x8T2EsbmQ9bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9bmQuSHIoNCk7KGZ1bmN0aW9uKGMpe2MuWm09Cm4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmVsXzthfHwoImZ1bmN0aW9uIj09dHlwZW9mIGIuZWw/YT1iLmVsKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGIuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQoKSkpKTt0aGlzLlMoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJihiPWJbMF0pO3RoaXMuVihiKX0sZ2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuTiYmdGhpcy5OKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmKGE9Yi5wYXVzZWQoKSk7YXx8Yi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMTsiZnVuY3Rpb24iPT10eXBlb2YgYi5wYXVzZWQmJihhPWIucGF1c2VkKCkpO2EmJmIucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUyIn0sa2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5tdXRlZCYmImZ1bmN0aW9uIj09dHlwZW9mIGEubXV0ZWQmJihiPWEubXV0ZWQoKSk7cmV0dXJuIGJ9LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExO2Iudm9sdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgYi52b2x1bWUmJihhPTEwMCpiLnZvbHVtZSgpKTtyZXR1cm4gYX0sVWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9fSl9KShjKTt2YXIgUGE9Yy5abXx8UGE7KGZ1bmN0aW9uKGMpe2MuWW09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuVmYoKTtiLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwO3RoaXMueG98fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoInRpbWV1cGRhdGUiKTt0aGlzLkYoITApfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9GSVJTVF9RVUFSVElMRSIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX01JRFBPSU5UIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfVEhJUkRfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLnMoImFkc2Vycm9yIik7dGhpcy56cyhhKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LAp6czpmdW5jdGlvbihiKXt2YXIgYT05OTk5OTk7aWYoYi5kYXRhJiZiLmRhdGEuQWRFcnJvcilmb3IodmFyIGcgaW4gYi5kYXRhLkFkRXJyb3IpYi5kYXRhLkFkRXJyb3IuaGFzT3duUHJvcGVydHkoZykmJiJudW1iZXIiPT10eXBlb2YgYi5kYXRhLkFkRXJyb3JbZ10mJihhPWIuZGF0YS5BZEVycm9yW2ddLHRoaXMucyhhKSk7OTAxPT1hP3RoaXMubygpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLlhiPSEwLHRoaXMubygpLHRoaXMuZWEoKSk6dGhpcy5GKCl9LFZmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkcyYmYi5hZHMuaXNBZFBsYXlpbmcmJmIuYWRzLmlzQWRQbGF5aW5nKCk/KHRoaXMueG89ITAsdGhpcy5vKCkpOnRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5WZi5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZz8KdGhpcy5GKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgUWE9Yy5ZbXx8UWE7KGZ1bmN0aW9uKGMpe2MuJG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllckZyYW1ld29yayYmd2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlJiYiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKXt2YXIgYj13aW5kb3cucGxheWVyRnJhbWV3b3JrLmdldEJhc2UoKTtpZihiJiZiLmdldEFsbFBsYXllcnMmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFsbFBsYXllcnMpaWYoKGI9Yi5nZXRBbGxQbGF5ZXJzKCkpJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9bmV3IFBhKGJbYV0pO3RoaXMuSihnKXx8KHRoaXMuSyhnKSwobmV3IFFhKGcsdGhpcy5HKSkuYygpKX1lbHNlIHRoaXMuSSgpfWVsc2UgdGhpcy5WZSgpLAp0aGlzLkkoKX19KX0pKGMpO3ZhciBSYT1jLiRtfHxSYSxTYT1uZXcgUmEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzldO3RoaXMuemk9dGhpcy5hWzhdO3RoaXMuUXM9dGhpcy5hWzddO3RoaXMudHA9dGhpcy5hWzZdO3RoaXMuTXQ9dGhpcy5hWzRdO3RoaXMueXU9dGhpcy5hWzZdO3RoaXMucHU9dGhpcy5hWzRdO3RoaXMuTnM9dGhpcy5hWzddO3RoaXMua3Y9dGhpcy5hWzEwXTt0aGlzLkd4PXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsxMF19Yy5Obz1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTW06dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnppOnRoaXMuUHMoYSl9LFBzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Rczp0aGlzLnNwKGEpfSxzcDpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLnRwOnRoaXMuTHQoYSl9LEx0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NdDp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5vdShhKX0sb3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnB1OnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnM6dGhpcy5qdihhKX0sanY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmt2OnRoaXMuRngoYSl9LEZ4OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5HeDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIFRhPWMuTm98fFRhLG9kPW5ldyBUYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPW9kLkxtKDQpOyhmdW5jdGlvbihjKXtjLk1pPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsCmEpe3RoaXMuaShiKTt0aGlzLmRoPWF9LE06ZnVuY3Rpb24oKXt9LEVlOmZ1bmN0aW9uKGIpe3RoaXMuZGg9YjtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGgpLnBhcmVudE5vZGU7dGhpcy5TKGIpO3RoaXMuVihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIFVhPWMuTWl8fFVhOyhmdW5jdGlvbihjKXtjLkxpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmkoYixhKX0sRWU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTsKdmFyIGI9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUiksYT10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuQURWRVJUSVNJTkcpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuQkVHSU4sZnVuY3Rpb24oKXt0aGlzLnMoImNvbnRlbnRwbGF5Iik7dGhpcy5GKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMucygiY29udGVudHBsYXkiKTt0aGlzLkYoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBWYT1jLkxpfHxWYTsoZnVuY3Rpb24oYyl7Yy5OaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPQpicmlnaHRjb3ZlLmV4cGVyaWVuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1icmlnaHRjb3ZlLmdldEV4cGVyaWVuY2UoYSksZD0hMTtnJiYoZD1nLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUikpO2lmKGcmJmQmJmQuaXNQbGF5ZXJEZWZpbmVkKCkpZD1uZXcgVWEoZCxhKSx0aGlzLkooZCl8fChkLkVlKGEpLHRoaXMuSyhkKSxkPW5ldyBWYShkLHRoaXMuRyxnKSxkLkVlKGcpLGQuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFdhPWMuTml8fFdhLFhhPW5ldyBXYShpYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTHg9dGhpcy5hWzJdO3RoaXMuWXU9dGhpcy5hWzJdO3RoaXMuVXM9dGhpcy5hWzJdO3RoaXMuUXE9dGhpcy5hWzhdO3RoaXMuUnU9dGhpcy5hWzZdO3RoaXMuemo9dGhpcy5hWzddOwp0aGlzLmw9dGhpcy5hWzddfWMuZHU9YjtiLnByb3RvdHlwZT17S3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MeDp0aGlzLlh1KGEpfSxYdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWXU6dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuUHEoYSl9LFBxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5RcTp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnU6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnpqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgWWE9Yy5kdXx8WWEscGQ9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9cGQuS3goNCk7KGZ1bmN0aW9uKGMpe2MueGw9Cm4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLlMoYik7dGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sUGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sUDpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTsKdmFyIFphPWMueGx8fFphOyhmdW5jdGlvbihjKXtjLndsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlBhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMuSmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLkpjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLkpjKCl9LmJpbmQodGhpcykpKTp0aGlzLkpjKCl9LEpjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubygpOih0aGlzLnMoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksCjIwMCl9fSl9KShjKTt2YXIgJGE9Yy53bHx8JGE7KGZ1bmN0aW9uKGMpe2MueWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBaYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3ICRhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBhYj1jLnlsfHxhYixiYj1uZXcgYWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMueGs9dGhpcy5hWzFdO3RoaXMuQXI9dGhpcy5hWzFdO3RoaXMub3Y9dGhpcy5hWzhdO3RoaXMuUnQ9dGhpcy5hWzldO3RoaXMuWHE9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNV19Yy5Ybz1iO2IucHJvdG90eXBlPQp7cXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ0OnRoaXMud2soYSl9LHdrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54azp0aGlzLnpyKGEpfSx6cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXI6dGhpcy5udihhKX0sbnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm92OnRoaXMuUXQoYSl9LFF0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5SdDp0aGlzLldxKGEpfSxXcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWHE6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBjYj1jLlhvfHxjYixxZD1uZXcgY2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1xZC5xdCg0KTsoZnVuY3Rpb24oYyl7Yy5kbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLk1lPQowO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZmEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlYoYik6dGhpcy5mYSgpfSxBdjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnFiLGc9dGhpcy5vYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5LYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5yZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuTWU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/Cih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sVWE6ZnVuY3Rpb24oKXt0aGlzLk1lKys7aWYoMTA8dGhpcy5NZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSwKd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LApQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxsYTpmdW5jdGlvbigpe30sZ2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5OJiZ0aGlzLk4oKX19KX0pKGMpO3ZhciBkYj1jLmRtfHxkYjsoZnVuY3Rpb24oYyl7Yy5jbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLmtlKWlmKHRoaXMucmJ8fCh0aGlzLnJiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMucmIrKywxNTx0aGlzLnJiKXRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMua2U9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMueWEoKXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5XKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApfX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHwKNDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlc9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5XPXRoaXMuV3x8ITE7dGhpcy54YSgpO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50JiYhdGhpcy5Mcj8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5XKTt0aGlzLnUoKX0uYmluZCh0aGlzKSksdGhpcy5Mcj0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuQXYoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIGViPWMuY218fGViOyhmdW5jdGlvbihjKXtjLmVtPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLklhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IGRiKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLm1hfHx0aGlzLkooYSl8fCh0aGlzLksoYSksKG5ldyBlYihhLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgZmI9Yy5lbXx8ZmIsZ2I9bmV3IGZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5GcD10aGlzLmFbMl07dGhpcy5ldj10aGlzLmFbNl07dGhpcy5Vaz10aGlzLmFbNl07dGhpcy5Naj10aGlzLmFbMV07dGhpcy5Qdj10aGlzLmFbNV07dGhpcy5GdT10aGlzLmFbMl07dGhpcy5Jcz10aGlzLmFbMl07dGhpcy5rcj10aGlzLmFbMTBdO3RoaXMuVHk9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMl19Yy5FbT1iO2IucHJvdG90eXBlPXtFcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnA6dGhpcy5kdihhKX0sZHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ldjp0aGlzLlRrKGEpfSxUazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVWs6dGhpcy5MaihhKX0sTGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1qOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Qdjp0aGlzLkV1KGEpfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRnU6dGhpcy5IcyhhKX0sSHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5Jczp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua3I6dGhpcy5TeShhKX0sU3k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlR5OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgaGI9Yy5FbXx8aGIscmQ9bmV3IGhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9cmQuRXAoNCk7KGZ1bmN0aW9uKGMpe2MubGs9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYi5lbGVtZW50KTt0aGlzLlYoYi5lbGVtZW50KX0sUGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSwKa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIGliPWMubGt8fGliOyhmdW5jdGlvbihjKXtjLmtrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkYoKX19KX0pKGMpO3ZhciBqYj1jLmtrfHxqYjsoZnVuY3Rpb24oYyl7Yy5taz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsCmZ1bmN0aW9uKGIpe2I9bmV3IGliKGIuZGV0YWlsKTtiLm1hfHx0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBqYihiLHRoaXMuRykpLmMoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGtiPWMubWt8fGtiLG1iPW5ldyBrYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncj10aGlzLmFbN107dGhpcy5QeD10aGlzLmFbMV07dGhpcy5Sdj10aGlzLmFbN107dGhpcy51bz10aGlzLmFbMV07dGhpcy5ocD10aGlzLmFbN107dGhpcy5waT10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs4XX1jLkJyPWI7Yi5wcm90b3R5cGU9e2ZyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3I6dGhpcy5PeChhKX0sT3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5QeDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUnY6dGhpcy50byhhKX0sdG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy51bzp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaHA6dGhpcy5vaShhKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnBpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgbmI9Yy5Ccnx8bmIsc2Q9bmV3IG5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9c2QuZnIoNCk7KGZ1bmN0aW9uKGMpe2MuTWs9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUudmcoYiwiZWxlbWVudElEIik7dGhpcy5saD1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Cmcuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLmxoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToiYWZ0ZXIiPT10aGlzLmxoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYSk7dGhpcy5TKGcpO3RoaXMuVihnKTt0aGlzLmJkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5iZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYmQpfSxrYTpmdW5jdGlvbigpe3JldHVybiEwfSxwcTpmdW5jdGlvbigpe2UuUGcodGhpcy5iZCk7ZS51ZSh0aGlzLmJkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucHEoKX0uYmluZCh0aGlzKSwKNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgb2I9Yy5Na3x8b2I7KGZ1bmN0aW9uKGMpe2MuTGs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkYoITApfX0pfSkoYyk7dmFyIHBiPWMuTGt8fHBiOyhmdW5jdGlvbihjKXtjLk5rPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSWE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLnZnKGIsImVsZW1lbnRJRCIpO2UuUGcoYSkmJihiPW5ldyBvYihiKSx0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBwYihiLHRoaXMuRykpLmMoKSkpO3RoaXMueWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMueWI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBxYj1jLk5rfHxxYixyYj1uZXcgcWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnU9dGhpcy5hWzFdO3RoaXMuVnk9dGhpcy5hWzldO3RoaXMuRHc9dGhpcy5hWzhdO3RoaXMudm49dGhpcy5hWzddO3RoaXMubD10aGlzLmFbN119Yy5hcT1iO2IucHJvdG90eXBlPXtNdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTnU6dGhpcy5VeShhKX0sVXk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZ5OnRoaXMuQ3coYSl9LEN3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Edzp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudm46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBzYj1jLmFxfHxzYix0ZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9dGQuTXUoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnRrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LG93OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sRm86ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHg9Yy50a3x8eDsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGcsZCxjKXt0aGlzLlhhPWE7dGhpcy5wZz10aGlzLmFpPSExO3RoaXMuZmg9ZDt0aGlzLkVoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLlhhPW5ldyB4KGEpKTsKdmFyIGU9dGhpcy5CYj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9ZS5yZWFkeVN0YXRlfHwyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzfHxnKGUpO2lmKGQmJjQ9PWUucmVhZHlTdGF0ZSYmMjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1cylkKGUpO2Vsc2UgaWYoND09ZS5yZWFkeVN0YXRlJiYwPT1lLnN0YXR1cyYmbCYmbC55ZSh0aGlzLlhhLnVybCkmJmwuRmQpe3ZhciBoPW5ldyB4KGEudXJsKTtoLm93KCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwubmEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLm5hKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT0KZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMudWs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMucGcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkVoP3RoaXMuQmIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5CYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLmFpfHwodGhpcy5CYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuQmIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksdGhpcy5CYi5zZW5kKGEpfWNhdGNoKGMpe2wmJmwueWUodGhpcy5YYS51cmwpPwpsLkZkP2wubmEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwueWUodGhpcy5YYS51cmwpLHRoaXMuZmgmJnRoaXMuZmgoKX1yZXR1cm4gdGhpcy5CYn19fSkoYyk7dmFyIHRiPWMudWt8fHRiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zYT0hMTt0aGlzLmhjPSIiO3RoaXMuWGQ9dGhpcy5nYz10aGlzLmtiPW51bGw7dGhpcy5KcT10aGlzLndiPXRoaXMuVmc9ITE7dGhpcy5HYT0iIjt0aGlzLlJnPSExO3RoaXMuQ2E9dGhpcy5oZD0iIjt0aGlzLk5nPXRoaXMuYmE9dGhpcy5pc0VuYWJsZWQ9dGhpcy5TZT0hMTt0aGlzLkFhPVtdO3RoaXMuRWc9dGhpcy5SYj0iIjt0aGlzLmdlPSExO3RoaXMuZ2Y9MDt0aGlzLnhmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMudmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLkNiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5GYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy53Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuVGI9IiI7dGhpcy54Yj1bXTt0aGlzLlViPVtdO3RoaXMuU2I9IiI7dGhpcy5oZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnJlPSExO3RoaXMucnE9dGhpcy5HZD1udWxsO3RoaXMuQWg9dGhpcy5EYz10aGlzLmhnPXRoaXMubWY9dGhpcy5GZD10aGlzLllkPXRoaXMuSGM9ITE7dGhpcy4kYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5rZD0wO3RoaXMuR2c9ITE7dGhpcy5GZz0xRTN9Yy52az1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5zYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLmhjLGFkdGFnbW9kaWZpZXI6dGhpcy5rYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuZ2MsYWR0YWdyZWdleDp0aGlzLlhkLGpzcG9wdXBzOnRoaXMuVmcsCnNpZGVsb2Fkczp0aGlzLndiLGRpc2FibGV0ZXN0czp0aGlzLkpxLGhvbWFkQWxpYXM6dGhpcy5HYSxpc0luaXRpYWxpemVkOnRoaXMuUmcsZ2xvYmFsQ29uZmlnOnRoaXMuaGQsY2xpZW50Q29uZmlnOnRoaXMuQ2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5iYSxpc0Jsb2NrZWQ6dGhpcy5OZyxzZXJ2ZXI6dGhpcy5BYSxzdm1Db25maWc6dGhpcy5SYixob21hZEFkcGF0aDp0aGlzLkVnLGRpc2FibGVDb29raWVUZXN0OnRoaXMuZ2UsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuZ2YsSE9NQURfVkVSSUZJRUQ6dGhpcy54ZixIT01BRF9CTE9DS0VEOnRoaXMudmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuQ2IsSE9NQURfQURCTE9DS0VSOnRoaXMuRmMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLndmLHRlc3RIaWRlOnRoaXMuVGIsdGVzdFRhZ3M6dGhpcy54Yix0ZXN0VGFnc0pTOnRoaXMuVWIsdGVzdENvb2tpZTp0aGlzLlNiLHRocm90dGxlOnRoaXMuaGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsCmhvbWFkVGVzdGVkOnRoaXMucmUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5ycSxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5ZZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5GZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5tZixjb25maWdGYWlsdXJlczp0aGlzLiRhLHNpdGVDb25maWc6dGhpcy5RYixzZXJ2ZXJJZDp0aGlzLnZoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5uYyx2cGFpZDp0aGlzLkRjLHNraXBBbGxvd2VkOnRoaXMuQWgsdm1hcHM6dGhpcy5XaH19LEVzOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLiRhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuJGFbYl0mJjE9PXRoaXMuJGFbYl0mJihhPSEwKTtyZXR1cm4gYX0sWGU6ZnVuY3Rpb24oYSl7dGhpcy4kYVthXT0hMH0sZHM6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuJGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy4kYVtiXSYmCjE9PXRoaXMuJGFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sRGQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMudWIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5NcChhKX0sd2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLGU9IiIsaD0iIixrPSIiO2lmKCF0aGlzLnNhJiYhYilyZXR1cm4gbmV3IHgoYSk7Yz10aGlzLnhlKGEpO2U9dGhpcy56YShhKTtjPwoodGhpcy52YygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy52ZCgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLmhjfHx0aGlzLmtifHx0aGlzLmdjfHx0aGlzLlhkKSYmKGs9dGhpcy5udShrKSk7YT1uZXcgeChoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmZzKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLm5iKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0seGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsKKGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy52YygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sdmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQWEmJnRoaXMuQWEubGVuZ3RoJiYwPHRoaXMuQWEubGVuZ3RoJiYoYj10aGlzLkFhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LHllOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMueGUoYSk7cmV0dXJuIGJ9LGZzOmZ1bmN0aW9uKGEpe3ZhciBiPQoiIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuR2EmJjA8dGhpcy5HYS5sZW5ndGgpcmV0dXJuIHRoaXMuR2E7Zm9yKGQgaW4gdGhpcy5HYSlpZihiPXRoaXMuR2FbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5nejtyZXR1cm4ibm9uZSJ9LGxkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQWFbdGhpcy52aF19LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZCgpLGI9dGhpcy56aCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxhaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spOwpyZXR1cm4gYn0sbXU6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLnphKGEpLGM9IiIsYz0iIixoO2ZvcihoIGluIGIpe2lmKGJbaF0uc3VidmFsdWVzKXtmb3IodmFyIEI9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbaF0pLnNwbGl0KCImIiksYz17fSxrPTA7azxCLmxlbmd0aDtrKyspe3ZhciByPUJba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5haChjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pO0I9W107Zm9yKGwgaW4gYylCLnB1c2gobCsiPSIrY1tsXSk7Yz1CPWVuY29kZVVSSUNvbXBvbmVudChCLmpvaW4oIiYiKSl9ZWxzZSBjPXRoaXMuYWgoZC5xdWVyeUtleVtoXSxoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31sPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbC5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxudTpmdW5jdGlvbihhKXt0aGlzLmhjJiYKKGErPXRoaXMuaGMpO2lmKHRoaXMua2IpZm9yKHZhciBiIGluIHRoaXMua2IpdGhpcy5rYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5rYltiXSkpO3RoaXMuZ2MmJihhPXRoaXMubXUoYSx0aGlzLmdjKSk7cmV0dXJuIGF9LGY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLlJnPSEwO3RoaXMuaGQ9YTt0aGlzLkNhPWI7dGhpcy5TZT1kO3RoaXMuR2Q9Yzt0aGlzLmxjPWU7dGhpcy5RYj1ofHx7fTt0aGlzLlp0KCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkNhKXRoaXMuWHQoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuQ2EpdHJ5e3RoaXMuQ2E9YigpLHRoaXMuV2MoKX1jYXRjaChrKXt0aGlzLm5hKCJub0NsaWVudENvbmZpZyIpfX0sZmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwKITEpfXJldHVybiBifSxadDpmdW5jdGlvbigpe3RoaXMuSGEobmV3IHgodGhpcy5oZCt0aGlzLk9jKCJnbG9iYWwiKSksdGhpcy53cy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLldjKCl9LmJpbmQodGhpcyksITApfSxYdDpmdW5jdGlvbigpe25ldyB4KHRoaXMuQ2ErdGhpcy5PYygiY2xpZW50IikpO3RoaXMuSGEobmV3IHgodGhpcy5DYSt0aGlzLk9jKCJjbGllbnQiKSksdGhpcy5XYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiY2xpZW50Iik7dGhpcy5uYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sT2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMudWIoKTt0aGlzLlFiJiZ0aGlzLlFiLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5RYiYmdGhpcy5RYi5ub0NhY2hlQnVzdGVyJiYKKGI9IiIpO3JldHVybiBifSxuYTpmdW5jdGlvbihhKXtpZighdGhpcy5ZZCl7dGhpcy5ZZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLmZkKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5sYz0hMSk7dGhpcy5sYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmxjP3RoaXMubGMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuYmE9dGhpcy5OZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy52ZikpO3RoaXMuemIoKTtlLm9jKGsucHYpOyhiPWUuZmQodGhpcy5sZCgpKSl8fChiPWUuZmQoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHdzOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXt2YXIgYj0Ke307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5WYihiLmVuYWJsZWQpO3RoaXMuYmE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5DYXx8dGhpcy5SYnx8dGhpcy5HYXx8dGhpcy5XYygpOih0aGlzLnNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKSx0aGlzLnpiKCkpfX0sV2M6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5DYX1lbHNlIGE9dGhpcy5DYTt0aGlzLmlzRW5hYmxlZD10aGlzLlZiKGEuZW5hYmxlZCk7dGhpcy5iYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5BYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuQWEubGVuZ3RoO2IrKyl0aGlzLkFhW2JdPQp0aGlzLkFhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLlJiPWEuY29uZmlnfHwiIjt0aGlzLkdhPWEuYWxpYXN8fG51bGw7dGhpcy5FZz1hLmFkcGF0aHx8IiI7dGhpcy5nZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLnZoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLkFhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuUmImJnRoaXMuR2EmJnRoaXMuQWEubGVuZ3RoP3RoaXMub2QoITEpOih0aGlzLnNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKSx0aGlzLnpiKCkpfSxvZDpmdW5jdGlvbihhKXtpZighdGhpcy5iYSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHgodGhpcy52ZCgpKSxkPXRoaXMuemEodGhpcy5SYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjsKYi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHgodGhpcy5SYit0aGlzLk9jKCJjdXN0b21lciIpKTt0aGlzLkhhKGIsdGhpcy5Ndy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiY3VzdG9tZXIiKTthP3RoaXMuSW0/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5JbT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2QoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMub2QoITApfS5iaW5kKHRoaXMpLCEwKX19LE13OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fXRoaXMuRmQ9dGhpcy5WYihiLnN0cmljdCk7dGhpcy5tZj10aGlzLlZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLmhnPQpiLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMubmM9dGhpcy5WYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuVmIoYi5lbmFibGVkKTt0aGlzLlRiPWIudGVzdGhpZGV8fCIiO3RoaXMueGI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLlViPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuaGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5rYj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5nYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuWGQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVmc9Yi5qc3BvcHVwc3x8ITE7dGhpcy53Yj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5EYz1iLnZwYWlkfHwhMTt0aGlzLlFiLnZwYWlkPXRoaXMuRGM7dGhpcy5BaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLlRjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5XaD1iLnZtYXBzfHwiIjt0aGlzLlNiPWIudGVzdDNyZHBhcnR5Y29va2llJiYKYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLm9zKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5nZSYmKHRoaXMuU2I9bnVsbCk7dGhpcy5oZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnJlJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5yZT0hMCx0aGlzLm9kKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmt4KCkmJih0aGlzLlRifHx0aGlzLlVifHx0aGlzLnhifHx0aGlzLlNiKT90aGlzLlNlPyh0aGlzLnNhPXRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKSx0aGlzLmFlKCksdGhpcy56YigpKTp0aGlzLlF3KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuUncoKSl9fSxRdzpmdW5jdGlvbigpe3RoaXMuUHcoKTt0aGlzLlN3KCl9LFN3OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciKwphKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Mud2lkdGg9MTtjLmhlaWdodD0xO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7Yy5zcmM9ImFib3V0OmJsYW5rIjt2YXIgaD1lLmdhKDEwKSxCPWUuZ2EoMTApLGs9ZS5nYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoayxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwKIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKTtjLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShrKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShCKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS5uYihhKGgpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGwpe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYyk7aWYoMyE9ZCl7dmFyIGE9ZS5mZSgpOyFhLmlzQ2hyb21lJiYKIWEuaXNGaXJlZm94fHxhLmlzRWRnZXx8ZS5QYSgpfHx0aGlzLm5hKCJjc3BfIitiKTtlLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxSdzpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKTt0aGlzLnpiKCl9LEVkOmZ1bmN0aW9uKGEpe3RoaXMuSGM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9dGhpcy5zYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIoYSkpLHRoaXMuemIoKSx0aGlzLmFlKCkpfSxQdzpmdW5jdGlvbigpe2lmKHRoaXMuVGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuVGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5UYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTsKZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGMpe31hP3RoaXMuRWQodGhpcy5GYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuSWgoKX1lbHNlIHRoaXMuSWgoKX0sSGg6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMudWIoKSk7dGhpcy5WdyhmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuZGYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkVkKHRoaXMuRmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnhiPW51bGwsdGhpcy5kZigpfSxWdzpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmCmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSGEobmV3IHgoYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LEloOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLnViKCkpO3RoaXMuV3coZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLkhoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5FZCh0aGlzLkZjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlViJiZ0aGlzLlViLmxlbmd0aCl7dmFyIGM9dGhpcy5VYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLkhoKCl9LFd3OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmCmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpO2wuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0sZGY6ZnVuY3Rpb24oKXt0aGlzLlNiPyh0aGlzLmdmKyssdGhpcy5IYShuZXcgeCh0aGlzLlNiKSx0aGlzLk93LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuRmgoKX0sZWY6ZnVuY3Rpb24oYSl7dGhpcy5FZCh0aGlzLndmLAoibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LE93OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLmdmP3RoaXMuZGYoKTp0aGlzLmVmKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5GaCgpOnRoaXMuZWYoIkFBQSIpfSxGaDpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKTt0aGlzLnpiKCk7dGhpcy5hZSgpfSx6YjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5QYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLkhjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy54ZikpOwp0aGlzLkdkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuR2QmJnRoaXMuR2QoKX0sb3E6ZnVuY3Rpb24oKXtpZih0aGlzLm1mJiZ0aGlzLkVzKCkpe3ZhciBhPXRoaXMuZHMoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LEtoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSGE6ZnVuY3Rpb24oYSxiLGMsZixoLEIpe3RoaXMua2R8fCh0aGlzLmtkPTApO3RoaXMua2QrKzt0aGlzLmtkPnRoaXMuRmcmJiF0aGlzLkdnJiYodGhpcy5HZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuRmcsITApKTthPW5ldyB0YihhLGIsYyk7ZiYmKGEuYWk9ITApO2gmJmUueXQoKSYmKGEucGc9ITApO0ImJgooYS5FaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxUZjpmdW5jdGlvbigpe2UuUGEoKXx8ZS5UYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7dGhpcy5uYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy52YygpfHwKKGE9dGhpcy56YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMubmEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubmEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LE53OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLldofSxucTpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkhhKGEsdGhpcy5YeC5iaW5kKHRoaXMpLHRoaXMuV3guYmluZCh0aGlzKSl9LFh4OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5HcigpfSxXeDpmdW5jdGlvbigpe30sR3I6ZnVuY3Rpb24oKXtlLm9jKGsuRnIpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMubmEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAphZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLndiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMud2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy53YlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5UYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9bmV3IFI7d2luZG93W2MudWMoKV09dGhpcztlLlRhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LGt4OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuaGZ9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSx1YjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqCk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LFZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LG5iOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGYsZSxoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxmPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSx6aDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCx0PTMyODUzNzc1MjAscCxuLHYsdSx3O3A9YS5sZW5ndGg7dmFyIHg9W107Zm9yKGY9MDtmPHAtMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseC5wdXNoKGUpOwpzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHgucHVzaChmKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gocD4+PjI5KTt4LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT14W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7cD1sO249bTt2PXE7dT10O2ZvcihmPTA7MTk+PWY7ZisrKXc9YyhlLDUpKyhwJm58fnAmdikrdStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztmb3IoZj0yMDszOT49ZjtmKyspdz1jKGUsNSkrKHBebl52KSt1K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9dix2PW4sbj1jKHAsMzApLHA9ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhwJm58cCZ2fG4mdikrdStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXYsdj1uLG49YyhwLDMwKSxwPWUsZT13O2ZvcihmPTYwOzc5Pj1mO2YrKyl3PWMoZSw1KSsocF5uXnYpK3UraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK24mNDI5NDk2NzI5NTtxPXErdiY0Mjk0OTY3Mjk1O3Q9dCt1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYih0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIHViPWMudmt8fHViLGw9bmV3IHViO3dpbmRvdy5yZz1sO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybD10aGlzLmFbMTBdO3RoaXMuSHY9dGhpcy5hWzhdO3RoaXMua2w9dGhpcy5hWzZdO3RoaXMuUGs9dGhpcy5hWzhdO3RoaXMuUGk9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzddO3RoaXMuRHg9dGhpcy5hWzddO3RoaXMuWm89dGhpcy5hWzldO3RoaXMuSWw9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbMl19Yy5TdT1iO2IucHJvdG90eXBlPXtxbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucmw6dGhpcy5HdihhKX0sR3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkh2OnRoaXMuamwoYSl9LGpsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbDp0aGlzLk9rKGEpfSxPazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGs6dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlBpOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuS2k6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhxOnRoaXMuQ3goYSl9LEN4OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5EeDp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWm86dGhpcy5IbChhKX0sSGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgdmI9Yy5TdXx8dmIsdWQ9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9dWQucWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLlA/dGhpcy5WYT1hLm0uUCgpOnRoaXMuVmE9IiI7YS5tLkxnJiZhLm0uTGcoe3BhdXNlOnRoaXMucmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy50aC5iaW5kKHRoaXMpLAptdXRlOnRoaXMuSWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5KeC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmFiO3RoaXMucGxheWVyPXRoaXMuYi5tO3RoaXMuRmI9dGhpcy5SYz0hMTt0aGlzLktwPTFFMzt0aGlzLmphPW51bGw7dGhpcy5UPWI7dGhpcy51YT17fTt0aGlzLnZpZGVvPXt9O3RoaXMuQ2Q9e307dGhpcy5YcD1lLmdhKDEwKTt0aGlzLmFmPTA7dGhpcy5QYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLlBjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5tKSYmdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLlBjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLktvPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuQmQ9ITE7dGhpcy5ZZz1jJiZjLm1heFdyYXBwZXJEZXB0aD8KcGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuZz17fTt0aGlzLk5jPSExO3RoaXMuTmg9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5LYj0hMTt0aGlzLkRxPWUuZ2EoMTApO3RoaXMuTmI9ZS5nYSgxMCk7dGhpcy5NYj1lLmdhKDEwKTt0aGlzLkJoPWUuZ2EoMTApO3RoaXMuY29uZj17fTt0aGlzLm1jPXRoaXMudGI9ITE7dGhpcy5qZT1udWxsO3RoaXMuSmQ9dGhpcy5BYj10aGlzLnRlPXRoaXMuUGU9dGhpcy5iZT10aGlzLiRjPXRoaXMuY2Y9dGhpcy5aYj10aGlzLkxkPXRoaXMuaGg9dGhpcy5jZD10aGlzLnF4PXRoaXMuaWI9ITE7dGhpcy5jYz1bXTt0aGlzLldiPXt9O3RoaXMuamY9ITF9Yy5waz1iO2IucHJvdG90eXBlPXt3aDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlZhXSYmdGhpcy5jb25mW3RoaXMuVmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5WYV1bYV0pOwpyZXR1cm4gYn0sTGg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuT2EmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuVC5IYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLncoay56byx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpfSxDZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5pYj1jO2lmKHRoaXMuVC5iYSl0aGlzLmFmKyssdGhpcy5ULm9xKCksdGhpcy5ULnNhJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLkxoKCksbmV3IFUodGhpcyxhLHRoaXMuWWcse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5EYyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5tLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLm0uZ2V0Q3VycmVudFRpbWUoKX19KSk6CmI/KHRoaXMuTGgoKSxuZXcgVSh0aGlzLGEsdGhpcy5ZZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuVC5EYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLm0uZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIubS5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLkxhKCk7ZWxzZXt2YXIgZj10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkNlKGEsYixjKX0sNTApfX0sTmU6ZnVuY3Rpb24oYSl7dGhpcy5KZD10aGlzLkFiPXRoaXMuY2Q9ITE7dGhpcy5nPWE7dGhpcy53dyh0aGlzLmcpO3RoaXMuQmcoYSk7dGhpcy5jYz10aGlzLnNnKGEpO3RoaXMuV2I9e307dGhpcy5qZj0hMX0sQmc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuQ2Q9dGhpcy5ycyhhKSksdGhpcy5CZyhhLnBhcmVudCkpfSxzZzpmdW5jdGlvbihhKXt2YXIgYz0KW107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLnNnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuWnIoYSkpKTtyZXR1cm4gY30sWnI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlgmJmEuWC5nZXRBdHRyaWJ1dGUpe2I9YS5YLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LHJzOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5YKXtiPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWC5nZXRBdHRyaWJ1dGUoImlkIikmJgooaD1hLlguZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5YLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlguZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5iYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmh9fSxyYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuYWQmJmEuYWQuZXJyb3ImJmEuYWQuZXJyb3IuY29kZSYmKGI9YS5hZC5lcnJvci5jb2RlKSk7CnN3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5FYy5jb2RlOmI9PUQuTmQuY29kZT9lLncoay51eSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpOihlLkRlKCksYj09RC5BZi5jb2RlJiZlLncoay5ydSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKTtlLncoay5Fcix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHcueWYuY29kZTplLncoay5ZeCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHcuQmYuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLncoay5BeSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB3Lk9kLmNvZGU6ZS53KGsuRnksCnRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5NZC5jb2RlOmUudyhrLnN1LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMubWN8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3IudGEmJihjKz0iXyIrYS5lcnJvci50YSk7ZS50cmFjayhjLCIiLCEwKTt0aGlzLkdiKGEpO3RoaXMuTGEoKX0sR2I6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkthLmxlbmd0aDspdHJ5e3ZhciBjPQphLkthLnBvcCgpO3RoaXMuQmUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHd3OmZ1bmN0aW9uKGEpe3RoaXMuYmU9dGhpcy50ZT10aGlzLlBlPSExO3RoaXMudWE9dGhpcy5iLkw7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMudWEuekluZGV4PWI7Yj10aGlzLmIuSDtiLkJ6PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgYyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShjKSYmYi5zZXRBdHRyaWJ1dGUoYyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtjXSk7CnRoaXMuS28mJnRoaXMucGxheWVyLnFjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5xYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5VLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLlVbY10udHlwZSkmJnRoaXMuR28oYixhLlVbY10udXJsKyIiLGEuVVtjXS50eXBlKTt0aGlzLkpoKGIpPyh0aGlzLklvKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuamE9dGhpcy51YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuamEuYXBwZW5kQ2hpbGQoYikpOnRoaXMuZy55cSgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5qYT10aGlzLnVhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5qYS5hcHBlbmRDaGlsZChiKSx0aGlzLnV3KCkpOnRoaXMud2UoKT90aGlzLnloKCk6dGhpcy5nLm9yaWdpbi5pZyh3Lk1kKX0sdXc6ZnVuY3Rpb24oKXt0aGlzLlpiPXRoaXMuTGQ9ITE7dGhpcy5iLm0ua2EmJnRoaXMuYi5tLmthKCkmJihlLncoay4kZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMuWmI9ITApO2UuWWYoKTt0aGlzLmcmJnRoaXMuZy5vcmlnaW4mJnRoaXMuZy5vcmlnaW4uc2YmJmUuSm8odGhpcy5nLm9yaWdpbi5zZik7ZS5ZYSgic2V0VXBWcGFpZCIpO3ZhciBhPXRoaXMuYi5IO3RoaXMuYi5IPUMucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuSCwKYSk7dGhpcy5iLmloKCk7dGhpcy5iLkFjKCk7Zm9yKGE9dGhpcy5iLkw7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5BYygpO3RoaXMuamE9dGhpcy51YT10aGlzLmIuTDt0aGlzLm9mKCJ2cGFpZCIpO3RoaXMuWmImJihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1iKS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsucGQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk7dGhpcy5PPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5PLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5MLmFwcGVuZENoaWxkKHRoaXMuTyk7dGhpcy5PLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5tLmthJiZ0aGlzLmIubS5rYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5nLnRzKCksYz10aGlzLmcuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLndpZHRoKSwKaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLAoxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmVxKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5UKTt0aGlzLk8uc3JjPWE7ZS5WZCgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLkpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmNjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOwoiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLml5KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuankoKSx0aGlzLmIuSmIoITApLCF0aGlzLkFiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkFiPXtlbDp0aGlzLk8sY2I6ZnVuY3Rpb24oKXt0aGlzLkpkPSEwO2UudyhrLlZoLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLnZlKHRoaXMuQWIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmCih0aGlzLmIuSmIoITApLHRoaXMubnkoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLkpiKCEwKSx0aGlzLnJ5KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnB5KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnF5KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuc3koKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMub3koKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuWGgoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGg9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmcuamMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsuWmYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXt2YXIgYT0Kd2luZG93Lm9wZW4oIiIsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGIpe3dpbmRvdy5vcGVuKGgsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLm15KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5VZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt5KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLmx5KCk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5aYj0hMCxiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsucGQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk6KHRoaXMuWmI9ITEsYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay5sZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKSxlLncoay5VZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX19LmJpbmQodGhpcykpO2UuVmQoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuTGEoKX0uYmluZCh0aGlzKSk7ZS5WZCgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5EbyhmdW5jdGlvbihhKXtlLm9hKHRoaXMuTywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LApreTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMudHJhY2soInBhdXNlIik7ZS53KGsuU2QsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLkxkPSEwfSxseTpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuTWMsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLkxkPSExfSxueTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLkxmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LG15OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLktmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LApqeTpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLllhKCJpbXByZXNzaW9uIik7ZS53KGsuR2YsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0scnk6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuWWEoInN0YXJ0Iik7ZS53KGsuTWMsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0scHk6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLkVmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LHF5OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLllhKCJtaWRwb2ludCIpO2UudyhrLklmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSl9LHN5OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5NZix0aGlzLmcuQiwKdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0sb3k6ZnVuY3Rpb24oKXt0aGlzLkhkKCk7ZS5ZYSgiY29tcGxldGUiKX0sWGg6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5ZYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuY2E9ITE7dGhpcy5MYShhKX19LGl5OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2csZj1bXTshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csKGY9Yi5tYXRjaChjKSk/Zi5qb2luJiYoYj1mLmpvaW4oIi0iKSk6Yj1iLnN1YnN0cmluZygwLDIwKSk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIiwKYiwhMCk7ZS5ZYSgiZXJyIixiKTtlLncoay50eSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMuWGgoITApfSxHbzpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpLGY7Zj10aGlzLlQ7Zi5zYSYmZi5pc0VuYWJsZWQmJiFmLnZjKCk/KGY9Zi56YShiKSxmPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpmPWI7Yy5zcmM9ZjtjLm9uZXJyb3I9dGhpcy4keC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sSW86ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuVWguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5wZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucWYuYmluZCh0aGlzKSk7CmEuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuSGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5JZC5iaW5kKHRoaXMpKX0sd2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuVWguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5wZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5IZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLklkLmJpbmQodGhpcykpfSxVaDpmdW5jdGlvbihhKXt0aGlzLkZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmJ8fHRoaXMucGYoYSl9LmJpbmQodGhpcyksdGhpcy5LcCkpfSxwZjpmdW5jdGlvbihhKXtpZighdGhpcy5SYyYmCnRoaXMuSmgodGhpcy52aWRlbykmJiF0aGlzLnRiJiYhdGhpcy5GYil7dGhpcy5SYz0hMDt0cnl7aWYoIWUuUGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMudGJ8fCh0aGlzLnRiPSEwLHRoaXMud2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5ULmhnfHx0aGlzLlQubmEoInZpZGVvLW5vb3AiKSk7dGhpcy5MYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLlp4KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIuQWMoKTt0aGlzLlNoKCk7dGhpcy5vZigpO3RoaXMuUWYoKTt0aGlzLmIuaWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuYmYoKX19LGJmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT0KdGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuT2EpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuamQ9W107Zm9yKHZhciBiPXRoaXMuYi5MLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmpkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuTGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuTGMoKX1lbHNlIHRoaXMuTGMoKX0sTGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5qZClmb3IodmFyIGI9MDtiPHRoaXMuamQubGVuZ3RoO2IrKyl0aGlzLmpkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLiRjfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksCnRoaXMuTGEoKSxlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsYiwhMCkpOih0aGlzLkllKCEwKSx0aGlzLkxjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLnRlJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5QZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLk9iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuT2IuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuT2IuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLk5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5iZigpKX0uYmluZCh0aGlzKTt0aGlzLm1lKCkueGgodGhpcyl9LEhkOmZ1bmN0aW9uKCl7dGhpcy5ULm5jJiYhdGhpcy50YiYmZS50cmFjaygicXVhcnRpbGUiLAoiY29tcGxldGUiLCEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLndvLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy5MYSgpfSxMYTpmdW5jdGlvbihhKXtpZighdGhpcy5iZSlpZih0aGlzLmJlPSEwLHRoaXMuSmR8fChlLncoay53dSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5oYnx8dGhpcy5nLmFjKXt0aGlzLmFmKys7dGhpcy5GYj10aGlzLlJjPSExO3RyeXt0aGlzLndkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudWEucmVtb3ZlQ2hpbGQodGhpcy5qYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5CZD0hMTt0cnl7dGhpcy5iLlBoKCl9Y2F0Y2goaCl7fXRoaXMuY2Y9ITA7dGhpcy5iLnBlKCk7dGhpcy5LYj0KITE7dGhpcy5tZSgpLnNoKCk7dGhpcy5nLmhiJiZ0aGlzLmcub3JpZ2luLkplKCk7dGhpcy5nLmFjJiYoYT90aGlzLmcub3JpZ2luLmJoKCk6dGhpcy5jZSgpKX1lbHNlIHRoaXMuY2UoKX0sJHg6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy53ZCh0aGlzLnZpZGVvKSx0aGlzLndlKCk/dGhpcy55aCgpOnRoaXMuSWQoYSkpfSxJZDpmdW5jdGlvbihhKXt0aGlzLkZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLndlKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1jfHx0aGlzLlQuVGYoKX0uYmluZCh0aGlzKSwKMUUzKTp0aGlzLlQuVGYoKSk7dGhpcy5nLm9yaWdpbi5pZyh3Lk1kKX0scWY6ZnVuY3Rpb24oKXtpZih0aGlzLnF4KXRoaXMuTGEoKTtlbHNle3RoaXMuS2I9ITA7dGhpcy5iLm0uVWEmJiF0aGlzLmNmJiZ0aGlzLmIubS5VYSgpJiZlLncoay5ZYyx0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy54eChhKTtpZighdGhpcy5BYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkFiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5KZD0hMDtlLncoay5WaCx0aGlzLmcuQiwKdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UudmUodGhpcy5BYil9Yz0iIjt0aGlzLmcuJGUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmgpKSYmKGM9dGhpcy5nLiRlLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkJkfHwodGhpcy5CZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5LZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMuZy5oYj8odGhpcy5GYj10aGlzLlJjPSExLHRoaXMud2QodGhpcy52aWRlbyksdGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnVhLnJlbW92ZUNoaWxkKHRoaXMuamEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuQmQ9ITEsdGhpcy5iLlBoKCksdGhpcy5nLm9yaWdpbi5KZSgpKTp0aGlzLkxhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlBjLnJlcGxhY2UoIlt0aW1lXSIsZS5xZyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLk5jPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSx5aDpmdW5jdGlvbigpe3RoaXMubWM9ITA7dGhpcy51YT10aGlzLmIuTDt0aGlzLnVhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy51YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTsKYS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMubXMoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmphPXRoaXMudWEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLkFjKCk7dGhpcy52aWRlbz10aGlzLmphLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy51YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudWEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlRoLmJpbmQodGhpcyk7dGhpcy5qYS5hcHBlbmRDaGlsZChiKTt0aGlzLlNoKCk7dGhpcy5vZigpO3RoaXMuamU9c2V0SW50ZXJ2YWwodGhpcy5tcS5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LG1zOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpbXSxiPXt9LGM9MDtjPHRoaXMuZy5VLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlVbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuVDtoLnNhJiZoLmlzRW5hYmxlZCYmIWgudmMoKSYmKGU9aC56YShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LG1xOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5qZSksdGhpcy5IZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnFmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLmplKSx0aGlzLklkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6CnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LE1oOmZ1bmN0aW9uKCl7dGhpcy5oaHx8KHRoaXMuaGg9ITAsdGhpcy5jZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh4OmZ1bmN0aW9uKGEpe2UudyhrLlVkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7YT09dGhpcy5OaHx8dGhpcy50Ynx8KDA9PWEmJih0aGlzLmliJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmliKSx0aGlzLmliPSExKSx0aGlzLlBlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLnRlPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLk1oKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpKSwKdGhpcy5tYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMudGJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlBhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLncoay5HZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLGUudyhrLkxmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksdGhpcy5tYyYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5ULm5jJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5jZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLkVmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5uYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS53KGsuSWYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuVC5uYyYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudyhrLk1mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpLHRoaXMuTmg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMudGIpe3RyeXtpZih0aGlzLldiW2FdPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuV2IuaW1wcmVzc2lvbiYmdGhpcy5XYi5jb21wbGV0ZSYmIXRoaXMuamYpe3RoaXMuamY9ITA7dmFyIGM9dGhpcy5XYi5jb21wbGV0ZS0KdGhpcy5XYi5pbXByZXNzaW9uLGY9InN0YXRzX2hkX3RpbWVkaWZmIjt0aGlzLk8mJihmKz0idnBhaWQiKTs1RTM+YyYmZS50cmFjayhmLGMsITApfX1jYXRjaChoKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWM9W107dHJ5e2M9dGhpcy5zcyh0aGlzLmcuS2EsYSl9Y2F0Y2gobCl7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIG09Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuQ2QuaW1wcmVzc2lvbnMmJmUud3QobS51cmwsdGhpcy5DZC5pbXByZXNzaW9ucyk/dGhpcy5CZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS53KGsueW8sdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHthZElkOnRoaXMuQ2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LAp0aGlzLkQoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5CZShtLnVybCxtLnR5cGUpfWNhdGNoKHIpe31pZighYil0cnl7dGhpcy5nLkthPXRoaXMuSHEodGhpcy5nLkthLGEpfWNhdGNoKG4pe319fSxCZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQud2EoYSksYyYmYS5GbyhjKSxmfHwoZj10aGlzLmdnKSx0aGlzLlQuSGEoYSxmLHRoaXMuZ2csITEsITApKX0sc3M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxIcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxaeDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5UaC5iaW5kKHRoaXMpfSxUaDpmdW5jdGlvbigpe2UudyhrLlpmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5jZCYmZS5QYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS4kcigpLCEwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXt2YXIgYT13aW5kb3cub3BlbigiIix0aGlzLlQuc2E/Il90b3AiOiJfYmxhbmsiKTthLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7YS5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuZy5qY31jYXRjaChiKXt3aW5kb3cub3Blbih0aGlzLmcuamMsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9LFNoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0KImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlBjLnJlcGxhY2UoIlt0aW1lXSIsZS5xZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5ULlRjJiYoYj10aGlzLlQuVGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuamEuYXBwZW5kQ2hpbGQoYSl9fSxyYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8CnRoaXMuVC5UYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0seWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuVC5UYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlkPXRoaXMuRHE7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209CiIwcHgiKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnpkKCk7dGhpcy55ZCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLnJjKCl9LmJpbmQodGhpcykpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLk5iO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudXguYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMudHguYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy56ZCgpO3RoaXMueWQoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5yYygpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTWI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnN4LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLnJ4LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuemQoKTt0aGlzLnlkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMucmMoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGguc3R5bGUucG9zaXRpb249ImFic29sdXRlIixoLnN0eWxlLnRvcD0iLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuQmg7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7Yi5hcHBlbmRDaGlsZChjKTt0aGlzLmcuJGUmJmIuYXBwZW5kQ2hpbGQoaCk7Yi5hcHBlbmRDaGlsZChmKTtiLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuamEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuemQoKTt0aGlzLnlkKCl9LmJpbmQodGhpcykpO3RoaXMuamEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMucmMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmphLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmthJiZ0aGlzLmIubS5rYSgpJiYoZS53KGsuJGYsdGhpcy5nLkIsCnRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksdGhpcy5JZSgpKTt0aGlzLnNjKCl9fSxzYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHpkOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayJ9LHR4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5iLkgucGF1c2VkPyh0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLk1jLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpOih0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuU2QsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LHV4OmZ1bmN0aW9uKCl7dGhpcy5MZD9lLm9hKHRoaXMuTywKImNvbnRyb2wiLCJwbGF5Iik6ZS5vYSh0aGlzLk8sImNvbnRyb2wiLCJwYXVzZSIpfSxyZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMuYi5ILnBhdXNlZHx8KHRoaXMuYi5ILnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5TZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sdGg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLmIuSC5wYXVzZWQmJih0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLk1jLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpfSxyeDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYi5ILm11dGVkPwoodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay5sZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKToodGhpcy5iLkgubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsucGQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LHN4OmZ1bmN0aW9uKCl7dGhpcy5aYj9lLm9hKHRoaXMuTywiY29udHJvbCIsInVubXV0ZSIpOmUub2EodGhpcy5PLCJjb250cm9sIiwibXV0ZSIpfSxJZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYi5ILm11dGVkfHwodGhpcy5iLkgubXV0ZWQ9ITAsCmEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudyhrLnBkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpfSxKeDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYi5ILm11dGVkJiYodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5sZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sT2I6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5PYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5PYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLAp0aGlzLk9iKTt0aGlzLiRjfHx0aGlzLk5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5iZigpKX0sY2U6ZnVuY3Rpb24oKXt0aGlzLiRjPSEwO3RoaXMuaWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuaWIpLHRoaXMuaWI9ITEpO2lmKCgicHJlcm9sbCI9PWUuT2EmJnRoaXMuTmN8fCJwb3N0cm9sbCI9PWUuT2EpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuT2EpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2Zvcih2YXIgYj10aGlzLmIuTDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLkFjKCk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLAoiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLmVlKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuZWUoKX1lbHNlIHRoaXMuZWUoKX0sZWU6ZnVuY3Rpb24oKXt0aGlzLmNmPSEwO3RoaXMuYi5wZSgpO3RoaXMuYi5idygpO3RoaXMuS2I9ITE7ZS53KGsuQ3EsCnRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy5tZSgpLnNoKCl9LG1lOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5tJiYoYT10aGlzLmIubSk7cmV0dXJuIGF9LHdlOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJihhPSEwKX1yZXR1cm4gYX0sUWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkVhKCJtaW5WaXMiKTthJiYoZS51ZSh0aGlzLnZpZGVvLGEpP3RoaXMudGgoKTp0aGlzLnJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFmKCl9LmJpbmQodGhpcyksCjEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5nJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5nLmpjLGEuZHVyYXRpb249dGhpcy5nLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5nLmhiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuY2MmJjA8dGhpcy5jYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuY2MpKTtyZXR1cm4gYX0sRDpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuWHArIi0iK3RoaXMuYWY7dGhpcy5nJiZ0aGlzLmcud2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5nLndnKCkpO3JldHVybiBhfSxnZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFA9Yy5wa3x8UDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5QdD10aGlzLmFbMl07dGhpcy5jbD0KdGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzJdO3RoaXMuS2o9dGhpcy5hWzddO3RoaXMuVm89dGhpcy5hWzFdO3RoaXMubGo9dGhpcy5hWzddO3RoaXMuZ3Y9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNF19Yy5WcT1iO2IucHJvdG90eXBlPXtPdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUHQ6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNsOnRoaXMuT20oYSl9LE9tOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5QbTp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS2o6dGhpcy5VbyhhKX0sVW86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbzp0aGlzLmtqKGEpfSxrajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubGo6dGhpcy5mdihhKX0sZnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmd2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgd2I9CmMuVnF8fHdiLHZkPW5ldyB3YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXZkLk90KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuQmE9bnVsbDt0aGlzLlo9W107dGhpcy5YPW51bGw7dGhpcy5iYz10aGlzLmRjPSExO3RoaXMuc2Y9IiI7dGhpcy5yZj0hMTtkJiZkLmVtcHR5P3RoaXMuYnUoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy55bj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5mZSgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPQpiLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeCh0aGlzLnVybCk6bC53YShsLkRkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuUGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUuYmcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwKImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuRGQoYSkpKyImdHlwZT1qcyIsYj1sLndhKGwuRGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwud2EobC5EZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkhhKGIsdGhpcy5hdS5iaW5kKHRoaXMpLHRoaXMuWXQuYmluZCh0aGlzKSl9LHRnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5CYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5CYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuT2EpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuQmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLk9hfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5PYXx8dGhpcy5BdChhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5OdygpKXRyeXt2YXIgZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49ZC5sZW5ndGgmJihkPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2RbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtmW2JdPWcuZmlyc3RDaGlsZDtjLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfWVsc2UgZi5zcGxpY2UoYiwxKX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxBdDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKToKMDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGF1OmZ1bmN0aW9uKGEpe3RoaXMuU3YoYSk7dHJ5e3RoaXMuQmE9YS5yZXNwb25zZVhNTCx0aGlzLkJhfHwodGhpcy5CYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLk1hKHcuT2QpKX10aGlzLlo9dGhpcy50ZygpO3RoaXMuZGM9dGhpcy5mZigpO3RoaXMuYmM9dGhpcy5HaCgpO3RoaXMuWi5sZW5ndGg/dGhpcy54YygpOnRoaXMucmEodGhpcy5NYSh3LkVjLHtlcnJvcjp0aGlzLnJmP0QuTmQ6CkQuemZ9KSl9LGJ1OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkJhfHwodGhpcy5CYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuTWEody5PZCkpfXRoaXMuWj10aGlzLnRnKCk7dGhpcy5kYz10aGlzLmZmKCk7dGhpcy5iYz10aGlzLkdoKCk7dGhpcy5aLmxlbmd0aD90aGlzLnhjKCk6dGhpcy5yYSh0aGlzLk1hKHcuRWMse2Vycm9yOnRoaXMucmY/RC5OZDpELnpmfSkpfSxZdDpmdW5jdGlvbigpe3RoaXMucmEodGhpcy5NYSh3LnlmLHtkZXB0aDphfSkpfSx4YzpmdW5jdGlvbigpe3RoaXMuWD10aGlzLlouc2hpZnQoKTt0aGlzLkN0KCk/dGhpcy5YdygpPyhhKyssbmV3IGIodGhpcyx0aGlzLkNnKCksZyx7QWRTeXN0ZW06dGhpcy5ZcigpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnJhKHRoaXMuTWEody5CZikpOihhPTAsdGhpcy5VeCgpJiZ0aGlzLk5lKHRoaXMuRXEoKSkpfSxKZTpmdW5jdGlvbigpe3RoaXMuZGM/Cih0aGlzLmRjPTE8dGhpcy5aLmxlbmd0aCx0aGlzLloubGVuZ3RoJiZ0aGlzLnhjKCkpOnRoaXMucGFyZW50LkplKCl9LGJoOmZ1bmN0aW9uKCl7dGhpcy5iYz8odGhpcy5iYz0xPHRoaXMuWi5sZW5ndGgsdGhpcy5aLmxlbmd0aCYmdGhpcy54YygpKTp0aGlzLnBhcmVudC5iaCgpfSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlV3KCk/dGhpcy5UdygpPyEwOigtMSE9dGhpcy5wYygpP3RoaXMucmEodGhpcy5NYSh3LnVmKSk6dGhpcy5yYSh0aGlzLk1hKHcubWopKSwhMSk6KHRoaXMucmEodGhpcy5NYSh3LkVjLEQuQWYpKSwhMSl9LE5lOmZ1bmN0aW9uKGEpe2EuS2E9YS5LYS5jb25jYXQodGhpcy5GZSgpKTthLmhiPWEuaGI/YS5oYjp0aGlzLmRjO2EuYWM9YS5hYz9hLmFjOnRoaXMuYmM7dGhpcy5wYXJlbnQuTmUoYSl9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IHhiO2EuZHVyYXRpb249dGhpcy5wYygpO2EuVT10aGlzLnpnKCk7YS5qYz10aGlzLmFzKCk7YS5vcmlnaW49dGhpczsKYS5CPXRoaXMuWHIoKTthLiRlPXRoaXMucXMoYS5kdXJhdGlvbik7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGIpe3RoaXMuWCYmKGIuS2E9Yi5lcnJvci5jb2RlIT13LnVmLmNvZGU/Yi5LYS5jb25jYXQodGhpcy5icygpKTpiLkthLmNvbmNhdCh0aGlzLmtzKCkpKTt0aGlzLloubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuR2ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5HYiYmdGhpcy5wYXJlbnQuR2IoYiksYT0wLHRoaXMueGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShiKSxhPTApfSxHYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5HYihhKX0saWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuTWEoYSxiKSl9LE1hOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHliKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sWHc6ZnVuY3Rpb24oKXtyZXR1cm4gYTwKZ30sVXc6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnpnKCkubGVuZ3RofSxUdzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMucGMoKX0sZmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlouZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxHaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWiYmMjw9dGhpcy5aLmxlbmd0aCYmIXRoaXMuZmYoKSYmKGE9ITApO3JldHVybiBhfSxTdjpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuc2Y9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLnJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LEN0OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5DZygpLmxlbmd0aH0sCkNnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGUodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sWXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZSh0aGlzLlgsIkFkU3lzdGVtIil9LEZlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuT2coYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuYmIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxPZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09CmEubm9kZU5hbWU/ITA6dGhpcy5PZyhhLnBhcmVudE5vZGUpOiExfSxrczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxiczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sYXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYih0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0semc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxTYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLApoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGl6OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmJiKGFbY10pfSk7dHJ5e3ZhciBkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLlNjKS1NYXRoLmFicyg3MDAtYi5TYyl9KSxnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLlNjKS1NYXRoLmFicyg3MDAtYi5TYyl9KSxiPWQuY29uY2F0KGcpfWNhdGNoKGUpe31yZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTsKZm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMuZ2QoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LHBjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuYmIodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxxczpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkd3KGQsCmEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LGxlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5iYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sbmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGJiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuZ2QoYSk6IiJ9LGdkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubmUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVT1jLnlufHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRwPXRoaXMuYVs5XTsKdGhpcy5LbT10aGlzLmFbMV07dGhpcy5PcT10aGlzLmFbM107dGhpcy5VdD10aGlzLmFbOV07dGhpcy5CdT10aGlzLmFbMV07dGhpcy52cT10aGlzLmFbMl07dGhpcy5BbD10aGlzLmFbMTBdO3RoaXMua209dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbNF19Yy5FeD1iO2IucHJvdG90eXBlPXtDcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHA6dGhpcy5KbShhKX0sSm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkttOnRoaXMuTnEoYSl9LE5xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PcTp0aGlzLlR0KGEpfSxUdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXQ6dGhpcy5BdShhKX0sQXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJ1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52cTp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQWw6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5rbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMuRXh8fHpiLHdkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXdkLkNwKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuS2E9W107dGhpcy5VPVtdO3RoaXMuamM9IiI7dGhpcy5CPXRoaXMuYWM9dGhpcy5oYj0hMTt0aGlzLnFlPXRoaXMub3JpZ2luPW51bGx9Yy5wbT1iO2IucHJvdG90eXBlPXt5cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxoczpmdW5jdGlvbigpe2lmKCF0aGlzLnFlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uQmEpe3ZhciBhPXRoaXMub3JpZ2luLkJhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJgowPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnFlPWFbY10pfXJldHVybiB0aGlzLnFlfSx3ZzpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5ocygpO2ImJmIuZ2V0QXR0cmlidXRlJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpO3JldHVybiBhfSx0czpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuVVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIHhiPWMucG18fHhiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNzPXRoaXMuYVs0XTt0aGlzLlJ4PXRoaXMuYVsyXTt0aGlzLlRpPXRoaXMuYVs2XTt0aGlzLmJ4PXRoaXMuYVs0XTt0aGlzLmFsPXRoaXMuYVs2XTt0aGlzLmh4PXRoaXMuYVsxXTt0aGlzLldyPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzddfWMuT249YjtiLnByb3RvdHlwZT17UnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5TczoKdGhpcy5ReChhKX0sUXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJ4OnRoaXMuU2koYSl9LFNpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVGk6dGhpcy5heChhKX0sYXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ieDp0aGlzLiRrKGEpfSwkazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYWw6dGhpcy5neChhKX0sZ3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmh4OnRoaXMuVnIoYSl9LFZyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIEFiPWMuT258fEFiLHhkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXhkLlJzKDQpO3ZhciB3PXtPZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIiwKdGE6IlhNTF9QQVJTRV9FUlJPUiJ9LG1qOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix0YToiRFVSQVRJT05fRVJST1IifSxFYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsdGE6IkVNUFRZX1ZBU1QifSxCZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix0YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0seWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSwKbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLHRhOiJMT0FEX0VSUk9SIn0sTWQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHRhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sWnk6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsCnRhOiJNRURJQUZJTEVfRVJST1IifSx1Zjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIix0YToiRFVNTVlfQUQifX0sRD17emY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIix0YToiTk9fQURTIn0sQWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHRhOiJOT19NRURJQUZJTEVTIn0sYXo6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsdGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxOZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix0YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5wdD10aGlzLmFbMl07dGhpcy5Ubz10aGlzLmFbM107CnRoaXMuSnA9dGhpcy5hWzNdO3RoaXMubXI9dGhpcy5hWzVdO3RoaXMueG09dGhpcy5hWzVdO3RoaXMuQ2w9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbM119Yy5HeT1iO2IucHJvdG90eXBlPXtvdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucHQ6dGhpcy5TbyhhKX0sU286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlRvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5KcDp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXI6dGhpcy53bShhKX0sd206ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnhtOnRoaXMuQmwoYSl9LEJsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5DbDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEJiPWMuR3l8fEJiLHlkPW5ldyBCYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT15ZC5vdCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmFkPWI7dGhpcy5LYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLlBqfHx5YjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5scD10aGlzLmFbNF07dGhpcy54cD10aGlzLmFbNF07dGhpcy5LeT10aGlzLmFbOF07dGhpcy5veD10aGlzLmFbM107dGhpcy56eD10aGlzLmFbNl07dGhpcy5Paj10aGlzLmFbNl07dGhpcy5WbD10aGlzLmFbNV07dGhpcy5qdT10aGlzLmFbNV07dGhpcy5kdz10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs1XX1jLkNqPWI7Yi5wcm90b3R5cGU9e2twOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5scDp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnhwOnRoaXMuSnkoYSl9LEp5OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LeTp0aGlzLm54KGEpfSxueDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm94OnRoaXMueXgoYSl9LHl4OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56eDp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT2o6dGhpcy5VbChhKX0sVWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlZsOnRoaXMuaXUoYSl9LGl1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qdTp0aGlzLmN3KGEpfSxjdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBDYj1jLkNqfHxDYix6ZD1uZXcgQ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT0KemQua3AoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5tPWE7dGhpcy5hYj1hLnVnKCk7dGhpcy5MPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuTC5pZD1lLmdhKDEwKTt0aGlzLkg9Qy5wb3AoKTt0aGlzLkh8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuSC5pZD0iYWRYZGlzcGxheSIsdGhpcy5ILnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5BPXt9O3RoaXMuWmQ9ITE7dGhpcy5sYj1bXX1jLnNqPWI7Yi5wcm90b3R5cGU9e3JnOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LApnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnJnKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5KcyhhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpOwpoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sTHc6ZnVuY3Rpb24oKXt0aGlzLlpkPSEwfSxQaDpmdW5jdGlvbigpe3RoaXMuSD1DLnBvcCgpO3RoaXMuSHx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saWg6ZnVuY3Rpb24oKXt0aGlzLm0ucGF1c2UoKTtlLncoay5ZYyx0aGlzLm0udigpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLlpkfHwodGhpcy5tLnBsYXkoKSxlLncoay5aYyx0aGlzLm0udigpKSl9LEFjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkwuc3R5bGUuekluZGV4PWE7dGhpcy5MLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuTC5zdHlsZS5tYXJnaW5SaWdodD0KImF1dG8iO3RoaXMuTC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuTC5zdHlsZS5ib3hTaXppbmc9dGhpcy5hYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5MLnN0eWxlLndpZHRoPXRoaXMuYWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9dGhpcy5hYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLmFiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuYWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuYWIpO3RoaXMubS5QYiYmdGhpcy5tLlBiKCk/dGhpcy5tLnVnKCkuYXBwZW5kQ2hpbGQodGhpcy5MKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuTCk7d2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sSnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxrZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMua2codGhpcy5hYik7aWYoYi54IT10aGlzLkEueHx8Yi55IT10aGlzLkEueXx8Yi5wb3NpdGlvbiE9dGhpcy5BLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuQS53aWR0aCYmMDx0aGlzLkEuaGVpZ2h0JiYwPT0KYi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMucGUoKTtyZXR1cm59dGhpcy5BPWI7dGhpcy5tLlBiKCk/KHRoaXMuTC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuTC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkwuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkwuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkwuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLkwuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkguc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5sYi5sZW5ndGg7YSsrKXRoaXMubGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5DaCh0aGlzLkwpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMTApfSxEbzpmdW5jdGlvbihhKXt0aGlzLmxifHwodGhpcy5sYj1bXSk7ImZ1bmN0aW9uIj09CnR5cGVvZiBhJiZ0aGlzLmxiLnB1c2goYSl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5MJiZ0aGlzLkwucGFyZW50Tm9kZSYmdGhpcy5MLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuTC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTCk7dGhpcy5IJiZ0aGlzLkgucGF1c2UmJnRoaXMuSC5wYXVzZSgpfX19KShjKTtmb3IodmFyIE89Yy5zanx8TyxDPVtdLERiPTA7MTAwPkRiO0RiKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1lLmdhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgST0hMSxlYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5HcT10aGlzLmFbMTBdO3RoaXMudnY9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMTBdfWMuTnQ9YjtiLnByb3RvdHlwZT17RnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkdxOnRoaXMudXYoYSl9LHV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52djp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEViPWMuTnR8fEViLEFkPW5ldyBFYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUFkLkZxKDQpOyhmdW5jdGlvbihjKXtjLllsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7CmF8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuWmUoYik7dGhpcy5lZygpfSxaZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkZhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxVYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmCmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sbWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSx2OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5GYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIEZiPWMuWWx8fEZiOyhmdW5jdGlvbihjKXtjLlhsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj1mYSgpO3RoaXMuRWI9dGhpcy5FYnx8ITE7dGhpcy5IZj10aGlzLkpmPQp0aGlzLktnPXRoaXMucWE9dGhpcy5rZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLk1yKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5rZj0hMDt0aGlzLktnJiZ0aGlzLlhmKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkucWI7YSYmYS5LYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlVjKCk7dGhpcy5LZz0hMDt0aGlzLlhmKCl9LmJpbmQodGhpcykpOwp0aGlzLlNmKCl9LFhmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWIpe3RoaXMuVWMoKTtpZighdGhpcy5rZiYmIXRoaXMuVWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLmtmJiZ0aGlzLkhmJiYhdGhpcy5KZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCl9LmJpbmQodGhpcyksMTAwKX19LFVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5BZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxBZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxTZjpmdW5jdGlvbigpe2lmKHRoaXMuVWMoKSl7dmFyIGI9CnRoaXMuQWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5KZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLkhmPWIuZnp9dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2YoKX0uYmluZCh0aGlzKSwxMDApfSxqejpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi53eigpOiExfSxwYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IucGMoKTotMX0sbHM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sTXI6ZnVuY3Rpb24oYixhKXt0aGlzLkViPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLkVifHwzMDI9PXRoaXMuRWI/dGhpcy5xYT0hMDp0aGlzLnMoImFkZXJyb3IiLHRoaXMuRWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYygpfS5iaW5kKHRoaXMpLDEwMCl9LFhjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnFhPyh0aGlzLm8oKSx0aGlzLmVhKCkpOmIubWQoKT8odGhpcy5GKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5scyhiKT8odGhpcy5GKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBHYj1jLlhsfHxHYjsoZnVuY3Rpb24oYyl7Yy5abD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LHp0OmZ1bmN0aW9uKCl7d2luZG93Lk9PLnZtLnNvLnFvP3dpbmRvdy5PTy52bS5zby5xby5keihmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuenQoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5OYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgRmIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSihjKXx8KHRoaXMuSyhjKSwobmV3IEdiKGMsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBIYj1jLlpsfHxIYixJYj1uZXcgSGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzNdO3RoaXMuUnk9dGhpcy5hWzEwXTt0aGlzLmNxPXRoaXMuYVsyXTt0aGlzLmw9CnRoaXMuYVsyXX1jLkl2PWI7Yi5wcm90b3R5cGU9e1lwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5acDp0aGlzLlF5KGEpfSxReTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnk6dGhpcy5icShhKX0sYnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jcTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIEpiPWMuSXZ8fEpiLEJkPW5ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUJkLllwKDQpOyhmdW5jdGlvbihjKXtjLmJqPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMubWE9ITE7dGhpcy5EZygpfSxEZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpOwpifHwoYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5TKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sbGE6ZnVuY3Rpb24oKXt0aGlzLm5oKCl9LApuaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuTiYmKDAsdGhpcy5OKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIEtiPWMuYmp8fEtiOyhmdW5jdGlvbihjKXtjLmFqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMubygiZW1wdHkiKSx0aGlzLmVhKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT0KYj90aGlzLmVhKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nKCk/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTGI9Yy5hanx8TGI7KGZ1bmN0aW9uKGMpe2MuY2o9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxxaDpmdW5jdGlvbihiKXtiPW5ldyBLYihiKTtiLm1hP3RoaXMuSSgpOnRoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3IExiKGIsdGhpcy5HKSkuYygpKX0sYzpmdW5jdGlvbigpe3RoaXMuT3J8fCh0aGlzLk9yPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5xaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTsKaWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnFoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgTWI9Yy5janx8TWIsVj1uZXcgTWIocSk7Vi5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud3g9dGhpcy5hWzNdO3RoaXMucHA9dGhpcy5hWzldO3RoaXMuQWs9dGhpcy5hWzJdO3RoaXMuRXk9dGhpcy5hWzddO3RoaXMuVHg9dGhpcy5hWzNdO3RoaXMuc2k9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzldfWMubm89YjtiLnByb3RvdHlwZT17dng6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy53eDp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucHA6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFrOnRoaXMuRHkoYSl9LER5OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FeTp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlR4OnRoaXMucmkoYSl9LHJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5zaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIE5iPWMubm98fE5iLENkPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUNkLnZ4KDQpOyhmdW5jdGlvbihjKXtjLldtPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlMoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxQYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuV218fFc7KGZ1bmN0aW9uKGMpe2MuVm09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkuUGYoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm8uYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LlBmKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuenUoYSl9LmJpbmQodGhpcykpO3kuRHMoKX0senU6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5vKCk7dGhpcy5lYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5vKCk7dGhpcy5lYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkYoKX19KX0pKGMpOwp2YXIgWD1jLlZtfHxYOyhmdW5jdGlvbihjKXtjLlhtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnFkJiYoYj1lLklxKGIsdGhpcy5xZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLkooZCkpe3RoaXMuSyhkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD0KYy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnFkfHwodGhpcy5xZD1bXSksdGhpcy5xZC5wdXNoKGJbYV0pLGQ9bmV3IFcoaCksdGhpcy5KKGQpfHwodGhpcy5LKGQpLGY9bmV3IFgoZCx0aGlzLkcpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sUGY6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sWXc6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy53Y3x8KHRoaXMud2M9W10pLHRoaXMud2MucHVzaChiKSx0aGlzLmF3KCkmJih0aGlzLlZlKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYKKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxEczpmdW5jdGlvbigpe2lmKHRoaXMud2MpZm9yKHZhciBiPTA7Yjx0aGlzLndjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMud2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lll3KGIpfX0pfSkoYyk7CnZhciBPYj1jLlhtfHxPYix5PW5ldyBPYihxKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFyPXRoaXMuYVsxMF07dGhpcy5mcD10aGlzLmFbMl07dGhpcy5lbj10aGlzLmFbOV07dGhpcy5Mcz10aGlzLmFbOF07dGhpcy5rbz10aGlzLmFbMV07dGhpcy5sdD10aGlzLmFbN107dGhpcy5sbj10aGlzLmFbMl07dGhpcy5wbD10aGlzLmFbOV07dGhpcy5vcj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVsyXX1jLkprPWI7Yi5wcm90b3R5cGU9eyRxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hcjp0aGlzLmVwKGEpfSxlcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZnA6dGhpcy5kbihhKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmVuOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Mczp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmtvOnRoaXMua3QoYSl9LGt0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubHQ6dGhpcy5rbihhKX0sa246ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxuOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucGw6dGhpcy5ucihhKX0sbnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm9yOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgUGI9Yy5Ka3x8UGIsRGQ9bmV3IFBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9RGQuJHEoNCk7KGZ1bmN0aW9uKGMpe2MuV2k9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5TKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sVWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBRYj1jLldpfHxRYjsoZnVuY3Rpb24oYyl7Yy5YaT0KdS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5GKCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMueXZ8fCh0aGlzLnl2PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy5GKCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpOwp2YXIgUmI9Yy5YaXx8UmI7KGZ1bmN0aW9uKGMpe2MuWWk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBRYihkKTt0aGlzLkooZSl8fCh0aGlzLksoZSksKG5ldyBSYihlLHRoaXMuRykpLmMoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLkphKWlmKGE9PXRoaXMuSmFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7CnJldHVybiB0aGlzLkphW2Iub2IoKV0/ITA6ITF9fSl9KShjKTt2YXIgU2I9Yy5ZaXx8U2IsVGI9bmV3IFNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ0PXRoaXMuYVs3XTt0aGlzLlZuPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVsxMF07dGhpcy5ieT10aGlzLmFbMl07dGhpcy5SbD10aGlzLmFbMTBdO3RoaXMuaW09dGhpcy5hWzhdO3RoaXMucm49dGhpcy5hWzZdO3RoaXMuZnQ9dGhpcy5hWzFdO3RoaXMuRWw9dGhpcy5hWzZdO3RoaXMuSXg9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbOV19Yy5Ucj1iO2IucHJvdG90eXBlPXthdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJ0OnRoaXMuVW4oYSl9LFVuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVm46dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktyOnRoaXMuYXkoYSl9LApheTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnk6dGhpcy5RbChhKX0sUWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJsOnRoaXMuaG0oYSl9LGhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pbTp0aGlzLnFuKGEpfSxxbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJuOnRoaXMuZXQoYSl9LGV0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mdDp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWw6dGhpcy5IeChhKX0sSHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkl4OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgVWI9Yy5Ucnx8VWIsRWQ9bmV3IFViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9RWQuYXQoNCk7KGZ1bmN0aW9uKGMpe2MuT2w9Cm4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuUyhiKTt0aGlzLlYoYSk7dGhpcy5Vdih0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxVdjpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJnRoaXMuaWEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnBhdXNlJiZ0aGlzLmlhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmCnRoaXMuaWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5yZXN1bWUmJnRoaXMuaWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2ImJmIubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLm11dGUmJnRoaXMuaWEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJnRoaXMuaWEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS51bm11dGUmJnRoaXMuaWEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxMZzpmdW5jdGlvbihiKXt0aGlzLmlhPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBWYj1jLk9sfHxWYjsoZnVuY3Rpb24oYyl7Yy5ObD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLAphKTt0aGlzLiRoPSExfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXRoaXMuZ2V0UGxheWVyKCk7Yi5hdXRvc3RhcnQmJiF0aGlzLiRoJiYodGhpcy5GKCksdGhpcy4kaD0hMCx0aGlzLlJhKCkpO2EuRmEoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFdiPWMuTmx8fFdiOyhmdW5jdGlvbihjKXtjLlBsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgVmIoYltkXSksdGhpcy5KKGMpfHwodGhpcy5LKGMpLChuZXcgV2IoYyx0aGlzLkcpKS5jKCkpfX1lbHNlIHRoaXMuSSgpfX0pfSkoYyk7CnZhciBYYj1jLlBsfHxYYixZPW5ldyBYYihxKTtZLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcj10aGlzLmFbOV07dGhpcy5EaT10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVsxMF19Yy5uaT1iO2IucHJvdG90eXBlPXtQcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUXI6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkRpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgWWI9Yy5uaXx8WWIsRmQ9bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9RmQuUHIoNCk7KGZ1bmN0aW9uKGMpe2MuTW49bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxrYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sbGE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJgoxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5OPygwLHRoaXMuTikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIFpiPWMuTW58fFpiOyhmdW5jdGlvbihjKXtjLkxuPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxUdjpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuV2F8fCh0aGlzLldhPVtdKTt0aGlzLldhLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8CjMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuZWEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5lYz0hMDt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sYzpmdW5jdGlvbigpe3RoaXMudSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy54YT90aGlzLlR2KHRoaXMueGEpOih0aGlzLnhhPXRoaXMuSGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApKX0sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy54YSl7dGhpcy5GKCk7cmV0dXJufWlmKCF0aGlzLmVjKXt0aGlzLkYoKTtyZXR1cm59Yj0hMDtpZih0aGlzLldhJiYKdGhpcy5XYS5sZW5ndGgmJjE8dGhpcy5XYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLldhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLldhW2FdJiYzMDMhPXRoaXMuV2FbYV0mJjQwMyE9dGhpcy5XYVthXSYmKGI9ITEpO2lmKGIpdGhpcy5vKCJlbXB0eSIpLHRoaXMuZWEoKTtlbHNle3RoaXMuRigpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyICRiPWMuTG58fCRiOyhmdW5jdGlvbihjKXtjLk5uPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgWmIoYi5pdGVtKGEpKTt0aGlzLkooYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLksoYyksCihuZXcgJGIoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIGFjPWMuTm58fGFjLGJjPW5ldyBhYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qdD10aGlzLmFbN107dGhpcy5mdT10aGlzLmFbNl07dGhpcy5lcj10aGlzLmFbNV07dGhpcy5pbz10aGlzLmFbOV07dGhpcy5LdD10aGlzLmFbOF07dGhpcy5Bbj10aGlzLmFbOF07dGhpcy5Dbj10aGlzLmFbNF07dGhpcy5ndz10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs4XX1jLmppPWI7Yi5wcm90b3R5cGU9e2l0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qdDp0aGlzLmV1KGEpfSxldTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZ1OnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lcjp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaW86CnRoaXMuSnQoYSl9LEp0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5LdDp0aGlzLnpuKGEpfSx6bjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkFuOnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dbjp0aGlzLmZ3KGEpfSxmdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3c6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBjYz1jLmppfHxjYyxHZD1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1HZC5pdCg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sbGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLk4mJigwLHRoaXMuTikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5OJiYoMCx0aGlzLk4pKCEwKX0uYmluZCh0aGlzKSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgZGM9Yy5Za3x8ZGM7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLlloKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5vZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMub2coKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuQW8oKX0uYmluZCh0aGlzKSksdGhpcy5aaD0hMSx0aGlzLnh5PTFFMyx0aGlzLmtoPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxvZzpmdW5jdGlvbigpe3RoaXMua2guZG9uZXx8KHRoaXMua2guZG9uZT0hMCx0aGlzLlpoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZaCgpfS5iaW5kKHRoaXMpLAp0aGlzLnh5KSl9LEFvOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLlpoKTt0aGlzLm8oKX0sWWg6ZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMubygpLHRoaXMuZWEoKSk6KHRoaXMucygiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLkYoKSl9LHhnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBmPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHlhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy54Zyhtdy5lcnJvckRlbGVnYXRlcyk6CnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy54Zyh0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgZWM9Yy5Ya3x8ZWM7KGZ1bmN0aW9uKGMpe2MuWms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5OYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLk5hKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLk5hKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTsKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLk5hKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBkYyhjKSx0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBlYyhjLHRoaXMuRykpLmMoKSkpfX10aGlzLkkoKX19KX0pKGMpO3ZhciBmYz1jLlprfHxmYyxnYz1uZXcgZmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUHk9dGhpcy5hWzVdO3RoaXMuV3Q9dGhpcy5hWzEwXTt0aGlzLlZpPXRoaXMuYVs3XTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLm9qPXRoaXMuYVs4XTt0aGlzLmx1PXRoaXMuYVs5XTt0aGlzLm1tPQp0aGlzLmFbNV07dGhpcy52aj10aGlzLmFbNF07dGhpcy5QdT10aGlzLmFbNF07dGhpcy5Ecj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbNV19Yy54dz1iO2IucHJvdG90eXBlPXtPeTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUHk6dGhpcy5WdChhKX0sVnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLld0OnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVmk6dGhpcy5WayhhKX0sVms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLldrOnRoaXMubmooYSl9LG5qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vajp0aGlzLmt1KGEpfSxrdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubHU6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1tOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52ajp0aGlzLk91KGEpfSxPdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUHU6CnRoaXMuQ3IoYSl9LENyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ecjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGhjPWMueHd8fGhjLEhkPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUhkLk95KDQpOyhmdW5jdGlvbihjKXtjLlJtPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgaWM9Yy5SbXx8aWM7KGZ1bmN0aW9uKGMpe2MuUW09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm8oKSx0aGlzLmVhKCkpOih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLnUoKSkpOih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpO3RoaXMuaWMoKX0saWM6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy56ZSgpJiYKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnplKCkmJih0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmljKCl9LmJpbmQodGhpcyksMTApfSx6ZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgamM9Yy5RbXx8amM7KGZ1bmN0aW9uKGMpe2MuU209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJgoidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgaWMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3IGpjKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBrYz1jLlNtfHxrYyxsYz1uZXcga2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3I9dGhpcy5hWzddO3RoaXMueXM9dGhpcy5hWzRdO3RoaXMuUm89dGhpcy5hWzRdO3RoaXMueG49dGhpcy5hWzFdO3RoaXMudG49dGhpcy5hWzNdO3RoaXMuR2o9dGhpcy5hWzFdO3RoaXMubD10aGlzLmFbMV19Yy5oaz0KYjtiLnByb3RvdHlwZT17cnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNyOnRoaXMueHMoYSl9LHhzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55czp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUm86dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhuOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bjp0aGlzLkZqKGEpfSxGajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYz1jLmhrfHxtYyxJZD1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1JZC5ycig0KTsoZnVuY3Rpb24oYyl7Yy5HbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlMoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuT2U9ITF9LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkJ2KCl9LmJpbmQodGhpcyksNTAwKX0sQnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5OJiZ0aGlzLk4oKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksCmE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuT2UmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuT2UpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxIdzpmdW5jdGlvbigpe3RoaXMuT2U9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBuYz1jLkdtfHwKbmM7KGZ1bmN0aW9uKGMpe2MuRm09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKTt0aGlzLlliPTB9LGM6ZnVuY3Rpb24oKXt0aGlzLmh1PTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5ZYnx8KHRoaXMuWWI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8Cih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5ZYnx8dGhpcy5ZYisrLHRoaXMuWWI8PXRoaXMuaHU/KHRoaXMuWWIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSkpfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5IdygpLHRoaXMuRigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgb2M9Yy5GbXx8b2M7KGZ1bmN0aW9uKGMpe2MuSG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbmMod2luZG93LnBsYXllckFwaSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgb2MoYiwKdGhpcy5HKSkuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcGM9Yy5IbXx8cGMscWM9bmV3IHBjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNxPXRoaXMuYVs1XTt0aGlzLk1xPXRoaXMuYVs0XTt0aGlzLnp3PXRoaXMuYVsxXTt0aGlzLmpqPXRoaXMuYVs0XTt0aGlzLkh1PXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzldfWMuY3Y9YjtiLnByb3RvdHlwZT17UnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlNxOnRoaXMuTHEoYSl9LExxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NcTp0aGlzLnl3KGEpfSx5dzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuenc6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMuR3UoYSl9LEd1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5IdTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciByYz1jLmN2fHxyYyxKZD1uZXcgcmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1KZC5ScSg0KTsoZnVuY3Rpb24oYyl7Yy5BbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGxhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuTigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBzYz1jLkFtfHxzYzsoZnVuY3Rpb24oYyl7Yy56bT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCmZ1bmN0aW9uKCl7dGhpcy5SYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnpxKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuZWQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLlN0KCk6dGhpcy5pYygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZigpfHwodGhpcy5zKCJjb250ZW50cGxheSIpLHRoaXMudSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHpxOmZ1bmN0aW9uKCl7dGhpcy5GZigpfHx0aGlzLnUoITApfSxTdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZWQoKTshYi52YSYmCmIuWiYmYi5jeiYmYi5leiYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LGljOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMubygpLHRoaXMuZWEoKSk6KHRoaXMucygiYWRlcnJvciIsYiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWMoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe2lmKCF0aGlzLmdoKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT0KYSYmKHRoaXMuZ2g9YltjXSk7cmV0dXJuIHRoaXMuZ2h9LHplOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLmVkKCkuYWRzTG9hZGVyP3RoaXMuRighMCk6dGhpcy5GKCk6dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHRjPWMuem18fHRjOyhmdW5jdGlvbihjKXtjLkJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IHNjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5KKGMpfHwodGhpcy5LKGMpLChuZXcgdGMoYyx0aGlzLkcpKS5jKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgdWM9Yy5CbXx8dWMsdmM9bmV3IHVjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJwPXRoaXMuYVs2XTt0aGlzLlVxPXRoaXMuYVs5XTt0aGlzLll5PXRoaXMuYVsyXTt0aGlzLk15PXRoaXMuYVsxXTt0aGlzLlVwPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzEwXX1jLnlrPWI7Yi5wcm90b3R5cGU9e3FwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ycDp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVXE6dGhpcy5YeShhKX0sWHk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll5OnRoaXMuTHkoYSl9LEx5OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NeTp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLlVwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgd2M9Yy55a3x8d2MsS2Q9bmV3IHdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9S2QucXAoNCk7KGZ1bmN0aW9uKGMpe2MudWw9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5TKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlYoYSk6dGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxVYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sRmE6ZnVuY3Rpb24oKXt2YXIgYjtFPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTsKYiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWj1jLnVsfHxaOyhmdW5jdGlvbihjKXtjLnRsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlFlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuUWU9Yi5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5RZSYmYiE9dGhpcy5RZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5zKCJhZGVycm9yIixhLnl6KSx0aGlzLkYoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT0KYSYmKHRoaXMucygiYWRlcnJvciIpLHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBhYT1jLnRsfHxhYTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRSlmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFooYiksYi5tYT90aGlzLlZlKCk6dGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGFhKGIsdGhpcy5HKSxiLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRSx4Yz1jLnZsfHx4Yyx5Yz1uZXcgeGMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC53Yi5sZW5ndGgpe3ZhciBhPWwud2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUucncoeyJbTE9BRFNDUklQVF0iOmUuZ2EoMTApLCJbVVRJTFNdIjplLmdhKDEwKSwiW0NBTExCQUNLXSI6ZS5nYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuWGcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSltW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLlhnKGcsCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LGwpfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3A9dGhpcy5hWzhdO3RoaXMuam49dGhpcy5hWzJdO3RoaXMuZng9dGhpcy5hWzNdO3RoaXMuUmo9dGhpcy5hWzhdO3RoaXMud2k9dGhpcy5hWzRdO3RoaXMud3I9dGhpcy5hWzddO3RoaXMuUXA9dGhpcy5hWzFdO3RoaXMucnY9dGhpcy5hWzldO3RoaXMuang9dGhpcy5hWzVdO3RoaXMuS2w9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMV19Yy50aj1iO2IucHJvdG90eXBlPXtWcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3A6dGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpuOnRoaXMuZXgoYSl9LApleDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZng6dGhpcy5RaihhKX0sUWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlJqOnRoaXMudmkoYSl9LHZpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53aTp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3I6dGhpcy5QcChhKX0sUHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFwOnRoaXMucXYoYSl9LHF2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ydjp0aGlzLml4KGEpfSxpeDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuang6dGhpcy5KbChhKX0sSmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLktsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgemM9Yy50anx8emMsTGQ9bmV3IHpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUxkLlZwKDQpOyhmdW5jdGlvbihjKXtjLm5uPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5TKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMucXU9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9LGh3OmZ1bmN0aW9uKGIpe3RoaXMuUmQ9CmJ9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sbGE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuZ2IoYil9LmJpbmQodGhpcykpfSxnYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuTiYmdGhpcy5OKCksdGhpcy5SZCYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuUmQmJihuZXcgSCh0aGlzLHRoaXMuUmQpKS5jKCkpfX0pfSkoYyk7dmFyIE49Yy5ubnx8TjsoZnVuY3Rpb24oYyl7Yy5tbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSx4YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMua2UpaWYodGhpcy5yYnx8KHRoaXMucmI9MCksdGhpcy5yYisrLDE1PHRoaXMucmIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnR3KCk6dGhpcy51KCEwKSwhMDt0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnUoKTp0aGlzLnUoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5rZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLnlhKCl8fCh0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YSgpfS5iaW5kKHRoaXMpLDEwKX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sClk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVz1hLGIucygiYWRlcnJvciIsYSkpOmIucygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dGhpcy5XPXRoaXMuV3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnhhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSx1OmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRihiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSD1jLm1ufHxIOyhmdW5jdGlvbihjKXtjLnBuPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLklhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiLmh3KHRoaXMuRyksYj1uZXcgSChiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLnBufHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHA9CnRoaXMuYVsyXTt0aGlzLlRsPXRoaXMuYVszXTt0aGlzLmFtPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzJdfWMuS3E9YjtiLnByb3RvdHlwZT17R3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhwOnRoaXMuU2woYSl9LFNsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5UbDp0aGlzLiRsKGEpfSwkbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBDYz1jLktxfHxDYyxNZD1uZXcgQ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1NZC5HcCg0KTsoZnVuY3Rpb24oYyl7Yy5tbD1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy5jZz0KMDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVihhKTp0aGlzLmZhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jZ30sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLk4/KDAsdGhpcy5OKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse2ZxOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuY2c9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCntmcTpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sUDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIERjPWMubWx8fERjOyhmdW5jdGlvbihjKXtjLmxsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEN6OmZ1bmN0aW9uKCl7fSxXdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnRmKG5ldyBmdW5jdGlvbigpe30pO2EuJHk9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuV3YoYSk7d2luZG93LlpkPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLlZ2fHwodGhpcy5Wdj0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnNlfHwodGhpcy5zZT0xKTtpZigyMDx0aGlzLnNlKXRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLlFhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuc2UrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LFFhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLmFhKCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMuVWUoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5zKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLnBhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0sVWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc01hbmFnZXIpOwpiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpfSx5YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpe3RoaXMucWE9ITB9LGFhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YSgpPwoodGhpcy5vKCksdGhpcy5lYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkYoYil9fSl9KShjKTt2YXIgRWM9Yy5sbHx8RWM7KGZ1bmN0aW9uKGMpe2Mubmw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IERjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5tYXx8dGhpcy5KKGMpfHwodGhpcy5LKGMpLChuZXcgRWMoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEZjPWMubmx8fEZjLEdjPW5ldyBGYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubnQ9dGhpcy5hWzhdO3RoaXMuQng9dGhpcy5hWzddO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuSW49dGhpcy5hWzhdO3RoaXMuZ209dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbNl19Yy5zbD1iO2IucHJvdG90eXBlPXttdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnQ6dGhpcy5BeChhKX0sQXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJ4OnRoaXMuQXAoYSl9LEFwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5CcDp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSW46dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmdtOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgSGM9Yy5zbHx8SGMsTmQ9bmV3IEhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPU5kLm10KDQpOyhmdW5jdGlvbihjKXtjLmhsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIGJhPWMuaGx8fGJhOyhmdW5jdGlvbihjKXtjLmdsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LApjOmZ1bmN0aW9uKCl7dGhpcy5IZz0wO3RoaXMuVz10aGlzLld8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5xYT10aGlzLnRjPXRoaXMueGE9dGhpcy5RYz0hMTt0aGlzLnBoPWUudWIoMTApO3RoaXMuUWcoKX0sUWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudmE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLlFhKCksITA7dGhpcy5IZysrO2lmKDEwPHRoaXMuSGcpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMudSghMCk6dGhpcy51KCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5RZy5iaW5kKHRoaXMpLDEwMCksITF9LFFhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMudmE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMubygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuRihiKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNhPWMuZ2x8fGNhOyhmdW5jdGlvbihjKXtjLmlsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBjYShiLAp0aGlzLkcpLGIuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgSWM9Yy5pbHx8SWMsSmM9bmV3IEljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs4XTt0aGlzLlhuPXRoaXMuYVsxMF07dGhpcy5Dbz10aGlzLmFbNV07dGhpcy5oaj10aGlzLmFbMTBdO3RoaXMuZmo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzddfWMuWHM9YjtiLnByb3RvdHlwZT17Zm46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmduOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkNvOnRoaXMuZ2ooYSl9LGdqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5oajp0aGlzLmVqKGEpfSxlajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZmo6dGhpcy5qKGEpfSwKajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIEtjPWMuWHN8fEtjLE9kPW5ldyBLYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPU9kLmZuKDQpOyhmdW5jdGlvbihjKXtjLlRqPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yj8oYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllclByZWZpeCkpPyh0aGlzLlMoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5WKGIpOnRoaXMuZmEoKSk6dGhpcy5mYSgpOnRoaXMuZmEoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxtZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaXNGdWxsc2NyZWVuP2IuaXNGdWxsc2NyZWVuOiExfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLmR1cmF0aW9uP2IudmlkZW9pbmZvLmR1cmF0aW9uOjB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8ucGxheWhlYWQ/Yi52aWRlb2luZm8ucGxheWhlYWQ6MH0sCmV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgTGM9Yy5Uanx8TGM7KGZ1bmN0aW9uKGMpe2MuU2o9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVBsYXlpbmciLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLAp0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMucygiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksdGhpcy51KCkpfSx0ZXN0OmZ1bmN0aW9uKCl7fSx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtiLmlzUGxheWluZygpPyhiLnBhdXNlKCksdGhpcy5GKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBNYz1jLlNqfHxNYzsoZnVuY3Rpb24oYyl7Yy5Vaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApjOmZ1bmN0aW9uKCl7dGhpcy5JYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuTmEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyBMYyhkKSxkLm1hfHx0aGlzLkooZCl8fCh0aGlzLksoZCksKG5ldyBNYyhkLHRoaXMuRykpLmMoKSk7ZWxzZSBicmVha310aGlzLkkoKX19KX0pKGMpO3ZhciBOYz1jLlVqfHxOYyxPYz1uZXcgTmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub2s9dGhpcy5hWzFdO3RoaXMuYXA9dGhpcy5hWzldO3RoaXMuZWs9dGhpcy5hWzFdO3RoaXMudHE9dGhpcy5hWzEwXTt0aGlzLkx1PXRoaXMuYVsxXTsKdGhpcy5sPXRoaXMuYVszXX1jLkx2PWI7Yi5wcm90b3R5cGU9e25rOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vazp0aGlzLiRvKGEpfSwkbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXA6dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5lazp0aGlzLnNxKGEpfSxzcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudHE6dGhpcy5LdShhKX0sS3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkx1OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgUGM9Yy5Mdnx8UGMsUGQ9bmV3IFBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9UGQubmsoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5TKGIpLHRoaXMuVihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIFFjPWMuJGp8fFFjOyhmdW5jdGlvbihjKXtjLlpqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlVmKCl9LFVmOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5GKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZighMCl9LmJpbmQodGhpcyksCjEwMCkpfX0pfSkoYyk7dmFyIFJjPWMuWmp8fFJjOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBRYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5tYSl7dGhpcy5JKCk7cmV0dXJufWlmKCF0aGlzLkooYikpe3RoaXMuSyhiKTsobmV3IFJjKGIsdGhpcy5HKSkuYygpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgU2M9Yy5ha3x8U2MsVGM9bmV3IFNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNyPXRoaXMuYVsxMF07dGhpcy5FdD10aGlzLmFbNl07dGhpcy5NbD0KdGhpcy5hWzVdO3RoaXMubXg9dGhpcy5hWzZdO3RoaXMuaHQ9dGhpcy5hWzEwXTt0aGlzLmVvPXRoaXMuYVsxMF07dGhpcy5TcD10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOV19Yy54aT1iO2IucHJvdG90eXBlPXticjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3I6dGhpcy5EdChhKX0sRHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkV0OnRoaXMuTGwoYSl9LExsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5NbDp0aGlzLmx4KGEpfSxseDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubXg6dGhpcy5ndChhKX0sZ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5odDp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVvOnRoaXMuUnAoYSl9LFJwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5TcDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIFVjPWMueGl8fFVjLApRZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1RZC5icig0KTsoZnVuY3Rpb24oYyl7Yy5jaT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlMoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5WKGIpOnRoaXMuZmEoKSk6dGhpcy5mYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgVmM9Yy5jaXx8VmM7KGZ1bmN0aW9uKGMpe2MuYmk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYiwKYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy51LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcykpO3RoaXMuJGQoKTt0aGlzLlJmKCl9LFk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlc9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0scGE6ZnVuY3Rpb24oKXt0aGlzLnFhPSEwO3RoaXMubygiZW1wdHkgdmFzdCIpfSxSZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiYKYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8CjMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy5vKCksdGhpcy5lYSgpKTp0aGlzLnUoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlJmLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy4kZC5iaW5kKHRoaXMpLDEwMCl9LCRkOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaGEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5SYS5iaW5kKHRoaXMpLDEwKSx0aGlzLm8oKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLnUoKTp0aGlzLnUoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGQuYmluZCh0aGlzKSwxMDApfX0sdTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlJhLmJpbmQodGhpcyksCjFFNCk7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIFdjPWMuYml8fFdjOyhmdW5jdGlvbihjKXtjLmRpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sU2E6ZnVuY3Rpb24oYil7Yj1uZXcgVmMoYik7Yi5tYT90aGlzLkkoKTp0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBXYyhiLHRoaXMuRykpLmMoKSl9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5TYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuU2Eod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5JKCl9fSl9KShjKTt2YXIgWGM9Yy5kaXx8WGMsWWM9bmV3IFhjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5HdD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs3XX1jLk5tPWI7Yi5wcm90b3R5cGU9e0Z0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIFpjPWMuTm18fFpjLFJkPW5ldyBaYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVJkLkZ0KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlNnPXRoaXMuVWc9dGhpcy5UZz0hMTt0aGlzLnNkPVtdO3RoaXMuVGU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRjP251bGw6VGMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpjP251bGw6SmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/Cm51bGw6SWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlYsTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYmI/bnVsbDpiYixvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdiP251bGw6Z2IsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIHZjP251bGw6dmMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgeWE/bnVsbDp5YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgQmM/bnVsbDpCYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB5P251bGw6eSxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHljP251bGw6eWMsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRiP251bGw6VGIsU2ltcGxlVmlkZW9BbmRJbWE6InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgR2M/bnVsbDpHYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSWI/bnVsbDoKSWIsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE9jP251bGw6T2MsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBxYz9udWxsOnFjLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBtYj9udWxsOm1iLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiByYj9udWxsOnJiLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsWE9aQ09NOiJ1bmRlZmluZWQiPT09dHlwZW9mIERhP251bGw6RGEsQkNGbGFzaE9ubHk6InVuZGVmaW5lZCI9PT10eXBlb2YgWGE/bnVsbDpYYSxEZW1vVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB0YT9udWxsOnRhLFRPbmxpbmUyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNhP251bGw6U2EsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgWWM/bnVsbDpZYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWT8KbnVsbDpZfX1jLnJtPWI7Yi5wcm90b3R5cGU9e2M6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMubnMoYSk6W10sYjt0aGlzLlVnPSEwO2lmKGEubGVuZ3RoKXt0aGlzLlRnPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnVoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5UZSl7aWYodGhpcy5TZylicmVhaztiPXRoaXMuVGVbY107dGhpcy5uZihiKSYmKHRoaXMuc2QucHVzaChiKSx0aGlzLnVoKGIpKX19LG5mOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sbnM6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuVGVbY10sdGhpcy5uZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx1aDpmdW5jdGlvbihhKXt0aGlzLm5mKGEpJiZhLmMoKX0sSXc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIG4mJgohdGhpcy5UZylmb3IodGhpcy5TZz0hMCxhPTA7YTx0aGlzLnNkLmxlbmd0aDthKyspdGhpcy5zZFthXS55YiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnNkW2FdLnliKX19fSkoYyk7dmFyICRjPWMucm18fCRjLEw9bmV3ICRjO0wuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLllqPXRoaXMuYVs2XTt0aGlzLm12PXRoaXMuYVs4XTt0aGlzLmdrPXRoaXMuYVs0XTt0aGlzLmprPXRoaXMuYVs4XTt0aGlzLklqPXRoaXMuYVszXTt0aGlzLkVrPXRoaXMuYVszXTt0aGlzLmR0PXRoaXMuYVsxMF07dGhpcy5qcD10aGlzLmFbOF07dGhpcy5Tcj10aGlzLmFbOF07dGhpcy5xcj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVsxMF19Yy5taT1iO2IucHJvdG90eXBlPXtYajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWWo6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5tdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZ2s6dGhpcy5payhhKX0saWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmprOnRoaXMuSGooYSl9LEhqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Jajp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRWs6dGhpcy5jdChhKX0sY3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmR0OnRoaXMuaXAoYSl9LGlwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcDp0aGlzLlJyKGEpfSxScjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU3I6dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgYWQ9Yy5taXx8YWQsU2Q9bmV3IGFkKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVNkLlhqKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLm9jKGsuVngpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLm9jKGsudHUpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKRi53aWR0aD0xO0YuaGVpZ2h0PTE7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBUZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGhhPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBHPW5ldyBSLG09ITE7Ry51YygpO0cuTWcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLnVjKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5NZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0cudWMoKTt2YXIgVWQ9VGQoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csRy5zdCgpLHtpZDpVZH0pfSw1MDApLGxhPWUuZ2EoMTApO2dhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkl5PXRoaXMuYVs1XTt0aGlzLnVpPXRoaXMuYVs4XTt0aGlzLk52PXRoaXMuYVsxXTt0aGlzLkt2PXRoaXMuYVsxXTt0aGlzLmJ2PXRoaXMuYVs3XTt0aGlzLlV1PXRoaXMuYVs1XTt0aGlzLld1PXRoaXMuYVsyXTt0aGlzLiRpPXRoaXMuYVsxMF07dGhpcy5paT10aGlzLmFbMl07dGhpcy5Xcz10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs3XX1jLld5PWI7Yi5wcm90b3R5cGU9e0h5OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5JeTp0aGlzLnRpKGEpfSx0aTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudWk6dGhpcy5NdihhKX0sTXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk52OnRoaXMuSnYoYSl9LEp2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ldjp0aGlzLmF2KGEpfSxhdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYnY6dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlV1OnRoaXMuVnUoYSl9LFZ1OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuV3U6dGhpcy5aaShhKX0sWmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLiRpOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5paTp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuV3M6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBiZD1jLld5fHxiZCxWZD1uZXcgYmQoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1WZC5IeSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubWg9dGhpcy5jb25mPXRoaXMuZWI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLm5kPTA7dGhpcy5WYT0iIjt0aGlzLnRkPVtdO3RoaXMudWQ9MDt0aGlzLm9oPSExO3RoaXMuUmU9W119Yy5maT1iO2IucHJvdG90eXBlPXtxdzpmdW5jdGlvbihhKXt0aGlzLm1oPQphfSx4ZDpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuVmE9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGt3OmZ1bmN0aW9uKGEpe3RoaXMuZWI9YX0saXc6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEVhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5WYV0mJnRoaXMuY29uZlt0aGlzLlZhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuVmFdW2FdKTtyZXR1cm4gYn0semM6ZnVuY3Rpb24oYSxiKXtlLnNiKCJ3ZWx0LmRlIikmJmUuVGEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwKIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLmViKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMudHQoKSl0aGlzLmViLmYodGhpcy5lYi5oZCx0aGlzLmViLkNhLHRoaXMuZWIuU2UsZnVuY3Rpb24oKXt0aGlzLnpjKGEsYil9LmJpbmQodGhpcyksdGhpcy5lYi5sYyk7ZWxzZSBpZih0aGlzLkZzKCkpdGhpcy5ldyhmdW5jdGlvbigpe3RoaXMuemMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudyhrLlljLHRoaXMucGxheWVyLnYoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLkx3KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuZWIsaCk7bC53aCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuZ3UoYSkpfHwKZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuQWUmJihjPXRoaXMucGxheWVyLkFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkNlKGEsYyxmKTt0aGlzLnBsYXllci54aChsKX19LHR0OmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMubmQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5uZC5nZXRUaW1lKCksdGhpcy5uZD1hLDNFNTxiPyEwOiExO3RoaXMubmQ9YTtyZXR1cm4hMX0sQnc6ZnVuY3Rpb24oKXtlLlllKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5FYSgiYWRUYWciKTt0aGlzLkVhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5FYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuamcoYSkpP3RoaXMuemMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLAowKSxlLncoay5aYyx0aGlzLnBsYXllci52KCkpKX0sQXc6ZnVuY3Rpb24oYSl7ZS5ZZSgicG9zdHJvbGwiKTtpZighdGhpcy5taCl7dGhpcy5xdyghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5FYSgiYWRUYWciKTt0aGlzLkVhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuRWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5qZyhjKSk/dGhpcy56YyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5aYyx0aGlzLnBsYXllci52KCkpKX19LGpnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxZdjpmdW5jdGlvbigpe3RoaXMucGxheWVyLnZ3KHRoaXMuQXcuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGEoKX0sCkFkOmZ1bmN0aW9uKGEpe2UuWWUoIm1pZHJvbGwiKTtpZighdGhpcy5aZyl7dGhpcy5aZz0hMDt2YXIgYj10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkVhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy56YyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aZz0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5aYyx0aGlzLnBsYXllci52KCkpKX19LFh2OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucHcodGhpcy5BZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5HZSgpfSxjOmZ1bmN0aW9uKCl7dGhpcy5CdygpO3RoaXMucGxheWVyLkdlJiZ0aGlzLlh2KCk7dGhpcy5ZdigpfSxadjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOgphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy50ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuTnkoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnVkPXRoaXMudGQubGVuZ3RofSxGczpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy51ZCYmKGE9ITApO3JldHVybiBhfSxldzpmdW5jdGlvbihhKXt0aGlzLm9oPWE7Zm9yKGE9MDthPHRoaXMudGQubGVuZ3RoO2ErKyl0aGlzLnRkW2FdWyJmdW5jdGlvbiJdKHRoaXMuRXYuYmluZCh0aGlzKSl9LEV2OmZ1bmN0aW9uKGEpe3RoaXMudWQtLTthJiZ0aGlzLlJlLnB1c2goYSk7MD49dGhpcy51ZCYmdGhpcy5vaCgpfSxndTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5SZS5sZW5ndGg7YysrKWI9dGhpcy5SZVtjXSwKYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMuZml8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXI9dGhpcy5hWzddO3RoaXMuS249dGhpcy5hWzldO3RoaXMuQmk9dGhpcy5hWzVdO3RoaXMuUG89dGhpcy5hWzRdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuaXY9dGhpcy5hWzFdO3RoaXMubnA9dGhpcy5hWzFdO3RoaXMubD10aGlzLmFbMl19Yy5XbD1iO2IucHJvdG90eXBlPXtocjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXI6dGhpcy5KbihhKX0sSm46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktuOnRoaXMuQWkoYSl9LEFpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5CaTp0aGlzLk9vKGEpfSxPbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUG86dGhpcy5EaihhKX0sCkRqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Fajp0aGlzLmh2KGEpfSxodjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaXY6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5wOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgY2Q9Yy5XbHx8Y2QsV2Q9bmV3IGNkKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9V2QuaHIoNCl9KS5jYWxsKGllSm9qdWFiemFpcm9oR3UsaWVKb2p1YWJ6YWlyb2hHdSk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
144.76.158.35 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.35.158.76.144.clients.your-server.de
Software
AmazonS3 /
Resource Hash
640f0a03cd1e9c721ac8844b006b9047b070a9f7d13a3278b98fb0461947dd8f

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
ssl.1.damoh.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Connection
keep-alive
Content-Length
87
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Wed, 17 Apr 2019 06:56:38 GMT
Connection
keep-alive
Content-Length
288
Last-Modified
Wed, 27 Mar 2019 14:25:45 GMT
Server
AmazonS3
Etag
"54c7dbe42d2e906013c324c59a35e181"
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
data
dc371.s79.research.de.com/
43 B
308 B
Image
General
Full URL
https://dc371.s79.research.de.com/data?/dlmkCFFAAKktFLkqFFlqwF5xA00A22ATkzFePQDAAAAAAAznuqAPIAAAAAAAAzkfLASksFmRdXUAKAAsEAYJAAAAAaptAAAJLo0F0wFz6BvvAjkFuuBhzFuuBhkF2vFs1F0pFvuFukElvBjyFvwAwwA32A03AyvA32AuoE0tFs/BjsFpjFrUFhnF9oE00FwzFlzABlByGElyAGhFkjFspFjrFunEukEv1FisFljFspFjrFuuEl0FlyAGwFjzFlyAGjFspFjrFlyA1zAG4FhpFlyA1zAEBFLBFPqFz1Fr5B5KF1vF2KFUuFw1E35AR2BDNF1NFEqFyxBRyBwzES0FtyExyEG2F55E4qFXOFWyB0yFnhFmIFP3BonFU3BJkF5QE44F4BFPGFXfFxCEEGF2YE4kE52EZIF5GE2GEGxFJuF30FDTFW6F01BXZFwVENrFwkElhFxwFtrFWTFt4BzYFtlFZKFFtB23E1JEz2E1oFP2Fw4BJsFkBFzjEqzFxtB4lFYkF3xE55FYTFo3BzBFWjFB0Bf1Fj0BYJFzoEJrFZ5BZFFZiFvOFhtFOSFVzBorFwCFvvFw4BREFooFniFtQFIIF44F4yEzzEzJF1EEtxAyHFK4F2FEEyFQSFFiFVPF2ZEqKFllFtFEwwFMwB3iEliFQUFFxF5mEQrF44AR1B2zFBxFfKFzlAy1Ay2AzhFplBy1AzEEBNFmsFtZES1B1jFzKEvoFqLFqyFMwBv3FMkFKzFLyFzqFDRFp6FwSE3kFmUFu2FxzBiPFt0E35Fv3FhLFXwBSMFHiFnyB6yBmwFt2F31BkQFlpFqDFBuFHCFYJF4wAzNECoFzPEtoFtvFnJFDmFqTF4SEtkEwYECsFInFlyA1yA2zEpnFlyA1zAEDFnwBByFLKFT6FEPF4nEPSF62BoyBwFFBFFlyA1yA21EysFmpF4lBy1AzEExlAy1Ay2AhkF1yFslBy1AzEEo0F0wFzlBzBElyAGlByGEhzFuuBhkF2vFs1F0pFvuFukEllByGEwwAwxA2mEmwB0wAwwA32A03AywAwwAwwAl5B0vAlzAGhFzuFfjF0lBzEE1jEi2BjlFy1AtxA2mEmwBt3A20A3yAt2Ah1BlyA2nEkwFylBzEElyA2nEkwFyfFjvFuzFluF0lBzEEmBECAIQFAAAAAAAAAAAAAAGAJGFSBFNFFQtjFZWoyVA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
144.76.237.196 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h371.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:38 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 17-Apr-19 06:56:37 GMT
data
dc371.s79.research.de.com/
43 B
308 B
Image
General
Full URL
https://dc371.s79.research.de.com/data?/dlmkDgFAATkzFePHAAAAAAAAzN8+APUAAAAAAAAz2W7ASksFXSdJGAMCAgMA6DAAAAAN0KAAA7Jo0F0wFz6BvvAjkFuuBz0FyvFllFykFpnFp0FhsFtlFkpFhuBklFvBEkzFvyAwxA5fEyyAwzAfwBwxA3vAisFixBvpEukFl4FuoE0tFs/BjsFpjFr0FhnF9oE00FwzF6vAvhEkjFspFjrFunEukEv1FisFljFspFjrFuuEl0FvwEjzFvjEspFjrFlyA1zAG4FhpFlyA1zAEBFLBFPqFz0FoYFtfECxFL0FCTFVxFDMFpyBHPFwzAfTFk0BjzBrxBTxFHxFB3FwPEtPFC5B5IF0xBavFE4FztBmRFUQFwtFq4FUpFyGFoZFIiF02BpZFmZFRaFrGF6VFGrFZsFUxB6SFTwBJwBxCFzvEt3EJiF1fFkVF45FtXFLSFhLFiWFZxBv4FsyF3KEZzBsSFMWFOrFlBFI3FsCFXtFqtB45EriF2NE3XFm5FjFFzGF3YEIWFf3FUQF6wFKXFmoF2DEStFLjFotF2rFBTFl1F1wEUxBWTFILFDxBi3FpMFf4BmpF25AEJFz3EY1BS0FPPFtvEYaFrsFDiF44EZ3FyqF2wF21FoWF0oEYQFRqFU0FzHEi4FqMF3aEmTF2fFDtBhyFp4FaHFjzBKtFOyBXMFBlBy1Ay2AzhFplBy1AzEEBNFmsFtZEUEFmpFJ5FIrF1rFasFyFFtzFz5Ez3FzNFIXF3xB5QEH5FOKFPvF1VF5tAizFjiFChFpIFSQFN3BoVFzmEvnFiVFtNF02B33AG3FuHFsGFRaFNDFpjFfGFx1FExBBjFlGFJhFnWFtrFy1BTFF6TFNQF6sFTnFlyA1yA2zEpnFlyA1zAEDFnwBByFLKFT6FQzBzlFw2ElzBEJFaFFBFFlyA1yA21EysFmpF4lBy1AzEExlAy1Ay2AhkF1yFslBy1AzEEo0F0wFzlBzBElyAGlByGE33F3uB2vFkhFmvFulF1wFspFm0FukElBFCACCFAAAAAAAAAAAAAAGAJGFSBFNFFdhPACRAsEA6DAAAAAeReAAAKBo0F0wFz6BvvA0wFjuBnvFvnFslFz5FukFpjFh0FpvFuuBjvFtvBzhFmlFmyFhtFlvBxtAwtAzyAvoE0tFsvBjvFu0FhpFulFyuBo0FtsF/uE9xACANSFAAAAAAAAAAAAAAGAJGFSBFNFFQtjFYY/7VA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
144.76.237.196 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h371.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:38 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 17-Apr-19 06:56:37 GMT
data
dc371.s79.research.de.com/
43 B
308 B
Image
General
Full URL
https://dc371.s79.research.de.com/data?/dlmkEiFAAOprFiQfDOqwFiQfDlqwF5xA00A22ALkmFBTkzFASksFBYdlEAK4AoPA4BAAAAAglIAAAbPo0F0wFz6BvvAnvFvnFslFhkFzuBnuBkvF1iFslFjsFpjFruBulF0vBwhFnlFhkFvhEkzF/jEspFluF09BjhFtwE1iFtyAz0Ay1A04Ay0A01A21A3yA5mAv1F0wF10F9oE0tFsmBo9BxyAwmAzsFv0FuhFtlF93Az3Aw0Ax1A25AymAhkFr9B35A10AyyA0wAwmAhkFm9BxyAy5AyzA2zA5wAm3E9xAwwAwmAstF09Bx1A11A04A0xA52AmuE1tFfhFkzF9yAmnE1jFp9BxuAyuAwuAwuAyuAyuAwuAwmAmvFytFh0F9xAwwAw4ExyAwmA1yFs9Bo0F0wFzlBzBElyAGlByGE33F3uBnvFslFtuBklFlyAGuFl3FzlByGEz1FikFvtFhpFutB0hFrlFv2FlyFttEpjFyvFzvFm0FtsEvzFlzFtjEvuF0yFvsFtvE2lFytB3pFukFv3FztB0pFslFztBx5Aw0AtxA0wA3xA3uAo0FtsFmmEshFzoF9wAm3EnsF9xAmhEkzFpkF9OEUmBk0F9xA11A10A40Ax5A2yA0yAmiEwwF9xA4mAikF09B2yA5mAmkF09B3wAmpEk0F92A5mAzoF29ByyBwxA5wA0xA1mAjiF29ByyBwxA5wAxzAxmAzhFskFy9BhhFmhEi4Fl9BxmAjvFyyFlsFh0FvyF9zA03AxwAwxA3wAx5A3zAmmEytF9yAwmAw2F9yAmnEhfF2pFk9B54AwyAw5A0zAwuAx1A11A04A0xA52AmnEhfFzpFk9Bx1A11A04A0xA52AmnEhfFopFk9Bx4A54Az5AzzA2xAmnEhfFmjF9wAmpEhnF9wAmpEjzFn9B02A32A21AzyA22A4mAkzFz6F90A0mAtkFv9BwmAtzFv9BwmA1fF06F9wAm1EfoFpzF9yAm1EfqFh2Fh9BwmA1fFo9BxyAwwAm1Ef3F9xA2wAwmA1fFhoF9xAywAwmA1fFh3F9xA2wAwmA1fFjkF9yA0mA1fFuwFs1Fn9BwmA1fFutFptFl9BwmAhkF49By5AzmAhkF59By0Ax1AmiEp3F9xA14A1mAipFo9BxyAwwAmzEjyFf4F9wAmzEjyFf5F9wAmlEpkF9yAxwA2wA41AzmAvpFk9BzmAy4F9wAmlEhlF9wAmmEj9B21A2mAiyFkpFt9BwlAyDEwlAyDEwlAyDEwlAyDEx2AwwAlyADwBlyADxB2wAwlAyDExyAwwAlyADxB2wAwlAyDExyAwwAm2EpzF9xAmyEz6F9lA3DEl3ADlFFiFylB3DEmhEisF9DETmBwwFqsF91EmwEm4F9wAmmE19Bx2AmiEj9Bx1AmvEz3FfrFl5F90Aw5AyzAx0A0wAymApmFp9B0mA1jFp9B0uAt5F0hEv1BxmE1yEipFmmEziF9xAm4EwjF9pEQ1B3qFY2F4uEwmAw9Bo0F0wFzlBzBEvvA33F3uBnvFslFtuBklFmkE0kF94A1BECACCFAAAAAAAAAAAAAAGAJGFSBFNFFQtjFrbqkYA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
144.76.237.196 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h371.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:38 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 17-Apr-19 06:56:37 GMT
hic_qos
ssl.1.damoh.golem.de/
24 B
281 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,dmFyIGllSm9qdWFiemFpcm9oR3U9aWVKb2p1YWJ6YWlyb2hHdXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuTGV8fCh5LkxlPTApO3kuTGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5MZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5UYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEud2gobSksYS5DZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS4kcCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5ZYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wuc2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS54ZChjKTthLmt3KGwpO2EuaXcobSk7YS5adigpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlyPXRoaXMuYVs0XTt0aGlzLnh2PQp0aGlzLmFbN107dGhpcy5sPXRoaXMuYVs3XX1jLnN2PWI7Yi5wcm90b3R5cGU9e3hyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55cjp0aGlzLnd2KGEpfSx3djpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnh2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIga2E9Yy5zdnx8a2EsZGQ9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9ZGQueHIoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuJHA9ITE7dGhpcy5PYT0ic2V0dXAiO3RoaXMuQmM9W107dGhpcy5ZZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLkR2LmJpbmQodGhpcykpfWMucms9YjtiLnByb3RvdHlwZT17WWY6ZnVuY3Rpb24oKXt0aGlzLmNhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSwKb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LEpvOmZ1bmN0aW9uKGEpe3RoaXMuY2EuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG9hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxEdjpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5DdihhLmRhdGEpfSxDdjpmdW5jdGlvbihhKXtpZih0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPQp0aGlzLmNhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lciYmYS5ldmVudD09dGhpcy5jYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sVmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmNhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sYmc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lcyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuV2coYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGVzOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxIbzpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUuVXIoYSkpcmV0dXJuOyhiPXRoaXMuYmcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSxVcjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxtZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmCihiPXRoaXMuY2Eub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxCdDpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxOYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LHZnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxDaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT0KZG9jdW1lbnQuYm9keT8hMDohMX0sUGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSx1ZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoOwpkPXIud2lkdGg7Zj1yLmhlaWdodDswPnIudG9wJiYoZis9ci50b3ApO3IuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09ci5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sdmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy51ZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksMTAwKX0sdWI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LG9lOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0semg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxKPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLHAsbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBuPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLG4ucHVzaChjKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihuLnB1c2goZik7MTQhPW4ubGVuZ3RoJTE2OyluLnB1c2goMCk7bi5wdXNoKHA+Pj4yOSk7bi5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPG4ubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09blthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO3A9cjtsPUo7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfH5wJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKHBeCmxedikrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChwLDMwKSxwPWMsYz10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfHAmdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKHBebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKHAsMzApLHA9YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrcCY0Mjk0OTY3Mjk1O0o9SitsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihKKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LG5iOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+NixyPWMmNjMsaXNOYU4oZik/ZT1yPTY0OmlzTmFOKGMpJiYocj02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSx5dDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGZlOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHI9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IubGI/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8CmMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gobil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXI7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LCRyOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy5mZSgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFBhOmZ1bmN0aW9uKCl7dmFyIGE9e0lpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxPczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxibTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxUbjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5JaSgpfHxhLmRqKCl8fGEuT3MoKXx8YS5ibSgpfHxhLlRuKCl9fTtyZXR1cm4gYS5McCgpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGZkOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHNiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHBzOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxJcTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxHdzpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxxZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuT2goYikrIjoiK3RoaXMuT2goTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LE9oOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxZZTpmdW5jdGlvbihhKXt0aGlzLk9hPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLk9hO3RoaXMuTmYoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLAohMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxvYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlZCl7dmFyIHI9YTtkJiZiJiYoYj1rLlNhKGIsZCkpO2ImJihyPWsuU2EoYSxiKSk7ZiYmKHI9ay5TYShyLGYpKTtjJiYocj1rLlNhKHIsYykpO2gmJihyPWsuU2EocixoKSk7ZWQmJihyPWsuU2EocixoKSk7ZS5vYyhyKX0sRnY6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlJiYxMDIzIT1hLmNvZGUmJjEwMTghPWEuY29kZSl7dHJ5e2lmKGxhJiYoYi5zZXNzaW9uX2lkPWxhKSxiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiIsYS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpLGIuZXZlbnQ9CmEuY29kZSxiLnNpdGVfaHJlZj10aGlzLnBzKCksYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfX1jYXRjaChkKXt9cmV0dXJuIGJ9fSxOZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZ2KGEpO2lmKGIpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC52ZCgpKyI/aG9tYWRfYXQ9IitlbmNvZGVVUklDb21wb25lbnQoYik7bC53YShhLCEwKTthPWwud2EoYSwhMCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1lbmNvZGVVUklDb21wb25lbnQoYik7bC5IYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbHx8IWwuYmEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWErYjt0aGlzLkNjfHwodGhpcy5DYz17fSk7dGhpcy5DY1tmXXx8KHRoaXMuQ2NbZl09MCk7dGhpcy5DY1tmXSsrOzEwPHRoaXMuQ2NbZl18fChmPWwudmQoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpLGwud2EoZiwhMCksZj1sLndhKGYsITApLGYuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkhhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpKX19LERlOmZ1bmN0aW9uKCl7bCYmbC5iYT9sLmlzRW5hYmxlZCYmbC5ucSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZSgpfS5iaW5kKHRoaXMpLDUwMCl9LGxlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuYmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LG5lOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxiYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmdkKGEpOiIifSxnZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm5lKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sZXE6ZnVuY3Rpb24oYSxiLGQpe2Q9ITE7aWYoYi54ZShhKXx8dGhpcy5CdChhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LldlJiZ3aW5kb3cuc2FuZGJveC5XZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LldlWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwKc2FuZGJveC5XZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy5tZyhhKSlyZXR1cm4gdGhpcy5tZyhhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMubmIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtkJiYoZi5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtmLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2YuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjt2YXIgYz0hMTtkPSExO2Q9dGhpcy5UYShhLGIuR2EsZixmdW5jdGlvbihhKXtjPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2N8fChjPWQpLGM9SlNPTi5wYXJzZShjKX1jYXRjaChoKXtjPSExfWMudXJsJiZjLmhhc2gmJihjPWIubGQoKS5yZXBsYWNlKCJbaGFzaF0iLApjLmhhc2gpKTt0aGlzLkhvKGMsYSk7cmV0dXJuIGN9LFRhOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUscil7dmFyIGs9aHx8bDtoPSEwO3ImJihoPSExKTtpZihrJiZrLmJhKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7ay53YShhLGgpO2g9ay53YShhLGgpO2guZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuSGEoaCxmLGMsIiIsIiIsZSl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRhKGEsYixkLGYsYyxrLGUscil9LmJpbmQodGhpcyksNTAwKX0sV2c6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSl7dmFyIHI9ITA7ZSYmKHI9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7ZT1kO2Q9IiI7CmZvcih2YXIgayBpbiBlKWQrPSImIitrKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtrXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsciksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LCR0OmZ1bmN0aW9uKGEsYixkKXt0aGlzLldnKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLkJjKWZvcih2YXIgYyBpbiB0aGlzLkJjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuQmNbY10pOwpjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS5uYihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LFhnOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5uYihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuVGEoYSxmLkdhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT0KSlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuJHQoZi5sZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0scnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuQmM9YX0sTnk6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLlRhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLApiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGgpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LE1wOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSx3dDpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFE9Yy5ya3x8ClE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93LmtnPWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMucWs9YjtiLlNhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5wdj17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5zdT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi51eT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLkVyPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRnk9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5MZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuRWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLklmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLk1mPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi53bz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5HZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLll4PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5ydT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuRnI9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkF5PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlpmPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuQ3E9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLlpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuWWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLktmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLAptZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Iuem89e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLk1jPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5TZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5VZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IueW89e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlZoPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2Iud3U9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi5wZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07CmIubGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLiRmPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi50eT17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5WeD17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLnR1PXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfSxnZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX19fSkoYyk7dmFyIGs9Yy5xa3x8aztjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuanE9dGhpcy5hWzEwXTt0aGlzLiR3PXRoaXMuYVsxXTt0aGlzLlpuPXRoaXMuYVs2XTt0aGlzLkNrPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzhdfWMuZWk9YjtiLnByb3RvdHlwZT17aXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmpxOnRoaXMuWncoYSl9LFp3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kdzp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWm46dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNrOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgbWE9Yy5laXx8bWEsZmQ9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWZkLmlxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuc2s9YjtiLnByb3RvdHlwZT17b2U6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LG9iOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5BfHwieCIpfSxqczpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZSsKbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sZGQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmRkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuZGQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSx1YzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLm9lKHRoaXMub2IoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9CnRoaXMuZGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LHN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWMoKSsiMiJ9LE1nOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMub2UodGhpcy5qcygpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmRkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUj1jLnNrfHxSO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBvPXRoaXMuYVs0XTt0aGlzLnpwPXRoaXMuYVs2XTt0aGlzLlFuPXRoaXMuYVs4XTt0aGlzLnd5PXRoaXMuYVs2XTt0aGlzLnp5PXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzldfWMuRG49YjtiLnByb3RvdHlwZT17b286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT8KdGhpcy5wbzp0aGlzLnlwKGEpfSx5cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuenA6dGhpcy5QbihhKX0sUG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFuOnRoaXMudnkoYSl9LHZ5OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3k6dGhpcy55eShhKX0seXk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnp5OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgbmE9Yy5Ebnx8bmEsZ2Q9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9Z2Qub28oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsCmY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGYuZj9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5mOmZ1bmN0aW9uKCl7ZC5mLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnRmPWJ9KShjKTt2YXIgSz1jLnRmfHxLO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhpPXRoaXMuYVsxXTsKdGhpcy5Nbz10aGlzLmFbOF07dGhpcy5sPXRoaXMuYVs5XX1jLllzPWI7Yi5wcm90b3R5cGU9e0dpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSGk6dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1vOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgb2E9Yy5Zc3x8b2EsaGQ9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9aGQuR2koNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5xbT1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMueWM9MTAwO3RoaXMudmI9MDt0aGlzLklhPTE1MDt0aGlzLnliPTA7dGhpcy5sdyhiKX0sYzpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMudmI8PXRoaXMuSWE/KHRoaXMudmIrKywKdGhpcy55Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnljKSk6MD50aGlzLklhJiYodGhpcy55Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnljKSl9LGF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmI+dGhpcy5JYT8hMDohMX0sVmU6ZnVuY3Rpb24oKXt0aGlzLnZiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsdzpmdW5jdGlvbihiKXt0aGlzLkc9Yn0sZ3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxLOmZ1bmN0aW9uKGIpe3RoaXMuSmFbYi5vYigpXT1iO0wmJkwuVWcmJkwuSXcoYil9LHB6OmZ1bmN0aW9uKCl7cmV0dXJuIGUuTmEodGhpcy5KYSl9LEo6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYT09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVtiLm9iKCldPyEwOiExfSx4dDpmdW5jdGlvbihiKXtiPWIuRmEoKTtmb3IodmFyIGEgaW4gdGhpcy5KYSlpZihiLmlkPT0KdGhpcy5KYVthXS5GYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxEejpmdW5jdGlvbihiKXt0aGlzLkphW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLnFtfHx0OyhmdW5jdGlvbihjKXtjLnNtPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMueWM9MTA7dGhpcy52Yj0wO3RoaXMuSWE9NTA7dGhpcy5OPW51bGw7dGhpcy5tYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMucWI9IiI7dGhpcy5mZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHY6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkZhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7fSwKdnc6ZnVuY3Rpb24oYil7dGhpcy5OPWJ9LHF6OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTn0scHc6ZnVuY3Rpb24oYil7dGhpcy5IZT1ifSxvejpmdW5jdGlvbigpe3JldHVybiB0aGlzLkhlfSxHZTpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMudmI8PXRoaXMuSWEmJih0aGlzLnZiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy55YykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYil7fX0sdWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sb2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sWmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxFejpmdW5jdGlvbigpe30sVjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5HcygpfHx0aGlzLkVvKCk7dGhpcy5aZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHJ6OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEVvOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmdhKDEwKSl9LEdzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxTOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPQpifSxGYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxtZDpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sVWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0seHo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYX0sZmE6ZnVuY3Rpb24oKXt0aGlzLm1hPSEwfSxQYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxrYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHhoOmZ1bmN0aW9uKGIpe3RoaXMucWI9Yn0sbno6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYn0sc2g6ZnVuY3Rpb24oKXt0aGlzLnFiPW51bGx9LHV6OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5xYiYmKGI9ITApO3JldHVybiBifSx6ejpmdW5jdGlvbigpe3RoaXMuZmd8fCh0aGlzLmZnPSEwKX0scWM6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sa3o6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBuPWMuc218fG47KGZ1bmN0aW9uKGMpe2MuZ2k9Sy5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLkc9dGhpcy5wbGF5ZXI9IiI7dGhpcy5DZj0iMSI7dGhpcy5EZj0iMiI7dGhpcy5ybz0iMyI7dGhpcy5HYz0wO3RoaXMuJGc9CjMwO3RoaXMuRGI9W107dGhpcy5aYT1bXTt0aGlzLiRiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLk9mPXRoaXMuUmg9ITE7dGhpcy5zdGF0dXM9dGhpcy5HYzt0aGlzLmlkPWUuZ2EoMTApO3RoaXMueGQoYik7dGhpcy5udyhhKX0sYzpmdW5jdGlvbigpe30sZWE6ZnVuY3Rpb24oKXt0aGlzLlJofHwodGhpcy5SaD0hMCxlLkRlKCkpfSxLZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1MmJlMuS2ImJiFwYSYmKHBhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LEY6ZnVuY3Rpb24oYixhKXt2YXIgZz0hMDtiJiYoZz0hMSk7cmV0dXJuIHRoaXMuaGEoKT8hMToodGhpcy5zdygpLHRoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpLHRoaXMuS2goKSx0aGlzLk9mPSEwLGEmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCksITApfSxzOmZ1bmN0aW9uKGIsCmEpe3RoaXMuaGEoKXx8KHRoaXMuRGIucHVzaChiKSx0aGlzLlphLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxLaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuRGImJjA8dGhpcy5EYi5sZW5ndGgmJih0aGlzLkRiPWUudW5pcXVlKHRoaXMuRGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkRiLmpvaW4oIiwiKSkpO2lmKHRoaXMuWmEpe2Zvcih2YXIgZz0wO2c8dGhpcy5aYS5sZW5ndGg7ZysrKXRoaXMuJGJbdGhpcy5aYVtnXS5yZWFzb25dPT10aGlzLiRiW2JdJiZhLnB1c2godGhpcy5aYVtnXS5kZXRhaWwpLHRoaXMuJGJbdGhpcy5aYVtnXS5yZWFzb25dPHRoaXMuJGJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlphW2ddLmRldGFpbCksYj10aGlzLlphW2ddLnJlYXNvbik7dGhpcy4kYltiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihnPWUudW5pcXVlKGEpLGI9YisiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsCmIsITAsYSl9fSxzejpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9mfSxvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5DZn0sc3c6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkRmfSx0dzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMucm99LFJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5HY30sRmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuQ2Z9LGJ6OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkRmfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5HY30seGQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxudzpmdW5jdGlvbihiKXt0aGlzLkc9Yn0sZ3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxjdTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuZ2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRtPXRoaXMuYVs2XTt0aGlzLmNrPXRoaXMuYVs3XTt0aGlzLnhqPXRoaXMuYVsyXTt0aGlzLmxpPXRoaXMuYVs1XTt0aGlzLkJqPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsyXX1jLmZvPWI7Yi5wcm90b3R5cGU9e0NtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5EbTp0aGlzLmJrKGEpfSxiazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2s6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhqOnRoaXMua2koYSl9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5saTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQmo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYT1jLmZvfHxxYSxpZD1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9aWQuQ20oNCk7KGZ1bmN0aW9uKGMpe2MucWo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuZ2IoYil9LmJpbmQodGhpcykpfSxnYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5OJiZ0aGlzLk4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTsKdmFyIFQ9Yy5xanx8VDsoZnVuY3Rpb24oYyl7Yy5waj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2Q9bnVsbDt0aGlzLmN5PTFFMzt0aGlzLmpoPW51bGw7dGhpcy5weD0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cubGIpYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkYoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Oci5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuQ3MuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5CcyhhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuZnkoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmd5KGIpfS5iaW5kKHRoaXMpKSk7CmIub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLkFzKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5BcShhKX0uYmluZCh0aGlzKSl9LEFxOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkYoKX0sZnk6ZnVuY3Rpb24oYil7dGhpcy5LZHx8KHRoaXMuS2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmh5KGIpfS5iaW5kKHRoaXMpLHRoaXMuY3kpKX0saHk6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2QpO3RoaXMuRigpfSxneTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5LZCl9LEFzOmZ1bmN0aW9uKGIpe3RoaXMuaHooYik7dGhpcy5qaD1uZXcgRGF0ZTt0aGlzLmpoLXRoaXMuenY8dGhpcy5weD90aGlzLkYoKTp0aGlzLm8oKX0sQ3M6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy54ZChuZXcgVChhKSkpOwp0aGlzLkYoKX0sTnI6ZnVuY3Rpb24oKXt9LEJzOmZ1bmN0aW9uKCl7dGhpcy56dj1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLnBqfHxyYTsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLk5hKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5KKGcpfHwodGhpcy5LKGcpLChuZXcgcmEoZyx0aGlzLkcpKS5jKCkpfX10aGlzLkkoKX19fSl9KShjKTt2YXIgc2E9Yy5yanx8c2EsdGE9bmV3IHNhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZ3PXRoaXMuYVsyXTt0aGlzLkN5PQp0aGlzLmFbNV07dGhpcy5tbz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs4XX1jLnltPWI7Yi5wcm90b3R5cGU9e0V3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gdzp0aGlzLkJ5KGEpfSxCeTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3k6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgdWE9Yy55bXx8dWEsamQ9bmV3IHVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9amQuRXcoNCk7KGZ1bmN0aW9uKGMpe2MuUms9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5MYj0hMTt0aGlzLmxnKCk7dGhpcy5uZygpO3RoaXMuQnE9ITF9LGxnOmZ1bmN0aW9uKCl7dGhpcy5MYj0KITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLkxiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlMoYil9LG5nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTGIpe3ZhciBiPXRoaXMuRmEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkxiPSEwKTt0aGlzLlYoYSl9fSxsYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5OJiYoMCx0aGlzLk4pKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCwKY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLk4mJigwLHRoaXMuTikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLk4mJigwLHRoaXMuTikoKX0uYmluZCh0aGlzKSl9LEdlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuQWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkFkKGEpfS5iaW5kKHRoaXMpKX0sQWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsKYS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5IZSYmKDAsdGhpcy5IZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxrYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHZhPWMuUmt8fHZhOyhmdW5jdGlvbihjKXtjLlFrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE06ZnVuY3Rpb24oKXt9LFJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5HYzt0aGlzLmlzUGxheWluZz10aGlzLkljPSExO3RoaXMuVGQ9MTt0aGlzLktjPVtdO3RoaXMuamI9ITF9LGM6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLkljPSExO3RoaXMuVGQ9MTt0aGlzLktjPVtdO3RoaXMuamI9ITE7dGhpcy5nZXRQbGF5ZXIoKTsKdmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlRkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5qYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuamI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuamI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmpiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMuSWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMuS2UoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLiRnJiYKIXRoaXMuaGEoKSYmKHRoaXMuamI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMudSgpKToodGhpcy5zKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy51KCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLlJhKCksdGhpcy5nZXRQbGF5ZXIoKS5CcT0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkucWI7YSYmKGEucmQoKSxhLmNlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLkljPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMuS2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuJGcmJiF0aGlzLmhhKCkmJih0aGlzLmpiPyh0aGlzLnMoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5LYy5pbmRleE9mKGEpJiYKdGhpcy5LYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLmVhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5zKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuS2MubGVuZ3RoPj10aGlzLlRkJiZ0aGlzLnUoKSl9LGN1OmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sdTpmdW5jdGlvbihiKXtiP3RoaXMuaWU/dGhpcy5pZSsrOnRoaXMuaWU9MTp0aGlzLmhlP3RoaXMuaGUrKzp0aGlzLmhlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkNoKGEudmlkZW9UYWcpP2EuTGI/dGhpcy5vKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5JY3x8dGhpcy5pc1BsYXlpbmc/Cih0aGlzLmhlPnRoaXMuaWUmJihiPSExKSx0aGlzLkYoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDUwKTooYS5sZygpLGEubmcoKSxhLkxifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHdhPWMuUWt8fHdhOyhmdW5jdGlvbihjKXtjLlNrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuY3MoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPW5ldyB2YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSihnKXx8dGhpcy54dChnKXx8KHRoaXMuSyhnKSxnPW5ldyB3YShnLHRoaXMuRyksZy5NKCksZy5jKCkpfX10aGlzLkkoKX19LG16OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LApjczpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUubmIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHhhPWMuU2t8fHhhLHlhPW5ldyB4YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dT10aGlzLmFbNV07dGhpcy5keD10aGlzLmFbOV07dGhpcy5PcD10aGlzLmFbOV07dGhpcy51bT10aGlzLmFbOF07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5jcD10aGlzLmFbOF07dGhpcy51cj10aGlzLmFbMV07dGhpcy5JdD10aGlzLmFbNl07dGhpcy5vbT10aGlzLmFbNV07dGhpcy4kcz10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs0XX1jLnZvPWI7Yi5wcm90b3R5cGU9e3V1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52dTp0aGlzLmN4KGEpfSxjeDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZHg6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5PcDp0aGlzLnRtKGEpfSx0bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW06dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmZsOnRoaXMuYnAoYSl9LGJwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5jcDp0aGlzLnRyKGEpfSx0cjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudXI6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkl0OnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vbTp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHM6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6YT1jLnZvfHx6YSxrZD1uZXcgemEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT0Ka2QudXUoNCk7KGZ1bmN0aW9uKGMpe2MuYW89bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb19pZCk7dGhpcy5TKGIpO3ZhciBiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0sYT10aGlzLmdldFJhd1BsYXllcigpO2ImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlYoYik6dGhpcy5JKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlhPWkNPTSJ9fSl9KShjKTsKdmFyIEFhPWMuYW98fEFhOyhmdW5jdGlvbihjKXtjLiRuPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IudHJhY2tlci52YXN0X3ByZXJvbGx8fGIudHJhY2tlci52YXN0X3Bvc3Ryb2xsP3RoaXMubygpOih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLnUoKSl9LHU6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMuRigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEJhPWMuJG58fEJhOyhmdW5jdGlvbihjKXtjLmJvPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzJiYKMDxlLk5hKHdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcykpe3ZhciBiPXdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YlthXTtpZihnLmNvbnRyb2xzJiZnLmNvbnRyb2xzLnBsYXllcilnPW5ldyBBYShnKSx0aGlzLkooZyl8fCh0aGlzLksoZyksKG5ldyBCYShnLHRoaXMuRykpLmMoKSk7ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19KX0pKGMpO3ZhciBDYT1jLmJvfHxDYSxEYT1uZXcgQ2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRmk9dGhpcy5hWzRdO3RoaXMuSWs9dGhpcy5hWzVdO3RoaXMuRHU9dGhpcy5hWzhdO3RoaXMuWnE9dGhpcy5hWzRdO3RoaXMuVW09dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbNl19Yy5Laz1iO2IucHJvdG90eXBlPQp7RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZpOnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jazp0aGlzLkN1KGEpfSxDdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkR1OnRoaXMuWXEoYSl9LFlxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5acTp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBFYT1jLktrfHxFYSxsZD1uZXcgRWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1sZC5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5Gbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPQpiLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5WKGIpOnRoaXMuZmEoKSk6dGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuZ2IoYil9LmJpbmQodGhpcykpfSxnYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5OJiZ0aGlzLk4oKX0sbWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGcpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciBGYT1jLkZufHxGYTsoZnVuY3Rpb24oYyl7Yy5Fbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5XPXRoaXMuV3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnFhPXRoaXMudGM9dGhpcy54YT10aGlzLlFjPSExO3RoaXMucGg9ZS51YigxMCk7dGhpcy5RaD0hMDt0aGlzLmVjPXRoaXMuSmc9ITE7dGhpcy5laCgpO3RoaXMua3EoKTt0aGlzLlFhKCl9LEF6OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5vYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5aLCI7Iix0eXBlb2YgYi5aLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlo/Yi5aLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5aP3R5cGVvZiBiLlouc3RhdGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuUiwiOyIsdHlwZW9mIGIuUiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLlI/Yi5SLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuRGE6InVuZGVmaW5lZFgiLAoiOyIsYi5SP3R5cGVvZiBiLlIuRGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLkRhP2IuaW1hLkRhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuRGE/dHlwZW9mIGIuaW1hLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuUiYmYi5SLkRhP2IuUi5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5SJiZiLlIuRGE/dHlwZW9mIGIuUi5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5QZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5QZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuUj9iLlIuUGQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5QZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsCiI7IixiLmltYT9iLmltYS5RZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5RZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlFkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuUWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEudmE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEudmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuUj9iLlIudmE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi52YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuV2Q6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuV2Q6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLldkOgoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLldkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMucGgpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sSGI6ZnVuY3Rpb24oKXtpZighdGhpcy52YSl7dmFyIGI9dGhpcy5wYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudmE9CmIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnZhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnZhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnZhfSx5ZzpmdW5jdGlvbigpe2lmKCF0aGlzLnRjKXt2YXIgYj10aGlzLnBiKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMudGM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLnRjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMudGN9LHZ0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuSWcpe3ZhciBiPXRoaXMucGIoKSxhPXRoaXMudXQoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLklnPSEwKX1yZXR1cm4gdGhpcy5JZ30sdXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwohdGhpcy5RYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuUWM9ITApO3JldHVybiB0aGlzLlFjfSxRYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLlVlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcyksCjIwKX0sVWU6ZnVuY3Rpb24oKXt0aGlzLmVjPSEwO3ZhciBiPXRoaXMueWcoKTtpZihifHx0aGlzLmhhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5zKCJhZGVycm9yIiwKdGhpcy5XKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5QYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuZmM9ITA7aWYoZS5zYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5mY3x8KHRoaXMucygiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcyksCjIwKX0sbHo6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmFnJiZiLmFkcyYmKHRoaXMuYWc9Yi5hZHMpO3JldHVybiB0aGlzLmFnfSxrcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLmFhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLmFhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMuYWEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLmFhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubygpO3RoaXMuS2UoKX0uYmluZCh0aGlzKSl9LGRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy55ZygpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSw1MCl9LGVoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLnZ0KCkpe3ZhciBhPXRoaXMucGIoKSxnPXRoaXMuSGIoKTthJiZnJiYodGhpcy5wYigpLHRoaXMuSGIoKSx0aGlzLmVjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWM/dGhpcy5vKCk6KHRoaXMuYWEoITApLHRoaXMucygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLnBiKCl9ZWxzZSB0aGlzLkpnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGIoKSxiPXRoaXMuSGIoKTthJiYhYj8odGhpcy5zKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmFhKCkpOih0aGlzLmFhKCEwKSx0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5KZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVoKCl9LmJpbmQodGhpcyksNTApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LGxxOmZ1bmN0aW9uKCl7dGhpcy5rY3x8KHRoaXMua2M9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLmtjIT1iLmFkcy5zdGF0ZSYmKHRoaXMua2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLmtjKXt0aGlzLm8oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMua2M9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxxKCl9LmJpbmQodGhpcyksMTApfSx5YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpezA8PWUuZmQoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuVz90aGlzLnUoITApOih0aGlzLnFhPSEwLHRoaXMubygiZW1wdHkgdmFzdCIpKX0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMubygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuUWg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5GKHRoaXMuUWgsZnVuY3Rpb24oKXt0aGlzLmRnKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApxcTpmdW5jdGlvbigpe3RoaXMudnp8fCgxMDx0aGlzLmR5Pyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuZHkrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy4kdigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xcSgpfS5iaW5kKHRoaXMpLDUwKSkpfSwkdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5leSl7dGhpcy5leT0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5hYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBHYT1jLkVufHxHYTsoZnVuY3Rpb24oYyl7Yy5Hbj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApjOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuRGgod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLkRoKGJbZ10pfWNhdGNoKGQpe310aGlzLkkoKX19LERoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuTmEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgRmEoYltnXSksYS5tYXx8dGhpcy5KKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLksoYSksKG5ldyBHYShhLHRoaXMuRykpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy55Yj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy55Yyl9fSl9KShjKTt2YXIgSGE9Yy5Hbnx8SGEsSWE9bmV3IEhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk54PXRoaXMuYVs5XTt0aGlzLiR1PXRoaXMuYVszXTt0aGlzLkdrPXRoaXMuYVs4XTt0aGlzLnhxPXRoaXMuYVs4XTt0aGlzLldqPXRoaXMuYVs2XTt0aGlzLkp1PXRoaXMuYVs5XTt0aGlzLlJpPXRoaXMuYVsxMF07dGhpcy5Ldz10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs4XX1jLnR2PWI7Yi5wcm90b3R5cGU9e014OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTng6dGhpcy5adShhKX0sWnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR1OnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Hazp0aGlzLndxKGEpfSx3cTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnhxOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Xajp0aGlzLkl1KGEpfSxJdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSnU6dGhpcy5RaShhKX0sUWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJpOnRoaXMuSncoYSl9LEp3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS3c6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBKYT1jLnR2fHxKYSxtZD1uZXcgSmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1tZC5NeCg0KTsoZnVuY3Rpb24oYyl7Yy5ibj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5nZXRQbGF5ZXIoKS5pZCk7CmIuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlYoYSl9LGxhOmZ1bmN0aW9uKCl7fSxnYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksZz1iLmdldER1cmF0aW9uKCk7YSYmMDxhJiZnJiYwPGcmJmE+PWctMiYmdGhpcy5OJiYidW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkKCkmJnRoaXMuTigpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBhdXNlKCk6Yi5pc1BhdXNlZCgpfHxiLmdldFBsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQYXVzZWQoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGxheSgpOgpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT0xMDAqYi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgS2E9Yy5ibnx8S2E7KGZ1bmN0aW9uKGMpe2MuYW49dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuSWI9bnVsbDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGI9ITE7dGhpcy5yaCgpO2lmKGIuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGIuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgYT0KYi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5YYj0hMCx0aGlzLm8oKTt0aGlzLnMoImFkZXJyb3IiLGEpO2IuZ2V0UGxheWVyKCk7Yi5nZXRQbGF5ZXIoKTt0aGlzLlZjKCl9fWVsc2UiZmxhc2giPT1iLnBsYXllcl90eXBlP3RoaXMuV2YoKTp0aGlzLm8oKX0sVmM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuaGEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmdldFBsYXllcigpO2lmKCJwbGF5aW5nIj09YS5nZXRQbGF5ZXIoKS5zdGF0ZSlpZihhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBnPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7CmEuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLlhiPSEwLHRoaXMubygpO3RoaXMucygiYWRlcnJvciIsZyk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7dGhpcy5YYj90aGlzLmVhKCk6Yj9hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlP3RoaXMuRigxMDEyIT1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlKTphLmdldFBsYXllcigpLmFkc19sb2FkZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZjKCEwKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuRighMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZjKCEwKX0uYmluZCh0aGlzKSwxMDApfX1lbHNlIHRoaXMubygpO2Vsc2UgYS5nZXRQbGF5ZXIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlZjLmJpbmQodGhpcyksCjEwMCl9fSxXZjpmdW5jdGlvbigpe2lmKCF0aGlzLmhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkliKSx0aGlzLm8oKSk7ImZpcnN0UXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuSWIpLHRoaXMubygpKTsibWlkcG9pbnQiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuSWIpLHRoaXMubygpKTsidGhpcmRRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5JYiksdGhpcy5vKCkpOyJhZExvYWRpbmdFcnJvciI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmbnVsbD09dGhpcy5JYiYmKHRoaXMuSWI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhifHwKKHRoaXMucygiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy5GKCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2YuYmluZCh0aGlzKSw1MCl9fSxyaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7Yi5hZHNfbG9hZGVyP2IuYWRzX2xvYWRlciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YS5nZXRFcnJvcigpO2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKTtpZigxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKSl0aGlzLlhiPSEwLHRoaXMubygpOzkwMT09YS5nZXRFcnJvckNvZGUoKSYmCnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmgoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTGE9Yy5hbnx8TGE7KGZ1bmN0aW9uKGMpe2MuY249dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiZ2aWRlby5nZXRQbGF5ZXImJnZpZGVvLmdldFBsYXllcigpJiYodmlkZW8uZ2V0UGxheWVyKCkuZWx8fCJmbGFzaCI9PXZpZGVvLnBsYXllcl90eXBlKSl7dmFyIGI9bmV3IEthKHZpZGVvKTt0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBMYShiLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWE9Yy5jbnx8TWEsTmE9bmV3IE1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklyPXRoaXMuYVs3XTt0aGlzLnZzPXRoaXMuYVsxXTt0aGlzLnZwPQp0aGlzLmFbN107dGhpcy5Tbj10aGlzLmFbM107dGhpcy5HbD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsxMF19Yy5Xbz1iO2IucHJvdG90eXBlPXtIcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSXI6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZzOnRoaXMudXAoYSl9LHVwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52cDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU246dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgT2E9Yy5Xb3x8T2EsbmQ9bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9bmQuSHIoNCk7KGZ1bmN0aW9uKGMpe2MuWm09Cm4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmVsXzthfHwoImZ1bmN0aW9uIj09dHlwZW9mIGIuZWw/YT1iLmVsKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGIuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQoKSkpKTt0aGlzLlMoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJihiPWJbMF0pO3RoaXMuVihiKX0sZ2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuTiYmdGhpcy5OKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmKGE9Yi5wYXVzZWQoKSk7YXx8Yi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMTsiZnVuY3Rpb24iPT10eXBlb2YgYi5wYXVzZWQmJihhPWIucGF1c2VkKCkpO2EmJmIucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUyIn0sa2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5tdXRlZCYmImZ1bmN0aW9uIj09dHlwZW9mIGEubXV0ZWQmJihiPWEubXV0ZWQoKSk7cmV0dXJuIGJ9LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExO2Iudm9sdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgYi52b2x1bWUmJihhPTEwMCpiLnZvbHVtZSgpKTtyZXR1cm4gYX0sVWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9fSl9KShjKTt2YXIgUGE9Yy5abXx8UGE7KGZ1bmN0aW9uKGMpe2MuWW09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuVmYoKTtiLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwO3RoaXMueG98fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoInRpbWV1cGRhdGUiKTt0aGlzLkYoITApfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9GSVJTVF9RVUFSVElMRSIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX01JRFBPSU5UIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfVEhJUkRfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLnMoImFkc2Vycm9yIik7dGhpcy56cyhhKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LAp6czpmdW5jdGlvbihiKXt2YXIgYT05OTk5OTk7aWYoYi5kYXRhJiZiLmRhdGEuQWRFcnJvcilmb3IodmFyIGcgaW4gYi5kYXRhLkFkRXJyb3IpYi5kYXRhLkFkRXJyb3IuaGFzT3duUHJvcGVydHkoZykmJiJudW1iZXIiPT10eXBlb2YgYi5kYXRhLkFkRXJyb3JbZ10mJihhPWIuZGF0YS5BZEVycm9yW2ddLHRoaXMucyhhKSk7OTAxPT1hP3RoaXMubygpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLlhiPSEwLHRoaXMubygpLHRoaXMuZWEoKSk6dGhpcy5GKCl9LFZmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkcyYmYi5hZHMuaXNBZFBsYXlpbmcmJmIuYWRzLmlzQWRQbGF5aW5nKCk/KHRoaXMueG89ITAsdGhpcy5vKCkpOnRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5WZi5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZz8KdGhpcy5GKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgUWE9Yy5ZbXx8UWE7KGZ1bmN0aW9uKGMpe2MuJG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllckZyYW1ld29yayYmd2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlJiYiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKXt2YXIgYj13aW5kb3cucGxheWVyRnJhbWV3b3JrLmdldEJhc2UoKTtpZihiJiZiLmdldEFsbFBsYXllcnMmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFsbFBsYXllcnMpaWYoKGI9Yi5nZXRBbGxQbGF5ZXJzKCkpJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9bmV3IFBhKGJbYV0pO3RoaXMuSihnKXx8KHRoaXMuSyhnKSwobmV3IFFhKGcsdGhpcy5HKSkuYygpKX1lbHNlIHRoaXMuSSgpfWVsc2UgdGhpcy5WZSgpLAp0aGlzLkkoKX19KX0pKGMpO3ZhciBSYT1jLiRtfHxSYSxTYT1uZXcgUmEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzldO3RoaXMuemk9dGhpcy5hWzhdO3RoaXMuUXM9dGhpcy5hWzddO3RoaXMudHA9dGhpcy5hWzZdO3RoaXMuTXQ9dGhpcy5hWzRdO3RoaXMueXU9dGhpcy5hWzZdO3RoaXMucHU9dGhpcy5hWzRdO3RoaXMuTnM9dGhpcy5hWzddO3RoaXMua3Y9dGhpcy5hWzEwXTt0aGlzLkd4PXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsxMF19Yy5Obz1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTW06dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnppOnRoaXMuUHMoYSl9LFBzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Rczp0aGlzLnNwKGEpfSxzcDpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLnRwOnRoaXMuTHQoYSl9LEx0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NdDp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5vdShhKX0sb3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnB1OnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnM6dGhpcy5qdihhKX0sanY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmt2OnRoaXMuRngoYSl9LEZ4OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5HeDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIFRhPWMuTm98fFRhLG9kPW5ldyBUYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPW9kLkxtKDQpOyhmdW5jdGlvbihjKXtjLk1pPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsCmEpe3RoaXMuaShiKTt0aGlzLmRoPWF9LE06ZnVuY3Rpb24oKXt9LEVlOmZ1bmN0aW9uKGIpe3RoaXMuZGg9YjtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGgpLnBhcmVudE5vZGU7dGhpcy5TKGIpO3RoaXMuVihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIFVhPWMuTWl8fFVhOyhmdW5jdGlvbihjKXtjLkxpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmkoYixhKX0sRWU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTsKdmFyIGI9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUiksYT10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuQURWRVJUSVNJTkcpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuQkVHSU4sZnVuY3Rpb24oKXt0aGlzLnMoImNvbnRlbnRwbGF5Iik7dGhpcy5GKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMucygiY29udGVudHBsYXkiKTt0aGlzLkYoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBWYT1jLkxpfHxWYTsoZnVuY3Rpb24oYyl7Yy5OaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPQpicmlnaHRjb3ZlLmV4cGVyaWVuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1icmlnaHRjb3ZlLmdldEV4cGVyaWVuY2UoYSksZD0hMTtnJiYoZD1nLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUikpO2lmKGcmJmQmJmQuaXNQbGF5ZXJEZWZpbmVkKCkpZD1uZXcgVWEoZCxhKSx0aGlzLkooZCl8fChkLkVlKGEpLHRoaXMuSyhkKSxkPW5ldyBWYShkLHRoaXMuRyxnKSxkLkVlKGcpLGQuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFdhPWMuTml8fFdhLFhhPW5ldyBXYShpYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTHg9dGhpcy5hWzJdO3RoaXMuWXU9dGhpcy5hWzJdO3RoaXMuVXM9dGhpcy5hWzJdO3RoaXMuUXE9dGhpcy5hWzhdO3RoaXMuUnU9dGhpcy5hWzZdO3RoaXMuemo9dGhpcy5hWzddOwp0aGlzLmw9dGhpcy5hWzddfWMuZHU9YjtiLnByb3RvdHlwZT17S3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MeDp0aGlzLlh1KGEpfSxYdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWXU6dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuUHEoYSl9LFBxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5RcTp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnU6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnpqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgWWE9Yy5kdXx8WWEscGQ9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9cGQuS3goNCk7KGZ1bmN0aW9uKGMpe2MueGw9Cm4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLlMoYik7dGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sUGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sUDpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTsKdmFyIFphPWMueGx8fFphOyhmdW5jdGlvbihjKXtjLndsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlBhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMuSmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLkpjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLkpjKCl9LmJpbmQodGhpcykpKTp0aGlzLkpjKCl9LEpjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubygpOih0aGlzLnMoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksCjIwMCl9fSl9KShjKTt2YXIgJGE9Yy53bHx8JGE7KGZ1bmN0aW9uKGMpe2MueWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBaYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3ICRhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBhYj1jLnlsfHxhYixiYj1uZXcgYWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMueGs9dGhpcy5hWzFdO3RoaXMuQXI9dGhpcy5hWzFdO3RoaXMub3Y9dGhpcy5hWzhdO3RoaXMuUnQ9dGhpcy5hWzldO3RoaXMuWHE9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNV19Yy5Ybz1iO2IucHJvdG90eXBlPQp7cXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ0OnRoaXMud2soYSl9LHdrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54azp0aGlzLnpyKGEpfSx6cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXI6dGhpcy5udihhKX0sbnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm92OnRoaXMuUXQoYSl9LFF0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5SdDp0aGlzLldxKGEpfSxXcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWHE6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBjYj1jLlhvfHxjYixxZD1uZXcgY2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1xZC5xdCg0KTsoZnVuY3Rpb24oYyl7Yy5kbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLk1lPQowO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZmEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlYoYik6dGhpcy5mYSgpfSxBdjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnFiLGc9dGhpcy5vYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5LYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5yZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuTWU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/Cih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sVWE6ZnVuY3Rpb24oKXt0aGlzLk1lKys7aWYoMTA8dGhpcy5NZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSwKd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LApQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxsYTpmdW5jdGlvbigpe30sZ2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5OJiZ0aGlzLk4oKX19KX0pKGMpO3ZhciBkYj1jLmRtfHxkYjsoZnVuY3Rpb24oYyl7Yy5jbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLmtlKWlmKHRoaXMucmJ8fCh0aGlzLnJiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMucmIrKywxNTx0aGlzLnJiKXRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMua2U9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMueWEoKXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5XKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApfX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHwKNDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlc9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5XPXRoaXMuV3x8ITE7dGhpcy54YSgpO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50JiYhdGhpcy5Mcj8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5XKTt0aGlzLnUoKX0uYmluZCh0aGlzKSksdGhpcy5Mcj0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuQXYoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIGViPWMuY218fGViOyhmdW5jdGlvbihjKXtjLmVtPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLklhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IGRiKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLm1hfHx0aGlzLkooYSl8fCh0aGlzLksoYSksKG5ldyBlYihhLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgZmI9Yy5lbXx8ZmIsZ2I9bmV3IGZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5GcD10aGlzLmFbMl07dGhpcy5ldj10aGlzLmFbNl07dGhpcy5Vaz10aGlzLmFbNl07dGhpcy5Naj10aGlzLmFbMV07dGhpcy5Qdj10aGlzLmFbNV07dGhpcy5GdT10aGlzLmFbMl07dGhpcy5Jcz10aGlzLmFbMl07dGhpcy5rcj10aGlzLmFbMTBdO3RoaXMuVHk9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMl19Yy5FbT1iO2IucHJvdG90eXBlPXtFcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnA6dGhpcy5kdihhKX0sZHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ldjp0aGlzLlRrKGEpfSxUazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVWs6dGhpcy5MaihhKX0sTGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1qOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Qdjp0aGlzLkV1KGEpfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRnU6dGhpcy5IcyhhKX0sSHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5Jczp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua3I6dGhpcy5TeShhKX0sU3k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlR5OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgaGI9Yy5FbXx8aGIscmQ9bmV3IGhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9cmQuRXAoNCk7KGZ1bmN0aW9uKGMpe2MubGs9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYi5lbGVtZW50KTt0aGlzLlYoYi5lbGVtZW50KX0sUGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSwKa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIGliPWMubGt8fGliOyhmdW5jdGlvbihjKXtjLmtrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkYoKX19KX0pKGMpO3ZhciBqYj1jLmtrfHxqYjsoZnVuY3Rpb24oYyl7Yy5taz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsCmZ1bmN0aW9uKGIpe2I9bmV3IGliKGIuZGV0YWlsKTtiLm1hfHx0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBqYihiLHRoaXMuRykpLmMoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGtiPWMubWt8fGtiLG1iPW5ldyBrYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncj10aGlzLmFbN107dGhpcy5QeD10aGlzLmFbMV07dGhpcy5Sdj10aGlzLmFbN107dGhpcy51bz10aGlzLmFbMV07dGhpcy5ocD10aGlzLmFbN107dGhpcy5waT10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs4XX1jLkJyPWI7Yi5wcm90b3R5cGU9e2ZyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3I6dGhpcy5PeChhKX0sT3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5QeDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUnY6dGhpcy50byhhKX0sdG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy51bzp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaHA6dGhpcy5vaShhKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnBpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgbmI9Yy5Ccnx8bmIsc2Q9bmV3IG5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9c2QuZnIoNCk7KGZ1bmN0aW9uKGMpe2MuTWs9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUudmcoYiwiZWxlbWVudElEIik7dGhpcy5saD1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Cmcuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLmxoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToiYWZ0ZXIiPT10aGlzLmxoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYSk7dGhpcy5TKGcpO3RoaXMuVihnKTt0aGlzLmJkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5iZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYmQpfSxrYTpmdW5jdGlvbigpe3JldHVybiEwfSxwcTpmdW5jdGlvbigpe2UuUGcodGhpcy5iZCk7ZS51ZSh0aGlzLmJkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucHEoKX0uYmluZCh0aGlzKSwKNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgb2I9Yy5Na3x8b2I7KGZ1bmN0aW9uKGMpe2MuTGs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkYoITApfX0pfSkoYyk7dmFyIHBiPWMuTGt8fHBiOyhmdW5jdGlvbihjKXtjLk5rPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSWE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLnZnKGIsImVsZW1lbnRJRCIpO2UuUGcoYSkmJihiPW5ldyBvYihiKSx0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBwYihiLHRoaXMuRykpLmMoKSkpO3RoaXMueWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMueWI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBxYj1jLk5rfHxxYixyYj1uZXcgcWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnU9dGhpcy5hWzFdO3RoaXMuVnk9dGhpcy5hWzldO3RoaXMuRHc9dGhpcy5hWzhdO3RoaXMudm49dGhpcy5hWzddO3RoaXMubD10aGlzLmFbN119Yy5hcT1iO2IucHJvdG90eXBlPXtNdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTnU6dGhpcy5VeShhKX0sVXk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZ5OnRoaXMuQ3coYSl9LEN3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Edzp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudm46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBzYj1jLmFxfHxzYix0ZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9dGQuTXUoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnRrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LG93OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sRm86ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHg9Yy50a3x8eDsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGcsZCxjKXt0aGlzLlhhPWE7dGhpcy5wZz10aGlzLmFpPSExO3RoaXMuZmg9ZDt0aGlzLkVoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLlhhPW5ldyB4KGEpKTsKdmFyIGU9dGhpcy5CYj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9ZS5yZWFkeVN0YXRlfHwyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzfHxnKGUpO2lmKGQmJjQ9PWUucmVhZHlTdGF0ZSYmMjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1cylkKGUpO2Vsc2UgaWYoND09ZS5yZWFkeVN0YXRlJiYwPT1lLnN0YXR1cyYmbCYmbC55ZSh0aGlzLlhhLnVybCkmJmwuRmQpe3ZhciBoPW5ldyB4KGEudXJsKTtoLm93KCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwubmEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLm5hKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT0KZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMudWs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMucGcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkVoP3RoaXMuQmIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5CYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLmFpfHwodGhpcy5CYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuQmIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksdGhpcy5CYi5zZW5kKGEpfWNhdGNoKGMpe2wmJmwueWUodGhpcy5YYS51cmwpPwpsLkZkP2wubmEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwueWUodGhpcy5YYS51cmwpLHRoaXMuZmgmJnRoaXMuZmgoKX1yZXR1cm4gdGhpcy5CYn19fSkoYyk7dmFyIHRiPWMudWt8fHRiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zYT0hMTt0aGlzLmhjPSIiO3RoaXMuWGQ9dGhpcy5nYz10aGlzLmtiPW51bGw7dGhpcy5KcT10aGlzLndiPXRoaXMuVmc9ITE7dGhpcy5HYT0iIjt0aGlzLlJnPSExO3RoaXMuQ2E9dGhpcy5oZD0iIjt0aGlzLk5nPXRoaXMuYmE9dGhpcy5pc0VuYWJsZWQ9dGhpcy5TZT0hMTt0aGlzLkFhPVtdO3RoaXMuRWc9dGhpcy5SYj0iIjt0aGlzLmdlPSExO3RoaXMuZ2Y9MDt0aGlzLnhmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMudmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLkNiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5GYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy53Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuVGI9IiI7dGhpcy54Yj1bXTt0aGlzLlViPVtdO3RoaXMuU2I9IiI7dGhpcy5oZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnJlPSExO3RoaXMucnE9dGhpcy5HZD1udWxsO3RoaXMuQWg9dGhpcy5EYz10aGlzLmhnPXRoaXMubWY9dGhpcy5GZD10aGlzLllkPXRoaXMuSGM9ITE7dGhpcy4kYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5rZD0wO3RoaXMuR2c9ITE7dGhpcy5GZz0xRTN9Yy52az1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5zYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLmhjLGFkdGFnbW9kaWZpZXI6dGhpcy5rYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuZ2MsYWR0YWdyZWdleDp0aGlzLlhkLGpzcG9wdXBzOnRoaXMuVmcsCnNpZGVsb2Fkczp0aGlzLndiLGRpc2FibGV0ZXN0czp0aGlzLkpxLGhvbWFkQWxpYXM6dGhpcy5HYSxpc0luaXRpYWxpemVkOnRoaXMuUmcsZ2xvYmFsQ29uZmlnOnRoaXMuaGQsY2xpZW50Q29uZmlnOnRoaXMuQ2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5iYSxpc0Jsb2NrZWQ6dGhpcy5OZyxzZXJ2ZXI6dGhpcy5BYSxzdm1Db25maWc6dGhpcy5SYixob21hZEFkcGF0aDp0aGlzLkVnLGRpc2FibGVDb29raWVUZXN0OnRoaXMuZ2UsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuZ2YsSE9NQURfVkVSSUZJRUQ6dGhpcy54ZixIT01BRF9CTE9DS0VEOnRoaXMudmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuQ2IsSE9NQURfQURCTE9DS0VSOnRoaXMuRmMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLndmLHRlc3RIaWRlOnRoaXMuVGIsdGVzdFRhZ3M6dGhpcy54Yix0ZXN0VGFnc0pTOnRoaXMuVWIsdGVzdENvb2tpZTp0aGlzLlNiLHRocm90dGxlOnRoaXMuaGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsCmhvbWFkVGVzdGVkOnRoaXMucmUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5ycSxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5ZZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5GZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5tZixjb25maWdGYWlsdXJlczp0aGlzLiRhLHNpdGVDb25maWc6dGhpcy5RYixzZXJ2ZXJJZDp0aGlzLnZoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5uYyx2cGFpZDp0aGlzLkRjLHNraXBBbGxvd2VkOnRoaXMuQWgsdm1hcHM6dGhpcy5XaH19LEVzOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLiRhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuJGFbYl0mJjE9PXRoaXMuJGFbYl0mJihhPSEwKTtyZXR1cm4gYX0sWGU6ZnVuY3Rpb24oYSl7dGhpcy4kYVthXT0hMH0sZHM6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuJGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy4kYVtiXSYmCjE9PXRoaXMuJGFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sRGQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMudWIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5NcChhKX0sd2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLGU9IiIsaD0iIixrPSIiO2lmKCF0aGlzLnNhJiYhYilyZXR1cm4gbmV3IHgoYSk7Yz10aGlzLnhlKGEpO2U9dGhpcy56YShhKTtjPwoodGhpcy52YygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy52ZCgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLmhjfHx0aGlzLmtifHx0aGlzLmdjfHx0aGlzLlhkKSYmKGs9dGhpcy5udShrKSk7YT1uZXcgeChoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmZzKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLm5iKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0seGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsKKGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy52YygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sdmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQWEmJnRoaXMuQWEubGVuZ3RoJiYwPHRoaXMuQWEubGVuZ3RoJiYoYj10aGlzLkFhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LHllOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMueGUoYSk7cmV0dXJuIGJ9LGZzOmZ1bmN0aW9uKGEpe3ZhciBiPQoiIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuR2EmJjA8dGhpcy5HYS5sZW5ndGgpcmV0dXJuIHRoaXMuR2E7Zm9yKGQgaW4gdGhpcy5HYSlpZihiPXRoaXMuR2FbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5nejtyZXR1cm4ibm9uZSJ9LGxkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQWFbdGhpcy52aF19LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZCgpLGI9dGhpcy56aCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxhaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spOwpyZXR1cm4gYn0sbXU6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLnphKGEpLGM9IiIsYz0iIixoO2ZvcihoIGluIGIpe2lmKGJbaF0uc3VidmFsdWVzKXtmb3IodmFyIEI9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbaF0pLnNwbGl0KCImIiksYz17fSxrPTA7azxCLmxlbmd0aDtrKyspe3ZhciByPUJba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5haChjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pO0I9W107Zm9yKGwgaW4gYylCLnB1c2gobCsiPSIrY1tsXSk7Yz1CPWVuY29kZVVSSUNvbXBvbmVudChCLmpvaW4oIiYiKSl9ZWxzZSBjPXRoaXMuYWgoZC5xdWVyeUtleVtoXSxoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31sPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbC5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxudTpmdW5jdGlvbihhKXt0aGlzLmhjJiYKKGErPXRoaXMuaGMpO2lmKHRoaXMua2IpZm9yKHZhciBiIGluIHRoaXMua2IpdGhpcy5rYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5rYltiXSkpO3RoaXMuZ2MmJihhPXRoaXMubXUoYSx0aGlzLmdjKSk7cmV0dXJuIGF9LGY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLlJnPSEwO3RoaXMuaGQ9YTt0aGlzLkNhPWI7dGhpcy5TZT1kO3RoaXMuR2Q9Yzt0aGlzLmxjPWU7dGhpcy5RYj1ofHx7fTt0aGlzLlp0KCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkNhKXRoaXMuWHQoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuQ2EpdHJ5e3RoaXMuQ2E9YigpLHRoaXMuV2MoKX1jYXRjaChrKXt0aGlzLm5hKCJub0NsaWVudENvbmZpZyIpfX0sZmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwKITEpfXJldHVybiBifSxadDpmdW5jdGlvbigpe3RoaXMuSGEobmV3IHgodGhpcy5oZCt0aGlzLk9jKCJnbG9iYWwiKSksdGhpcy53cy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLldjKCl9LmJpbmQodGhpcyksITApfSxYdDpmdW5jdGlvbigpe25ldyB4KHRoaXMuQ2ErdGhpcy5PYygiY2xpZW50IikpO3RoaXMuSGEobmV3IHgodGhpcy5DYSt0aGlzLk9jKCJjbGllbnQiKSksdGhpcy5XYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiY2xpZW50Iik7dGhpcy5uYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sT2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMudWIoKTt0aGlzLlFiJiZ0aGlzLlFiLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5RYiYmdGhpcy5RYi5ub0NhY2hlQnVzdGVyJiYKKGI9IiIpO3JldHVybiBifSxuYTpmdW5jdGlvbihhKXtpZighdGhpcy5ZZCl7dGhpcy5ZZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLmZkKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5sYz0hMSk7dGhpcy5sYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmxjP3RoaXMubGMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuYmE9dGhpcy5OZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy52ZikpO3RoaXMuemIoKTtlLm9jKGsucHYpOyhiPWUuZmQodGhpcy5sZCgpKSl8fChiPWUuZmQoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHdzOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXt2YXIgYj0Ke307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5WYihiLmVuYWJsZWQpO3RoaXMuYmE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5DYXx8dGhpcy5SYnx8dGhpcy5HYXx8dGhpcy5XYygpOih0aGlzLnNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKSx0aGlzLnpiKCkpfX0sV2M6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5DYX1lbHNlIGE9dGhpcy5DYTt0aGlzLmlzRW5hYmxlZD10aGlzLlZiKGEuZW5hYmxlZCk7dGhpcy5iYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5BYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuQWEubGVuZ3RoO2IrKyl0aGlzLkFhW2JdPQp0aGlzLkFhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLlJiPWEuY29uZmlnfHwiIjt0aGlzLkdhPWEuYWxpYXN8fG51bGw7dGhpcy5FZz1hLmFkcGF0aHx8IiI7dGhpcy5nZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLnZoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLkFhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuUmImJnRoaXMuR2EmJnRoaXMuQWEubGVuZ3RoP3RoaXMub2QoITEpOih0aGlzLnNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKSx0aGlzLnpiKCkpfSxvZDpmdW5jdGlvbihhKXtpZighdGhpcy5iYSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHgodGhpcy52ZCgpKSxkPXRoaXMuemEodGhpcy5SYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjsKYi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHgodGhpcy5SYit0aGlzLk9jKCJjdXN0b21lciIpKTt0aGlzLkhhKGIsdGhpcy5Ndy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiY3VzdG9tZXIiKTthP3RoaXMuSW0/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5JbT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2QoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMub2QoITApfS5iaW5kKHRoaXMpLCEwKX19LE13OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fXRoaXMuRmQ9dGhpcy5WYihiLnN0cmljdCk7dGhpcy5tZj10aGlzLlZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLmhnPQpiLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMubmM9dGhpcy5WYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuVmIoYi5lbmFibGVkKTt0aGlzLlRiPWIudGVzdGhpZGV8fCIiO3RoaXMueGI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLlViPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuaGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5rYj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5nYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuWGQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVmc9Yi5qc3BvcHVwc3x8ITE7dGhpcy53Yj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5EYz1iLnZwYWlkfHwhMTt0aGlzLlFiLnZwYWlkPXRoaXMuRGM7dGhpcy5BaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLlRjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5XaD1iLnZtYXBzfHwiIjt0aGlzLlNiPWIudGVzdDNyZHBhcnR5Y29va2llJiYKYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLm9zKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5nZSYmKHRoaXMuU2I9bnVsbCk7dGhpcy5oZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnJlJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5yZT0hMCx0aGlzLm9kKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmt4KCkmJih0aGlzLlRifHx0aGlzLlVifHx0aGlzLnhifHx0aGlzLlNiKT90aGlzLlNlPyh0aGlzLnNhPXRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKSx0aGlzLmFlKCksdGhpcy56YigpKTp0aGlzLlF3KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuUncoKSl9fSxRdzpmdW5jdGlvbigpe3RoaXMuUHcoKTt0aGlzLlN3KCl9LFN3OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciKwphKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Mud2lkdGg9MTtjLmhlaWdodD0xO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7Yy5zcmM9ImFib3V0OmJsYW5rIjt2YXIgaD1lLmdhKDEwKSxCPWUuZ2EoMTApLGs9ZS5nYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoayxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwKIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKTtjLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShrKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShCKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS5uYihhKGgpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGwpe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYyk7aWYoMyE9ZCl7dmFyIGE9ZS5mZSgpOyFhLmlzQ2hyb21lJiYKIWEuaXNGaXJlZm94fHxhLmlzRWRnZXx8ZS5QYSgpfHx0aGlzLm5hKCJjc3BfIitiKTtlLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxSdzpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKTt0aGlzLnpiKCl9LEVkOmZ1bmN0aW9uKGEpe3RoaXMuSGM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9dGhpcy5zYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIoYSkpLHRoaXMuemIoKSx0aGlzLmFlKCkpfSxQdzpmdW5jdGlvbigpe2lmKHRoaXMuVGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuVGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5UYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTsKZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGMpe31hP3RoaXMuRWQodGhpcy5GYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuSWgoKX1lbHNlIHRoaXMuSWgoKX0sSGg6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMudWIoKSk7dGhpcy5WdyhmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuZGYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkVkKHRoaXMuRmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnhiPW51bGwsdGhpcy5kZigpfSxWdzpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmCmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSGEobmV3IHgoYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LEloOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLnViKCkpO3RoaXMuV3coZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLkhoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5FZCh0aGlzLkZjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlViJiZ0aGlzLlViLmxlbmd0aCl7dmFyIGM9dGhpcy5VYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLkhoKCl9LFd3OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmCmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpO2wuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0sZGY6ZnVuY3Rpb24oKXt0aGlzLlNiPyh0aGlzLmdmKyssdGhpcy5IYShuZXcgeCh0aGlzLlNiKSx0aGlzLk93LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuRmgoKX0sZWY6ZnVuY3Rpb24oYSl7dGhpcy5FZCh0aGlzLndmLAoibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LE93OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLmdmP3RoaXMuZGYoKTp0aGlzLmVmKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5GaCgpOnRoaXMuZWYoIkFBQSIpfSxGaDpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKTt0aGlzLnpiKCk7dGhpcy5hZSgpfSx6YjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5QYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLkhjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy54ZikpOwp0aGlzLkdkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuR2QmJnRoaXMuR2QoKX0sb3E6ZnVuY3Rpb24oKXtpZih0aGlzLm1mJiZ0aGlzLkVzKCkpe3ZhciBhPXRoaXMuZHMoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LEtoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSGE6ZnVuY3Rpb24oYSxiLGMsZixoLEIpe3RoaXMua2R8fCh0aGlzLmtkPTApO3RoaXMua2QrKzt0aGlzLmtkPnRoaXMuRmcmJiF0aGlzLkdnJiYodGhpcy5HZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuRmcsITApKTthPW5ldyB0YihhLGIsYyk7ZiYmKGEuYWk9ITApO2gmJmUueXQoKSYmKGEucGc9ITApO0ImJgooYS5FaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxUZjpmdW5jdGlvbigpe2UuUGEoKXx8ZS5UYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7dGhpcy5uYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy52YygpfHwKKGE9dGhpcy56YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMubmEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubmEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LE53OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLldofSxucTpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkhhKGEsdGhpcy5YeC5iaW5kKHRoaXMpLHRoaXMuV3guYmluZCh0aGlzKSl9LFh4OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5HcigpfSxXeDpmdW5jdGlvbigpe30sR3I6ZnVuY3Rpb24oKXtlLm9jKGsuRnIpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMubmEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAphZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLndiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMud2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy53YlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5UYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9bmV3IFI7d2luZG93W2MudWMoKV09dGhpcztlLlRhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LGt4OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuaGZ9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSx1YjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqCk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LFZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LG5iOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGYsZSxoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxmPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSx6aDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCx0PTMyODUzNzc1MjAscCxuLHYsdSx3O3A9YS5sZW5ndGg7dmFyIHg9W107Zm9yKGY9MDtmPHAtMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseC5wdXNoKGUpOwpzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHgucHVzaChmKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gocD4+PjI5KTt4LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT14W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7cD1sO249bTt2PXE7dT10O2ZvcihmPTA7MTk+PWY7ZisrKXc9YyhlLDUpKyhwJm58fnAmdikrdStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztmb3IoZj0yMDszOT49ZjtmKyspdz1jKGUsNSkrKHBebl52KSt1K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9dix2PW4sbj1jKHAsMzApLHA9ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhwJm58cCZ2fG4mdikrdStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXYsdj1uLG49YyhwLDMwKSxwPWUsZT13O2ZvcihmPTYwOzc5Pj1mO2YrKyl3PWMoZSw1KSsocF5uXnYpK3UraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK24mNDI5NDk2NzI5NTtxPXErdiY0Mjk0OTY3Mjk1O3Q9dCt1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYih0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIHViPWMudmt8fHViLGw9bmV3IHViO3dpbmRvdy5yZz1sO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybD10aGlzLmFbMTBdO3RoaXMuSHY9dGhpcy5hWzhdO3RoaXMua2w9dGhpcy5hWzZdO3RoaXMuUGs9dGhpcy5hWzhdO3RoaXMuUGk9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzddO3RoaXMuRHg9dGhpcy5hWzddO3RoaXMuWm89dGhpcy5hWzldO3RoaXMuSWw9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbMl19Yy5TdT1iO2IucHJvdG90eXBlPXtxbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucmw6dGhpcy5HdihhKX0sR3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkh2OnRoaXMuamwoYSl9LGpsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbDp0aGlzLk9rKGEpfSxPazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGs6dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlBpOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuS2k6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhxOnRoaXMuQ3goYSl9LEN4OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5EeDp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWm86dGhpcy5IbChhKX0sSGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgdmI9Yy5TdXx8dmIsdWQ9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9dWQucWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLlA/dGhpcy5WYT1hLm0uUCgpOnRoaXMuVmE9IiI7YS5tLkxnJiZhLm0uTGcoe3BhdXNlOnRoaXMucmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy50aC5iaW5kKHRoaXMpLAptdXRlOnRoaXMuSWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5KeC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmFiO3RoaXMucGxheWVyPXRoaXMuYi5tO3RoaXMuRmI9dGhpcy5SYz0hMTt0aGlzLktwPTFFMzt0aGlzLmphPW51bGw7dGhpcy5UPWI7dGhpcy51YT17fTt0aGlzLnZpZGVvPXt9O3RoaXMuQ2Q9e307dGhpcy5YcD1lLmdhKDEwKTt0aGlzLmFmPTA7dGhpcy5QYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLlBjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5tKSYmdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLlBjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLktvPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuQmQ9ITE7dGhpcy5ZZz1jJiZjLm1heFdyYXBwZXJEZXB0aD8KcGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuZz17fTt0aGlzLk5jPSExO3RoaXMuTmg9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5LYj0hMTt0aGlzLkRxPWUuZ2EoMTApO3RoaXMuTmI9ZS5nYSgxMCk7dGhpcy5NYj1lLmdhKDEwKTt0aGlzLkJoPWUuZ2EoMTApO3RoaXMuY29uZj17fTt0aGlzLm1jPXRoaXMudGI9ITE7dGhpcy5qZT1udWxsO3RoaXMuSmQ9dGhpcy5BYj10aGlzLnRlPXRoaXMuUGU9dGhpcy5iZT10aGlzLiRjPXRoaXMuY2Y9dGhpcy5aYj10aGlzLkxkPXRoaXMuaGg9dGhpcy5jZD10aGlzLnF4PXRoaXMuaWI9ITE7dGhpcy5jYz1bXTt0aGlzLldiPXt9O3RoaXMuamY9ITF9Yy5waz1iO2IucHJvdG90eXBlPXt3aDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlZhXSYmdGhpcy5jb25mW3RoaXMuVmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5WYV1bYV0pOwpyZXR1cm4gYn0sTGg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuT2EmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuVC5IYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLncoay56byx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpfSxDZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5pYj1jO2lmKHRoaXMuVC5iYSl0aGlzLmFmKyssdGhpcy5ULm9xKCksdGhpcy5ULnNhJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLkxoKCksbmV3IFUodGhpcyxhLHRoaXMuWWcse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5EYyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5tLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLm0uZ2V0Q3VycmVudFRpbWUoKX19KSk6CmI/KHRoaXMuTGgoKSxuZXcgVSh0aGlzLGEsdGhpcy5ZZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuVC5EYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLm0uZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIubS5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLkxhKCk7ZWxzZXt2YXIgZj10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkNlKGEsYixjKX0sNTApfX0sTmU6ZnVuY3Rpb24oYSl7dGhpcy5KZD10aGlzLkFiPXRoaXMuY2Q9ITE7dGhpcy5nPWE7dGhpcy53dyh0aGlzLmcpO3RoaXMuQmcoYSk7dGhpcy5jYz10aGlzLnNnKGEpO3RoaXMuV2I9e307dGhpcy5qZj0hMX0sQmc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuQ2Q9dGhpcy5ycyhhKSksdGhpcy5CZyhhLnBhcmVudCkpfSxzZzpmdW5jdGlvbihhKXt2YXIgYz0KW107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLnNnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuWnIoYSkpKTtyZXR1cm4gY30sWnI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlgmJmEuWC5nZXRBdHRyaWJ1dGUpe2I9YS5YLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LHJzOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5YKXtiPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWC5nZXRBdHRyaWJ1dGUoImlkIikmJgooaD1hLlguZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5YLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlguZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5iYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmh9fSxyYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuYWQmJmEuYWQuZXJyb3ImJmEuYWQuZXJyb3IuY29kZSYmKGI9YS5hZC5lcnJvci5jb2RlKSk7CnN3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5FYy5jb2RlOmI9PUQuTmQuY29kZT9lLncoay51eSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpOihlLkRlKCksYj09RC5BZi5jb2RlJiZlLncoay5ydSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKTtlLncoay5Fcix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHcueWYuY29kZTplLncoay5ZeCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHcuQmYuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLncoay5BeSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB3Lk9kLmNvZGU6ZS53KGsuRnksCnRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5NZC5jb2RlOmUudyhrLnN1LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMubWN8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3IudGEmJihjKz0iXyIrYS5lcnJvci50YSk7ZS50cmFjayhjLCIiLCEwKTt0aGlzLkdiKGEpO3RoaXMuTGEoKX0sR2I6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkthLmxlbmd0aDspdHJ5e3ZhciBjPQphLkthLnBvcCgpO3RoaXMuQmUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHd3OmZ1bmN0aW9uKGEpe3RoaXMuYmU9dGhpcy50ZT10aGlzLlBlPSExO3RoaXMudWE9dGhpcy5iLkw7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMudWEuekluZGV4PWI7Yj10aGlzLmIuSDtiLkJ6PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgYyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShjKSYmYi5zZXRBdHRyaWJ1dGUoYyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtjXSk7CnRoaXMuS28mJnRoaXMucGxheWVyLnFjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5xYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5VLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLlVbY10udHlwZSkmJnRoaXMuR28oYixhLlVbY10udXJsKyIiLGEuVVtjXS50eXBlKTt0aGlzLkpoKGIpPyh0aGlzLklvKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuamE9dGhpcy51YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuamEuYXBwZW5kQ2hpbGQoYikpOnRoaXMuZy55cSgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5qYT10aGlzLnVhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5qYS5hcHBlbmRDaGlsZChiKSx0aGlzLnV3KCkpOnRoaXMud2UoKT90aGlzLnloKCk6dGhpcy5nLm9yaWdpbi5pZyh3Lk1kKX0sdXc6ZnVuY3Rpb24oKXt0aGlzLlpiPXRoaXMuTGQ9ITE7dGhpcy5iLm0ua2EmJnRoaXMuYi5tLmthKCkmJihlLncoay4kZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMuWmI9ITApO2UuWWYoKTt0aGlzLmcmJnRoaXMuZy5vcmlnaW4mJnRoaXMuZy5vcmlnaW4uc2YmJmUuSm8odGhpcy5nLm9yaWdpbi5zZik7ZS5ZYSgic2V0VXBWcGFpZCIpO3ZhciBhPXRoaXMuYi5IO3RoaXMuYi5IPUMucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuSCwKYSk7dGhpcy5iLmloKCk7dGhpcy5iLkFjKCk7Zm9yKGE9dGhpcy5iLkw7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5BYygpO3RoaXMuamE9dGhpcy51YT10aGlzLmIuTDt0aGlzLm9mKCJ2cGFpZCIpO3RoaXMuWmImJihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1iKS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsucGQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk7dGhpcy5PPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5PLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5MLmFwcGVuZENoaWxkKHRoaXMuTyk7dGhpcy5PLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5tLmthJiZ0aGlzLmIubS5rYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5nLnRzKCksYz10aGlzLmcuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLndpZHRoKSwKaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLAoxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmVxKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5UKTt0aGlzLk8uc3JjPWE7ZS5WZCgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLkpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmNjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOwoiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLml5KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuankoKSx0aGlzLmIuSmIoITApLCF0aGlzLkFiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkFiPXtlbDp0aGlzLk8sY2I6ZnVuY3Rpb24oKXt0aGlzLkpkPSEwO2UudyhrLlZoLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLnZlKHRoaXMuQWIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmCih0aGlzLmIuSmIoITApLHRoaXMubnkoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLkpiKCEwKSx0aGlzLnJ5KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnB5KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnF5KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuc3koKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMub3koKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuWGgoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGg9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmcuamMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsuWmYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXt2YXIgYT0Kd2luZG93Lm9wZW4oIiIsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGIpe3dpbmRvdy5vcGVuKGgsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLm15KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5VZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt5KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLmx5KCk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5aYj0hMCxiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsucGQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk6KHRoaXMuWmI9ITEsYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay5sZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKSxlLncoay5VZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX19LmJpbmQodGhpcykpO2UuVmQoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuTGEoKX0uYmluZCh0aGlzKSk7ZS5WZCgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5EbyhmdW5jdGlvbihhKXtlLm9hKHRoaXMuTywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LApreTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMudHJhY2soInBhdXNlIik7ZS53KGsuU2QsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLkxkPSEwfSxseTpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuTWMsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLkxkPSExfSxueTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLkxmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LG15OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLktmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LApqeTpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLllhKCJpbXByZXNzaW9uIik7ZS53KGsuR2YsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0scnk6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuWWEoInN0YXJ0Iik7ZS53KGsuTWMsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0scHk6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLkVmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LHF5OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLllhKCJtaWRwb2ludCIpO2UudyhrLklmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSl9LHN5OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5NZix0aGlzLmcuQiwKdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0sb3k6ZnVuY3Rpb24oKXt0aGlzLkhkKCk7ZS5ZYSgiY29tcGxldGUiKX0sWGg6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5ZYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuY2E9ITE7dGhpcy5MYShhKX19LGl5OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2csZj1bXTshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csKGY9Yi5tYXRjaChjKSk/Zi5qb2luJiYoYj1mLmpvaW4oIi0iKSk6Yj1iLnN1YnN0cmluZygwLDIwKSk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIiwKYiwhMCk7ZS5ZYSgiZXJyIixiKTtlLncoay50eSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMuWGgoITApfSxHbzpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpLGY7Zj10aGlzLlQ7Zi5zYSYmZi5pc0VuYWJsZWQmJiFmLnZjKCk/KGY9Zi56YShiKSxmPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpmPWI7Yy5zcmM9ZjtjLm9uZXJyb3I9dGhpcy4keC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sSW86ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuVWguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5wZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucWYuYmluZCh0aGlzKSk7CmEuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuSGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5JZC5iaW5kKHRoaXMpKX0sd2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuVWguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5wZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5IZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLklkLmJpbmQodGhpcykpfSxVaDpmdW5jdGlvbihhKXt0aGlzLkZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmJ8fHRoaXMucGYoYSl9LmJpbmQodGhpcyksdGhpcy5LcCkpfSxwZjpmdW5jdGlvbihhKXtpZighdGhpcy5SYyYmCnRoaXMuSmgodGhpcy52aWRlbykmJiF0aGlzLnRiJiYhdGhpcy5GYil7dGhpcy5SYz0hMDt0cnl7aWYoIWUuUGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMudGJ8fCh0aGlzLnRiPSEwLHRoaXMud2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5ULmhnfHx0aGlzLlQubmEoInZpZGVvLW5vb3AiKSk7dGhpcy5MYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLlp4KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIuQWMoKTt0aGlzLlNoKCk7dGhpcy5vZigpO3RoaXMuUWYoKTt0aGlzLmIuaWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuYmYoKX19LGJmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT0KdGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuT2EpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuamQ9W107Zm9yKHZhciBiPXRoaXMuYi5MLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmpkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuTGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuTGMoKX1lbHNlIHRoaXMuTGMoKX0sTGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5qZClmb3IodmFyIGI9MDtiPHRoaXMuamQubGVuZ3RoO2IrKyl0aGlzLmpkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLiRjfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksCnRoaXMuTGEoKSxlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsYiwhMCkpOih0aGlzLkllKCEwKSx0aGlzLkxjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLnRlJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5QZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLk9iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuT2IuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuT2IuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLk5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5iZigpKX0uYmluZCh0aGlzKTt0aGlzLm1lKCkueGgodGhpcyl9LEhkOmZ1bmN0aW9uKCl7dGhpcy5ULm5jJiYhdGhpcy50YiYmZS50cmFjaygicXVhcnRpbGUiLAoiY29tcGxldGUiLCEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLndvLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy5MYSgpfSxMYTpmdW5jdGlvbihhKXtpZighdGhpcy5iZSlpZih0aGlzLmJlPSEwLHRoaXMuSmR8fChlLncoay53dSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5oYnx8dGhpcy5nLmFjKXt0aGlzLmFmKys7dGhpcy5GYj10aGlzLlJjPSExO3RyeXt0aGlzLndkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudWEucmVtb3ZlQ2hpbGQodGhpcy5qYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5CZD0hMTt0cnl7dGhpcy5iLlBoKCl9Y2F0Y2goaCl7fXRoaXMuY2Y9ITA7dGhpcy5iLnBlKCk7dGhpcy5LYj0KITE7dGhpcy5tZSgpLnNoKCk7dGhpcy5nLmhiJiZ0aGlzLmcub3JpZ2luLkplKCk7dGhpcy5nLmFjJiYoYT90aGlzLmcub3JpZ2luLmJoKCk6dGhpcy5jZSgpKX1lbHNlIHRoaXMuY2UoKX0sJHg6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy53ZCh0aGlzLnZpZGVvKSx0aGlzLndlKCk/dGhpcy55aCgpOnRoaXMuSWQoYSkpfSxJZDpmdW5jdGlvbihhKXt0aGlzLkZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLndlKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1jfHx0aGlzLlQuVGYoKX0uYmluZCh0aGlzKSwKMUUzKTp0aGlzLlQuVGYoKSk7dGhpcy5nLm9yaWdpbi5pZyh3Lk1kKX0scWY6ZnVuY3Rpb24oKXtpZih0aGlzLnF4KXRoaXMuTGEoKTtlbHNle3RoaXMuS2I9ITA7dGhpcy5iLm0uVWEmJiF0aGlzLmNmJiZ0aGlzLmIubS5VYSgpJiZlLncoay5ZYyx0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy54eChhKTtpZighdGhpcy5BYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkFiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5KZD0hMDtlLncoay5WaCx0aGlzLmcuQiwKdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UudmUodGhpcy5BYil9Yz0iIjt0aGlzLmcuJGUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmgpKSYmKGM9dGhpcy5nLiRlLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkJkfHwodGhpcy5CZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5LZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMuZy5oYj8odGhpcy5GYj10aGlzLlJjPSExLHRoaXMud2QodGhpcy52aWRlbyksdGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnVhLnJlbW92ZUNoaWxkKHRoaXMuamEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuQmQ9ITEsdGhpcy5iLlBoKCksdGhpcy5nLm9yaWdpbi5KZSgpKTp0aGlzLkxhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlBjLnJlcGxhY2UoIlt0aW1lXSIsZS5xZyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLk5jPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSx5aDpmdW5jdGlvbigpe3RoaXMubWM9ITA7dGhpcy51YT10aGlzLmIuTDt0aGlzLnVhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy51YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTsKYS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMubXMoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmphPXRoaXMudWEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLkFjKCk7dGhpcy52aWRlbz10aGlzLmphLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy51YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudWEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlRoLmJpbmQodGhpcyk7dGhpcy5qYS5hcHBlbmRDaGlsZChiKTt0aGlzLlNoKCk7dGhpcy5vZigpO3RoaXMuamU9c2V0SW50ZXJ2YWwodGhpcy5tcS5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LG1zOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpbXSxiPXt9LGM9MDtjPHRoaXMuZy5VLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlVbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuVDtoLnNhJiZoLmlzRW5hYmxlZCYmIWgudmMoKSYmKGU9aC56YShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LG1xOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5qZSksdGhpcy5IZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnFmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLmplKSx0aGlzLklkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6CnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LE1oOmZ1bmN0aW9uKCl7dGhpcy5oaHx8KHRoaXMuaGg9ITAsdGhpcy5jZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh4OmZ1bmN0aW9uKGEpe2UudyhrLlVkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7YT09dGhpcy5OaHx8dGhpcy50Ynx8KDA9PWEmJih0aGlzLmliJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmliKSx0aGlzLmliPSExKSx0aGlzLlBlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLnRlPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLk1oKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpKSwKdGhpcy5tYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMudGJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlBhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLncoay5HZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLGUudyhrLkxmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksdGhpcy5tYyYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5ULm5jJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5jZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLkVmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5uYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS53KGsuSWYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuVC5uYyYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudyhrLk1mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpLHRoaXMuTmg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMudGIpe3RyeXtpZih0aGlzLldiW2FdPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuV2IuaW1wcmVzc2lvbiYmdGhpcy5XYi5jb21wbGV0ZSYmIXRoaXMuamYpe3RoaXMuamY9ITA7dmFyIGM9dGhpcy5XYi5jb21wbGV0ZS0KdGhpcy5XYi5pbXByZXNzaW9uLGY9InN0YXRzX2hkX3RpbWVkaWZmIjt0aGlzLk8mJihmKz0idnBhaWQiKTs1RTM+YyYmZS50cmFjayhmLGMsITApfX1jYXRjaChoKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWM9W107dHJ5e2M9dGhpcy5zcyh0aGlzLmcuS2EsYSl9Y2F0Y2gobCl7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIG09Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuQ2QuaW1wcmVzc2lvbnMmJmUud3QobS51cmwsdGhpcy5DZC5pbXByZXNzaW9ucyk/dGhpcy5CZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS53KGsueW8sdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHthZElkOnRoaXMuQ2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LAp0aGlzLkQoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5CZShtLnVybCxtLnR5cGUpfWNhdGNoKHIpe31pZighYil0cnl7dGhpcy5nLkthPXRoaXMuSHEodGhpcy5nLkthLGEpfWNhdGNoKG4pe319fSxCZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQud2EoYSksYyYmYS5GbyhjKSxmfHwoZj10aGlzLmdnKSx0aGlzLlQuSGEoYSxmLHRoaXMuZ2csITEsITApKX0sc3M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxIcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxaeDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5UaC5iaW5kKHRoaXMpfSxUaDpmdW5jdGlvbigpe2UudyhrLlpmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5jZCYmZS5QYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS4kcigpLCEwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXt2YXIgYT13aW5kb3cub3BlbigiIix0aGlzLlQuc2E/Il90b3AiOiJfYmxhbmsiKTthLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7YS5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuZy5qY31jYXRjaChiKXt3aW5kb3cub3Blbih0aGlzLmcuamMsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9LFNoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0KImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlBjLnJlcGxhY2UoIlt0aW1lXSIsZS5xZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5ULlRjJiYoYj10aGlzLlQuVGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuamEuYXBwZW5kQ2hpbGQoYSl9fSxyYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8CnRoaXMuVC5UYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0seWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuVC5UYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlkPXRoaXMuRHE7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209CiIwcHgiKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnpkKCk7dGhpcy55ZCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLnJjKCl9LmJpbmQodGhpcykpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLk5iO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudXguYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMudHguYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy56ZCgpO3RoaXMueWQoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5yYygpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTWI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnN4LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLnJ4LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuemQoKTt0aGlzLnlkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMucmMoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGguc3R5bGUucG9zaXRpb249ImFic29sdXRlIixoLnN0eWxlLnRvcD0iLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuQmg7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7Yi5hcHBlbmRDaGlsZChjKTt0aGlzLmcuJGUmJmIuYXBwZW5kQ2hpbGQoaCk7Yi5hcHBlbmRDaGlsZChmKTtiLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuamEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuemQoKTt0aGlzLnlkKCl9LmJpbmQodGhpcykpO3RoaXMuamEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMucmMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmphLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmthJiZ0aGlzLmIubS5rYSgpJiYoZS53KGsuJGYsdGhpcy5nLkIsCnRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksdGhpcy5JZSgpKTt0aGlzLnNjKCl9fSxzYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHpkOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayJ9LHR4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5iLkgucGF1c2VkPyh0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLk1jLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpOih0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuU2QsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LHV4OmZ1bmN0aW9uKCl7dGhpcy5MZD9lLm9hKHRoaXMuTywKImNvbnRyb2wiLCJwbGF5Iik6ZS5vYSh0aGlzLk8sImNvbnRyb2wiLCJwYXVzZSIpfSxyZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMuYi5ILnBhdXNlZHx8KHRoaXMuYi5ILnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5TZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sdGg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLmIuSC5wYXVzZWQmJih0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLk1jLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpfSxyeDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYi5ILm11dGVkPwoodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay5sZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKToodGhpcy5iLkgubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsucGQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LHN4OmZ1bmN0aW9uKCl7dGhpcy5aYj9lLm9hKHRoaXMuTywiY29udHJvbCIsInVubXV0ZSIpOmUub2EodGhpcy5PLCJjb250cm9sIiwibXV0ZSIpfSxJZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYi5ILm11dGVkfHwodGhpcy5iLkgubXV0ZWQ9ITAsCmEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudyhrLnBkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpfSxKeDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYi5ILm11dGVkJiYodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5sZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sT2I6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5PYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5PYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLAp0aGlzLk9iKTt0aGlzLiRjfHx0aGlzLk5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5iZigpKX0sY2U6ZnVuY3Rpb24oKXt0aGlzLiRjPSEwO3RoaXMuaWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuaWIpLHRoaXMuaWI9ITEpO2lmKCgicHJlcm9sbCI9PWUuT2EmJnRoaXMuTmN8fCJwb3N0cm9sbCI9PWUuT2EpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuT2EpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2Zvcih2YXIgYj10aGlzLmIuTDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLkFjKCk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLAoiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLmVlKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuZWUoKX1lbHNlIHRoaXMuZWUoKX0sZWU6ZnVuY3Rpb24oKXt0aGlzLmNmPSEwO3RoaXMuYi5wZSgpO3RoaXMuYi5idygpO3RoaXMuS2I9ITE7ZS53KGsuQ3EsCnRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy5tZSgpLnNoKCl9LG1lOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5tJiYoYT10aGlzLmIubSk7cmV0dXJuIGF9LHdlOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJihhPSEwKX1yZXR1cm4gYX0sUWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkVhKCJtaW5WaXMiKTthJiYoZS51ZSh0aGlzLnZpZGVvLGEpP3RoaXMudGgoKTp0aGlzLnJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFmKCl9LmJpbmQodGhpcyksCjEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5nJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5nLmpjLGEuZHVyYXRpb249dGhpcy5nLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5nLmhiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuY2MmJjA8dGhpcy5jYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuY2MpKTtyZXR1cm4gYX0sRDpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuWHArIi0iK3RoaXMuYWY7dGhpcy5nJiZ0aGlzLmcud2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5nLndnKCkpO3JldHVybiBhfSxnZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFA9Yy5wa3x8UDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5QdD10aGlzLmFbMl07dGhpcy5jbD0KdGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzJdO3RoaXMuS2o9dGhpcy5hWzddO3RoaXMuVm89dGhpcy5hWzFdO3RoaXMubGo9dGhpcy5hWzddO3RoaXMuZ3Y9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNF19Yy5WcT1iO2IucHJvdG90eXBlPXtPdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUHQ6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNsOnRoaXMuT20oYSl9LE9tOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5QbTp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS2o6dGhpcy5VbyhhKX0sVW86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbzp0aGlzLmtqKGEpfSxrajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubGo6dGhpcy5mdihhKX0sZnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmd2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgd2I9CmMuVnF8fHdiLHZkPW5ldyB3YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXZkLk90KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuQmE9bnVsbDt0aGlzLlo9W107dGhpcy5YPW51bGw7dGhpcy5iYz10aGlzLmRjPSExO3RoaXMuc2Y9IiI7dGhpcy5yZj0hMTtkJiZkLmVtcHR5P3RoaXMuYnUoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy55bj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5mZSgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPQpiLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeCh0aGlzLnVybCk6bC53YShsLkRkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuUGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUuYmcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwKImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuRGQoYSkpKyImdHlwZT1qcyIsYj1sLndhKGwuRGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwud2EobC5EZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkhhKGIsdGhpcy5hdS5iaW5kKHRoaXMpLHRoaXMuWXQuYmluZCh0aGlzKSl9LHRnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5CYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5CYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuT2EpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuQmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLk9hfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5PYXx8dGhpcy5BdChhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5OdygpKXRyeXt2YXIgZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49ZC5sZW5ndGgmJihkPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2RbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtmW2JdPWcuZmlyc3RDaGlsZDtjLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfWVsc2UgZi5zcGxpY2UoYiwxKX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxBdDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKToKMDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGF1OmZ1bmN0aW9uKGEpe3RoaXMuU3YoYSk7dHJ5e3RoaXMuQmE9YS5yZXNwb25zZVhNTCx0aGlzLkJhfHwodGhpcy5CYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLk1hKHcuT2QpKX10aGlzLlo9dGhpcy50ZygpO3RoaXMuZGM9dGhpcy5mZigpO3RoaXMuYmM9dGhpcy5HaCgpO3RoaXMuWi5sZW5ndGg/dGhpcy54YygpOnRoaXMucmEodGhpcy5NYSh3LkVjLHtlcnJvcjp0aGlzLnJmP0QuTmQ6CkQuemZ9KSl9LGJ1OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkJhfHwodGhpcy5CYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuTWEody5PZCkpfXRoaXMuWj10aGlzLnRnKCk7dGhpcy5kYz10aGlzLmZmKCk7dGhpcy5iYz10aGlzLkdoKCk7dGhpcy5aLmxlbmd0aD90aGlzLnhjKCk6dGhpcy5yYSh0aGlzLk1hKHcuRWMse2Vycm9yOnRoaXMucmY/RC5OZDpELnpmfSkpfSxZdDpmdW5jdGlvbigpe3RoaXMucmEodGhpcy5NYSh3LnlmLHtkZXB0aDphfSkpfSx4YzpmdW5jdGlvbigpe3RoaXMuWD10aGlzLlouc2hpZnQoKTt0aGlzLkN0KCk/dGhpcy5YdygpPyhhKyssbmV3IGIodGhpcyx0aGlzLkNnKCksZyx7QWRTeXN0ZW06dGhpcy5ZcigpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnJhKHRoaXMuTWEody5CZikpOihhPTAsdGhpcy5VeCgpJiZ0aGlzLk5lKHRoaXMuRXEoKSkpfSxKZTpmdW5jdGlvbigpe3RoaXMuZGM/Cih0aGlzLmRjPTE8dGhpcy5aLmxlbmd0aCx0aGlzLloubGVuZ3RoJiZ0aGlzLnhjKCkpOnRoaXMucGFyZW50LkplKCl9LGJoOmZ1bmN0aW9uKCl7dGhpcy5iYz8odGhpcy5iYz0xPHRoaXMuWi5sZW5ndGgsdGhpcy5aLmxlbmd0aCYmdGhpcy54YygpKTp0aGlzLnBhcmVudC5iaCgpfSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlV3KCk/dGhpcy5UdygpPyEwOigtMSE9dGhpcy5wYygpP3RoaXMucmEodGhpcy5NYSh3LnVmKSk6dGhpcy5yYSh0aGlzLk1hKHcubWopKSwhMSk6KHRoaXMucmEodGhpcy5NYSh3LkVjLEQuQWYpKSwhMSl9LE5lOmZ1bmN0aW9uKGEpe2EuS2E9YS5LYS5jb25jYXQodGhpcy5GZSgpKTthLmhiPWEuaGI/YS5oYjp0aGlzLmRjO2EuYWM9YS5hYz9hLmFjOnRoaXMuYmM7dGhpcy5wYXJlbnQuTmUoYSl9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IHhiO2EuZHVyYXRpb249dGhpcy5wYygpO2EuVT10aGlzLnpnKCk7YS5qYz10aGlzLmFzKCk7YS5vcmlnaW49dGhpczsKYS5CPXRoaXMuWHIoKTthLiRlPXRoaXMucXMoYS5kdXJhdGlvbik7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGIpe3RoaXMuWCYmKGIuS2E9Yi5lcnJvci5jb2RlIT13LnVmLmNvZGU/Yi5LYS5jb25jYXQodGhpcy5icygpKTpiLkthLmNvbmNhdCh0aGlzLmtzKCkpKTt0aGlzLloubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuR2ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5HYiYmdGhpcy5wYXJlbnQuR2IoYiksYT0wLHRoaXMueGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShiKSxhPTApfSxHYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5HYihhKX0saWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuTWEoYSxiKSl9LE1hOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHliKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sWHc6ZnVuY3Rpb24oKXtyZXR1cm4gYTwKZ30sVXc6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnpnKCkubGVuZ3RofSxUdzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMucGMoKX0sZmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlouZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxHaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWiYmMjw9dGhpcy5aLmxlbmd0aCYmIXRoaXMuZmYoKSYmKGE9ITApO3JldHVybiBhfSxTdjpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuc2Y9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLnJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LEN0OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5DZygpLmxlbmd0aH0sCkNnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGUodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sWXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZSh0aGlzLlgsIkFkU3lzdGVtIil9LEZlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuT2coYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuYmIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxPZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09CmEubm9kZU5hbWU/ITA6dGhpcy5PZyhhLnBhcmVudE5vZGUpOiExfSxrczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxiczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sYXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYih0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0semc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxTYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLApoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGl6OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmJiKGFbY10pfSk7dHJ5e3ZhciBkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLlNjKS1NYXRoLmFicyg3MDAtYi5TYyl9KSxnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLlNjKS1NYXRoLmFicyg3MDAtYi5TYyl9KSxiPWQuY29uY2F0KGcpfWNhdGNoKGUpe31yZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTsKZm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMuZ2QoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LHBjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuYmIodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxxczpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkd3KGQsCmEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LGxlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5iYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sbmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGJiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuZ2QoYSk6IiJ9LGdkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubmUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVT1jLnlufHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRwPXRoaXMuYVs5XTsKdGhpcy5LbT10aGlzLmFbMV07dGhpcy5PcT10aGlzLmFbM107dGhpcy5VdD10aGlzLmFbOV07dGhpcy5CdT10aGlzLmFbMV07dGhpcy52cT10aGlzLmFbMl07dGhpcy5BbD10aGlzLmFbMTBdO3RoaXMua209dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbNF19Yy5FeD1iO2IucHJvdG90eXBlPXtDcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHA6dGhpcy5KbShhKX0sSm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkttOnRoaXMuTnEoYSl9LE5xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PcTp0aGlzLlR0KGEpfSxUdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXQ6dGhpcy5BdShhKX0sQXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJ1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52cTp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQWw6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5rbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMuRXh8fHpiLHdkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXdkLkNwKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuS2E9W107dGhpcy5VPVtdO3RoaXMuamM9IiI7dGhpcy5CPXRoaXMuYWM9dGhpcy5oYj0hMTt0aGlzLnFlPXRoaXMub3JpZ2luPW51bGx9Yy5wbT1iO2IucHJvdG90eXBlPXt5cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxoczpmdW5jdGlvbigpe2lmKCF0aGlzLnFlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uQmEpe3ZhciBhPXRoaXMub3JpZ2luLkJhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJgowPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnFlPWFbY10pfXJldHVybiB0aGlzLnFlfSx3ZzpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5ocygpO2ImJmIuZ2V0QXR0cmlidXRlJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpO3JldHVybiBhfSx0czpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuVVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIHhiPWMucG18fHhiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNzPXRoaXMuYVs0XTt0aGlzLlJ4PXRoaXMuYVsyXTt0aGlzLlRpPXRoaXMuYVs2XTt0aGlzLmJ4PXRoaXMuYVs0XTt0aGlzLmFsPXRoaXMuYVs2XTt0aGlzLmh4PXRoaXMuYVsxXTt0aGlzLldyPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzddfWMuT249YjtiLnByb3RvdHlwZT17UnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5TczoKdGhpcy5ReChhKX0sUXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJ4OnRoaXMuU2koYSl9LFNpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVGk6dGhpcy5heChhKX0sYXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ieDp0aGlzLiRrKGEpfSwkazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYWw6dGhpcy5neChhKX0sZ3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmh4OnRoaXMuVnIoYSl9LFZyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIEFiPWMuT258fEFiLHhkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXhkLlJzKDQpO3ZhciB3PXtPZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIiwKdGE6IlhNTF9QQVJTRV9FUlJPUiJ9LG1qOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix0YToiRFVSQVRJT05fRVJST1IifSxFYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsdGE6IkVNUFRZX1ZBU1QifSxCZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix0YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0seWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSwKbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLHRhOiJMT0FEX0VSUk9SIn0sTWQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHRhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sWnk6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsCnRhOiJNRURJQUZJTEVfRVJST1IifSx1Zjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIix0YToiRFVNTVlfQUQifX0sRD17emY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIix0YToiTk9fQURTIn0sQWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHRhOiJOT19NRURJQUZJTEVTIn0sYXo6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsdGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxOZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix0YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5wdD10aGlzLmFbMl07dGhpcy5Ubz10aGlzLmFbM107CnRoaXMuSnA9dGhpcy5hWzNdO3RoaXMubXI9dGhpcy5hWzVdO3RoaXMueG09dGhpcy5hWzVdO3RoaXMuQ2w9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbM119Yy5HeT1iO2IucHJvdG90eXBlPXtvdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucHQ6dGhpcy5TbyhhKX0sU286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlRvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5KcDp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXI6dGhpcy53bShhKX0sd206ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnhtOnRoaXMuQmwoYSl9LEJsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5DbDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEJiPWMuR3l8fEJiLHlkPW5ldyBCYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT15ZC5vdCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmFkPWI7dGhpcy5LYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLlBqfHx5YjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5scD10aGlzLmFbNF07dGhpcy54cD10aGlzLmFbNF07dGhpcy5LeT10aGlzLmFbOF07dGhpcy5veD10aGlzLmFbM107dGhpcy56eD10aGlzLmFbNl07dGhpcy5Paj10aGlzLmFbNl07dGhpcy5WbD10aGlzLmFbNV07dGhpcy5qdT10aGlzLmFbNV07dGhpcy5kdz10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs1XX1jLkNqPWI7Yi5wcm90b3R5cGU9e2twOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5scDp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnhwOnRoaXMuSnkoYSl9LEp5OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LeTp0aGlzLm54KGEpfSxueDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm94OnRoaXMueXgoYSl9LHl4OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56eDp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT2o6dGhpcy5VbChhKX0sVWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlZsOnRoaXMuaXUoYSl9LGl1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qdTp0aGlzLmN3KGEpfSxjdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBDYj1jLkNqfHxDYix6ZD1uZXcgQ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT0KemQua3AoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5tPWE7dGhpcy5hYj1hLnVnKCk7dGhpcy5MPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuTC5pZD1lLmdhKDEwKTt0aGlzLkg9Qy5wb3AoKTt0aGlzLkh8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuSC5pZD0iYWRYZGlzcGxheSIsdGhpcy5ILnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5BPXt9O3RoaXMuWmQ9ITE7dGhpcy5sYj1bXX1jLnNqPWI7Yi5wcm90b3R5cGU9e3JnOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LApnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnJnKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5KcyhhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpOwpoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sTHc6ZnVuY3Rpb24oKXt0aGlzLlpkPSEwfSxQaDpmdW5jdGlvbigpe3RoaXMuSD1DLnBvcCgpO3RoaXMuSHx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saWg6ZnVuY3Rpb24oKXt0aGlzLm0ucGF1c2UoKTtlLncoay5ZYyx0aGlzLm0udigpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLlpkfHwodGhpcy5tLnBsYXkoKSxlLncoay5aYyx0aGlzLm0udigpKSl9LEFjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkwuc3R5bGUuekluZGV4PWE7dGhpcy5MLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuTC5zdHlsZS5tYXJnaW5SaWdodD0KImF1dG8iO3RoaXMuTC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuTC5zdHlsZS5ib3hTaXppbmc9dGhpcy5hYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5MLnN0eWxlLndpZHRoPXRoaXMuYWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9dGhpcy5hYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLmFiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuYWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuYWIpO3RoaXMubS5QYiYmdGhpcy5tLlBiKCk/dGhpcy5tLnVnKCkuYXBwZW5kQ2hpbGQodGhpcy5MKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuTCk7d2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sSnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxrZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMua2codGhpcy5hYik7aWYoYi54IT10aGlzLkEueHx8Yi55IT10aGlzLkEueXx8Yi5wb3NpdGlvbiE9dGhpcy5BLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuQS53aWR0aCYmMDx0aGlzLkEuaGVpZ2h0JiYwPT0KYi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMucGUoKTtyZXR1cm59dGhpcy5BPWI7dGhpcy5tLlBiKCk/KHRoaXMuTC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuTC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkwuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkwuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkwuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLkwuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkguc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5sYi5sZW5ndGg7YSsrKXRoaXMubGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5DaCh0aGlzLkwpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMTApfSxEbzpmdW5jdGlvbihhKXt0aGlzLmxifHwodGhpcy5sYj1bXSk7ImZ1bmN0aW9uIj09CnR5cGVvZiBhJiZ0aGlzLmxiLnB1c2goYSl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5MJiZ0aGlzLkwucGFyZW50Tm9kZSYmdGhpcy5MLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuTC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTCk7dGhpcy5IJiZ0aGlzLkgucGF1c2UmJnRoaXMuSC5wYXVzZSgpfX19KShjKTtmb3IodmFyIE89Yy5zanx8TyxDPVtdLERiPTA7MTAwPkRiO0RiKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1lLmdhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgST0hMSxlYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5HcT10aGlzLmFbMTBdO3RoaXMudnY9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMTBdfWMuTnQ9YjtiLnByb3RvdHlwZT17RnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkdxOnRoaXMudXYoYSl9LHV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52djp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEViPWMuTnR8fEViLEFkPW5ldyBFYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUFkLkZxKDQpOyhmdW5jdGlvbihjKXtjLllsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7CmF8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuWmUoYik7dGhpcy5lZygpfSxaZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkZhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxVYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmCmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sbWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSx2OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5GYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIEZiPWMuWWx8fEZiOyhmdW5jdGlvbihjKXtjLlhsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj1mYSgpO3RoaXMuRWI9dGhpcy5FYnx8ITE7dGhpcy5IZj10aGlzLkpmPQp0aGlzLktnPXRoaXMucWE9dGhpcy5rZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLk1yKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5rZj0hMDt0aGlzLktnJiZ0aGlzLlhmKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkucWI7YSYmYS5LYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlVjKCk7dGhpcy5LZz0hMDt0aGlzLlhmKCl9LmJpbmQodGhpcykpOwp0aGlzLlNmKCl9LFhmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWIpe3RoaXMuVWMoKTtpZighdGhpcy5rZiYmIXRoaXMuVWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLmtmJiZ0aGlzLkhmJiYhdGhpcy5KZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCl9LmJpbmQodGhpcyksMTAwKX19LFVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5BZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxBZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxTZjpmdW5jdGlvbigpe2lmKHRoaXMuVWMoKSl7dmFyIGI9CnRoaXMuQWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5KZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLkhmPWIuZnp9dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2YoKX0uYmluZCh0aGlzKSwxMDApfSxqejpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi53eigpOiExfSxwYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IucGMoKTotMX0sbHM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sTXI6ZnVuY3Rpb24oYixhKXt0aGlzLkViPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLkVifHwzMDI9PXRoaXMuRWI/dGhpcy5xYT0hMDp0aGlzLnMoImFkZXJyb3IiLHRoaXMuRWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYygpfS5iaW5kKHRoaXMpLDEwMCl9LFhjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnFhPyh0aGlzLm8oKSx0aGlzLmVhKCkpOmIubWQoKT8odGhpcy5GKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5scyhiKT8odGhpcy5GKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBHYj1jLlhsfHxHYjsoZnVuY3Rpb24oYyl7Yy5abD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LHp0OmZ1bmN0aW9uKCl7d2luZG93Lk9PLnZtLnNvLnFvP3dpbmRvdy5PTy52bS5zby5xby5keihmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuenQoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5OYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgRmIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSihjKXx8KHRoaXMuSyhjKSwobmV3IEdiKGMsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBIYj1jLlpsfHxIYixJYj1uZXcgSGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzNdO3RoaXMuUnk9dGhpcy5hWzEwXTt0aGlzLmNxPXRoaXMuYVsyXTt0aGlzLmw9CnRoaXMuYVsyXX1jLkl2PWI7Yi5wcm90b3R5cGU9e1lwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5acDp0aGlzLlF5KGEpfSxReTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnk6dGhpcy5icShhKX0sYnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jcTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIEpiPWMuSXZ8fEpiLEJkPW5ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUJkLllwKDQpOyhmdW5jdGlvbihjKXtjLmJqPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMubWE9ITE7dGhpcy5EZygpfSxEZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpOwpifHwoYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5TKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sbGE6ZnVuY3Rpb24oKXt0aGlzLm5oKCl9LApuaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuTiYmKDAsdGhpcy5OKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIEtiPWMuYmp8fEtiOyhmdW5jdGlvbihjKXtjLmFqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMubygiZW1wdHkiKSx0aGlzLmVhKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT0KYj90aGlzLmVhKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nKCk/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTGI9Yy5hanx8TGI7KGZ1bmN0aW9uKGMpe2MuY2o9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxxaDpmdW5jdGlvbihiKXtiPW5ldyBLYihiKTtiLm1hP3RoaXMuSSgpOnRoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3IExiKGIsdGhpcy5HKSkuYygpKX0sYzpmdW5jdGlvbigpe3RoaXMuT3J8fCh0aGlzLk9yPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5xaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTsKaWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnFoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgTWI9Yy5janx8TWIsVj1uZXcgTWIocSk7Vi5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud3g9dGhpcy5hWzNdO3RoaXMucHA9dGhpcy5hWzldO3RoaXMuQWs9dGhpcy5hWzJdO3RoaXMuRXk9dGhpcy5hWzddO3RoaXMuVHg9dGhpcy5hWzNdO3RoaXMuc2k9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzldfWMubm89YjtiLnByb3RvdHlwZT17dng6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy53eDp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucHA6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFrOnRoaXMuRHkoYSl9LER5OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FeTp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlR4OnRoaXMucmkoYSl9LHJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5zaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIE5iPWMubm98fE5iLENkPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUNkLnZ4KDQpOyhmdW5jdGlvbihjKXtjLldtPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlMoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxQYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuV218fFc7KGZ1bmN0aW9uKGMpe2MuVm09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkuUGYoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm8uYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LlBmKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuenUoYSl9LmJpbmQodGhpcykpO3kuRHMoKX0senU6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5vKCk7dGhpcy5lYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5vKCk7dGhpcy5lYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkYoKX19KX0pKGMpOwp2YXIgWD1jLlZtfHxYOyhmdW5jdGlvbihjKXtjLlhtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnFkJiYoYj1lLklxKGIsdGhpcy5xZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLkooZCkpe3RoaXMuSyhkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD0KYy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnFkfHwodGhpcy5xZD1bXSksdGhpcy5xZC5wdXNoKGJbYV0pLGQ9bmV3IFcoaCksdGhpcy5KKGQpfHwodGhpcy5LKGQpLGY9bmV3IFgoZCx0aGlzLkcpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sUGY6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sWXc6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy53Y3x8KHRoaXMud2M9W10pLHRoaXMud2MucHVzaChiKSx0aGlzLmF3KCkmJih0aGlzLlZlKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYKKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxEczpmdW5jdGlvbigpe2lmKHRoaXMud2MpZm9yKHZhciBiPTA7Yjx0aGlzLndjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMud2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lll3KGIpfX0pfSkoYyk7CnZhciBPYj1jLlhtfHxPYix5PW5ldyBPYihxKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFyPXRoaXMuYVsxMF07dGhpcy5mcD10aGlzLmFbMl07dGhpcy5lbj10aGlzLmFbOV07dGhpcy5Mcz10aGlzLmFbOF07dGhpcy5rbz10aGlzLmFbMV07dGhpcy5sdD10aGlzLmFbN107dGhpcy5sbj10aGlzLmFbMl07dGhpcy5wbD10aGlzLmFbOV07dGhpcy5vcj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVsyXX1jLkprPWI7Yi5wcm90b3R5cGU9eyRxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hcjp0aGlzLmVwKGEpfSxlcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZnA6dGhpcy5kbihhKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmVuOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Mczp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmtvOnRoaXMua3QoYSl9LGt0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubHQ6dGhpcy5rbihhKX0sa246ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxuOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucGw6dGhpcy5ucihhKX0sbnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm9yOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgUGI9Yy5Ka3x8UGIsRGQ9bmV3IFBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9RGQuJHEoNCk7KGZ1bmN0aW9uKGMpe2MuV2k9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5TKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sVWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBRYj1jLldpfHxRYjsoZnVuY3Rpb24oYyl7Yy5YaT0KdS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5GKCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMueXZ8fCh0aGlzLnl2PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy5GKCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpOwp2YXIgUmI9Yy5YaXx8UmI7KGZ1bmN0aW9uKGMpe2MuWWk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBRYihkKTt0aGlzLkooZSl8fCh0aGlzLksoZSksKG5ldyBSYihlLHRoaXMuRykpLmMoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLkphKWlmKGE9PXRoaXMuSmFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7CnJldHVybiB0aGlzLkphW2Iub2IoKV0/ITA6ITF9fSl9KShjKTt2YXIgU2I9Yy5ZaXx8U2IsVGI9bmV3IFNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ0PXRoaXMuYVs3XTt0aGlzLlZuPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVsxMF07dGhpcy5ieT10aGlzLmFbMl07dGhpcy5SbD10aGlzLmFbMTBdO3RoaXMuaW09dGhpcy5hWzhdO3RoaXMucm49dGhpcy5hWzZdO3RoaXMuZnQ9dGhpcy5hWzFdO3RoaXMuRWw9dGhpcy5hWzZdO3RoaXMuSXg9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbOV19Yy5Ucj1iO2IucHJvdG90eXBlPXthdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJ0OnRoaXMuVW4oYSl9LFVuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVm46dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktyOnRoaXMuYXkoYSl9LApheTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnk6dGhpcy5RbChhKX0sUWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJsOnRoaXMuaG0oYSl9LGhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pbTp0aGlzLnFuKGEpfSxxbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJuOnRoaXMuZXQoYSl9LGV0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mdDp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWw6dGhpcy5IeChhKX0sSHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkl4OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgVWI9Yy5Ucnx8VWIsRWQ9bmV3IFViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9RWQuYXQoNCk7KGZ1bmN0aW9uKGMpe2MuT2w9Cm4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuUyhiKTt0aGlzLlYoYSk7dGhpcy5Vdih0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxVdjpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJnRoaXMuaWEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnBhdXNlJiZ0aGlzLmlhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmCnRoaXMuaWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5yZXN1bWUmJnRoaXMuaWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2ImJmIubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLm11dGUmJnRoaXMuaWEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJnRoaXMuaWEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS51bm11dGUmJnRoaXMuaWEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxMZzpmdW5jdGlvbihiKXt0aGlzLmlhPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBWYj1jLk9sfHxWYjsoZnVuY3Rpb24oYyl7Yy5ObD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLAphKTt0aGlzLiRoPSExfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXRoaXMuZ2V0UGxheWVyKCk7Yi5hdXRvc3RhcnQmJiF0aGlzLiRoJiYodGhpcy5GKCksdGhpcy4kaD0hMCx0aGlzLlJhKCkpO2EuRmEoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFdiPWMuTmx8fFdiOyhmdW5jdGlvbihjKXtjLlBsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgVmIoYltkXSksdGhpcy5KKGMpfHwodGhpcy5LKGMpLChuZXcgV2IoYyx0aGlzLkcpKS5jKCkpfX1lbHNlIHRoaXMuSSgpfX0pfSkoYyk7CnZhciBYYj1jLlBsfHxYYixZPW5ldyBYYihxKTtZLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcj10aGlzLmFbOV07dGhpcy5EaT10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVsxMF19Yy5uaT1iO2IucHJvdG90eXBlPXtQcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUXI6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkRpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgWWI9Yy5uaXx8WWIsRmQ9bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9RmQuUHIoNCk7KGZ1bmN0aW9uKGMpe2MuTW49bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxrYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sbGE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJgoxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5OPygwLHRoaXMuTikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIFpiPWMuTW58fFpiOyhmdW5jdGlvbihjKXtjLkxuPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxUdjpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuV2F8fCh0aGlzLldhPVtdKTt0aGlzLldhLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8CjMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuZWEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5lYz0hMDt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sYzpmdW5jdGlvbigpe3RoaXMudSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy54YT90aGlzLlR2KHRoaXMueGEpOih0aGlzLnhhPXRoaXMuSGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApKX0sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy54YSl7dGhpcy5GKCk7cmV0dXJufWlmKCF0aGlzLmVjKXt0aGlzLkYoKTtyZXR1cm59Yj0hMDtpZih0aGlzLldhJiYKdGhpcy5XYS5sZW5ndGgmJjE8dGhpcy5XYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLldhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLldhW2FdJiYzMDMhPXRoaXMuV2FbYV0mJjQwMyE9dGhpcy5XYVthXSYmKGI9ITEpO2lmKGIpdGhpcy5vKCJlbXB0eSIpLHRoaXMuZWEoKTtlbHNle3RoaXMuRigpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyICRiPWMuTG58fCRiOyhmdW5jdGlvbihjKXtjLk5uPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgWmIoYi5pdGVtKGEpKTt0aGlzLkooYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLksoYyksCihuZXcgJGIoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIGFjPWMuTm58fGFjLGJjPW5ldyBhYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qdD10aGlzLmFbN107dGhpcy5mdT10aGlzLmFbNl07dGhpcy5lcj10aGlzLmFbNV07dGhpcy5pbz10aGlzLmFbOV07dGhpcy5LdD10aGlzLmFbOF07dGhpcy5Bbj10aGlzLmFbOF07dGhpcy5Dbj10aGlzLmFbNF07dGhpcy5ndz10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs4XX1jLmppPWI7Yi5wcm90b3R5cGU9e2l0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qdDp0aGlzLmV1KGEpfSxldTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZ1OnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lcjp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaW86CnRoaXMuSnQoYSl9LEp0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5LdDp0aGlzLnpuKGEpfSx6bjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkFuOnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dbjp0aGlzLmZ3KGEpfSxmdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3c6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBjYz1jLmppfHxjYyxHZD1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1HZC5pdCg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sbGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLk4mJigwLHRoaXMuTikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5OJiYoMCx0aGlzLk4pKCEwKX0uYmluZCh0aGlzKSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgZGM9Yy5Za3x8ZGM7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLlloKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5vZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMub2coKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuQW8oKX0uYmluZCh0aGlzKSksdGhpcy5aaD0hMSx0aGlzLnh5PTFFMyx0aGlzLmtoPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxvZzpmdW5jdGlvbigpe3RoaXMua2guZG9uZXx8KHRoaXMua2guZG9uZT0hMCx0aGlzLlpoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZaCgpfS5iaW5kKHRoaXMpLAp0aGlzLnh5KSl9LEFvOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLlpoKTt0aGlzLm8oKX0sWWg6ZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMubygpLHRoaXMuZWEoKSk6KHRoaXMucygiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLkYoKSl9LHhnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBmPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHlhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy54Zyhtdy5lcnJvckRlbGVnYXRlcyk6CnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy54Zyh0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgZWM9Yy5Ya3x8ZWM7KGZ1bmN0aW9uKGMpe2MuWms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5OYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLk5hKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLk5hKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTsKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLk5hKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBkYyhjKSx0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBlYyhjLHRoaXMuRykpLmMoKSkpfX10aGlzLkkoKX19KX0pKGMpO3ZhciBmYz1jLlprfHxmYyxnYz1uZXcgZmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUHk9dGhpcy5hWzVdO3RoaXMuV3Q9dGhpcy5hWzEwXTt0aGlzLlZpPXRoaXMuYVs3XTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLm9qPXRoaXMuYVs4XTt0aGlzLmx1PXRoaXMuYVs5XTt0aGlzLm1tPQp0aGlzLmFbNV07dGhpcy52aj10aGlzLmFbNF07dGhpcy5QdT10aGlzLmFbNF07dGhpcy5Ecj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbNV19Yy54dz1iO2IucHJvdG90eXBlPXtPeTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUHk6dGhpcy5WdChhKX0sVnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLld0OnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVmk6dGhpcy5WayhhKX0sVms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLldrOnRoaXMubmooYSl9LG5qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vajp0aGlzLmt1KGEpfSxrdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubHU6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1tOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52ajp0aGlzLk91KGEpfSxPdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUHU6CnRoaXMuQ3IoYSl9LENyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ecjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGhjPWMueHd8fGhjLEhkPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUhkLk95KDQpOyhmdW5jdGlvbihjKXtjLlJtPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgaWM9Yy5SbXx8aWM7KGZ1bmN0aW9uKGMpe2MuUW09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm8oKSx0aGlzLmVhKCkpOih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLnUoKSkpOih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpO3RoaXMuaWMoKX0saWM6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy56ZSgpJiYKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnplKCkmJih0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmljKCl9LmJpbmQodGhpcyksMTApfSx6ZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgamM9Yy5RbXx8amM7KGZ1bmN0aW9uKGMpe2MuU209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJgoidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgaWMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3IGpjKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBrYz1jLlNtfHxrYyxsYz1uZXcga2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3I9dGhpcy5hWzddO3RoaXMueXM9dGhpcy5hWzRdO3RoaXMuUm89dGhpcy5hWzRdO3RoaXMueG49dGhpcy5hWzFdO3RoaXMudG49dGhpcy5hWzNdO3RoaXMuR2o9dGhpcy5hWzFdO3RoaXMubD10aGlzLmFbMV19Yy5oaz0KYjtiLnByb3RvdHlwZT17cnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNyOnRoaXMueHMoYSl9LHhzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55czp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUm86dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhuOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bjp0aGlzLkZqKGEpfSxGajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYz1jLmhrfHxtYyxJZD1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1JZC5ycig0KTsoZnVuY3Rpb24oYyl7Yy5HbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlMoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuT2U9ITF9LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkJ2KCl9LmJpbmQodGhpcyksNTAwKX0sQnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5OJiZ0aGlzLk4oKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksCmE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuT2UmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuT2UpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxIdzpmdW5jdGlvbigpe3RoaXMuT2U9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBuYz1jLkdtfHwKbmM7KGZ1bmN0aW9uKGMpe2MuRm09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKTt0aGlzLlliPTB9LGM6ZnVuY3Rpb24oKXt0aGlzLmh1PTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5ZYnx8KHRoaXMuWWI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8Cih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5ZYnx8dGhpcy5ZYisrLHRoaXMuWWI8PXRoaXMuaHU/KHRoaXMuWWIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSkpfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5IdygpLHRoaXMuRigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgb2M9Yy5GbXx8b2M7KGZ1bmN0aW9uKGMpe2MuSG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbmMod2luZG93LnBsYXllckFwaSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgb2MoYiwKdGhpcy5HKSkuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcGM9Yy5IbXx8cGMscWM9bmV3IHBjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNxPXRoaXMuYVs1XTt0aGlzLk1xPXRoaXMuYVs0XTt0aGlzLnp3PXRoaXMuYVsxXTt0aGlzLmpqPXRoaXMuYVs0XTt0aGlzLkh1PXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzldfWMuY3Y9YjtiLnByb3RvdHlwZT17UnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlNxOnRoaXMuTHEoYSl9LExxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NcTp0aGlzLnl3KGEpfSx5dzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuenc6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMuR3UoYSl9LEd1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5IdTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciByYz1jLmN2fHxyYyxKZD1uZXcgcmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1KZC5ScSg0KTsoZnVuY3Rpb24oYyl7Yy5BbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGxhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuTigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBzYz1jLkFtfHxzYzsoZnVuY3Rpb24oYyl7Yy56bT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCmZ1bmN0aW9uKCl7dGhpcy5SYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnpxKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuZWQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLlN0KCk6dGhpcy5pYygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZigpfHwodGhpcy5zKCJjb250ZW50cGxheSIpLHRoaXMudSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHpxOmZ1bmN0aW9uKCl7dGhpcy5GZigpfHx0aGlzLnUoITApfSxTdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZWQoKTshYi52YSYmCmIuWiYmYi5jeiYmYi5leiYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LGljOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMubygpLHRoaXMuZWEoKSk6KHRoaXMucygiYWRlcnJvciIsYiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWMoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe2lmKCF0aGlzLmdoKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT0KYSYmKHRoaXMuZ2g9YltjXSk7cmV0dXJuIHRoaXMuZ2h9LHplOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLmVkKCkuYWRzTG9hZGVyP3RoaXMuRighMCk6dGhpcy5GKCk6dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHRjPWMuem18fHRjOyhmdW5jdGlvbihjKXtjLkJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IHNjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5KKGMpfHwodGhpcy5LKGMpLChuZXcgdGMoYyx0aGlzLkcpKS5jKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgdWM9Yy5CbXx8dWMsdmM9bmV3IHVjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJwPXRoaXMuYVs2XTt0aGlzLlVxPXRoaXMuYVs5XTt0aGlzLll5PXRoaXMuYVsyXTt0aGlzLk15PXRoaXMuYVsxXTt0aGlzLlVwPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzEwXX1jLnlrPWI7Yi5wcm90b3R5cGU9e3FwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ycDp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVXE6dGhpcy5YeShhKX0sWHk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll5OnRoaXMuTHkoYSl9LEx5OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NeTp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLlVwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgd2M9Yy55a3x8d2MsS2Q9bmV3IHdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9S2QucXAoNCk7KGZ1bmN0aW9uKGMpe2MudWw9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5TKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlYoYSk6dGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxVYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sRmE6ZnVuY3Rpb24oKXt2YXIgYjtFPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTsKYiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWj1jLnVsfHxaOyhmdW5jdGlvbihjKXtjLnRsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlFlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuUWU9Yi5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5RZSYmYiE9dGhpcy5RZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5zKCJhZGVycm9yIixhLnl6KSx0aGlzLkYoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT0KYSYmKHRoaXMucygiYWRlcnJvciIpLHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBhYT1jLnRsfHxhYTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRSlmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFooYiksYi5tYT90aGlzLlZlKCk6dGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGFhKGIsdGhpcy5HKSxiLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRSx4Yz1jLnZsfHx4Yyx5Yz1uZXcgeGMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC53Yi5sZW5ndGgpe3ZhciBhPWwud2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUucncoeyJbTE9BRFNDUklQVF0iOmUuZ2EoMTApLCJbVVRJTFNdIjplLmdhKDEwKSwiW0NBTExCQUNLXSI6ZS5nYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuWGcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSltW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLlhnKGcsCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LGwpfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3A9dGhpcy5hWzhdO3RoaXMuam49dGhpcy5hWzJdO3RoaXMuZng9dGhpcy5hWzNdO3RoaXMuUmo9dGhpcy5hWzhdO3RoaXMud2k9dGhpcy5hWzRdO3RoaXMud3I9dGhpcy5hWzddO3RoaXMuUXA9dGhpcy5hWzFdO3RoaXMucnY9dGhpcy5hWzldO3RoaXMuang9dGhpcy5hWzVdO3RoaXMuS2w9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMV19Yy50aj1iO2IucHJvdG90eXBlPXtWcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3A6dGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpuOnRoaXMuZXgoYSl9LApleDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZng6dGhpcy5RaihhKX0sUWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlJqOnRoaXMudmkoYSl9LHZpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53aTp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3I6dGhpcy5QcChhKX0sUHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFwOnRoaXMucXYoYSl9LHF2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ydjp0aGlzLml4KGEpfSxpeDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuang6dGhpcy5KbChhKX0sSmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLktsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgemM9Yy50anx8emMsTGQ9bmV3IHpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUxkLlZwKDQpOyhmdW5jdGlvbihjKXtjLm5uPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5TKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMucXU9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9LGh3OmZ1bmN0aW9uKGIpe3RoaXMuUmQ9CmJ9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sbGE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuZ2IoYil9LmJpbmQodGhpcykpfSxnYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuTiYmdGhpcy5OKCksdGhpcy5SZCYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuUmQmJihuZXcgSCh0aGlzLHRoaXMuUmQpKS5jKCkpfX0pfSkoYyk7dmFyIE49Yy5ubnx8TjsoZnVuY3Rpb24oYyl7Yy5tbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSx4YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMua2UpaWYodGhpcy5yYnx8KHRoaXMucmI9MCksdGhpcy5yYisrLDE1PHRoaXMucmIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnR3KCk6dGhpcy51KCEwKSwhMDt0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnUoKTp0aGlzLnUoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5rZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLnlhKCl8fCh0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YSgpfS5iaW5kKHRoaXMpLDEwKX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sClk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVz1hLGIucygiYWRlcnJvciIsYSkpOmIucygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dGhpcy5XPXRoaXMuV3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnhhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSx1OmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRihiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSD1jLm1ufHxIOyhmdW5jdGlvbihjKXtjLnBuPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLklhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiLmh3KHRoaXMuRyksYj1uZXcgSChiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLnBufHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHA9CnRoaXMuYVsyXTt0aGlzLlRsPXRoaXMuYVszXTt0aGlzLmFtPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzJdfWMuS3E9YjtiLnByb3RvdHlwZT17R3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhwOnRoaXMuU2woYSl9LFNsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5UbDp0aGlzLiRsKGEpfSwkbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBDYz1jLktxfHxDYyxNZD1uZXcgQ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1NZC5HcCg0KTsoZnVuY3Rpb24oYyl7Yy5tbD1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy5jZz0KMDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVihhKTp0aGlzLmZhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jZ30sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLk4/KDAsdGhpcy5OKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse2ZxOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuY2c9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCntmcTpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sUDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIERjPWMubWx8fERjOyhmdW5jdGlvbihjKXtjLmxsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEN6OmZ1bmN0aW9uKCl7fSxXdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnRmKG5ldyBmdW5jdGlvbigpe30pO2EuJHk9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuV3YoYSk7d2luZG93LlpkPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLlZ2fHwodGhpcy5Wdj0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnNlfHwodGhpcy5zZT0xKTtpZigyMDx0aGlzLnNlKXRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLlFhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuc2UrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LFFhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLmFhKCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMuVWUoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5zKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLnBhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0sVWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc01hbmFnZXIpOwpiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpfSx5YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpe3RoaXMucWE9ITB9LGFhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YSgpPwoodGhpcy5vKCksdGhpcy5lYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkYoYil9fSl9KShjKTt2YXIgRWM9Yy5sbHx8RWM7KGZ1bmN0aW9uKGMpe2Mubmw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IERjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5tYXx8dGhpcy5KKGMpfHwodGhpcy5LKGMpLChuZXcgRWMoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEZjPWMubmx8fEZjLEdjPW5ldyBGYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubnQ9dGhpcy5hWzhdO3RoaXMuQng9dGhpcy5hWzddO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuSW49dGhpcy5hWzhdO3RoaXMuZ209dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbNl19Yy5zbD1iO2IucHJvdG90eXBlPXttdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnQ6dGhpcy5BeChhKX0sQXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJ4OnRoaXMuQXAoYSl9LEFwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5CcDp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSW46dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmdtOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgSGM9Yy5zbHx8SGMsTmQ9bmV3IEhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPU5kLm10KDQpOyhmdW5jdGlvbihjKXtjLmhsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIGJhPWMuaGx8fGJhOyhmdW5jdGlvbihjKXtjLmdsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LApjOmZ1bmN0aW9uKCl7dGhpcy5IZz0wO3RoaXMuVz10aGlzLld8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5xYT10aGlzLnRjPXRoaXMueGE9dGhpcy5RYz0hMTt0aGlzLnBoPWUudWIoMTApO3RoaXMuUWcoKX0sUWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudmE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLlFhKCksITA7dGhpcy5IZysrO2lmKDEwPHRoaXMuSGcpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMudSghMCk6dGhpcy51KCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5RZy5iaW5kKHRoaXMpLDEwMCksITF9LFFhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMudmE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMubygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuRihiKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNhPWMuZ2x8fGNhOyhmdW5jdGlvbihjKXtjLmlsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBjYShiLAp0aGlzLkcpLGIuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgSWM9Yy5pbHx8SWMsSmM9bmV3IEljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs4XTt0aGlzLlhuPXRoaXMuYVsxMF07dGhpcy5Dbz10aGlzLmFbNV07dGhpcy5oaj10aGlzLmFbMTBdO3RoaXMuZmo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzddfWMuWHM9YjtiLnByb3RvdHlwZT17Zm46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmduOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkNvOnRoaXMuZ2ooYSl9LGdqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5oajp0aGlzLmVqKGEpfSxlajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZmo6dGhpcy5qKGEpfSwKajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIEtjPWMuWHN8fEtjLE9kPW5ldyBLYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPU9kLmZuKDQpOyhmdW5jdGlvbihjKXtjLlRqPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yj8oYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllclByZWZpeCkpPyh0aGlzLlMoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5WKGIpOnRoaXMuZmEoKSk6dGhpcy5mYSgpOnRoaXMuZmEoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxtZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaXNGdWxsc2NyZWVuP2IuaXNGdWxsc2NyZWVuOiExfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLmR1cmF0aW9uP2IudmlkZW9pbmZvLmR1cmF0aW9uOjB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8ucGxheWhlYWQ/Yi52aWRlb2luZm8ucGxheWhlYWQ6MH0sCmV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgTGM9Yy5Uanx8TGM7KGZ1bmN0aW9uKGMpe2MuU2o9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVBsYXlpbmciLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLAp0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMucygiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksdGhpcy51KCkpfSx0ZXN0OmZ1bmN0aW9uKCl7fSx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtiLmlzUGxheWluZygpPyhiLnBhdXNlKCksdGhpcy5GKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBNYz1jLlNqfHxNYzsoZnVuY3Rpb24oYyl7Yy5Vaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApjOmZ1bmN0aW9uKCl7dGhpcy5JYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuTmEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyBMYyhkKSxkLm1hfHx0aGlzLkooZCl8fCh0aGlzLksoZCksKG5ldyBNYyhkLHRoaXMuRykpLmMoKSk7ZWxzZSBicmVha310aGlzLkkoKX19KX0pKGMpO3ZhciBOYz1jLlVqfHxOYyxPYz1uZXcgTmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub2s9dGhpcy5hWzFdO3RoaXMuYXA9dGhpcy5hWzldO3RoaXMuZWs9dGhpcy5hWzFdO3RoaXMudHE9dGhpcy5hWzEwXTt0aGlzLkx1PXRoaXMuYVsxXTsKdGhpcy5sPXRoaXMuYVszXX1jLkx2PWI7Yi5wcm90b3R5cGU9e25rOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vazp0aGlzLiRvKGEpfSwkbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXA6dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5lazp0aGlzLnNxKGEpfSxzcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudHE6dGhpcy5LdShhKX0sS3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkx1OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgUGM9Yy5Mdnx8UGMsUGQ9bmV3IFBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9UGQubmsoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5TKGIpLHRoaXMuVihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIFFjPWMuJGp8fFFjOyhmdW5jdGlvbihjKXtjLlpqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlVmKCl9LFVmOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5GKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZighMCl9LmJpbmQodGhpcyksCjEwMCkpfX0pfSkoYyk7dmFyIFJjPWMuWmp8fFJjOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBRYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5tYSl7dGhpcy5JKCk7cmV0dXJufWlmKCF0aGlzLkooYikpe3RoaXMuSyhiKTsobmV3IFJjKGIsdGhpcy5HKSkuYygpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgU2M9Yy5ha3x8U2MsVGM9bmV3IFNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNyPXRoaXMuYVsxMF07dGhpcy5FdD10aGlzLmFbNl07dGhpcy5NbD0KdGhpcy5hWzVdO3RoaXMubXg9dGhpcy5hWzZdO3RoaXMuaHQ9dGhpcy5hWzEwXTt0aGlzLmVvPXRoaXMuYVsxMF07dGhpcy5TcD10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOV19Yy54aT1iO2IucHJvdG90eXBlPXticjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3I6dGhpcy5EdChhKX0sRHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkV0OnRoaXMuTGwoYSl9LExsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5NbDp0aGlzLmx4KGEpfSxseDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubXg6dGhpcy5ndChhKX0sZ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5odDp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVvOnRoaXMuUnAoYSl9LFJwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5TcDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIFVjPWMueGl8fFVjLApRZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1RZC5icig0KTsoZnVuY3Rpb24oYyl7Yy5jaT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlMoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5WKGIpOnRoaXMuZmEoKSk6dGhpcy5mYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgVmM9Yy5jaXx8VmM7KGZ1bmN0aW9uKGMpe2MuYmk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYiwKYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy51LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcykpO3RoaXMuJGQoKTt0aGlzLlJmKCl9LFk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlc9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0scGE6ZnVuY3Rpb24oKXt0aGlzLnFhPSEwO3RoaXMubygiZW1wdHkgdmFzdCIpfSxSZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiYKYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8CjMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy5vKCksdGhpcy5lYSgpKTp0aGlzLnUoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlJmLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy4kZC5iaW5kKHRoaXMpLDEwMCl9LCRkOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaGEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5SYS5iaW5kKHRoaXMpLDEwKSx0aGlzLm8oKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLnUoKTp0aGlzLnUoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGQuYmluZCh0aGlzKSwxMDApfX0sdTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlJhLmJpbmQodGhpcyksCjFFNCk7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIFdjPWMuYml8fFdjOyhmdW5jdGlvbihjKXtjLmRpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sU2E6ZnVuY3Rpb24oYil7Yj1uZXcgVmMoYik7Yi5tYT90aGlzLkkoKTp0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBXYyhiLHRoaXMuRykpLmMoKSl9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5TYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuU2Eod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5JKCl9fSl9KShjKTt2YXIgWGM9Yy5kaXx8WGMsWWM9bmV3IFhjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5HdD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs3XX1jLk5tPWI7Yi5wcm90b3R5cGU9e0Z0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIFpjPWMuTm18fFpjLFJkPW5ldyBaYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVJkLkZ0KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlNnPXRoaXMuVWc9dGhpcy5UZz0hMTt0aGlzLnNkPVtdO3RoaXMuVGU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRjP251bGw6VGMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpjP251bGw6SmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/Cm51bGw6SWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlYsTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYmI/bnVsbDpiYixvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdiP251bGw6Z2IsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIHZjP251bGw6dmMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgeWE/bnVsbDp5YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgQmM/bnVsbDpCYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB5P251bGw6eSxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHljP251bGw6eWMsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRiP251bGw6VGIsU2ltcGxlVmlkZW9BbmRJbWE6InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgR2M/bnVsbDpHYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSWI/bnVsbDoKSWIsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE9jP251bGw6T2MsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBxYz9udWxsOnFjLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBtYj9udWxsOm1iLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiByYj9udWxsOnJiLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsWE9aQ09NOiJ1bmRlZmluZWQiPT09dHlwZW9mIERhP251bGw6RGEsQkNGbGFzaE9ubHk6InVuZGVmaW5lZCI9PT10eXBlb2YgWGE/bnVsbDpYYSxEZW1vVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB0YT9udWxsOnRhLFRPbmxpbmUyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNhP251bGw6U2EsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgWWM/bnVsbDpZYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWT8KbnVsbDpZfX1jLnJtPWI7Yi5wcm90b3R5cGU9e2M6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMubnMoYSk6W10sYjt0aGlzLlVnPSEwO2lmKGEubGVuZ3RoKXt0aGlzLlRnPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnVoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5UZSl7aWYodGhpcy5TZylicmVhaztiPXRoaXMuVGVbY107dGhpcy5uZihiKSYmKHRoaXMuc2QucHVzaChiKSx0aGlzLnVoKGIpKX19LG5mOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sbnM6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuVGVbY10sdGhpcy5uZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx1aDpmdW5jdGlvbihhKXt0aGlzLm5mKGEpJiZhLmMoKX0sSXc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIG4mJgohdGhpcy5UZylmb3IodGhpcy5TZz0hMCxhPTA7YTx0aGlzLnNkLmxlbmd0aDthKyspdGhpcy5zZFthXS55YiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnNkW2FdLnliKX19fSkoYyk7dmFyICRjPWMucm18fCRjLEw9bmV3ICRjO0wuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLllqPXRoaXMuYVs2XTt0aGlzLm12PXRoaXMuYVs4XTt0aGlzLmdrPXRoaXMuYVs0XTt0aGlzLmprPXRoaXMuYVs4XTt0aGlzLklqPXRoaXMuYVszXTt0aGlzLkVrPXRoaXMuYVszXTt0aGlzLmR0PXRoaXMuYVsxMF07dGhpcy5qcD10aGlzLmFbOF07dGhpcy5Tcj10aGlzLmFbOF07dGhpcy5xcj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVsxMF19Yy5taT1iO2IucHJvdG90eXBlPXtYajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWWo6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5tdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZ2s6dGhpcy5payhhKX0saWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmprOnRoaXMuSGooYSl9LEhqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Jajp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRWs6dGhpcy5jdChhKX0sY3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmR0OnRoaXMuaXAoYSl9LGlwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcDp0aGlzLlJyKGEpfSxScjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU3I6dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgYWQ9Yy5taXx8YWQsU2Q9bmV3IGFkKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVNkLlhqKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLm9jKGsuVngpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLm9jKGsudHUpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKRi53aWR0aD0xO0YuaGVpZ2h0PTE7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBUZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGhhPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBHPW5ldyBSLG09ITE7Ry51YygpO0cuTWcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLnVjKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5NZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0cudWMoKTt2YXIgVWQ9VGQoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csRy5zdCgpLHtpZDpVZH0pfSw1MDApLGxhPWUuZ2EoMTApO2dhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkl5PXRoaXMuYVs1XTt0aGlzLnVpPXRoaXMuYVs4XTt0aGlzLk52PXRoaXMuYVsxXTt0aGlzLkt2PXRoaXMuYVsxXTt0aGlzLmJ2PXRoaXMuYVs3XTt0aGlzLlV1PXRoaXMuYVs1XTt0aGlzLld1PXRoaXMuYVsyXTt0aGlzLiRpPXRoaXMuYVsxMF07dGhpcy5paT10aGlzLmFbMl07dGhpcy5Xcz10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs3XX1jLld5PWI7Yi5wcm90b3R5cGU9e0h5OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5JeTp0aGlzLnRpKGEpfSx0aTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudWk6dGhpcy5NdihhKX0sTXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk52OnRoaXMuSnYoYSl9LEp2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ldjp0aGlzLmF2KGEpfSxhdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYnY6dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlV1OnRoaXMuVnUoYSl9LFZ1OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuV3U6dGhpcy5aaShhKX0sWmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLiRpOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5paTp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuV3M6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBiZD1jLld5fHxiZCxWZD1uZXcgYmQoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1WZC5IeSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubWg9dGhpcy5jb25mPXRoaXMuZWI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLm5kPTA7dGhpcy5WYT0iIjt0aGlzLnRkPVtdO3RoaXMudWQ9MDt0aGlzLm9oPSExO3RoaXMuUmU9W119Yy5maT1iO2IucHJvdG90eXBlPXtxdzpmdW5jdGlvbihhKXt0aGlzLm1oPQphfSx4ZDpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuVmE9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGt3OmZ1bmN0aW9uKGEpe3RoaXMuZWI9YX0saXc6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEVhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5WYV0mJnRoaXMuY29uZlt0aGlzLlZhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuVmFdW2FdKTtyZXR1cm4gYn0semM6ZnVuY3Rpb24oYSxiKXtlLnNiKCJ3ZWx0LmRlIikmJmUuVGEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwKIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLmViKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMudHQoKSl0aGlzLmViLmYodGhpcy5lYi5oZCx0aGlzLmViLkNhLHRoaXMuZWIuU2UsZnVuY3Rpb24oKXt0aGlzLnpjKGEsYil9LmJpbmQodGhpcyksdGhpcy5lYi5sYyk7ZWxzZSBpZih0aGlzLkZzKCkpdGhpcy5ldyhmdW5jdGlvbigpe3RoaXMuemMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudyhrLlljLHRoaXMucGxheWVyLnYoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLkx3KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuZWIsaCk7bC53aCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuZ3UoYSkpfHwKZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuQWUmJihjPXRoaXMucGxheWVyLkFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkNlKGEsYyxmKTt0aGlzLnBsYXllci54aChsKX19LHR0OmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMubmQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5uZC5nZXRUaW1lKCksdGhpcy5uZD1hLDNFNTxiPyEwOiExO3RoaXMubmQ9YTtyZXR1cm4hMX0sQnc6ZnVuY3Rpb24oKXtlLlllKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5FYSgiYWRUYWciKTt0aGlzLkVhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5FYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuamcoYSkpP3RoaXMuemMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLAowKSxlLncoay5aYyx0aGlzLnBsYXllci52KCkpKX0sQXc6ZnVuY3Rpb24oYSl7ZS5ZZSgicG9zdHJvbGwiKTtpZighdGhpcy5taCl7dGhpcy5xdyghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5FYSgiYWRUYWciKTt0aGlzLkVhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuRWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5qZyhjKSk/dGhpcy56YyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5aYyx0aGlzLnBsYXllci52KCkpKX19LGpnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxZdjpmdW5jdGlvbigpe3RoaXMucGxheWVyLnZ3KHRoaXMuQXcuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGEoKX0sCkFkOmZ1bmN0aW9uKGEpe2UuWWUoIm1pZHJvbGwiKTtpZighdGhpcy5aZyl7dGhpcy5aZz0hMDt2YXIgYj10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkVhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy56YyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aZz0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5aYyx0aGlzLnBsYXllci52KCkpKX19LFh2OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucHcodGhpcy5BZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5HZSgpfSxjOmZ1bmN0aW9uKCl7dGhpcy5CdygpO3RoaXMucGxheWVyLkdlJiZ0aGlzLlh2KCk7dGhpcy5ZdigpfSxadjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOgphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy50ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuTnkoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnVkPXRoaXMudGQubGVuZ3RofSxGczpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy51ZCYmKGE9ITApO3JldHVybiBhfSxldzpmdW5jdGlvbihhKXt0aGlzLm9oPWE7Zm9yKGE9MDthPHRoaXMudGQubGVuZ3RoO2ErKyl0aGlzLnRkW2FdWyJmdW5jdGlvbiJdKHRoaXMuRXYuYmluZCh0aGlzKSl9LEV2OmZ1bmN0aW9uKGEpe3RoaXMudWQtLTthJiZ0aGlzLlJlLnB1c2goYSk7MD49dGhpcy51ZCYmdGhpcy5vaCgpfSxndTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5SZS5sZW5ndGg7YysrKWI9dGhpcy5SZVtjXSwKYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMuZml8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXI9dGhpcy5hWzddO3RoaXMuS249dGhpcy5hWzldO3RoaXMuQmk9dGhpcy5hWzVdO3RoaXMuUG89dGhpcy5hWzRdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuaXY9dGhpcy5hWzFdO3RoaXMubnA9dGhpcy5hWzFdO3RoaXMubD10aGlzLmFbMl19Yy5XbD1iO2IucHJvdG90eXBlPXtocjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXI6dGhpcy5KbihhKX0sSm46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktuOnRoaXMuQWkoYSl9LEFpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5CaTp0aGlzLk9vKGEpfSxPbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUG86dGhpcy5EaihhKX0sCkRqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Fajp0aGlzLmh2KGEpfSxodjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaXY6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5wOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgY2Q9Yy5XbHx8Y2QsV2Q9bmV3IGNkKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9V2QuaHIoNCl9KS5jYWxsKGllSm9qdWFiemFpcm9oR3UsaWVKb2p1YWJ6YWlyb2hHdSk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.65.40 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.40.65.243.136.clients.your-server.de
Software
openresty/1.13.6.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
ssl.1.damoh.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000e465b7531c34525cb6ce23:1584946596535:1555484196535:.golem.de:1:1555484196535!hvb178; __utmc=21769261; __utmz=21769261.1555484197.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.980209430.1555484196.1555484196.1555484196.1; __utmb=21769261.1.10.1555484197; golem_us=5bb0cb86; golem_uv=5bb0cb86; golem_uz=5bb0cb86; __io=a4e139041.463f71015_1555484196816; __io_unique_43098=17; __io_uh=1; __io_visit_43098=1; __gads=ID=91124d6a96ce1f18:T=1555484196:S=ALNI_MajQvC0Wtmvmb0T-uT3kRdgRTFTPg
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:38 GMT
Last-Modified
Mon, 03 Sep 2018 14:21:38 GMT
Server
openresty/1.13.6.2
ETag
"5b8d4372-18"
Content-Type
application/octet-stream
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
truncated
/ Frame D734
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
a23a7641dea5a45304ac57263abd3595ab2fa7379b96de9e792fd916ab541936

Request headers

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

Response headers

Content-Type
text/javascript
37e3acce16bfc629bcbf4870122d95b55c8086d5
t.bacontent.de/t/
0
95 B
Script
General
Full URL
https://t.bacontent.de/t/37e3acce16bfc629bcbf4870122d95b55c8086d5?aid=idc&t=data%2Finventory&url=https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&ts=1555484199
Requested by
Host: c.bacontent.de
URL: https://c.bacontent.de/assets/js/loader.js?v=22170164
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.190.35.232 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
232.35.190.35.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

pragma
no-cache
date
Wed, 17 Apr 2019 06:56:38 GMT
via
1.1 google
last-modified
Wed, 17 Apr 2019 06 GMT
server
Apache
content-type
text/javascript; charset=utf8
status
200
cache-control
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
alt-svc
clear
content-length
0
expires
Sat, 26 Jul 1997 05:00:00 GMT
activeview
pagead2.googlesyndication.com/pcs/ Frame E550
42 B
178 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsvG4NDWt02ytL5zlGy35iiJHuNnYIBsZAs5KCaecMnHEcBl7Un4nhPZICae1LunmDUlLWg2p3GwzOvehjaUi26Vc5xTH5GhU7RNIBf9prA&sig=Cg0ArKJSzNNnldTdHak4EAE&adk=3506586144&tt=-1&bs=1585%2C1185&mtos=1007,1007,1007,1007,1007&tos=1007,0,0,0,0&p=140,393,390,1193&mcvt=1007&rs=3&ht=0&tfs=1170&tls=2177&mc=1&lte=1&bas=0&bac=0&avms=geo&rst=1555484197098&rpt=489&isd=0&msd=0&lm=2&oseid=3&xdi=0&ps=1603%2C6248&ss=1600%2C1200&pt=-1&deb=1-1-6-43-13-27-75-12&tvt=2159&r=v&id=osdim&vs=4&uc=8&upc=1&tgt=DIV&cl=1&cec=6&clc=0&cac=0&cd=0x0&v=20190415
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:814::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

pragma
no-cache
date
Wed, 17 Apr 2019 06:56:38 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
ssl.1.damoh.golem.de/6bb6f6791e6bddb8a8b0009f2d56ff27cfc6e11a/
110 B
672 B
XHR
General
Full URL
https://ssl.1.damoh.golem.de/6bb6f6791e6bddb8a8b0009f2d56ff27cfc6e11a/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGllSm9qdWFiemFpcm9oR3U9aWVKb2p1YWJ6YWlyb2hHdXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuTGV8fCh5LkxlPTApO3kuTGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5MZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5UYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEud2gobSksYS5DZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS4kcCllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5ZYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wuc2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS54ZChjKTthLmt3KGwpO2EuaXcobSk7YS5adigpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlyPXRoaXMuYVs0XTt0aGlzLnh2PQp0aGlzLmFbN107dGhpcy5sPXRoaXMuYVs3XX1jLnN2PWI7Yi5wcm90b3R5cGU9e3hyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55cjp0aGlzLnd2KGEpfSx3djpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnh2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIga2E9Yy5zdnx8a2EsZGQ9bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9ZGQueHIoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuJHA9ITE7dGhpcy5PYT0ic2V0dXAiO3RoaXMuQmM9W107dGhpcy5ZZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLkR2LmJpbmQodGhpcykpfWMucms9YjtiLnByb3RvdHlwZT17WWY6ZnVuY3Rpb24oKXt0aGlzLmNhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSwKb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LEpvOmZ1bmN0aW9uKGEpe3RoaXMuY2EuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LG9hOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxEdjpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5DdihhLmRhdGEpfSxDdjpmdW5jdGlvbihhKXtpZih0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPQp0aGlzLmNhLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGI7ZCsrKXRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lciYmYS5ldmVudD09dGhpcy5jYS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX0sVmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmNhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sYmc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lcyhhKSxkPSExO2lmKGIpcmV0dXJuIHRoaXMuV2coYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpifSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGVzOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxIbzpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUuVXIoYSkpcmV0dXJuOyhiPXRoaXMuYmcoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSxVcjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxtZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmCihiPXRoaXMuY2Eub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxCdDpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxOYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LHZnOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxDaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT0KZG9jdW1lbnQuYm9keT8hMDohMX0sUGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSx1ZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoOwpkPXIud2lkdGg7Zj1yLmhlaWdodDswPnIudG9wJiYoZis9ci50b3ApO3IuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09ci5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sdmU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy51ZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7CmlmKGIpe2lmKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWEuc3RhcnRUaW1lPj1hLnRpbWVNUyl7YS5jYigpO3JldHVybn19ZWxzZSBhLnN0YXJ0VGltZT0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmUoYSl9LmJpbmQodGhpcyksMTAwKX0sdWI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LG9lOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8CmEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0semg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxKPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLHAsbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtwPWEubGVuZ3RoO3ZhciBuPVtdO2ZvcihmPTA7ZjxwLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLG4ucHVzaChjKTtzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLQoxKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQocC0yKTw8MjR8YS5jaGFyQ29kZUF0KHAtMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChwLTMpPDwyNHxhLmNoYXJDb2RlQXQocC0yKTw8MTZ8YS5jaGFyQ29kZUF0KHAtMSk8PDh8MTI4fWZvcihuLnB1c2goZik7MTQhPW4ubGVuZ3RoJTE2OyluLnB1c2goMCk7bi5wdXNoKHA+Pj4yOSk7bi5wdXNoKHA8PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPG4ubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09blthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO3A9cjtsPUo7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfH5wJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKHBeCmxedikrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXYsdj1sLGw9ZChwLDMwKSxwPWMsYz10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQoYyw1KSsocCZsfHAmdnxsJnYpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQocCwzMCkscD1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKHBebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKHAsMzApLHA9YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrcCY0Mjk0OTY3Mjk1O0o9SitsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihKKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LG5iOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4KMixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+NixyPWMmNjMsaXNOYU4oZik/ZT1yPTY0OmlzTmFOKGMpJiYocj02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSx5dDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGZlOmZ1bmN0aW9uKCl7dmFyIGE9e30sCmI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHI9ITEsaz0hMSxsPSExLG09ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChwKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChxKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IubGI/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8CmMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gobil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXI7YS5pc0VkZ2U9azthLmlzQ2hyb21lPWw7YS5pc0JsaW5rPW07cmV0dXJuIGF9LCRyOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy5mZSgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFBhOmZ1bmN0aW9uKCl7dmFyIGE9e0lpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LApkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxPczpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxibTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxUbjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sTHA6ZnVuY3Rpb24oKXtyZXR1cm4gYS5JaSgpfHxhLmRqKCl8fGEuT3MoKXx8YS5ibSgpfHxhLlRuKCl9fTtyZXR1cm4gYS5McCgpfSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGZkOmZ1bmN0aW9uKGEpe2E9dGhpcy56YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHNiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHBzOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMuemEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxJcTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxHdzpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxxZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuT2goYikrIjoiK3RoaXMuT2goTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LE9oOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxZZTpmdW5jdGlvbihhKXt0aGlzLk9hPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLk9hO3RoaXMuTmYoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLAohMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxvYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlZCl7dmFyIHI9YTtkJiZiJiYoYj1rLlNhKGIsZCkpO2ImJihyPWsuU2EoYSxiKSk7ZiYmKHI9ay5TYShyLGYpKTtjJiYocj1rLlNhKHIsYykpO2gmJihyPWsuU2EocixoKSk7ZWQmJihyPWsuU2EocixoKSk7ZS5vYyhyKX0sRnY6ZnVuY3Rpb24oYSl7dmFyIGI9e307aWYoIWEuY29kZSlyZXR1cm4hMTtpZihhLmNvZGUmJjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlJiYxMDIzIT1hLmNvZGUmJjEwMTghPWEuY29kZSl7dHJ5e2lmKGxhJiYoYi5zZXNzaW9uX2lkPWxhKSxiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiIsYS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpLGIuZXZlbnQ9CmEuY29kZSxiLnNpdGVfaHJlZj10aGlzLnBzKCksYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfX1jYXRjaChkKXt9cmV0dXJuIGJ9fSxOZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZ2KGEpO2lmKGIpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZihiKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYil0cnl7Yj1KU09OLnN0cmluZ2lmeShiKX1jYXRjaChkKXtiPWIudG9TdHJpbmc/Yi50b1N0cmluZygpOiIifWImJmIudHJpbSYmKGI9Yi50cmltKCkpO2E9bC52ZCgpKyI/aG9tYWRfYXQ9IitlbmNvZGVVUklDb21wb25lbnQoYik7bC53YShhLCEwKTthPWwud2EoYSwhMCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1lbmNvZGVVUklDb21wb25lbnQoYik7bC5IYShhLGZ1bmN0aW9uKCl7fSl9fSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbHx8IWwuYmEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWErYjt0aGlzLkNjfHwodGhpcy5DYz17fSk7dGhpcy5DY1tmXXx8KHRoaXMuQ2NbZl09MCk7dGhpcy5DY1tmXSsrOzEwPHRoaXMuQ2NbZl18fChmPWwudmQoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpLGwud2EoZiwhMCksZj1sLndhKGYsITApLGYuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPQoiIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixsLkhhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpKX19LERlOmZ1bmN0aW9uKCl7bCYmbC5iYT9sLmlzRW5hYmxlZCYmbC5ucSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EZSgpfS5iaW5kKHRoaXMpLDUwMCl9LGxlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmCmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuYmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LG5lOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxiYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmdkKGEpOiIifSxnZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm5lKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sZXE6ZnVuY3Rpb24oYSxiLGQpe2Q9ITE7aWYoYi54ZShhKXx8dGhpcy5CdChhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LldlJiZ3aW5kb3cuc2FuZGJveC5XZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LldlWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwKc2FuZGJveC5XZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChhKSgiRXJyb3IiKSk7aWYodGhpcy5tZyhhKSlyZXR1cm4gdGhpcy5tZyhhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMubmIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtkJiYoZi5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtmLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2YuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjt2YXIgYz0hMTtkPSExO2Q9dGhpcy5UYShhLGIuR2EsZixmdW5jdGlvbihhKXtjPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2N8fChjPWQpLGM9SlNPTi5wYXJzZShjKX1jYXRjaChoKXtjPSExfWMudXJsJiZjLmhhc2gmJihjPWIubGQoKS5yZXBsYWNlKCJbaGFzaF0iLApjLmhhc2gpKTt0aGlzLkhvKGMsYSk7cmV0dXJuIGN9LFRhOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUscil7dmFyIGs9aHx8bDtoPSEwO3ImJihoPSExKTtpZihrJiZrLmJhKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2gobSl7YyhtKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpYygpO2Vsc2V7ay53YShhLGgpO2g9ay53YShhLGgpO2guZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuSGEoaCxmLGMsIiIsIiIsZSl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRhKGEsYixkLGYsYyxrLGUscil9LmJpbmQodGhpcyksNTAwKX0sV2c6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSl7dmFyIHI9ITA7ZSYmKHI9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7ZT1kO2Q9IiI7CmZvcih2YXIgayBpbiBlKWQrPSImIitrKyI9IitlbmNvZGVVUklDb21wb25lbnQoZVtrXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8NCE9bC5yZWFkeVN0YXRlfHwyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzfHxmKGwpO2MmJjQ9PWwucmVhZHlTdGF0ZSYmMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsciksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LCR0OmZ1bmN0aW9uKGEsYixkKXt0aGlzLldnKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLkJjKWZvcih2YXIgYyBpbiB0aGlzLkJjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuQmNbY10pOwpjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS5uYihhKTtkJiYoYy5vbmVycm9yPWQpO2RvY3VtZW50LmhlYWQuZmlyc3RDaGlsZD9kb2N1bWVudC5oZWFkLmluc2VydEJlZm9yZShjLGRvY3VtZW50LmhlYWQuZmlyc3RDaGlsZCk6ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LFhnOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5uYihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuVGEoYSxmLkdhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT0KSlNPTi5wYXJzZShhKX1jYXRjaChjKXthPSExfXRoaXMuJHQoZi5sZCgpLnJlcGxhY2UoIltoYXNoXSIsYS5oYXNoKSxiLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0scnc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuQmM9YX0sTnk6ZnVuY3Rpb24oYSxiLGQsZixjKXt0aGlzLlRhKGEsZCx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGQ9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCk7ZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLApiPWIucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGI9Yi5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmIsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfWNhdGNoKGgpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX19LGZ1bmN0aW9uKCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfSl9LE1wOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0hMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSx3dDpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFE9Yy5ya3x8ClE7bmV3IFE7dmFyIGU9bmV3IFE7d2luZG93LmtnPWU7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMucWs9YjtiLlNhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5wdj17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5zdT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi51eT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLkVyPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuRnk9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5MZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuRWY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLklmPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLk1mPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi53bz17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5HZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLll4PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5ydT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIiwKbmFtZToiYWRFcnJvciJ9O2IuRnI9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkF5PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlpmPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IuQ3E9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLlpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuWWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLktmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLAptZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Iuem89e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLk1jPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5TZD17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5VZD17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2IueW89e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlZoPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2Iud3U9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi5wZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07CmIubGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLiRmPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi50eT17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5WeD17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLnR1PXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfSxnZXRUeXBlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX19fSkoYyk7dmFyIGs9Yy5xa3x8aztjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuanE9dGhpcy5hWzEwXTt0aGlzLiR3PXRoaXMuYVsxXTt0aGlzLlpuPXRoaXMuYVs2XTt0aGlzLkNrPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzhdfWMuZWk9YjtiLnByb3RvdHlwZT17aXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmpxOnRoaXMuWncoYSl9LFp3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kdzp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWm46dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNrOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgbWE9Yy5laXx8bWEsZmQ9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPWZkLmlxKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuc2s9YjtiLnByb3RvdHlwZT17b2U6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LG9iOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5BfHwieCIpfSxqczpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZSsKbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sZGQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmRkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuZGQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSx1YzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLm9lKHRoaXMub2IoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9CnRoaXMuZGQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LHN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWMoKSsiMiJ9LE1nOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMub2UodGhpcy5qcygpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmRkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUj1jLnNrfHxSO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnBvPXRoaXMuYVs0XTt0aGlzLnpwPXRoaXMuYVs2XTt0aGlzLlFuPXRoaXMuYVs4XTt0aGlzLnd5PXRoaXMuYVs2XTt0aGlzLnp5PXRoaXMuYVs1XTt0aGlzLmw9dGhpcy5hWzldfWMuRG49YjtiLnByb3RvdHlwZT17b286ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT8KdGhpcy5wbzp0aGlzLnlwKGEpfSx5cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuenA6dGhpcy5QbihhKX0sUG46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFuOnRoaXMudnkoYSl9LHZ5OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3k6dGhpcy55eShhKX0seXk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnp5OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgbmE9Yy5Ebnx8bmEsZ2Q9bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9Z2Qub28oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsCmY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGYuZj9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5mOmZ1bmN0aW9uKCl7ZC5mLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnRmPWJ9KShjKTt2YXIgSz1jLnRmfHxLO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhpPXRoaXMuYVsxXTsKdGhpcy5Nbz10aGlzLmFbOF07dGhpcy5sPXRoaXMuYVs5XX1jLllzPWI7Yi5wcm90b3R5cGU9e0dpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuSGk6dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk1vOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgb2E9Yy5Zc3x8b2EsaGQ9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9aGQuR2koNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5xbT1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMueWM9MTAwO3RoaXMudmI9MDt0aGlzLklhPTE1MDt0aGlzLnliPTA7dGhpcy5sdyhiKX0sYzpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMudmI8PXRoaXMuSWE/KHRoaXMudmIrKywKdGhpcy55Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnljKSk6MD50aGlzLklhJiYodGhpcy55Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnljKSl9LGF3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmI+dGhpcy5JYT8hMDohMX0sVmU6ZnVuY3Rpb24oKXt0aGlzLnZiPTB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsdzpmdW5jdGlvbihiKXt0aGlzLkc9Yn0sZ3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxLOmZ1bmN0aW9uKGIpe3RoaXMuSmFbYi5vYigpXT1iO0wmJkwuVWcmJkwuSXcoYil9LHB6OmZ1bmN0aW9uKCl7cmV0dXJuIGUuTmEodGhpcy5KYSl9LEo6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYT09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVtiLm9iKCldPyEwOiExfSx4dDpmdW5jdGlvbihiKXtiPWIuRmEoKTtmb3IodmFyIGEgaW4gdGhpcy5KYSlpZihiLmlkPT0KdGhpcy5KYVthXS5GYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxEejpmdW5jdGlvbihiKXt0aGlzLkphW2IuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLnFtfHx0OyhmdW5jdGlvbihjKXtjLnNtPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMueWM9MTA7dGhpcy52Yj0wO3RoaXMuSWE9NTA7dGhpcy5OPW51bGw7dGhpcy5tYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMucWI9IiI7dGhpcy5mZz0hMTt0aGlzLk0oKX0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHY6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkZhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE06ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7fSwKdnc6ZnVuY3Rpb24oYil7dGhpcy5OPWJ9LHF6OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTn0scHc6ZnVuY3Rpb24oYil7dGhpcy5IZT1ifSxvejpmdW5jdGlvbigpe3JldHVybiB0aGlzLkhlfSxHZTpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMudmI8PXRoaXMuSWEmJih0aGlzLnZiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksdGhpcy55YykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYil7fX0sdWc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sb2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sWmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxFejpmdW5jdGlvbigpe30sVjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5HcygpfHx0aGlzLkVvKCk7dGhpcy5aZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHJ6OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEVvOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLmdhKDEwKSl9LEdzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxTOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPQpifSxGYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxtZDpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmN1cnJlbnRUaW1lP2IuY3VycmVudFRpbWU6MH0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLmR1cmF0aW9uP2IuZHVyYXRpb246MH0sVWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0seHo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYX0sZmE6ZnVuY3Rpb24oKXt0aGlzLm1hPSEwfSxQYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxrYTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnZpZGVvVGFnO3JldHVybiBiJiZiLm11dGVkP2IubXV0ZWQ6ITF9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHhoOmZ1bmN0aW9uKGIpe3RoaXMucWI9Yn0sbno6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYn0sc2g6ZnVuY3Rpb24oKXt0aGlzLnFiPW51bGx9LHV6OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5xYiYmKGI9ITApO3JldHVybiBifSx6ejpmdW5jdGlvbigpe3RoaXMuZmd8fCh0aGlzLmZnPSEwKX0scWM6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sa3o6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBuPWMuc218fG47KGZ1bmN0aW9uKGMpe2MuZ2k9Sy5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLkc9dGhpcy5wbGF5ZXI9IiI7dGhpcy5DZj0iMSI7dGhpcy5EZj0iMiI7dGhpcy5ybz0iMyI7dGhpcy5HYz0wO3RoaXMuJGc9CjMwO3RoaXMuRGI9W107dGhpcy5aYT1bXTt0aGlzLiRiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLk9mPXRoaXMuUmg9ITE7dGhpcy5zdGF0dXM9dGhpcy5HYzt0aGlzLmlkPWUuZ2EoMTApO3RoaXMueGQoYik7dGhpcy5udyhhKX0sYzpmdW5jdGlvbigpe30sZWE6ZnVuY3Rpb24oKXt0aGlzLlJofHwodGhpcy5SaD0hMCxlLkRlKCkpfSxLZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuUCgpO1MmJlMuS2ImJiFwYSYmKHBhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LEY6ZnVuY3Rpb24oYixhKXt2YXIgZz0hMDtiJiYoZz0hMSk7cmV0dXJuIHRoaXMuaGEoKT8hMToodGhpcy5zdygpLHRoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpLHRoaXMuS2goKSx0aGlzLk9mPSEwLGEmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCksITApfSxzOmZ1bmN0aW9uKGIsCmEpe3RoaXMuaGEoKXx8KHRoaXMuRGIucHVzaChiKSx0aGlzLlphLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxLaDpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuRGImJjA8dGhpcy5EYi5sZW5ndGgmJih0aGlzLkRiPWUudW5pcXVlKHRoaXMuRGIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLkRiLmpvaW4oIiwiKSkpO2lmKHRoaXMuWmEpe2Zvcih2YXIgZz0wO2c8dGhpcy5aYS5sZW5ndGg7ZysrKXRoaXMuJGJbdGhpcy5aYVtnXS5yZWFzb25dPT10aGlzLiRiW2JdJiZhLnB1c2godGhpcy5aYVtnXS5kZXRhaWwpLHRoaXMuJGJbdGhpcy5aYVtnXS5yZWFzb25dPHRoaXMuJGJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlphW2ddLmRldGFpbCksYj10aGlzLlphW2ddLnJlYXNvbik7dGhpcy4kYltiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihnPWUudW5pcXVlKGEpLGI9YisiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsCmIsITAsYSl9fSxzejpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9mfSxvOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5DZn0sc3c6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkRmfSx0dzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMucm99LFJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5HY30sRmY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuQ2Z9LGJ6OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkRmfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5HY30seGQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxudzpmdW5jdGlvbihiKXt0aGlzLkc9Yn0sZ3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxjdTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuZ2l8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRtPXRoaXMuYVs2XTt0aGlzLmNrPXRoaXMuYVs3XTt0aGlzLnhqPXRoaXMuYVsyXTt0aGlzLmxpPXRoaXMuYVs1XTt0aGlzLkJqPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsyXX1jLmZvPWI7Yi5wcm90b3R5cGU9e0NtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5EbTp0aGlzLmJrKGEpfSxiazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2s6dGhpcy53aihhKX0sd2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhqOnRoaXMua2koYSl9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5saTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQmo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYT1jLmZvfHxxYSxpZD1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9aWQuQ20oNCk7KGZ1bmN0aW9uKGMpe2MucWo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuZ2IoYil9LmJpbmQodGhpcykpfSxnYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5OJiZ0aGlzLk4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTsKdmFyIFQ9Yy5xanx8VDsoZnVuY3Rpb24oYyl7Yy5waj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2Q9bnVsbDt0aGlzLmN5PTFFMzt0aGlzLmpoPW51bGw7dGhpcy5weD0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cubGIpYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkYoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Oci5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuQ3MuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy5CcyhhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuZnkoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmd5KGIpfS5iaW5kKHRoaXMpKSk7CmIub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLkFzKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5BcShhKX0uYmluZCh0aGlzKSl9LEFxOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkYoKX0sZnk6ZnVuY3Rpb24oYil7dGhpcy5LZHx8KHRoaXMuS2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmh5KGIpfS5iaW5kKHRoaXMpLHRoaXMuY3kpKX0saHk6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuS2QpO3RoaXMuRigpfSxneTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5LZCl9LEFzOmZ1bmN0aW9uKGIpe3RoaXMuaHooYik7dGhpcy5qaD1uZXcgRGF0ZTt0aGlzLmpoLXRoaXMuenY8dGhpcy5weD90aGlzLkYoKTp0aGlzLm8oKX0sQ3M6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy54ZChuZXcgVChhKSkpOwp0aGlzLkYoKX0sTnI6ZnVuY3Rpb24oKXt9LEJzOmZ1bmN0aW9uKCl7dGhpcy56dj1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLnBqfHxyYTsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLk5hKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFQoYlthXSk7dGhpcy5KKGcpfHwodGhpcy5LKGcpLChuZXcgcmEoZyx0aGlzLkcpKS5jKCkpfX10aGlzLkkoKX19fSl9KShjKTt2YXIgc2E9Yy5yanx8c2EsdGE9bmV3IHNhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkZ3PXRoaXMuYVsyXTt0aGlzLkN5PQp0aGlzLmFbNV07dGhpcy5tbz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs4XX1jLnltPWI7Yi5wcm90b3R5cGU9e0V3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gdzp0aGlzLkJ5KGEpfSxCeTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3k6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgdWE9Yy55bXx8dWEsamQ9bmV3IHVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9amQuRXcoNCk7KGZ1bmN0aW9uKGMpe2MuUms9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5MYj0hMTt0aGlzLmxnKCk7dGhpcy5uZygpO3RoaXMuQnE9ITF9LGxnOmZ1bmN0aW9uKCl7dGhpcy5MYj0KITE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2J8fCh0aGlzLkxiPSEwKTtpZigiT0JKRUNUIj09Yi5ub2RlTmFtZXx8IlZJREVPIj09Yi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLlMoYil9LG5nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTGIpe3ZhciBiPXRoaXMuRmEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkxiPSEwKTt0aGlzLlYoYSl9fSxsYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5OJiYoMCx0aGlzLk4pKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCwKY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLk4mJigwLHRoaXMuTikoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLk4mJigwLHRoaXMuTikoKX0uYmluZCh0aGlzKSl9LEdlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuQWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLkFkKGEpfS5iaW5kKHRoaXMpKX0sQWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsKYS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpOyJtaWQiPT1iLmFkcG9zaXRpb24mJmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5IZSYmKDAsdGhpcy5IZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LFVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxrYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHZhPWMuUmt8fHZhOyhmdW5jdGlvbihjKXtjLlFrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE06ZnVuY3Rpb24oKXt9LFJhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5HYzt0aGlzLmlzUGxheWluZz10aGlzLkljPSExO3RoaXMuVGQ9MTt0aGlzLktjPVtdO3RoaXMuamI9ITF9LGM6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLkljPSExO3RoaXMuVGQ9MTt0aGlzLktjPVtdO3RoaXMuamI9ITE7dGhpcy5nZXRQbGF5ZXIoKTsKdmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlRkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5qYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuamI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuamI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmpiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMuSWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMuS2UoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLiRnJiYKIXRoaXMuaGEoKSYmKHRoaXMuamI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMudSgpKToodGhpcy5zKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy51KCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLlJhKCksdGhpcy5nZXRQbGF5ZXIoKS5CcT0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkucWI7YSYmKGEucmQoKSxhLmNlKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLkljPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMuS2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuJGcmJiF0aGlzLmhhKCkmJih0aGlzLmpiPyh0aGlzLnMoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5LYy5pbmRleE9mKGEpJiYKdGhpcy5LYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLmVhKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5zKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuS2MubGVuZ3RoPj10aGlzLlRkJiZ0aGlzLnUoKSl9LGN1OmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sdTpmdW5jdGlvbihiKXtiP3RoaXMuaWU/dGhpcy5pZSsrOnRoaXMuaWU9MTp0aGlzLmhlP3RoaXMuaGUrKzp0aGlzLmhlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkNoKGEudmlkZW9UYWcpP2EuTGI/dGhpcy5vKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5JY3x8dGhpcy5pc1BsYXlpbmc/Cih0aGlzLmhlPnRoaXMuaWUmJihiPSExKSx0aGlzLkYoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDUwKTooYS5sZygpLGEubmcoKSxhLkxifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHdhPWMuUWt8fHdhOyhmdW5jdGlvbihjKXtjLlNrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuY3MoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKWlmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPW5ldyB2YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSihnKXx8dGhpcy54dChnKXx8KHRoaXMuSyhnKSxnPW5ldyB3YShnLHRoaXMuRyksZy5NKCksZy5jKCkpfX10aGlzLkkoKX19LG16OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LApjczpmdW5jdGlvbigpe3ZhciBiPWUuemEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUubmIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHhhPWMuU2t8fHhhLHlhPW5ldyB4YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dT10aGlzLmFbNV07dGhpcy5keD10aGlzLmFbOV07dGhpcy5PcD10aGlzLmFbOV07dGhpcy51bT10aGlzLmFbOF07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5jcD10aGlzLmFbOF07dGhpcy51cj10aGlzLmFbMV07dGhpcy5JdD10aGlzLmFbNl07dGhpcy5vbT10aGlzLmFbNV07dGhpcy4kcz10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs0XX1jLnZvPWI7Yi5wcm90b3R5cGU9e3V1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52dTp0aGlzLmN4KGEpfSxjeDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZHg6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5PcDp0aGlzLnRtKGEpfSx0bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW06dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmZsOnRoaXMuYnAoYSl9LGJwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5jcDp0aGlzLnRyKGEpfSx0cjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudXI6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkl0OnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vbTp0aGlzLlpzKGEpfSxaczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuJHM6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6YT1jLnZvfHx6YSxrZD1uZXcgemEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT0Ka2QudXUoNCk7KGZ1bmN0aW9uKGMpe2MuYW89bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb19pZCk7dGhpcy5TKGIpO3ZhciBiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0sYT10aGlzLmdldFJhd1BsYXllcigpO2ImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlYoYik6dGhpcy5JKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlhPWkNPTSJ9fSl9KShjKTsKdmFyIEFhPWMuYW98fEFhOyhmdW5jdGlvbihjKXtjLiRuPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IudHJhY2tlci52YXN0X3ByZXJvbGx8fGIudHJhY2tlci52YXN0X3Bvc3Ryb2xsP3RoaXMubygpOih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLnUoKSl9LHU6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMuRigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEJhPWMuJG58fEJhOyhmdW5jdGlvbihjKXtjLmJvPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzJiYKMDxlLk5hKHdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcykpe3ZhciBiPXdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YlthXTtpZihnLmNvbnRyb2xzJiZnLmNvbnRyb2xzLnBsYXllcilnPW5ldyBBYShnKSx0aGlzLkooZyl8fCh0aGlzLksoZyksKG5ldyBCYShnLHRoaXMuRykpLmMoKSk7ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19KX0pKGMpO3ZhciBDYT1jLmJvfHxDYSxEYT1uZXcgQ2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRmk9dGhpcy5hWzRdO3RoaXMuSWs9dGhpcy5hWzVdO3RoaXMuRHU9dGhpcy5hWzhdO3RoaXMuWnE9dGhpcy5hWzRdO3RoaXMuVW09dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbNl19Yy5Laz1iO2IucHJvdG90eXBlPQp7RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZpOnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jazp0aGlzLkN1KGEpfSxDdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkR1OnRoaXMuWXEoYSl9LFlxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5acTp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBFYT1jLktrfHxFYSxsZD1uZXcgRWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1sZC5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5Gbj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPQpiLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUyhhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5WKGIpOnRoaXMuZmEoKSk6dGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxsYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuZ2IoYil9LmJpbmQodGhpcykpfSxnYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5OJiZ0aGlzLk4oKX0sbWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LFVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGcpe2E9ITF9YSYmYi5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciBGYT1jLkZufHxGYTsoZnVuY3Rpb24oYyl7Yy5Fbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5XPXRoaXMuV3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnFhPXRoaXMudGM9dGhpcy54YT10aGlzLlFjPSExO3RoaXMucGg9ZS51YigxMCk7dGhpcy5RaD0hMDt0aGlzLmVjPXRoaXMuSmc9ITE7dGhpcy5laCgpO3RoaXMua3EoKTt0aGlzLlFhKCl9LEF6OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5vYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5aLCI7Iix0eXBlb2YgYi5aLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlo/Yi5aLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5aP3R5cGVvZiBiLlouc3RhdGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuUiwiOyIsdHlwZW9mIGIuUiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLlI/Yi5SLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5EYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuRGE6InVuZGVmaW5lZFgiLAoiOyIsYi5SP3R5cGVvZiBiLlIuRGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLkRhP2IuaW1hLkRhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuRGE/dHlwZW9mIGIuaW1hLkRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuUiYmYi5SLkRhP2IuUi5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5SJiZiLlIuRGE/dHlwZW9mIGIuUi5EYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5QZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5QZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuUj9iLlIuUGQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5QZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsCiI7IixiLmltYT9iLmltYS5RZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5RZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlFkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuUWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEudmE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEudmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuUj9iLlIudmE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi52YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuV2Q6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuV2Q6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLldkOgoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLldkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMucGgpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sSGI6ZnVuY3Rpb24oKXtpZighdGhpcy52YSl7dmFyIGI9dGhpcy5wYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudmE9CmIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLnZhPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLnZhPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLnZhfSx5ZzpmdW5jdGlvbigpe2lmKCF0aGlzLnRjKXt2YXIgYj10aGlzLnBiKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMudGM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLnRjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMudGN9LHZ0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuSWcpe3ZhciBiPXRoaXMucGIoKSxhPXRoaXMudXQoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLklnPSEwKX1yZXR1cm4gdGhpcy5JZ30sdXQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwohdGhpcy5RYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMuUWM9ITApO3JldHVybiB0aGlzLlFjfSxRYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLlVlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcyksCjIwKX0sVWU6ZnVuY3Rpb24oKXt0aGlzLmVjPSEwO3ZhciBiPXRoaXMueWcoKTtpZihifHx0aGlzLmhhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5zKCJhZGVycm9yIiwKdGhpcy5XKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5QYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuZmM9ITA7aWYoZS5zYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLmZjPSEwO2Uuc2IoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5mY3x8KHRoaXMucygiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcyksCjIwKX0sbHo6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmFnJiZiLmFkcyYmKHRoaXMuYWc9Yi5hZHMpO3JldHVybiB0aGlzLmFnfSxrcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLmFhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLmFhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMuYWEoKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLmFhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTsKYi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubygpO3RoaXMuS2UoKX0uYmluZCh0aGlzKSl9LGRnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy55ZygpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZGcoKX0uYmluZCh0aGlzKSw1MCl9LGVoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLnZ0KCkpe3ZhciBhPXRoaXMucGIoKSxnPXRoaXMuSGIoKTthJiZnJiYodGhpcy5wYigpLHRoaXMuSGIoKSx0aGlzLmVjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWM/dGhpcy5vKCk6KHRoaXMuYWEoITApLHRoaXMucygibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLnBiKCl9ZWxzZSB0aGlzLkpnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGIoKSxiPXRoaXMuSGIoKTthJiYhYj8odGhpcy5zKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmFhKCkpOih0aGlzLmFhKCEwKSx0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5KZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVoKCl9LmJpbmQodGhpcyksNTApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpOwppZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LGxxOmZ1bmN0aW9uKCl7dGhpcy5rY3x8KHRoaXMua2M9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLmtjIT1iLmFkcy5zdGF0ZSYmKHRoaXMua2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PQp0aGlzLmtjKXt0aGlzLm8oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMua2M9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxxKCl9LmJpbmQodGhpcyksMTApfSx5YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpezA8PWUuZmQoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuVz90aGlzLnUoITApOih0aGlzLnFhPSEwLHRoaXMubygiZW1wdHkgdmFzdCIpKX0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMubygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuUWg9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5GKHRoaXMuUWgsZnVuY3Rpb24oKXt0aGlzLmRnKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApxcTpmdW5jdGlvbigpe3RoaXMudnp8fCgxMDx0aGlzLmR5Pyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuZHkrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy4kdigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xcSgpfS5iaW5kKHRoaXMpLDUwKSkpfSwkdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5leSl7dGhpcy5leT0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5hYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBHYT1jLkVufHxHYTsoZnVuY3Rpb24oYyl7Yy5Hbj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApjOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuRGgod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLkRoKGJbZ10pfWNhdGNoKGQpe310aGlzLkkoKX19LERoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuTmEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgRmEoYltnXSksYS5tYXx8dGhpcy5KKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLksoYSksKG5ldyBHYShhLHRoaXMuRykpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy55Yj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksdGhpcy55Yyl9fSl9KShjKTt2YXIgSGE9Yy5Hbnx8SGEsSWE9bmV3IEhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk54PXRoaXMuYVs5XTt0aGlzLiR1PXRoaXMuYVszXTt0aGlzLkdrPXRoaXMuYVs4XTt0aGlzLnhxPXRoaXMuYVs4XTt0aGlzLldqPXRoaXMuYVs2XTt0aGlzLkp1PXRoaXMuYVs5XTt0aGlzLlJpPXRoaXMuYVsxMF07dGhpcy5Ldz10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs4XX1jLnR2PWI7Yi5wcm90b3R5cGU9e014OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTng6dGhpcy5adShhKX0sWnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLiR1OnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Hazp0aGlzLndxKGEpfSx3cTpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLnhxOnRoaXMuVmooYSl9LFZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Xajp0aGlzLkl1KGEpfSxJdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSnU6dGhpcy5RaShhKX0sUWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJpOnRoaXMuSncoYSl9LEp3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS3c6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBKYT1jLnR2fHxKYSxtZD1uZXcgSmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1tZC5NeCg0KTsoZnVuY3Rpb24oYyl7Yy5ibj1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5nZXRQbGF5ZXIoKS5pZCk7CmIuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlYoYSl9LGxhOmZ1bmN0aW9uKCl7fSxnYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksZz1iLmdldER1cmF0aW9uKCk7YSYmMDxhJiZnJiYwPGcmJmE+PWctMiYmdGhpcy5OJiYidW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkKCkmJnRoaXMuTigpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBhdXNlKCk6Yi5pc1BhdXNlZCgpfHxiLmdldFBsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQYXVzZWQoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGxheSgpOgpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApO3JldHVybiBifSxxYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT0xMDAqYi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgS2E9Yy5ibnx8S2E7KGZ1bmN0aW9uKGMpe2MuYW49dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuSWI9bnVsbDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGI9ITE7dGhpcy5yaCgpO2lmKGIuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGIuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgYT0KYi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5YYj0hMCx0aGlzLm8oKTt0aGlzLnMoImFkZXJyb3IiLGEpO2IuZ2V0UGxheWVyKCk7Yi5nZXRQbGF5ZXIoKTt0aGlzLlZjKCl9fWVsc2UiZmxhc2giPT1iLnBsYXllcl90eXBlP3RoaXMuV2YoKTp0aGlzLm8oKX0sVmM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuaGEoKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmdldFBsYXllcigpO2lmKCJwbGF5aW5nIj09YS5nZXRQbGF5ZXIoKS5zdGF0ZSlpZihhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBnPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7CmEuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLlhiPSEwLHRoaXMubygpO3RoaXMucygiYWRlcnJvciIsZyk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7dGhpcy5YYj90aGlzLmVhKCk6Yj9hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlP3RoaXMuRigxMDEyIT1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlKTphLmdldFBsYXllcigpLmFkc19sb2FkZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZjKCEwKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuRighMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZjKCEwKX0uYmluZCh0aGlzKSwxMDApfX1lbHNlIHRoaXMubygpO2Vsc2UgYS5nZXRQbGF5ZXIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlZjLmJpbmQodGhpcyksCjEwMCl9fSxXZjpmdW5jdGlvbigpe2lmKCF0aGlzLmhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkliKSx0aGlzLm8oKSk7ImZpcnN0UXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuSWIpLHRoaXMubygpKTsibWlkcG9pbnQiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuSWIpLHRoaXMubygpKTsidGhpcmRRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5JYiksdGhpcy5vKCkpOyJhZExvYWRpbmdFcnJvciI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmbnVsbD09dGhpcy5JYiYmKHRoaXMuSWI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhifHwKKHRoaXMucygiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy5GKCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2YuYmluZCh0aGlzKSw1MCl9fSxyaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7Yi5hZHNfbG9hZGVyP2IuYWRzX2xvYWRlciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YS5nZXRFcnJvcigpO2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKTtpZigxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKSl0aGlzLlhiPSEwLHRoaXMubygpOzkwMT09YS5nZXRFcnJvckNvZGUoKSYmCnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmgoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTGE9Yy5hbnx8TGE7KGZ1bmN0aW9uKGMpe2MuY249dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiZ2aWRlby5nZXRQbGF5ZXImJnZpZGVvLmdldFBsYXllcigpJiYodmlkZW8uZ2V0UGxheWVyKCkuZWx8fCJmbGFzaCI9PXZpZGVvLnBsYXllcl90eXBlKSl7dmFyIGI9bmV3IEthKHZpZGVvKTt0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBMYShiLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWE9Yy5jbnx8TWEsTmE9bmV3IE1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklyPXRoaXMuYVs3XTt0aGlzLnZzPXRoaXMuYVsxXTt0aGlzLnZwPQp0aGlzLmFbN107dGhpcy5Tbj10aGlzLmFbM107dGhpcy5HbD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsxMF19Yy5Xbz1iO2IucHJvdG90eXBlPXtIcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSXI6dGhpcy51cyhhKX0sdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZzOnRoaXMudXAoYSl9LHVwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52cDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuU246dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgT2E9Yy5Xb3x8T2EsbmQ9bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9bmQuSHIoNCk7KGZ1bmN0aW9uKGMpe2MuWm09Cm4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmVsXzthfHwoImZ1bmN0aW9uIj09dHlwZW9mIGIuZWw/YT1iLmVsKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGIuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQoKSkpKTt0aGlzLlMoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJihiPWJbMF0pO3RoaXMuVihiKX0sZ2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuTiYmdGhpcy5OKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmKGE9Yi5wYXVzZWQoKSk7YXx8Yi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMTsiZnVuY3Rpb24iPT10eXBlb2YgYi5wYXVzZWQmJihhPWIucGF1c2VkKCkpO2EmJmIucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUyIn0sa2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5tdXRlZCYmImZ1bmN0aW9uIj09dHlwZW9mIGEubXV0ZWQmJihiPWEubXV0ZWQoKSk7cmV0dXJuIGJ9LHFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExO2Iudm9sdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgYi52b2x1bWUmJihhPTEwMCpiLnZvbHVtZSgpKTtyZXR1cm4gYX0sVWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9fSl9KShjKTt2YXIgUGE9Yy5abXx8UGE7KGZ1bmN0aW9uKGMpe2MuWW09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuVmYoKTtiLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwO3RoaXMueG98fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoInRpbWV1cGRhdGUiKTt0aGlzLkYoITApfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9GSVJTVF9RVUFSVElMRSIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX01JRFBPSU5UIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfVEhJUkRfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLnMoImFkc2Vycm9yIik7dGhpcy56cyhhKX0uYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LAp6czpmdW5jdGlvbihiKXt2YXIgYT05OTk5OTk7aWYoYi5kYXRhJiZiLmRhdGEuQWRFcnJvcilmb3IodmFyIGcgaW4gYi5kYXRhLkFkRXJyb3IpYi5kYXRhLkFkRXJyb3IuaGFzT3duUHJvcGVydHkoZykmJiJudW1iZXIiPT10eXBlb2YgYi5kYXRhLkFkRXJyb3JbZ10mJihhPWIuZGF0YS5BZEVycm9yW2ddLHRoaXMucyhhKSk7OTAxPT1hP3RoaXMubygpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLlhiPSEwLHRoaXMubygpLHRoaXMuZWEoKSk6dGhpcy5GKCl9LFZmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkcyYmYi5hZHMuaXNBZFBsYXlpbmcmJmIuYWRzLmlzQWRQbGF5aW5nKCk/KHRoaXMueG89ITAsdGhpcy5vKCkpOnRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5WZi5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZz8KdGhpcy5GKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgUWE9Yy5ZbXx8UWE7KGZ1bmN0aW9uKGMpe2MuJG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LnBsYXllckZyYW1ld29yayYmd2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlJiYiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKXt2YXIgYj13aW5kb3cucGxheWVyRnJhbWV3b3JrLmdldEJhc2UoKTtpZihiJiZiLmdldEFsbFBsYXllcnMmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFsbFBsYXllcnMpaWYoKGI9Yi5nZXRBbGxQbGF5ZXJzKCkpJiZiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9bmV3IFBhKGJbYV0pO3RoaXMuSihnKXx8KHRoaXMuSyhnKSwobmV3IFFhKGcsdGhpcy5HKSkuYygpKX1lbHNlIHRoaXMuSSgpfWVsc2UgdGhpcy5WZSgpLAp0aGlzLkkoKX19KX0pKGMpO3ZhciBSYT1jLiRtfHxSYSxTYT1uZXcgUmEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzldO3RoaXMuemk9dGhpcy5hWzhdO3RoaXMuUXM9dGhpcy5hWzddO3RoaXMudHA9dGhpcy5hWzZdO3RoaXMuTXQ9dGhpcy5hWzRdO3RoaXMueXU9dGhpcy5hWzZdO3RoaXMucHU9dGhpcy5hWzRdO3RoaXMuTnM9dGhpcy5hWzddO3RoaXMua3Y9dGhpcy5hWzEwXTt0aGlzLkd4PXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVsxMF19Yy5Obz1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTW06dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnppOnRoaXMuUHMoYSl9LFBzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Rczp0aGlzLnNwKGEpfSxzcDpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLnRwOnRoaXMuTHQoYSl9LEx0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NdDp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5vdShhKX0sb3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnB1OnRoaXMuTXMoYSl9LE1zOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnM6dGhpcy5qdihhKX0sanY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmt2OnRoaXMuRngoYSl9LEZ4OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5HeDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIFRhPWMuTm98fFRhLG9kPW5ldyBUYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPW9kLkxtKDQpOyhmdW5jdGlvbihjKXtjLk1pPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsCmEpe3RoaXMuaShiKTt0aGlzLmRoPWF9LE06ZnVuY3Rpb24oKXt9LEVlOmZ1bmN0aW9uKGIpe3RoaXMuZGg9YjtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGgpLnBhcmVudE5vZGU7dGhpcy5TKGIpO3RoaXMuVihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIFVhPWMuTWl8fFVhOyhmdW5jdGlvbihjKXtjLkxpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmkoYixhKX0sRWU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTsKdmFyIGI9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUiksYT10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuQURWRVJUSVNJTkcpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuQkVHSU4sZnVuY3Rpb24oKXt0aGlzLnMoImNvbnRlbnRwbGF5Iik7dGhpcy5GKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMucygiY29udGVudHBsYXkiKTt0aGlzLkYoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBWYT1jLkxpfHxWYTsoZnVuY3Rpb24oYyl7Yy5OaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPQpicmlnaHRjb3ZlLmV4cGVyaWVuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1icmlnaHRjb3ZlLmdldEV4cGVyaWVuY2UoYSksZD0hMTtnJiYoZD1nLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUikpO2lmKGcmJmQmJmQuaXNQbGF5ZXJEZWZpbmVkKCkpZD1uZXcgVWEoZCxhKSx0aGlzLkooZCl8fChkLkVlKGEpLHRoaXMuSyhkKSxkPW5ldyBWYShkLHRoaXMuRyxnKSxkLkVlKGcpLGQuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFdhPWMuTml8fFdhLFhhPW5ldyBXYShpYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTHg9dGhpcy5hWzJdO3RoaXMuWXU9dGhpcy5hWzJdO3RoaXMuVXM9dGhpcy5hWzJdO3RoaXMuUXE9dGhpcy5hWzhdO3RoaXMuUnU9dGhpcy5hWzZdO3RoaXMuemo9dGhpcy5hWzddOwp0aGlzLmw9dGhpcy5hWzddfWMuZHU9YjtiLnByb3RvdHlwZT17S3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5MeDp0aGlzLlh1KGEpfSxYdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWXU6dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuUHEoYSl9LFBxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5RcTp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnU6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnpqOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgWWE9Yy5kdXx8WWEscGQ9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9cGQuS3goNCk7KGZ1bmN0aW9uKGMpe2MueGw9Cm4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLlMoYik7dGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sUGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sUDpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTsKdmFyIFphPWMueGx8fFphOyhmdW5jdGlvbihjKXtjLndsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlBhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMuSmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLkpjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLkpjKCl9LmJpbmQodGhpcykpKTp0aGlzLkpjKCl9LEpjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubygpOih0aGlzLnMoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLkYoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksCjIwMCl9fSl9KShjKTt2YXIgJGE9Yy53bHx8JGE7KGZ1bmN0aW9uKGMpe2MueWw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBaYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3ICRhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBhYj1jLnlsfHxhYixiYj1uZXcgYWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMueGs9dGhpcy5hWzFdO3RoaXMuQXI9dGhpcy5hWzFdO3RoaXMub3Y9dGhpcy5hWzhdO3RoaXMuUnQ9dGhpcy5hWzldO3RoaXMuWHE9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNV19Yy5Ybz1iO2IucHJvdG90eXBlPQp7cXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJ0OnRoaXMud2soYSl9LHdrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54azp0aGlzLnpyKGEpfSx6cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXI6dGhpcy5udihhKX0sbnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm92OnRoaXMuUXQoYSl9LFF0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5SdDp0aGlzLldxKGEpfSxXcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWHE6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBjYj1jLlhvfHxjYixxZD1uZXcgY2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1xZC5xdCg0KTsoZnVuY3Rpb24oYyl7Yy5kbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt0aGlzLk1lPQowO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZmEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlYoYik6dGhpcy5mYSgpfSxBdjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnFiLGc9dGhpcy5vYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5LYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5yZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuTWU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/Cih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sVWE6ZnVuY3Rpb24oKXt0aGlzLk1lKys7aWYoMTA8dGhpcy5NZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSwKd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmlzUGxheWluZ30sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LApQOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxsYTpmdW5jdGlvbigpe30sZ2I6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5OJiZ0aGlzLk4oKX19KX0pKGMpO3ZhciBkYj1jLmRtfHxkYjsoZnVuY3Rpb24oYyl7Yy5jbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSx4YTpmdW5jdGlvbigpe2lmKCF0aGlzLmtlKWlmKHRoaXMucmJ8fCh0aGlzLnJiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMucmIrKywxNTx0aGlzLnJiKXRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMua2U9CiEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpO3RoaXMueWEoKXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5XKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhhKCl9LmJpbmQodGhpcyksMTApfX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHwKNDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlc9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5XPXRoaXMuV3x8ITE7dGhpcy54YSgpO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50JiYhdGhpcy5Mcj8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5XKTt0aGlzLnUoKX0uYmluZCh0aGlzKSksdGhpcy5Mcj0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuQXYoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIGViPWMuY218fGViOyhmdW5jdGlvbihjKXtjLmVtPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLklhPTE1MDA7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IGRiKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLm1hfHx0aGlzLkooYSl8fCh0aGlzLksoYSksKG5ldyBlYihhLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgZmI9Yy5lbXx8ZmIsZ2I9bmV3IGZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5GcD10aGlzLmFbMl07dGhpcy5ldj10aGlzLmFbNl07dGhpcy5Vaz10aGlzLmFbNl07dGhpcy5Naj10aGlzLmFbMV07dGhpcy5Qdj10aGlzLmFbNV07dGhpcy5GdT10aGlzLmFbMl07dGhpcy5Jcz10aGlzLmFbMl07dGhpcy5rcj10aGlzLmFbMTBdO3RoaXMuVHk9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMl19Yy5FbT1iO2IucHJvdG90eXBlPXtFcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnA6dGhpcy5kdihhKX0sZHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ldjp0aGlzLlRrKGEpfSxUazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVWs6dGhpcy5MaihhKX0sTGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1qOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Qdjp0aGlzLkV1KGEpfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRnU6dGhpcy5IcyhhKX0sSHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5Jczp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua3I6dGhpcy5TeShhKX0sU3k6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlR5OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgaGI9Yy5FbXx8aGIscmQ9bmV3IGhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9cmQuRXAoNCk7KGZ1bmN0aW9uKGMpe2MubGs9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYi5lbGVtZW50KTt0aGlzLlYoYi5lbGVtZW50KX0sUGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSwKa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sUDpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIGliPWMubGt8fGliOyhmdW5jdGlvbihjKXtjLmtrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkYoKX19KX0pKGMpO3ZhciBqYj1jLmtrfHxqYjsoZnVuY3Rpb24oYyl7Yy5taz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsCmZ1bmN0aW9uKGIpe2I9bmV3IGliKGIuZGV0YWlsKTtiLm1hfHx0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBqYihiLHRoaXMuRykpLmMoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGtiPWMubWt8fGtiLG1iPW5ldyBrYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncj10aGlzLmFbN107dGhpcy5QeD10aGlzLmFbMV07dGhpcy5Sdj10aGlzLmFbN107dGhpcy51bz10aGlzLmFbMV07dGhpcy5ocD10aGlzLmFbN107dGhpcy5waT10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs4XX1jLkJyPWI7Yi5wcm90b3R5cGU9e2ZyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZ3I6dGhpcy5PeChhKX0sT3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5QeDp0aGlzLlF2KGEpfSxRdjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUnY6dGhpcy50byhhKX0sdG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy51bzp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaHA6dGhpcy5vaShhKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnBpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgbmI9Yy5Ccnx8bmIsc2Q9bmV3IG5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9c2QuZnIoNCk7KGZ1bmN0aW9uKGMpe2MuTWs9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUudmcoYiwiZWxlbWVudElEIik7dGhpcy5saD1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Cmcuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLmxoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToiYWZ0ZXIiPT10aGlzLmxoP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYSk7dGhpcy5TKGcpO3RoaXMuVihnKTt0aGlzLmJkPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5iZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYmQpfSxrYTpmdW5jdGlvbigpe3JldHVybiEwfSxwcTpmdW5jdGlvbigpe2UuUGcodGhpcy5iZCk7ZS51ZSh0aGlzLmJkKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucHEoKX0uYmluZCh0aGlzKSwKNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgb2I9Yy5Na3x8b2I7KGZ1bmN0aW9uKGMpe2MuTGs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkYoITApfX0pfSkoYyk7dmFyIHBiPWMuTGt8fHBiOyhmdW5jdGlvbihjKXtjLk5rPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSWE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZihtJiZtLmlucmVhZCl7dmFyIGI9bS5pbnJlYWQsYT1lLnZnKGIsImVsZW1lbnRJRCIpO2UuUGcoYSkmJihiPW5ldyBvYihiKSx0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBwYihiLHRoaXMuRykpLmMoKSkpO3RoaXMueWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMueWI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwKMTAwKX19KX0pKGMpO3ZhciBxYj1jLk5rfHxxYixyYj1uZXcgcWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnU9dGhpcy5hWzFdO3RoaXMuVnk9dGhpcy5hWzldO3RoaXMuRHc9dGhpcy5hWzhdO3RoaXMudm49dGhpcy5hWzddO3RoaXMubD10aGlzLmFbN119Yy5hcT1iO2IucHJvdG90eXBlPXtNdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTnU6dGhpcy5VeShhKX0sVXk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZ5OnRoaXMuQ3coYSl9LEN3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Edzp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudm46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBzYj1jLmFxfHxzYix0ZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9dGQuTXUoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnRrPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LG93OmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sRm86ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHg9Yy50a3x8eDsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGcsZCxjKXt0aGlzLlhhPWE7dGhpcy5wZz10aGlzLmFpPSExO3RoaXMuZmg9ZDt0aGlzLkVoPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLlhhPW5ldyB4KGEpKTsKdmFyIGU9dGhpcy5CYj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9ZS5yZWFkeVN0YXRlfHwyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzfHxnKGUpO2lmKGQmJjQ9PWUucmVhZHlTdGF0ZSYmMjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1cylkKGUpO2Vsc2UgaWYoND09ZS5yZWFkeVN0YXRlJiYwPT1lLnN0YXR1cyYmbCYmbC55ZSh0aGlzLlhhLnVybCkmJmwuRmQpe3ZhciBoPW5ldyB4KGEudXJsKTtoLm93KCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmKGI9ITApO2J8fGwubmEoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXtsLm5hKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT0KZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMudWs9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMucGcmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLkVoP3RoaXMuQmIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMSk6dGhpcy5CYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCEwKSx0aGlzLmFpfHwodGhpcy5CYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuQmIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksdGhpcy5CYi5zZW5kKGEpfWNhdGNoKGMpe2wmJmwueWUodGhpcy5YYS51cmwpPwpsLkZkP2wubmEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwueWUodGhpcy5YYS51cmwpLHRoaXMuZmgmJnRoaXMuZmgoKX1yZXR1cm4gdGhpcy5CYn19fSkoYyk7dmFyIHRiPWMudWt8fHRiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zYT0hMTt0aGlzLmhjPSIiO3RoaXMuWGQ9dGhpcy5nYz10aGlzLmtiPW51bGw7dGhpcy5KcT10aGlzLndiPXRoaXMuVmc9ITE7dGhpcy5HYT0iIjt0aGlzLlJnPSExO3RoaXMuQ2E9dGhpcy5oZD0iIjt0aGlzLk5nPXRoaXMuYmE9dGhpcy5pc0VuYWJsZWQ9dGhpcy5TZT0hMTt0aGlzLkFhPVtdO3RoaXMuRWc9dGhpcy5SYj0iIjt0aGlzLmdlPSExO3RoaXMuZ2Y9MDt0aGlzLnhmPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMudmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLkNiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5GYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy53Zj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuVGI9IiI7dGhpcy54Yj1bXTt0aGlzLlViPVtdO3RoaXMuU2I9IiI7dGhpcy5oZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLnJlPSExO3RoaXMucnE9dGhpcy5HZD1udWxsO3RoaXMuQWg9dGhpcy5EYz10aGlzLmhnPXRoaXMubWY9dGhpcy5GZD10aGlzLllkPXRoaXMuSGM9ITE7dGhpcy4kYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5rZD0wO3RoaXMuR2c9ITE7dGhpcy5GZz0xRTN9Yy52az1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5zYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLmhjLGFkdGFnbW9kaWZpZXI6dGhpcy5rYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuZ2MsYWR0YWdyZWdleDp0aGlzLlhkLGpzcG9wdXBzOnRoaXMuVmcsCnNpZGVsb2Fkczp0aGlzLndiLGRpc2FibGV0ZXN0czp0aGlzLkpxLGhvbWFkQWxpYXM6dGhpcy5HYSxpc0luaXRpYWxpemVkOnRoaXMuUmcsZ2xvYmFsQ29uZmlnOnRoaXMuaGQsY2xpZW50Q29uZmlnOnRoaXMuQ2EsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5iYSxpc0Jsb2NrZWQ6dGhpcy5OZyxzZXJ2ZXI6dGhpcy5BYSxzdm1Db25maWc6dGhpcy5SYixob21hZEFkcGF0aDp0aGlzLkVnLGRpc2FibGVDb29raWVUZXN0OnRoaXMuZ2UsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMuZ2YsSE9NQURfVkVSSUZJRUQ6dGhpcy54ZixIT01BRF9CTE9DS0VEOnRoaXMudmYsSE9NQURfTk9CTE9DS0VSOnRoaXMuQ2IsSE9NQURfQURCTE9DS0VSOnRoaXMuRmMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLndmLHRlc3RIaWRlOnRoaXMuVGIsdGVzdFRhZ3M6dGhpcy54Yix0ZXN0VGFnc0pTOnRoaXMuVWIsdGVzdENvb2tpZTp0aGlzLlNiLHRocm90dGxlOnRoaXMuaGYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsCmhvbWFkVGVzdGVkOnRoaXMucmUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5ycSxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkhjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5ZZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5GZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5tZixjb25maWdGYWlsdXJlczp0aGlzLiRhLHNpdGVDb25maWc6dGhpcy5RYixzZXJ2ZXJJZDp0aGlzLnZoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5uYyx2cGFpZDp0aGlzLkRjLHNraXBBbGxvd2VkOnRoaXMuQWgsdm1hcHM6dGhpcy5XaH19LEVzOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLiRhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuJGFbYl0mJjE9PXRoaXMuJGFbYl0mJihhPSEwKTtyZXR1cm4gYX0sWGU6ZnVuY3Rpb24oYSl7dGhpcy4kYVthXT0hMH0sZHM6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuJGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy4kYVtiXSYmCjE9PXRoaXMuJGFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0sRGQ6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMudWIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5NcChhKX0sd2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLGU9IiIsaD0iIixrPSIiO2lmKCF0aGlzLnNhJiYhYilyZXR1cm4gbmV3IHgoYSk7Yz10aGlzLnhlKGEpO2U9dGhpcy56YShhKTtjPwoodGhpcy52YygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy52ZCgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLmhjfHx0aGlzLmtifHx0aGlzLmdjfHx0aGlzLlhkKSYmKGs9dGhpcy5udShrKSk7YT1uZXcgeChoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmZzKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLm5iKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0seGU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsKKGQ9ZC5leGVjKGEpKSYmKGRbMl18fGRbNV0pP2I9ITA6dGhpcy52YygpJiYoZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sdmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuQWEmJnRoaXMuQWEubGVuZ3RoJiYwPHRoaXMuQWEubGVuZ3RoJiYoYj10aGlzLkFhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LHllOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMueGUoYSk7cmV0dXJuIGJ9LGZzOmZ1bmN0aW9uKGEpe3ZhciBiPQoiIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMuR2EmJjA8dGhpcy5HYS5sZW5ndGgpcmV0dXJuIHRoaXMuR2E7Zm9yKGQgaW4gdGhpcy5HYSlpZihiPXRoaXMuR2FbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5nejtyZXR1cm4ibm9uZSJ9LGxkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQWFbdGhpcy52aF19LHZkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5sZCgpLGI9dGhpcy56aCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxhaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spOwpyZXR1cm4gYn0sbXU6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLnphKGEpLGM9IiIsYz0iIixoO2ZvcihoIGluIGIpe2lmKGJbaF0uc3VidmFsdWVzKXtmb3IodmFyIEI9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbaF0pLnNwbGl0KCImIiksYz17fSxrPTA7azxCLmxlbmd0aDtrKyspe3ZhciByPUJba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5haChjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pO0I9W107Zm9yKGwgaW4gYylCLnB1c2gobCsiPSIrY1tsXSk7Yz1CPWVuY29kZVVSSUNvbXBvbmVudChCLmpvaW4oIiYiKSl9ZWxzZSBjPXRoaXMuYWgoZC5xdWVyeUtleVtoXSxoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31sPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbC5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxudTpmdW5jdGlvbihhKXt0aGlzLmhjJiYKKGErPXRoaXMuaGMpO2lmKHRoaXMua2IpZm9yKHZhciBiIGluIHRoaXMua2IpdGhpcy5rYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5rYltiXSkpO3RoaXMuZ2MmJihhPXRoaXMubXUoYSx0aGlzLmdjKSk7cmV0dXJuIGF9LGY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLlJnPSEwO3RoaXMuaGQ9YTt0aGlzLkNhPWI7dGhpcy5TZT1kO3RoaXMuR2Q9Yzt0aGlzLmxjPWU7dGhpcy5RYj1ofHx7fTt0aGlzLlp0KCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLkNhKXRoaXMuWHQoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMuQ2EpdHJ5e3RoaXMuQ2E9YigpLHRoaXMuV2MoKX1jYXRjaChrKXt0aGlzLm5hKCJub0NsaWVudENvbmZpZyIpfX0sZmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwKITEpfXJldHVybiBifSxadDpmdW5jdGlvbigpe3RoaXMuSGEobmV3IHgodGhpcy5oZCt0aGlzLk9jKCJnbG9iYWwiKSksdGhpcy53cy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLldjKCl9LmJpbmQodGhpcyksITApfSxYdDpmdW5jdGlvbigpe25ldyB4KHRoaXMuQ2ErdGhpcy5PYygiY2xpZW50IikpO3RoaXMuSGEobmV3IHgodGhpcy5DYSt0aGlzLk9jKCJjbGllbnQiKSksdGhpcy5XYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiY2xpZW50Iik7dGhpcy5uYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sT2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMudWIoKTt0aGlzLlFiJiZ0aGlzLlFiLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5RYiYmdGhpcy5RYi5ub0NhY2hlQnVzdGVyJiYKKGI9IiIpO3JldHVybiBifSxuYTpmdW5jdGlvbihhKXtpZighdGhpcy5ZZCl7dGhpcy5ZZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLmZkKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5sYz0hMSk7dGhpcy5sYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmxjP3RoaXMubGMoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuYmE9dGhpcy5OZz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy52ZikpO3RoaXMuemIoKTtlLm9jKGsucHYpOyhiPWUuZmQodGhpcy5sZCgpKSl8fChiPWUuZmQoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpO2F8fChhPSJ1bmtvd24iKTtlLnRyYWNrKCJzdGF0c19oZF9wZW5hbHR5IixhLCEwKX19LHdzOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXt2YXIgYj0Ke307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5WYihiLmVuYWJsZWQpO3RoaXMuYmE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5DYXx8dGhpcy5SYnx8dGhpcy5HYXx8dGhpcy5XYygpOih0aGlzLnNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKSx0aGlzLnpiKCkpfX0sV2M6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmKGI9YS5yZXNwb25zZVRleHQpO2E9e307aWYoYil0cnl7YT1KU09OLnBhcnNlKGIpfWNhdGNoKGQpe2E9dGhpcy5DYX1lbHNlIGE9dGhpcy5DYTt0aGlzLmlzRW5hYmxlZD10aGlzLlZiKGEuZW5hYmxlZCk7dGhpcy5iYT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5BYT1hLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuQWEubGVuZ3RoO2IrKyl0aGlzLkFhW2JdPQp0aGlzLkFhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLlJiPWEuY29uZmlnfHwiIjt0aGlzLkdhPWEuYWxpYXN8fG51bGw7dGhpcy5FZz1hLmFkcGF0aHx8IiI7dGhpcy5nZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLnZoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLkFhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuUmImJnRoaXMuR2EmJnRoaXMuQWEubGVuZ3RoP3RoaXMub2QoITEpOih0aGlzLnNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKSx0aGlzLnpiKCkpfSxvZDpmdW5jdGlvbihhKXtpZighdGhpcy5iYSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHgodGhpcy52ZCgpKSxkPXRoaXMuemEodGhpcy5SYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjsKYi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHgodGhpcy5SYit0aGlzLk9jKCJjdXN0b21lciIpKTt0aGlzLkhhKGIsdGhpcy5Ndy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5YZSgiY3VzdG9tZXIiKTthP3RoaXMuSW0/dGhpcy5uYSgibm9TVk1Db25maWciKToodGhpcy5JbT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2QoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMub2QoITApfS5iaW5kKHRoaXMpLCEwKX19LE13OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fXRoaXMuRmQ9dGhpcy5WYihiLnN0cmljdCk7dGhpcy5tZj10aGlzLlZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLmhnPQpiLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMubmM9dGhpcy5WYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuVmIoYi5lbmFibGVkKTt0aGlzLlRiPWIudGVzdGhpZGV8fCIiO3RoaXMueGI9Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLlViPWIudGVzdGFkdGFnc2pzfHxiLnRlc3RhZHRhZ3N8fFtdO3RoaXMuaGM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5rYj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5nYz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuWGQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVmc9Yi5qc3BvcHVwc3x8ITE7dGhpcy53Yj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5EYz1iLnZwYWlkfHwhMTt0aGlzLlFiLnZwYWlkPXRoaXMuRGM7dGhpcy5BaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLlRjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5XaD1iLnZtYXBzfHwiIjt0aGlzLlNiPWIudGVzdDNyZHBhcnR5Y29va2llJiYKYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLm9zKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5nZSYmKHRoaXMuU2I9bnVsbCk7dGhpcy5oZj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLnJlJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5yZT0hMCx0aGlzLm9kKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmt4KCkmJih0aGlzLlRifHx0aGlzLlVifHx0aGlzLnhifHx0aGlzLlNiKT90aGlzLlNlPyh0aGlzLnNhPXRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKSx0aGlzLmFlKCksdGhpcy56YigpKTp0aGlzLlF3KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuUncoKSl9fSxRdzpmdW5jdGlvbigpe3RoaXMuUHcoKTt0aGlzLlN3KCl9LFN3OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciKwphKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYSsiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9dmFyIGI9ImlubGluZWV2YWxkYXRhIixkPTA7dHJ5e3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Mud2lkdGg9MTtjLmhlaWdodD0xO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7Yy5zcmM9ImFib3V0OmJsYW5rIjt2YXIgaD1lLmdhKDEwKSxCPWUuZ2EoMTApLGs9ZS5nYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEIsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoayxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwKIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKTtjLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShrKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShCKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS5uYihhKGgpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGwpe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYyk7aWYoMyE9ZCl7dmFyIGE9ZS5mZSgpOyFhLmlzQ2hyb21lJiYKIWEuaXNGaXJlZm94fHxhLmlzRWRnZXx8ZS5QYSgpfHx0aGlzLm5hKCJjc3BfIitiKTtlLnRyYWNrKCJzdGF0c19oZF9jc3AiLGIsITApfX0uYmluZCh0aGlzKSwxRTMpfSxSdzpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKTt0aGlzLnpiKCl9LEVkOmZ1bmN0aW9uKGEpe3RoaXMuSGM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9dGhpcy5zYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIoYSkpLHRoaXMuemIoKSx0aGlzLmFlKCkpfSxQdzpmdW5jdGlvbigpe2lmKHRoaXMuVGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuVGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5UYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTsKZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGMpe31hP3RoaXMuRWQodGhpcy5GYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuSWgoKX1lbHNlIHRoaXMuSWgoKX0sSGg6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMudWIoKSk7dGhpcy5WdyhmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuZGYuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkVkKHRoaXMuRmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnhiPW51bGwsdGhpcy5kZigpfSxWdzpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmCmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSGEobmV3IHgoYSksZixmdW5jdGlvbigpe2UoKSYmYygpfSl9LEloOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLnViKCkpO3RoaXMuV3coZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLkhoLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5FZCh0aGlzLkZjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlViJiZ0aGlzLlViLmxlbmd0aCl7dmFyIGM9dGhpcy5VYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLkhoKCl9LFd3OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmCmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihiLGMpe2M9PWEmJmgoKSYmZSgpfTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGwpO2wuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0sZGY6ZnVuY3Rpb24oKXt0aGlzLlNiPyh0aGlzLmdmKyssdGhpcy5IYShuZXcgeCh0aGlzLlNiKSx0aGlzLk93LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmVmKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMuRmgoKX0sZWY6ZnVuY3Rpb24oYSl7dGhpcy5FZCh0aGlzLndmLAoibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LE93OmZ1bmN0aW9uKGEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9YiYmYi5zdGF0dXM/InRyaWdnZXItc2V0Ij09Yi5zdGF0dXM/Mz50aGlzLmdmP3RoaXMuZGYoKTp0aGlzLmVmKCJCQkIiKToiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5GaCgpOnRoaXMuZWYoIkFBQSIpfSxGaDpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmZiKHRoaXMuQ2IpKTt0aGlzLnpiKCk7dGhpcy5hZSgpfSx6YjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5QYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLkhjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuZmIodGhpcy54ZikpOwp0aGlzLkdkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuR2QmJnRoaXMuR2QoKX0sb3E6ZnVuY3Rpb24oKXtpZih0aGlzLm1mJiZ0aGlzLkVzKCkpe3ZhciBhPXRoaXMuZHMoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LEtoOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sSGE6ZnVuY3Rpb24oYSxiLGMsZixoLEIpe3RoaXMua2R8fCh0aGlzLmtkPTApO3RoaXMua2QrKzt0aGlzLmtkPnRoaXMuRmcmJiF0aGlzLkdnJiYodGhpcy5HZz0hMCxlLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLHRoaXMuRmcsITApKTthPW5ldyB0YihhLGIsYyk7ZiYmKGEuYWk9ITApO2gmJmUueXQoKSYmKGEucGc9ITApO0ImJgooYS5FaD0hMCk7cmV0dXJuIGEubG9hZCgpfSxUZjpmdW5jdGlvbigpe2UuUGEoKXx8ZS5UYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7dGhpcy5uYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPWEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiI7dGhpcy52YygpfHwKKGE9dGhpcy56YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMubmEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMubmEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLm5hKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5uYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubmEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LE53OmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLldofSxucTpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiEwKTt2YXIgYT10aGlzLndhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkhhKGEsdGhpcy5YeC5iaW5kKHRoaXMpLHRoaXMuV3guYmluZCh0aGlzKSl9LFh4OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5HcigpfSxXeDpmdW5jdGlvbigpe30sR3I6ZnVuY3Rpb24oKXtlLm9jKGsuRnIpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMubmEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LAphZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLndiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMud2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy53YlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5UYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9bmV3IFI7d2luZG93W2MudWMoKV09dGhpcztlLlRhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LGt4OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuaGZ9LG9zOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSx1YjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqCk1hdGgucmFuZG9tKCkrLjEpKX0sZ2E6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LFZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LG5iOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGYsZSxoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxmPWEuY2hhckNvZGVBdChtKyspLGU9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSx6YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSx6aDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCx0PTMyODUzNzc1MjAscCxuLHYsdSx3O3A9YS5sZW5ndGg7dmFyIHg9W107Zm9yKGY9MDtmPHAtMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseC5wdXNoKGUpOwpzd2l0Y2gocCU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChwLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChwLTIpPDwyNHxhLmNoYXJDb2RlQXQocC0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KHAtMyk8PDI0fGEuY2hhckNvZGVBdChwLTIpPDwxNnxhLmNoYXJDb2RlQXQocC0xKTw8OHwxMjh9Zm9yKHgucHVzaChmKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gocD4+PjI5KTt4LnB1c2gocDw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT14W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7cD1sO249bTt2PXE7dT10O2ZvcihmPTA7MTk+PWY7ZisrKXc9YyhlLDUpKyhwJm58fnAmdikrdStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztmb3IoZj0yMDszOT49ZjtmKyspdz1jKGUsNSkrKHBebl52KSt1K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9dix2PW4sbj1jKHAsMzApLHA9ZSxlPXc7Zm9yKGY9NDA7NTk+PWY7ZisrKXc9YyhlLDUpKyhwJm58cCZ2fG4mdikrdStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx1PXYsdj1uLG49YyhwLDMwKSxwPWUsZT13O2ZvcihmPTYwOzc5Pj1mO2YrKyl3PWMoZSw1KSsocF5uXnYpK3UraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdT12LHY9bixuPWMocCwzMCkscD1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK24mNDI5NDk2NzI5NTtxPXErdiY0Mjk0OTY3Mjk1O3Q9dCt1JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYih0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIHViPWMudmt8fHViLGw9bmV3IHViO3dpbmRvdy5yZz1sO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybD10aGlzLmFbMTBdO3RoaXMuSHY9dGhpcy5hWzhdO3RoaXMua2w9dGhpcy5hWzZdO3RoaXMuUGs9dGhpcy5hWzhdO3RoaXMuUGk9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzddO3RoaXMuRHg9dGhpcy5hWzddO3RoaXMuWm89dGhpcy5hWzldO3RoaXMuSWw9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbMl19Yy5TdT1iO2IucHJvdG90eXBlPXtxbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucmw6dGhpcy5HdihhKX0sR3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkh2OnRoaXMuamwoYSl9LGpsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbDp0aGlzLk9rKGEpfSxPazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUGs6dGhpcy5PaShhKX0sT2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlBpOnRoaXMuSmkoYSl9LEppOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuS2k6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhxOnRoaXMuQ3goYSl9LEN4OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5EeDp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWm86dGhpcy5IbChhKX0sSGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLklsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgdmI9Yy5TdXx8dmIsdWQ9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9dWQucWwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLlA/dGhpcy5WYT1hLm0uUCgpOnRoaXMuVmE9IiI7YS5tLkxnJiZhLm0uTGcoe3BhdXNlOnRoaXMucmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy50aC5iaW5kKHRoaXMpLAptdXRlOnRoaXMuSWUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5KeC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmFiO3RoaXMucGxheWVyPXRoaXMuYi5tO3RoaXMuRmI9dGhpcy5SYz0hMTt0aGlzLktwPTFFMzt0aGlzLmphPW51bGw7dGhpcy5UPWI7dGhpcy51YT17fTt0aGlzLnZpZGVvPXt9O3RoaXMuQ2Q9e307dGhpcy5YcD1lLmdhKDEwKTt0aGlzLmFmPTA7dGhpcy5QYz0iV2VyYnVuZyAtIFt0aW1lXSI7YyYmYy5hZG1lc3NhZ2UmJih0aGlzLlBjPWMuYWRtZXNzYWdlLCJmdW5jdGlvbiI9PXR5cGVvZiBjLmFkbWVzc2FnZSYmKChhPXRoaXMuYi5tKSYmdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLlBjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLktvPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuQmQ9ITE7dGhpcy5ZZz1jJiZjLm1heFdyYXBwZXJEZXB0aD8KcGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuZz17fTt0aGlzLk5jPSExO3RoaXMuTmg9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5LYj0hMTt0aGlzLkRxPWUuZ2EoMTApO3RoaXMuTmI9ZS5nYSgxMCk7dGhpcy5NYj1lLmdhKDEwKTt0aGlzLkJoPWUuZ2EoMTApO3RoaXMuY29uZj17fTt0aGlzLm1jPXRoaXMudGI9ITE7dGhpcy5qZT1udWxsO3RoaXMuSmQ9dGhpcy5BYj10aGlzLnRlPXRoaXMuUGU9dGhpcy5iZT10aGlzLiRjPXRoaXMuY2Y9dGhpcy5aYj10aGlzLkxkPXRoaXMuaGg9dGhpcy5jZD10aGlzLnF4PXRoaXMuaWI9ITE7dGhpcy5jYz1bXTt0aGlzLldiPXt9O3RoaXMuamY9ITF9Yy5waz1iO2IucHJvdG90eXBlPXt3aDpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRWE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLlZhXSYmdGhpcy5jb25mW3RoaXMuVmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5WYV1bYV0pOwpyZXR1cm4gYn0sTGg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuT2EmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuVC5IYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLncoay56byx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpfSxDZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5pYj1jO2lmKHRoaXMuVC5iYSl0aGlzLmFmKyssdGhpcy5ULm9xKCksdGhpcy5ULnNhJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLkxoKCksbmV3IFUodGhpcyxhLHRoaXMuWWcse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5EYyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5tLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLm0uZ2V0Q3VycmVudFRpbWUoKX19KSk6CmI/KHRoaXMuTGgoKSxuZXcgVSh0aGlzLGEsdGhpcy5ZZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuVC5EYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLm0uZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIubS5nZXRDdXJyZW50VGltZSgpfX0pKTp0aGlzLkxhKCk7ZWxzZXt2YXIgZj10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkNlKGEsYixjKX0sNTApfX0sTmU6ZnVuY3Rpb24oYSl7dGhpcy5KZD10aGlzLkFiPXRoaXMuY2Q9ITE7dGhpcy5nPWE7dGhpcy53dyh0aGlzLmcpO3RoaXMuQmcoYSk7dGhpcy5jYz10aGlzLnNnKGEpO3RoaXMuV2I9e307dGhpcy5qZj0hMX0sQmc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuQ2Q9dGhpcy5ycyhhKSksdGhpcy5CZyhhLnBhcmVudCkpfSxzZzpmdW5jdGlvbihhKXt2YXIgYz0KW107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLnNnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuWnIoYSkpKTtyZXR1cm4gY30sWnI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz1bXTtpZihhJiZhLlgmJmEuWC5nZXRBdHRyaWJ1dGUpe2I9YS5YLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKyljLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWMubGVuZ3RoJiYoYz1jWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6Y319LHJzOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5YKXtiPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWC5nZXRBdHRyaWJ1dGUoImlkIikmJgooaD1hLlguZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5YLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlguZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5iYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmh9fSxyYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuYWQmJmEuYWQuZXJyb3ImJmEuYWQuZXJyb3IuY29kZSYmKGI9YS5hZC5lcnJvci5jb2RlKSk7CnN3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5FYy5jb2RlOmI9PUQuTmQuY29kZT9lLncoay51eSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpOihlLkRlKCksYj09RC5BZi5jb2RlJiZlLncoay5ydSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKTtlLncoay5Fcix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHcueWYuY29kZTplLncoay5ZeCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHcuQmYuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLncoay5BeSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB3Lk9kLmNvZGU6ZS53KGsuRnksCnRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2Ugdy5NZC5jb2RlOmUudyhrLnN1LHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMubWN8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3IudGEmJihjKz0iXyIrYS5lcnJvci50YSk7ZS50cmFjayhjLCIiLCEwKTt0aGlzLkdiKGEpO3RoaXMuTGEoKX0sR2I6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkthLmxlbmd0aDspdHJ5e3ZhciBjPQphLkthLnBvcCgpO3RoaXMuQmUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHd3OmZ1bmN0aW9uKGEpe3RoaXMuYmU9dGhpcy50ZT10aGlzLlBlPSExO3RoaXMudWE9dGhpcy5iLkw7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMudWEuekluZGV4PWI7Yj10aGlzLmIuSDtiLkJ6PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgYyBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShjKSYmYi5zZXRBdHRyaWJ1dGUoYyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtjXSk7CnRoaXMuS28mJnRoaXMucGxheWVyLnFjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5xYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IoYz0wO2M8YS5VLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLlVbY10udHlwZSkmJnRoaXMuR28oYixhLlVbY10udXJsKyIiLGEuVVtjXS50eXBlKTt0aGlzLkpoKGIpPyh0aGlzLklvKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpLHRoaXMuamE9dGhpcy51YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuamEuYXBwZW5kQ2hpbGQoYikpOnRoaXMuZy55cSgpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5qYT10aGlzLnVhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5qYS5hcHBlbmRDaGlsZChiKSx0aGlzLnV3KCkpOnRoaXMud2UoKT90aGlzLnloKCk6dGhpcy5nLm9yaWdpbi5pZyh3Lk1kKX0sdXc6ZnVuY3Rpb24oKXt0aGlzLlpiPXRoaXMuTGQ9ITE7dGhpcy5iLm0ua2EmJnRoaXMuYi5tLmthKCkmJihlLncoay4kZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMuWmI9ITApO2UuWWYoKTt0aGlzLmcmJnRoaXMuZy5vcmlnaW4mJnRoaXMuZy5vcmlnaW4uc2YmJmUuSm8odGhpcy5nLm9yaWdpbi5zZik7ZS5ZYSgic2V0VXBWcGFpZCIpO3ZhciBhPXRoaXMuYi5IO3RoaXMuYi5IPUMucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmIuSCwKYSk7dGhpcy5iLmloKCk7dGhpcy5iLkFjKCk7Zm9yKGE9dGhpcy5iLkw7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5BYygpO3RoaXMuamE9dGhpcy51YT10aGlzLmIuTDt0aGlzLm9mKCJ2cGFpZCIpO3RoaXMuWmImJihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk1iKS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsucGQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk7dGhpcy5PPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5PLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYi5MLmFwcGVuZENoaWxkKHRoaXMuTyk7dGhpcy5PLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYi5tLmthJiZ0aGlzLmIubS5rYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5nLnRzKCksYz10aGlzLmcuQi5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGwuZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLndpZHRoKSwKaGVpZ2h0OnBhcnNlSW50KHRoaXMuYi5MLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLAoxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5vYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2Uub2EodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLmVxKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5UKTt0aGlzLk8uc3JjPWE7ZS5WZCgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLkpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLmNjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOwoiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLml5KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuankoKSx0aGlzLmIuSmIoITApLCF0aGlzLkFiKSl7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkFiPXtlbDp0aGlzLk8sY2I6ZnVuY3Rpb24oKXt0aGlzLkpkPSEwO2UudyhrLlZoLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLnZlKHRoaXMuQWIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmCih0aGlzLmIuSmIoITApLHRoaXMubnkoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLkpiKCEwKSx0aGlzLnJ5KCkpOyJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnB5KCk7IkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnF5KCk7IkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuc3koKTsiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMub3koKTsiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuWGgoKTtpZigiQWRDbGlja1RocnUiPT1hLmRhdGEubmFtZSl7dmFyIGg9YS5kYXRhLmNsaWNrVGhydVRhcmdldDtofHwoaD10aGlzLmcuamMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsuWmYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXt2YXIgYT0Kd2luZG93Lm9wZW4oIiIsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGIpe3dpbmRvdy5vcGVuKGgsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLm15KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5VZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt5KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiZ0aGlzLmx5KCk7IkFkVm9sdW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpLDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5aYj0hMCxiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsucGQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSk6KHRoaXMuWmI9ITEsYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay5sZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKSxlLncoay5VZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX19LmJpbmQodGhpcykpO2UuVmQoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuTGEoKX0uYmluZCh0aGlzKSk7ZS5WZCgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLkxhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5EbyhmdW5jdGlvbihhKXtlLm9hKHRoaXMuTywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LApreTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMudHJhY2soInBhdXNlIik7ZS53KGsuU2QsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTthLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbjt0aGlzLkxkPSEwfSxseTpmdW5jdGlvbigpe2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247dGhpcy50cmFjaygicmVzdW1lIiwhMCk7ZS53KGsuTWMsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLkxkPSExfSxueTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UudyhrLkxmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LG15OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLktmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LApqeTpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLllhKCJpbXByZXNzaW9uIik7ZS53KGsuR2YsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0scnk6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuWWEoInN0YXJ0Iik7ZS53KGsuTWMsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0scHk6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5ZYSgiZmlyc3RRdWFydGlsZSIpO2UudyhrLkVmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSl9LHF5OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLllhKCJtaWRwb2ludCIpO2UudyhrLklmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSl9LHN5OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpO2UuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5NZix0aGlzLmcuQiwKdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKX0sb3k6ZnVuY3Rpb24oKXt0aGlzLkhkKCk7ZS5ZYSgiY29tcGxldGUiKX0sWGg6ZnVuY3Rpb24oYSl7aWYodGhpcy5PJiZ0aGlzLk8ucGFyZW50Tm9kZSYmdGhpcy5PLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7ZS5ZYSgiYWRzdG9wcGVkIik7dmFyIGI9dGhpcy5PLnBhcmVudE5vZGU7dGhpcy5PLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5PKTtiLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYik7dGhpcy5PPWUuY2E9ITE7dGhpcy5MYShhKX19LGl5OmZ1bmN0aW9uKGEpe3ZhciBiPWEubWVzc2FnZXx8IiIsYz0vXGQrL2csZj1bXTshYiYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYj1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csKGY9Yi5tYXRjaChjKSk/Zi5qb2luJiYoYj1mLmpvaW4oIi0iKSk6Yj1iLnN1YnN0cmluZygwLDIwKSk7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIiwKYiwhMCk7ZS5ZYSgiZXJyIixiKTtlLncoay50eSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMuWGgoITApfSxHbzpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpLGY7Zj10aGlzLlQ7Zi5zYSYmZi5pc0VuYWJsZWQmJiFmLnZjKCk/KGY9Zi56YShiKSxmPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KTpmPWI7Yy5zcmM9ZjtjLm9uZXJyb3I9dGhpcy4keC5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sSW86ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuVWguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5wZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucWYuYmluZCh0aGlzKSk7CmEuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuSGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5JZC5iaW5kKHRoaXMpKX0sd2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuVWguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5wZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucWYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5IZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLklkLmJpbmQodGhpcykpfSxVaDpmdW5jdGlvbihhKXt0aGlzLkZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmJ8fHRoaXMucGYoYSl9LmJpbmQodGhpcyksdGhpcy5LcCkpfSxwZjpmdW5jdGlvbihhKXtpZighdGhpcy5SYyYmCnRoaXMuSmgodGhpcy52aWRlbykmJiF0aGlzLnRiJiYhdGhpcy5GYil7dGhpcy5SYz0hMDt0cnl7aWYoIWUuUGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMudGJ8fCh0aGlzLnRiPSEwLHRoaXMud2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5ULmhnfHx0aGlzLlQubmEoInZpZGVvLW5vb3AiKSk7dGhpcy5MYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLlp4KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIuQWMoKTt0aGlzLlNoKCk7dGhpcy5vZigpO3RoaXMuUWYoKTt0aGlzLmIuaWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuYmYoKX19LGJmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuJGMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT0KdGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuT2EpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuamQ9W107Zm9yKHZhciBiPXRoaXMuYi5MLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmpkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLApmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuTGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuTGMoKX1lbHNlIHRoaXMuTGMoKX0sTGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5qZClmb3IodmFyIGI9MDtiPHRoaXMuamQubGVuZ3RoO2IrKyl0aGlzLmpkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLiRjfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksCnRoaXMuTGEoKSxlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsYiwhMCkpOih0aGlzLkllKCEwKSx0aGlzLkxjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLnRlJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5QZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLk9iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuT2IuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuT2IuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLk5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5iZigpKX0uYmluZCh0aGlzKTt0aGlzLm1lKCkueGgodGhpcyl9LEhkOmZ1bmN0aW9uKCl7dGhpcy5ULm5jJiYhdGhpcy50YiYmZS50cmFjaygicXVhcnRpbGUiLAoiY29tcGxldGUiLCEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLndvLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy5MYSgpfSxMYTpmdW5jdGlvbihhKXtpZighdGhpcy5iZSlpZih0aGlzLmJlPSEwLHRoaXMuSmR8fChlLncoay53dSx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5oYnx8dGhpcy5nLmFjKXt0aGlzLmFmKys7dGhpcy5GYj10aGlzLlJjPSExO3RyeXt0aGlzLndkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudWEucmVtb3ZlQ2hpbGQodGhpcy5qYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5CZD0hMTt0cnl7dGhpcy5iLlBoKCl9Y2F0Y2goaCl7fXRoaXMuY2Y9ITA7dGhpcy5iLnBlKCk7dGhpcy5LYj0KITE7dGhpcy5tZSgpLnNoKCk7dGhpcy5nLmhiJiZ0aGlzLmcub3JpZ2luLkplKCk7dGhpcy5nLmFjJiYoYT90aGlzLmcub3JpZ2luLmJoKCk6dGhpcy5jZSgpKX1lbHNlIHRoaXMuY2UoKX0sJHg6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy53ZCh0aGlzLnZpZGVvKSx0aGlzLndlKCk/dGhpcy55aCgpOnRoaXMuSWQoYSkpfSxJZDpmdW5jdGlvbihhKXt0aGlzLkZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLndlKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1jfHx0aGlzLlQuVGYoKX0uYmluZCh0aGlzKSwKMUUzKTp0aGlzLlQuVGYoKSk7dGhpcy5nLm9yaWdpbi5pZyh3Lk1kKX0scWY6ZnVuY3Rpb24oKXtpZih0aGlzLnF4KXRoaXMuTGEoKTtlbHNle3RoaXMuS2I9ITA7dGhpcy5iLm0uVWEmJiF0aGlzLmNmJiZ0aGlzLmIubS5VYSgpJiZlLncoay5ZYyx0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy54eChhKTtpZighdGhpcy5BYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLkFiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5KZD0hMDtlLncoay5WaCx0aGlzLmcuQiwKdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UudmUodGhpcy5BYil9Yz0iIjt0aGlzLmcuJGUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuQmgpKSYmKGM9dGhpcy5nLiRlLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLkJkfHwodGhpcy5CZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5LZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMuZy5oYj8odGhpcy5GYj10aGlzLlJjPSExLHRoaXMud2QodGhpcy52aWRlbyksdGhpcy5qYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnVhLnJlbW92ZUNoaWxkKHRoaXMuamEpLAp0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuQmQ9ITEsdGhpcy5iLlBoKCksdGhpcy5nLm9yaWdpbi5KZSgpKTp0aGlzLkxhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlBjLnJlcGxhY2UoIlt0aW1lXSIsZS5xZyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLk5jPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSx5aDpmdW5jdGlvbigpe3RoaXMubWM9ITA7dGhpcy51YT10aGlzLmIuTDt0aGlzLnVhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy51YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTsKYS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMubXMoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmphPXRoaXMudWEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLkFjKCk7dGhpcy52aWRlbz10aGlzLmphLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy51YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudWEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlRoLmJpbmQodGhpcyk7dGhpcy5qYS5hcHBlbmRDaGlsZChiKTt0aGlzLlNoKCk7dGhpcy5vZigpO3RoaXMuamU9c2V0SW50ZXJ2YWwodGhpcy5tcS5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LG1zOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpbXSxiPXt9LGM9MDtjPHRoaXMuZy5VLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5nLlVbY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuVDtoLnNhJiZoLmlzRW5hYmxlZCYmIWgudmMoKSYmKGU9aC56YShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LG1xOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5qZSksdGhpcy5IZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnFmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLmplKSx0aGlzLklkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6CnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LE1oOmZ1bmN0aW9uKCl7dGhpcy5oaHx8KHRoaXMuaGg9ITAsdGhpcy5jZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh4OmZ1bmN0aW9uKGEpe2UudyhrLlVkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7YT09dGhpcy5OaHx8dGhpcy50Ynx8KDA9PWEmJih0aGlzLmliJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmliKSx0aGlzLmliPSExKSx0aGlzLlBlfHwoZS50cmFjaygic3RhdHNfaGRfaW1wcmVzc2lvbldpdGhPdXRSZXNvbHZlZFByb21pc2UiLCIiLCEwKSx0aGlzLnRlPSEwKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLk1oKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpKSwKdGhpcy5tYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMudGJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlBhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLncoay5HZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpLGUudyhrLkxmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksdGhpcy5tYyYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5nLmR1cmF0aW9uLzQpJiYodGhpcy5ULm5jJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5jZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLkVmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5uYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS53KGsuSWYsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuVC5uYyYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudyhrLk1mLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpLHRoaXMuTmg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMudGIpe3RyeXtpZih0aGlzLldiW2FdPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHRoaXMuV2IuaW1wcmVzc2lvbiYmdGhpcy5XYi5jb21wbGV0ZSYmIXRoaXMuamYpe3RoaXMuamY9ITA7dmFyIGM9dGhpcy5XYi5jb21wbGV0ZS0KdGhpcy5XYi5pbXByZXNzaW9uLGY9InN0YXRzX2hkX3RpbWVkaWZmIjt0aGlzLk8mJihmKz0idnBhaWQiKTs1RTM+YyYmZS50cmFjayhmLGMsITApfX1jYXRjaChoKXt9aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWM9W107dHJ5e2M9dGhpcy5zcyh0aGlzLmcuS2EsYSl9Y2F0Y2gobCl7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIG09Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuQ2QuaW1wcmVzc2lvbnMmJmUud3QobS51cmwsdGhpcy5DZC5pbXByZXNzaW9ucyk/dGhpcy5CZShtLnVybCxtLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS53KGsueW8sdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHthZElkOnRoaXMuQ2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LAp0aGlzLkQoKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5CZShtLnVybCxtLnR5cGUpfWNhdGNoKHIpe31pZighYil0cnl7dGhpcy5nLkthPXRoaXMuSHEodGhpcy5nLkthLGEpfWNhdGNoKG4pe319fSxCZTpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQud2EoYSksYyYmYS5GbyhjKSxmfHwoZj10aGlzLmdnKSx0aGlzLlQuSGEoYSxmLHRoaXMuZ2csITEsITApKX0sc3M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxIcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxaeDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5UaC5iaW5kKHRoaXMpfSxUaDpmdW5jdGlvbigpe2UudyhrLlpmLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSwKdGhpcy5DKCksdGhpcy5EKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5jZCYmZS5QYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZS4kcigpLCEwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXt2YXIgYT13aW5kb3cub3BlbigiIix0aGlzLlQuc2E/Il90b3AiOiJfYmxhbmsiKTthLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7YS5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuZy5qY31jYXRjaChiKXt3aW5kb3cub3Blbih0aGlzLmcuamMsdGhpcy5ULnNhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9LFNoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0KImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLlBjLnJlcGxhY2UoIlt0aW1lXSIsZS5xZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5ULlRjJiYoYj10aGlzLlQuVGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuamEuYXBwZW5kQ2hpbGQoYSl9fSxyYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8CnRoaXMuVC5UYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0seWQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuVC5UYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LG9mOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlkPXRoaXMuRHE7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209CiIwcHgiKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnpkKCk7dGhpcy55ZCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuc2MoKTt0aGlzLnJjKCl9LmJpbmQodGhpcykpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLk5iO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudXguYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMudHguYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy56ZCgpO3RoaXMueWQoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLnNjKCk7dGhpcy5yYygpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTWI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnN4LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLnJ4LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuemQoKTt0aGlzLnlkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMucmMoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGguc3R5bGUucG9zaXRpb249ImFic29sdXRlIixoLnN0eWxlLnRvcD0iLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuQmg7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7aC5pbm5lckhUTUw9IiI7Yi5hcHBlbmRDaGlsZChjKTt0aGlzLmcuJGUmJmIuYXBwZW5kQ2hpbGQoaCk7Yi5hcHBlbmRDaGlsZChmKTtiLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuamEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuemQoKTt0aGlzLnlkKCl9LmJpbmQodGhpcykpO3RoaXMuamEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5zYygpO3RoaXMucmMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmphLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmthJiZ0aGlzLmIubS5rYSgpJiYoZS53KGsuJGYsdGhpcy5nLkIsCnRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSksdGhpcy5JZSgpKTt0aGlzLnNjKCl9fSxzYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHpkOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayJ9LHR4OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5iLkgucGF1c2VkPyh0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLk1jLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpOih0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuU2QsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LHV4OmZ1bmN0aW9uKCl7dGhpcy5MZD9lLm9hKHRoaXMuTywKImNvbnRyb2wiLCJwbGF5Iik6ZS5vYSh0aGlzLk8sImNvbnRyb2wiLCJwYXVzZSIpfSxyZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpO3RoaXMuYi5ILnBhdXNlZHx8KHRoaXMuYi5ILnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5TZCx0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sdGg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLmIuSC5wYXVzZWQmJih0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLk1jLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpfSxyeDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYi5ILm11dGVkPwoodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsInVzZXIiLCEwKSxlLncoay5sZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKToodGhpcy5iLkgubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsucGQsdGhpcy5nLkIsdGhpcy5iLm0udigpLHRoaXMuQygpLHRoaXMuRCgpKSl9LHN4OmZ1bmN0aW9uKCl7dGhpcy5aYj9lLm9hKHRoaXMuTywiY29udHJvbCIsInVubXV0ZSIpOmUub2EodGhpcy5PLCJjb250cm9sIiwibXV0ZSIpfSxJZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYi5ILm11dGVkfHwodGhpcy5iLkgubXV0ZWQ9ITAsCmEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudyhrLnBkLHRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSkpfSxKeDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTWIpO3RoaXMuYi5ILm11dGVkJiYodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5sZix0aGlzLmcuQix0aGlzLmIubS52KCksdGhpcy5DKCksdGhpcy5EKCkpKX0sT2I6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5PYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5PYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLAp0aGlzLk9iKTt0aGlzLiRjfHx0aGlzLk5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5iZigpKX0sY2U6ZnVuY3Rpb24oKXt0aGlzLiRjPSEwO3RoaXMuaWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuaWIpLHRoaXMuaWI9ITEpO2lmKCgicHJlcm9sbCI9PWUuT2EmJnRoaXMuTmN8fCJwb3N0cm9sbCI9PWUuT2EpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuT2EpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2Zvcih2YXIgYj10aGlzLmIuTDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLkFjKCk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLAoiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLmVlKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuZWUoKX1lbHNlIHRoaXMuZWUoKX0sZWU6ZnVuY3Rpb24oKXt0aGlzLmNmPSEwO3RoaXMuYi5wZSgpO3RoaXMuYi5idygpO3RoaXMuS2I9ITE7ZS53KGsuQ3EsCnRoaXMuZy5CLHRoaXMuYi5tLnYoKSx0aGlzLkMoKSx0aGlzLkQoKSk7dGhpcy5tZSgpLnNoKCl9LG1lOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmImJnRoaXMuYi5tJiYoYT10aGlzLmIubSk7cmV0dXJuIGF9LHdlOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dHJ5e25ldyBBY3RpdmVYT2JqZWN0KCJTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCIpJiYoYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJihhPSEwKX1yZXR1cm4gYX0sUWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkVhKCJtaW5WaXMiKTthJiYoZS51ZSh0aGlzLnZpZGVvLGEpP3RoaXMudGgoKTp0aGlzLnJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFmKCl9LmJpbmQodGhpcyksCjEwMCkpfSxDOmZ1bmN0aW9uKCl7dmFyIGE9e307dGhpcy5nJiYoYS5jbGlja3Rocm91Z2g9dGhpcy5nLmpjLGEuZHVyYXRpb249dGhpcy5nLmR1cmF0aW9uLGEuYWRQb2Q9dGhpcy5nLmhiLHRoaXMudmlkZW8mJnRoaXMudmlkZW8uY3VycmVudFRpbWUmJihhLmN1cnJlbnRUaW1lPXRoaXMudmlkZW8uY3VycmVudFRpbWUpLHRoaXMuY2MmJjA8dGhpcy5jYy5sZW5ndGgmJihhLmFkSWRzPXRoaXMuY2MpKTtyZXR1cm4gYX0sRDpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuWHArIi0iK3RoaXMuYWY7dGhpcy5nJiZ0aGlzLmcud2cmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5nLndnKCkpO3JldHVybiBhfSxnZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFA9Yy5wa3x8UDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5QdD10aGlzLmFbMl07dGhpcy5jbD0KdGhpcy5hWzddO3RoaXMuUG09dGhpcy5hWzJdO3RoaXMuS2o9dGhpcy5hWzddO3RoaXMuVm89dGhpcy5hWzFdO3RoaXMubGo9dGhpcy5hWzddO3RoaXMuZ3Y9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNF19Yy5WcT1iO2IucHJvdG90eXBlPXtPdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUHQ6dGhpcy5ibChhKX0sYmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNsOnRoaXMuT20oYSl9LE9tOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5QbTp0aGlzLkpqKGEpfSxKajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS2o6dGhpcy5VbyhhKX0sVW86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbzp0aGlzLmtqKGEpfSxrajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubGo6dGhpcy5mdihhKX0sZnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmd2OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgd2I9CmMuVnF8fHdiLHZkPW5ldyB3YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXZkLk90KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuQmE9bnVsbDt0aGlzLlo9W107dGhpcy5YPW51bGw7dGhpcy5iYz10aGlzLmRjPSExO3RoaXMuc2Y9IiI7dGhpcy5yZj0hMTtkJiZkLmVtcHR5P3RoaXMuYnUoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy55bj1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5mZSgpLGI7Yj1lLnphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPQpiLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeCh0aGlzLnVybCk6bC53YShsLkRkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmIWUuUGEoKSYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUuYmcodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpKTA8YS5pbmRleE9mKCJnb29nbGVhZHMuZy5kb3VibGVjbGljay5uZXQvcGFnZWFkL2FkcyIpfHwKImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuRGQoYSkpKyImdHlwZT1qcyIsYj1sLndhKGwuRGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwud2EobC5EZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkhhKGIsdGhpcy5hdS5iaW5kKHRoaXMpLHRoaXMuWXQuYmluZCh0aGlzKSl9LHRnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5CYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5CYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuT2EpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuQmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLk9hfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5PYXx8dGhpcy5BdChhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5OdygpKXRyeXt2YXIgZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49ZC5sZW5ndGgmJihkPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2RbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtmW2JdPWcuZmlyc3RDaGlsZDtjLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfWVsc2UgZi5zcGxpY2UoYiwxKX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxBdDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKToKMDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGF1OmZ1bmN0aW9uKGEpe3RoaXMuU3YoYSk7dHJ5e3RoaXMuQmE9YS5yZXNwb25zZVhNTCx0aGlzLkJhfHwodGhpcy5CYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLk1hKHcuT2QpKX10aGlzLlo9dGhpcy50ZygpO3RoaXMuZGM9dGhpcy5mZigpO3RoaXMuYmM9dGhpcy5HaCgpO3RoaXMuWi5sZW5ndGg/dGhpcy54YygpOnRoaXMucmEodGhpcy5NYSh3LkVjLHtlcnJvcjp0aGlzLnJmP0QuTmQ6CkQuemZ9KSl9LGJ1OmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkJhfHwodGhpcy5CYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnJhKHRoaXMuTWEody5PZCkpfXRoaXMuWj10aGlzLnRnKCk7dGhpcy5kYz10aGlzLmZmKCk7dGhpcy5iYz10aGlzLkdoKCk7dGhpcy5aLmxlbmd0aD90aGlzLnhjKCk6dGhpcy5yYSh0aGlzLk1hKHcuRWMse2Vycm9yOnRoaXMucmY/RC5OZDpELnpmfSkpfSxZdDpmdW5jdGlvbigpe3RoaXMucmEodGhpcy5NYSh3LnlmLHtkZXB0aDphfSkpfSx4YzpmdW5jdGlvbigpe3RoaXMuWD10aGlzLlouc2hpZnQoKTt0aGlzLkN0KCk/dGhpcy5YdygpPyhhKyssbmV3IGIodGhpcyx0aGlzLkNnKCksZyx7QWRTeXN0ZW06dGhpcy5ZcigpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLnJhKHRoaXMuTWEody5CZikpOihhPTAsdGhpcy5VeCgpJiZ0aGlzLk5lKHRoaXMuRXEoKSkpfSxKZTpmdW5jdGlvbigpe3RoaXMuZGM/Cih0aGlzLmRjPTE8dGhpcy5aLmxlbmd0aCx0aGlzLloubGVuZ3RoJiZ0aGlzLnhjKCkpOnRoaXMucGFyZW50LkplKCl9LGJoOmZ1bmN0aW9uKCl7dGhpcy5iYz8odGhpcy5iYz0xPHRoaXMuWi5sZW5ndGgsdGhpcy5aLmxlbmd0aCYmdGhpcy54YygpKTp0aGlzLnBhcmVudC5iaCgpfSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlV3KCk/dGhpcy5UdygpPyEwOigtMSE9dGhpcy5wYygpP3RoaXMucmEodGhpcy5NYSh3LnVmKSk6dGhpcy5yYSh0aGlzLk1hKHcubWopKSwhMSk6KHRoaXMucmEodGhpcy5NYSh3LkVjLEQuQWYpKSwhMSl9LE5lOmZ1bmN0aW9uKGEpe2EuS2E9YS5LYS5jb25jYXQodGhpcy5GZSgpKTthLmhiPWEuaGI/YS5oYjp0aGlzLmRjO2EuYWM9YS5hYz9hLmFjOnRoaXMuYmM7dGhpcy5wYXJlbnQuTmUoYSl9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IHhiO2EuZHVyYXRpb249dGhpcy5wYygpO2EuVT10aGlzLnpnKCk7YS5qYz10aGlzLmFzKCk7YS5vcmlnaW49dGhpczsKYS5CPXRoaXMuWHIoKTthLiRlPXRoaXMucXMoYS5kdXJhdGlvbik7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGIpe3RoaXMuWCYmKGIuS2E9Yi5lcnJvci5jb2RlIT13LnVmLmNvZGU/Yi5LYS5jb25jYXQodGhpcy5icygpKTpiLkthLmNvbmNhdCh0aGlzLmtzKCkpKTt0aGlzLloubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuR2ImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5HYiYmdGhpcy5wYXJlbnQuR2IoYiksYT0wLHRoaXMueGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5yYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnJhJiZ0aGlzLnBhcmVudC5yYShiKSxhPTApfSxHYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5HYihhKX0saWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnJhKHRoaXMuTWEoYSxiKSl9LE1hOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHliKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sWHc6ZnVuY3Rpb24oKXtyZXR1cm4gYTwKZ30sVXc6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnpnKCkubGVuZ3RofSxUdzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMucGMoKX0sZmY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlouZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxHaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWiYmMjw9dGhpcy5aLmxlbmd0aCYmIXRoaXMuZmYoKSYmKGE9ITApO3JldHVybiBhfSxTdjpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuc2Y9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLnJmPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LEN0OmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5DZygpLmxlbmd0aH0sCkNnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGUodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sWXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZSh0aGlzLlgsIkFkU3lzdGVtIil9LEZlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuT2coYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuYmIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxPZzpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09CmEubm9kZU5hbWU/ITA6dGhpcy5PZyhhLnBhcmVudE5vZGUpOiExfSxrczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxiczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sYXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYih0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0semc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxTYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLApoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGl6OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmJiKGFbY10pfSk7dHJ5e3ZhciBkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLlNjKS1NYXRoLmFicyg3MDAtYi5TYyl9KSxnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLlNjKS1NYXRoLmFicyg3MDAtYi5TYyl9KSxiPWQuY29uY2F0KGcpfWNhdGNoKGUpe31yZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTsKZm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMuZ2QoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LHBjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuYmIodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxxczpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkd3KGQsCmEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LGxlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5iYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sbmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGJiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuZ2QoYSk6IiJ9LGdkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubmUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVT1jLnlufHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRwPXRoaXMuYVs5XTsKdGhpcy5LbT10aGlzLmFbMV07dGhpcy5PcT10aGlzLmFbM107dGhpcy5VdD10aGlzLmFbOV07dGhpcy5CdT10aGlzLmFbMV07dGhpcy52cT10aGlzLmFbMl07dGhpcy5BbD10aGlzLmFbMTBdO3RoaXMua209dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbNF19Yy5FeD1iO2IucHJvdG90eXBlPXtDcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHA6dGhpcy5KbShhKX0sSm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkttOnRoaXMuTnEoYSl9LE5xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PcTp0aGlzLlR0KGEpfSxUdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVXQ6dGhpcy5BdShhKX0sQXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkJ1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52cTp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQWw6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5rbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIHpiPWMuRXh8fHpiLHdkPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXdkLkNwKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuS2E9W107dGhpcy5VPVtdO3RoaXMuamM9IiI7dGhpcy5CPXRoaXMuYWM9dGhpcy5oYj0hMTt0aGlzLnFlPXRoaXMub3JpZ2luPW51bGx9Yy5wbT1iO2IucHJvdG90eXBlPXt5cTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fAowPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxoczpmdW5jdGlvbigpe2lmKCF0aGlzLnFlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4uQmEpe3ZhciBhPXRoaXMub3JpZ2luLkJhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKSxiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKykoYj1hW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSkmJgowPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLnFlPWFbY10pfXJldHVybiB0aGlzLnFlfSx3ZzpmdW5jdGlvbigpe3ZhciBhPSExLGI9dGhpcy5ocygpO2ImJmIuZ2V0QXR0cmlidXRlJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpO3JldHVybiBhfSx0czpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLlUubGVuZ3RoO2IrKylpZigwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8CjA8PXRoaXMuVVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLlVbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5VW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuVVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIHhiPWMucG18fHhiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNzPXRoaXMuYVs0XTt0aGlzLlJ4PXRoaXMuYVsyXTt0aGlzLlRpPXRoaXMuYVs2XTt0aGlzLmJ4PXRoaXMuYVs0XTt0aGlzLmFsPXRoaXMuYVs2XTt0aGlzLmh4PXRoaXMuYVsxXTt0aGlzLldyPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzddfWMuT249YjtiLnByb3RvdHlwZT17UnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5TczoKdGhpcy5ReChhKX0sUXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJ4OnRoaXMuU2koYSl9LFNpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVGk6dGhpcy5heChhKX0sYXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ieDp0aGlzLiRrKGEpfSwkazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuYWw6dGhpcy5neChhKX0sZ3g6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmh4OnRoaXMuVnIoYSl9LFZyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Xcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIEFiPWMuT258fEFiLHhkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPXhkLlJzKDQpO3ZhciB3PXtPZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIiwKdGE6IlhNTF9QQVJTRV9FUlJPUiJ9LG1qOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix0YToiRFVSQVRJT05fRVJST1IifSxFYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsdGE6IkVNUFRZX1ZBU1QifSxCZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix0YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0seWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSwKbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLHRhOiJMT0FEX0VSUk9SIn0sTWQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLHRhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sWnk6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsCnRhOiJNRURJQUZJTEVfRVJST1IifSx1Zjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIix0YToiRFVNTVlfQUQifX0sRD17emY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIix0YToiTk9fQURTIn0sQWY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHRhOiJOT19NRURJQUZJTEVTIn0sYXo6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsdGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxOZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix0YToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5wdD10aGlzLmFbMl07dGhpcy5Ubz10aGlzLmFbM107CnRoaXMuSnA9dGhpcy5hWzNdO3RoaXMubXI9dGhpcy5hWzVdO3RoaXMueG09dGhpcy5hWzVdO3RoaXMuQ2w9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbM119Yy5HeT1iO2IucHJvdG90eXBlPXtvdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucHQ6dGhpcy5TbyhhKX0sU286ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlRvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5KcDp0aGlzLmxyKGEpfSxscjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXI6dGhpcy53bShhKX0sd206ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnhtOnRoaXMuQmwoYSl9LEJsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5DbDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEJiPWMuR3l8fEJiLHlkPW5ldyBCYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT15ZC5vdCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmFkPWI7dGhpcy5LYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLlBqfHx5YjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5scD10aGlzLmFbNF07dGhpcy54cD10aGlzLmFbNF07dGhpcy5LeT10aGlzLmFbOF07dGhpcy5veD10aGlzLmFbM107dGhpcy56eD10aGlzLmFbNl07dGhpcy5Paj10aGlzLmFbNl07dGhpcy5WbD10aGlzLmFbNV07dGhpcy5qdT10aGlzLmFbNV07dGhpcy5kdz10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs1XX1jLkNqPWI7Yi5wcm90b3R5cGU9e2twOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5scDp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnhwOnRoaXMuSnkoYSl9LEp5OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5LeTp0aGlzLm54KGEpfSxueDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm94OnRoaXMueXgoYSl9LHl4OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56eDp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT2o6dGhpcy5VbChhKX0sVWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlZsOnRoaXMuaXUoYSl9LGl1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qdTp0aGlzLmN3KGEpfSxjdzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBDYj1jLkNqfHxDYix6ZD1uZXcgQ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT0KemQua3AoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmNvbmY9Ynx8e307dGhpcy5tPWE7dGhpcy5hYj1hLnVnKCk7dGhpcy5MPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuTC5pZD1lLmdhKDEwKTt0aGlzLkg9Qy5wb3AoKTt0aGlzLkh8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuSC5pZD0iYWRYZGlzcGxheSIsdGhpcy5ILnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5BPXt9O3RoaXMuWmQ9ITE7dGhpcy5sYj1bXX1jLnNqPWI7Yi5wcm90b3R5cGU9e3JnOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LApnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLnJnKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5KcyhhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpOwpoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sTHc6ZnVuY3Rpb24oKXt0aGlzLlpkPSEwfSxQaDpmdW5jdGlvbigpe3RoaXMuSD1DLnBvcCgpO3RoaXMuSHx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKX0saWg6ZnVuY3Rpb24oKXt0aGlzLm0ucGF1c2UoKTtlLncoay5ZYyx0aGlzLm0udigpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLlpkfHwodGhpcy5tLnBsYXkoKSxlLncoay5aYyx0aGlzLm0udigpKSl9LEFjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkwuc3R5bGUuekluZGV4PWE7dGhpcy5MLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuTC5zdHlsZS5tYXJnaW5SaWdodD0KImF1dG8iO3RoaXMuTC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuTC5zdHlsZS5ib3hTaXppbmc9dGhpcy5hYi5zdHlsZS5ib3hTaXppbmc7dGhpcy5MLnN0eWxlLndpZHRoPXRoaXMuYWIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9dGhpcy5hYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLmFiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuYWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuYWIpO3RoaXMubS5QYiYmdGhpcy5tLlBiKCk/dGhpcy5tLnVnKCkuYXBwZW5kQ2hpbGQodGhpcy5MKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuTCk7d2luZG93LnNldFRpbWVvdXQodGhpcy5KYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sSnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxrZzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMua2codGhpcy5hYik7aWYoYi54IT10aGlzLkEueHx8Yi55IT10aGlzLkEueXx8Yi5wb3NpdGlvbiE9dGhpcy5BLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuQS53aWR0aCYmMDx0aGlzLkEuaGVpZ2h0JiYwPT0KYi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMucGUoKTtyZXR1cm59dGhpcy5BPWI7dGhpcy5tLlBiKCk/KHRoaXMuTC5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuTC5zdHlsZS50b3A9IjBweCIpOih0aGlzLkwuc3R5bGUubGVmdD1iLngrInB4Iix0aGlzLkwuc3R5bGUudG9wPWIueSsicHgiKTt0aGlzLkwuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuTC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijt0aGlzLkwuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkguc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuSC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5sYi5sZW5ndGg7YSsrKXRoaXMubGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5DaCh0aGlzLkwpJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkpiLmJpbmQodGhpcyksMTApfSxEbzpmdW5jdGlvbihhKXt0aGlzLmxifHwodGhpcy5sYj1bXSk7ImZ1bmN0aW9uIj09CnR5cGVvZiBhJiZ0aGlzLmxiLnB1c2goYSl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5MJiZ0aGlzLkwucGFyZW50Tm9kZSYmdGhpcy5MLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuTC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTCk7dGhpcy5IJiZ0aGlzLkgucGF1c2UmJnRoaXMuSC5wYXVzZSgpfX19KShjKTtmb3IodmFyIE89Yy5zanx8TyxDPVtdLERiPTA7MTAwPkRiO0RiKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1lLmdhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgST0hMSxlYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix6KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLHopO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5HcT10aGlzLmFbMTBdO3RoaXMudnY9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMTBdfWMuTnQ9YjtiLnByb3RvdHlwZT17RnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkdxOnRoaXMudXYoYSl9LHV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52djp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEViPWMuTnR8fEViLEFkPW5ldyBFYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUFkLkZxKDQpOyhmdW5jdGlvbihjKXtjLllsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7CmF8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5TKGEpO3RoaXMuWmUoYik7dGhpcy5lZygpfSxaZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkZhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxVYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmCmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sbWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSx2OmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGM9dGhpcy5GYSgpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1jKWIuY29udGFpbmVySWQ9Yy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIEZiPWMuWWx8fEZiOyhmdW5jdGlvbihjKXtjLlhsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj1mYSgpO3RoaXMuRWI9dGhpcy5FYnx8ITE7dGhpcy5IZj10aGlzLkpmPQp0aGlzLktnPXRoaXMucWE9dGhpcy5rZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLk1yKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5rZj0hMDt0aGlzLktnJiZ0aGlzLlhmKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkucWI7YSYmYS5LYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLlVjKCk7dGhpcy5LZz0hMDt0aGlzLlhmKCl9LmJpbmQodGhpcykpOwp0aGlzLlNmKCl9LFhmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWIpe3RoaXMuVWMoKTtpZighdGhpcy5rZiYmIXRoaXMuVWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLmtmJiZ0aGlzLkhmJiYhdGhpcy5KZiYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCl9LmJpbmQodGhpcyksMTAwKX19LFVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5BZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxBZzpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxTZjpmdW5jdGlvbigpe2lmKHRoaXMuVWMoKSl7dmFyIGI9CnRoaXMuQWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5KZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLkhmPWIuZnp9dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2YoKX0uYmluZCh0aGlzKSwxMDApfSxqejpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi53eigpOiExfSxwYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IucGMoKTotMX0sbHM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sTXI6ZnVuY3Rpb24oYixhKXt0aGlzLkViPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLkVifHwzMDI9PXRoaXMuRWI/dGhpcy5xYT0hMDp0aGlzLnMoImFkZXJyb3IiLHRoaXMuRWIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YYygpfS5iaW5kKHRoaXMpLDEwMCl9LFhjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnFhPyh0aGlzLm8oKSx0aGlzLmVhKCkpOmIubWQoKT8odGhpcy5GKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5scyhiKT8odGhpcy5GKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBHYj1jLlhsfHxHYjsoZnVuY3Rpb24oYyl7Yy5abD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LHp0OmZ1bmN0aW9uKCl7d2luZG93Lk9PLnZtLnNvLnFvP3dpbmRvdy5PTy52bS5zby5xby5keihmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuenQoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5OYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgRmIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSihjKXx8KHRoaXMuSyhjKSwobmV3IEdiKGMsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBIYj1jLlpsfHxIYixJYj1uZXcgSGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnA9dGhpcy5hWzNdO3RoaXMuUnk9dGhpcy5hWzEwXTt0aGlzLmNxPXRoaXMuYVsyXTt0aGlzLmw9CnRoaXMuYVsyXX1jLkl2PWI7Yi5wcm90b3R5cGU9e1lwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5acDp0aGlzLlF5KGEpfSxReTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnk6dGhpcy5icShhKX0sYnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5jcTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIEpiPWMuSXZ8fEpiLEJkPW5ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUJkLllwKDQpOyhmdW5jdGlvbihjKXtjLmJqPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3RoaXMubWE9ITE7dGhpcy5EZygpfSxEZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpOwpifHwoYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnQpO3RoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5TKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sbGE6ZnVuY3Rpb24oKXt0aGlzLm5oKCl9LApuaDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuTiYmKDAsdGhpcy5OKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIEtiPWMuYmp8fEtiOyhmdW5jdGlvbihjKXtjLmFqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPWEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMubygiZW1wdHkiKSx0aGlzLmVhKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT0KYj90aGlzLmVhKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nKCk/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTGI9Yy5hanx8TGI7KGZ1bmN0aW9uKGMpe2MuY2o9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxxaDpmdW5jdGlvbihiKXtiPW5ldyBLYihiKTtiLm1hP3RoaXMuSSgpOnRoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3IExiKGIsdGhpcy5HKSkuYygpKX0sYzpmdW5jdGlvbigpe3RoaXMuT3J8fCh0aGlzLk9yPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5xaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTsKaWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLnFoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1tiXSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgTWI9Yy5janx8TWIsVj1uZXcgTWIocSk7Vi5jKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud3g9dGhpcy5hWzNdO3RoaXMucHA9dGhpcy5hWzldO3RoaXMuQWs9dGhpcy5hWzJdO3RoaXMuRXk9dGhpcy5hWzddO3RoaXMuVHg9dGhpcy5hWzNdO3RoaXMuc2k9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzldfWMubm89YjtiLnByb3RvdHlwZT17dng6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy53eDp0aGlzLm9wKGEpfSxvcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucHA6dGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFrOnRoaXMuRHkoYSl9LER5OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5FeTp0aGlzLlN4KGEpfSxTeDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlR4OnRoaXMucmkoYSl9LHJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5zaTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIE5iPWMubm98fE5iLENkPW5ldyBOYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUNkLnZ4KDQpOyhmdW5jdGlvbihjKXtjLldtPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlMoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxQYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuV218fFc7KGZ1bmN0aW9uKGMpe2MuVm09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkuUGYoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm8uYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LlBmKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuenUoYSl9LmJpbmQodGhpcykpO3kuRHMoKX0senU6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5vKCk7dGhpcy5lYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5vKCk7dGhpcy5lYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkYoKX19KX0pKGMpOwp2YXIgWD1jLlZtfHxYOyhmdW5jdGlvbihjKXtjLlhtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLnFkJiYoYj1lLklxKGIsdGhpcy5xZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLkooZCkpe3RoaXMuSyhkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD0KYy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnFkfHwodGhpcy5xZD1bXSksdGhpcy5xZC5wdXNoKGJbYV0pLGQ9bmV3IFcoaCksdGhpcy5KKGQpfHwodGhpcy5LKGQpLGY9bmV3IFgoZCx0aGlzLkcpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sUGY6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sWXc6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy53Y3x8KHRoaXMud2M9W10pLHRoaXMud2MucHVzaChiKSx0aGlzLmF3KCkmJih0aGlzLlZlKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYKKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxEczpmdW5jdGlvbigpe2lmKHRoaXMud2MpZm9yKHZhciBiPTA7Yjx0aGlzLndjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMud2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5Lll3KGIpfX0pfSkoYyk7CnZhciBPYj1jLlhtfHxPYix5PW5ldyBPYihxKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFyPXRoaXMuYVsxMF07dGhpcy5mcD10aGlzLmFbMl07dGhpcy5lbj10aGlzLmFbOV07dGhpcy5Mcz10aGlzLmFbOF07dGhpcy5rbz10aGlzLmFbMV07dGhpcy5sdD10aGlzLmFbN107dGhpcy5sbj10aGlzLmFbMl07dGhpcy5wbD10aGlzLmFbOV07dGhpcy5vcj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVsyXX1jLkprPWI7Yi5wcm90b3R5cGU9eyRxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hcjp0aGlzLmVwKGEpfSxlcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZnA6dGhpcy5kbihhKX0sZG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmVuOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Mczp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLmtvOnRoaXMua3QoYSl9LGt0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubHQ6dGhpcy5rbihhKX0sa246ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxuOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucGw6dGhpcy5ucihhKX0sbnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm9yOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgUGI9Yy5Ka3x8UGIsRGQ9bmV3IFBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9RGQuJHEoNCk7KGZ1bmN0aW9uKGMpe2MuV2k9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5TKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sVWE6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBRYj1jLldpfHxRYjsoZnVuY3Rpb24oYyl7Yy5YaT0KdS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5GKCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMueXZ8fCh0aGlzLnl2PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy5GKCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpOwp2YXIgUmI9Yy5YaXx8UmI7KGZ1bmN0aW9uKGMpe2MuWWk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBRYihkKTt0aGlzLkooZSl8fCh0aGlzLksoZSksKG5ldyBSYihlLHRoaXMuRykpLmMoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSjpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLkphKWlmKGE9PXRoaXMuSmFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7CnJldHVybiB0aGlzLkphW2Iub2IoKV0/ITA6ITF9fSl9KShjKTt2YXIgU2I9Yy5ZaXx8U2IsVGI9bmV3IFNiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ0PXRoaXMuYVs3XTt0aGlzLlZuPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVsxMF07dGhpcy5ieT10aGlzLmFbMl07dGhpcy5SbD10aGlzLmFbMTBdO3RoaXMuaW09dGhpcy5hWzhdO3RoaXMucm49dGhpcy5hWzZdO3RoaXMuZnQ9dGhpcy5hWzFdO3RoaXMuRWw9dGhpcy5hWzZdO3RoaXMuSXg9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbOV19Yy5Ucj1iO2IucHJvdG90eXBlPXthdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJ0OnRoaXMuVW4oYSl9LFVuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVm46dGhpcy5KcihhKX0sSnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLktyOnRoaXMuYXkoYSl9LApheTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYnk6dGhpcy5RbChhKX0sUWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlJsOnRoaXMuaG0oYSl9LGhtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pbTp0aGlzLnFuKGEpfSxxbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnJuOnRoaXMuZXQoYSl9LGV0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mdDp0aGlzLkRsKGEpfSxEbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRWw6dGhpcy5IeChhKX0sSHg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkl4OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgVWI9Yy5Ucnx8VWIsRWQ9bmV3IFViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9RWQuYXQoNCk7KGZ1bmN0aW9uKGMpe2MuT2w9Cm4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250YWluZXJJRCkpO2ImJihhPWIpO3RoaXMuUyhiKTt0aGlzLlYoYSk7dGhpcy5Vdih0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxVdjpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJnRoaXMuaWEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnBhdXNlJiZ0aGlzLmlhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmCnRoaXMuaWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5yZXN1bWUmJnRoaXMuaWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2ImJmIubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLm11dGUmJnRoaXMuaWEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaWEmJnRoaXMuaWEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS51bm11dGUmJnRoaXMuaWEudW5tdXRlKCl9LmJpbmQodGhpcykpfSxMZzpmdW5jdGlvbihiKXt0aGlzLmlhPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBWYj1jLk9sfHxWYjsoZnVuY3Rpb24oYyl7Yy5ObD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLAphKTt0aGlzLiRoPSExfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXRoaXMuZ2V0UGxheWVyKCk7Yi5hdXRvc3RhcnQmJiF0aGlzLiRoJiYodGhpcy5GKCksdGhpcy4kaD0hMCx0aGlzLlJhKCkpO2EuRmEoKS5hZGRFdmVudExpc3RlbmVyKGIucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5GKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFdiPWMuTmx8fFdiOyhmdW5jdGlvbihjKXtjLlBsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgVmIoYltkXSksdGhpcy5KKGMpfHwodGhpcy5LKGMpLChuZXcgV2IoYyx0aGlzLkcpKS5jKCkpfX1lbHNlIHRoaXMuSSgpfX0pfSkoYyk7CnZhciBYYj1jLlBsfHxYYixZPW5ldyBYYihxKTtZLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Rcj10aGlzLmFbOV07dGhpcy5EaT10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVsxMF19Yy5uaT1iO2IucHJvdG90eXBlPXtQcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUXI6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkRpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgWWI9Yy5uaXx8WWIsRmQ9bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9RmQuUHIoNCk7KGZ1bmN0aW9uKGMpe2MuTW49bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxrYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sbGE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJgoxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5OPygwLHRoaXMuTikoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIFpiPWMuTW58fFpiOyhmdW5jdGlvbihjKXtjLkxuPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxUdjpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuV2F8fCh0aGlzLldhPVtdKTt0aGlzLldhLnB1c2goYS5nZXRFcnJvckNvZGUoKSk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8CjMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuZWEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5lYz0hMDt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sYzpmdW5jdGlvbigpe3RoaXMudSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy54YT90aGlzLlR2KHRoaXMueGEpOih0aGlzLnhhPXRoaXMuSGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApKX0sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcmJjE8Yi5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy54YSl7dGhpcy5GKCk7cmV0dXJufWlmKCF0aGlzLmVjKXt0aGlzLkYoKTtyZXR1cm59Yj0hMDtpZih0aGlzLldhJiYKdGhpcy5XYS5sZW5ndGgmJjE8dGhpcy5XYS5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLldhLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLldhW2FdJiYzMDMhPXRoaXMuV2FbYV0mJjQwMyE9dGhpcy5XYVthXSYmKGI9ITEpO2lmKGIpdGhpcy5vKCJlbXB0eSIpLHRoaXMuZWEoKTtlbHNle3RoaXMuRigpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyICRiPWMuTG58fCRiOyhmdW5jdGlvbihjKXtjLk5uPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3RoaXMuSWE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgWmIoYi5pdGVtKGEpKTt0aGlzLkooYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLksoYyksCihuZXcgJGIoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIGFjPWMuTm58fGFjLGJjPW5ldyBhYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5qdD10aGlzLmFbN107dGhpcy5mdT10aGlzLmFbNl07dGhpcy5lcj10aGlzLmFbNV07dGhpcy5pbz10aGlzLmFbOV07dGhpcy5LdD10aGlzLmFbOF07dGhpcy5Bbj10aGlzLmFbOF07dGhpcy5Dbj10aGlzLmFbNF07dGhpcy5ndz10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs4XX1jLmppPWI7Yi5wcm90b3R5cGU9e2l0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qdDp0aGlzLmV1KGEpfSxldTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmZ1OnRoaXMuZHIoYSl9LGRyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5lcjp0aGlzLmhvKGEpfSxobzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaW86CnRoaXMuSnQoYSl9LEp0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5LdDp0aGlzLnpuKGEpfSx6bjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkFuOnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dbjp0aGlzLmZ3KGEpfSxmdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZ3c6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBjYz1jLmppfHxjYyxHZD1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1HZC5pdCg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sbGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLk4mJigwLHRoaXMuTikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5OJiYoMCx0aGlzLk4pKCEwKX0uYmluZCh0aGlzKSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgZGM9Yy5Za3x8ZGM7KGZ1bmN0aW9uKGMpe2MuWGs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLlloKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5vZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMub2coKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuQW8oKX0uYmluZCh0aGlzKSksdGhpcy5aaD0hMSx0aGlzLnh5PTFFMyx0aGlzLmtoPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxvZzpmdW5jdGlvbigpe3RoaXMua2guZG9uZXx8KHRoaXMua2guZG9uZT0hMCx0aGlzLlpoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZaCgpfS5iaW5kKHRoaXMpLAp0aGlzLnh5KSl9LEFvOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLlpoKTt0aGlzLm8oKX0sWWg6ZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMubygpLHRoaXMuZWEoKSk6KHRoaXMucygiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLkYoKSl9LHhnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBmPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHlhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy54Zyhtdy5lcnJvckRlbGVnYXRlcyk6CnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy54Zyh0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgZWM9Yy5Ya3x8ZWM7KGZ1bmN0aW9uKGMpe2MuWms9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5OYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLk5hKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLk5hKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTsKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLk5hKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBkYyhjKSx0aGlzLkooYyl8fCh0aGlzLksoYyksKG5ldyBlYyhjLHRoaXMuRykpLmMoKSkpfX10aGlzLkkoKX19KX0pKGMpO3ZhciBmYz1jLlprfHxmYyxnYz1uZXcgZmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUHk9dGhpcy5hWzVdO3RoaXMuV3Q9dGhpcy5hWzEwXTt0aGlzLlZpPXRoaXMuYVs3XTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLm9qPXRoaXMuYVs4XTt0aGlzLmx1PXRoaXMuYVs5XTt0aGlzLm1tPQp0aGlzLmFbNV07dGhpcy52aj10aGlzLmFbNF07dGhpcy5QdT10aGlzLmFbNF07dGhpcy5Ecj10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbNV19Yy54dz1iO2IucHJvdG90eXBlPXtPeTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUHk6dGhpcy5WdChhKX0sVnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLld0OnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVmk6dGhpcy5WayhhKX0sVms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLldrOnRoaXMubmooYSl9LG5qOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vajp0aGlzLmt1KGEpfSxrdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubHU6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1tOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52ajp0aGlzLk91KGEpfSxPdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUHU6CnRoaXMuQ3IoYSl9LENyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ecjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGhjPWMueHd8fGhjLEhkPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUhkLk95KDQpOyhmdW5jdGlvbihjKXtjLlJtPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgaWM9Yy5SbXx8aWM7KGZ1bmN0aW9uKGMpe2MuUW09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm8oKSx0aGlzLmVhKCkpOih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLnUoKSkpOih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpO3RoaXMuaWMoKX0saWM6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy56ZSgpJiYKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnplKCkmJih0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmljKCl9LmJpbmQodGhpcyksMTApfSx6ZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgamM9Yy5RbXx8amM7KGZ1bmN0aW9uKGMpe2MuU209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJgoidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgaWMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSihiKXx8KHRoaXMuSyhiKSwobmV3IGpjKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBrYz1jLlNtfHxrYyxsYz1uZXcga2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3I9dGhpcy5hWzddO3RoaXMueXM9dGhpcy5hWzRdO3RoaXMuUm89dGhpcy5hWzRdO3RoaXMueG49dGhpcy5hWzFdO3RoaXMudG49dGhpcy5hWzNdO3RoaXMuR2o9dGhpcy5hWzFdO3RoaXMubD10aGlzLmFbMV19Yy5oaz0KYjtiLnByb3RvdHlwZT17cnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNyOnRoaXMueHMoYSl9LHhzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55czp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUm86dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnhuOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bjp0aGlzLkZqKGEpfSxGajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYz1jLmhrfHxtYyxJZD1uZXcgbWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1JZC5ycig0KTsoZnVuY3Rpb24oYyl7Yy5HbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlMoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuT2U9ITF9LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkJ2KCl9LmJpbmQodGhpcyksNTAwKX0sQnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5OJiZ0aGlzLk4oKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksCmE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuT2UmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuT2UpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxIdzpmdW5jdGlvbigpe3RoaXMuT2U9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBuYz1jLkdtfHwKbmM7KGZ1bmN0aW9uKGMpe2MuRm09dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKTt0aGlzLlliPTB9LGM6ZnVuY3Rpb24oKXt0aGlzLmh1PTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5ZYnx8KHRoaXMuWWI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5zKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8Cih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5ZYnx8dGhpcy5ZYisrLHRoaXMuWWI8PXRoaXMuaHU/KHRoaXMuWWIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSkpfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5IdygpLHRoaXMuRigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgb2M9Yy5GbXx8b2M7KGZ1bmN0aW9uKGMpe2MuSG09dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbmMod2luZG93LnBsYXllckFwaSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLChuZXcgb2MoYiwKdGhpcy5HKSkuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcGM9Yy5IbXx8cGMscWM9bmV3IHBjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNxPXRoaXMuYVs1XTt0aGlzLk1xPXRoaXMuYVs0XTt0aGlzLnp3PXRoaXMuYVsxXTt0aGlzLmpqPXRoaXMuYVs0XTt0aGlzLkh1PXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzldfWMuY3Y9YjtiLnByb3RvdHlwZT17UnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlNxOnRoaXMuTHEoYSl9LExxOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NcTp0aGlzLnl3KGEpfSx5dzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuenc6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmpqOnRoaXMuR3UoYSl9LEd1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5IdTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sOmF9fX0pKGMpO3ZhciByYz1jLmN2fHxyYyxKZD1uZXcgcmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1KZC5ScSg0KTsoZnVuY3Rpb24oYyl7Yy5BbT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGxhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuTigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBzYz1jLkFtfHxzYzsoZnVuY3Rpb24oYyl7Yy56bT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCmZ1bmN0aW9uKCl7dGhpcy5SYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLnpxKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuZWQoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLlN0KCk6dGhpcy5pYygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZigpfHwodGhpcy5zKCJjb250ZW50cGxheSIpLHRoaXMudSghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHpxOmZ1bmN0aW9uKCl7dGhpcy5GZigpfHx0aGlzLnUoITApfSxTdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZWQoKTshYi52YSYmCmIuWiYmYi5jeiYmYi5leiYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LGljOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMubygpLHRoaXMuZWEoKSk6KHRoaXMucygiYWRlcnJvciIsYiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWMoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe2lmKCF0aGlzLmdoKWZvcih2YXIgYj1tLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5GYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT0KYSYmKHRoaXMuZ2g9YltjXSk7cmV0dXJuIHRoaXMuZ2h9LHplOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLmVkKCkuYWRzTG9hZGVyP3RoaXMuRighMCk6dGhpcy5GKCk6dGhpcy5GKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHRjPWMuem18fHRjOyhmdW5jdGlvbihjKXtjLkJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IHNjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5KKGMpfHwodGhpcy5LKGMpLChuZXcgdGMoYyx0aGlzLkcpKS5jKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgdWM9Yy5CbXx8dWMsdmM9bmV3IHVjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJwPXRoaXMuYVs2XTt0aGlzLlVxPXRoaXMuYVs5XTt0aGlzLll5PXRoaXMuYVsyXTt0aGlzLk15PXRoaXMuYVsxXTt0aGlzLlVwPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzEwXX1jLnlrPWI7Yi5wcm90b3R5cGU9e3FwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ycDp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVXE6dGhpcy5YeShhKX0sWHk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLll5OnRoaXMuTHkoYSl9LEx5OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5NeTp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLlVwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgd2M9Yy55a3x8d2MsS2Q9bmV3IHdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9S2QucXAoNCk7KGZ1bmN0aW9uKGMpe2MudWw9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0UmJihiPWIuZmlyc3RDaGlsZCk7aWYoYil7dGhpcy5TKGIpO2lmKGIudGFnTmFtZSl7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9YT90aGlzLlYoYSk6dGhpcy5mYSgpfWVsc2UgdGhpcy5mYSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihFKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxVYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sRmE6ZnVuY3Rpb24oKXt2YXIgYjtFPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTsKYiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWj1jLnVsfHxaOyhmdW5jdGlvbihjKXtjLnRsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlFlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuUWU9Yi5pZCk7RT93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5RZSYmYiE9dGhpcy5RZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5zKCJhZGVycm9yIixhLnl6KSx0aGlzLkYoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT0KYSYmKHRoaXMucygiYWRlcnJvciIpLHRoaXMuRigpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBhYT1jLnRsfHxhYTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRSlmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFooYiksYi5tYT90aGlzLlZlKCk6dGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGFhKGIsdGhpcy5HKSxiLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRSx4Yz1jLnZsfHx4Yyx5Yz1uZXcgeGMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC53Yi5sZW5ndGgpe3ZhciBhPWwud2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUucncoeyJbTE9BRFNDUklQVF0iOmUuZ2EoMTApLCJbVVRJTFNdIjplLmdhKDEwKSwiW0NBTExCQUNLXSI6ZS5nYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuWGcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSltW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLlhnKGcsCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LGwpfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3A9dGhpcy5hWzhdO3RoaXMuam49dGhpcy5hWzJdO3RoaXMuZng9dGhpcy5hWzNdO3RoaXMuUmo9dGhpcy5hWzhdO3RoaXMud2k9dGhpcy5hWzRdO3RoaXMud3I9dGhpcy5hWzddO3RoaXMuUXA9dGhpcy5hWzFdO3RoaXMucnY9dGhpcy5hWzldO3RoaXMuang9dGhpcy5hWzVdO3RoaXMuS2w9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbMV19Yy50aj1iO2IucHJvdG90eXBlPXtWcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3A6dGhpcy5obihhKX0saG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpuOnRoaXMuZXgoYSl9LApleDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZng6dGhpcy5RaihhKX0sUWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlJqOnRoaXMudmkoYSl9LHZpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53aTp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMud3I6dGhpcy5QcChhKX0sUHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFwOnRoaXMucXYoYSl9LHF2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ydjp0aGlzLml4KGEpfSxpeDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuang6dGhpcy5KbChhKX0sSmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLktsOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgemM9Yy50anx8emMsTGQ9bmV3IHpjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPUxkLlZwKDQpOyhmdW5jdGlvbihjKXtjLm5uPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5TKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMucXU9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9ZWxzZSB0aGlzLmZhKCl9LGh3OmZ1bmN0aW9uKGIpe3RoaXMuUmQ9CmJ9LGthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sbGE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuZ2IoYil9LmJpbmQodGhpcykpfSxnYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT4KYiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuTiYmdGhpcy5OKCksdGhpcy5SZCYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuUmQmJihuZXcgSCh0aGlzLHRoaXMuUmQpKS5jKCkpfX0pfSkoYyk7dmFyIE49Yy5ubnx8TjsoZnVuY3Rpb24oYyl7Yy5tbj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSx4YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMua2UpaWYodGhpcy5yYnx8KHRoaXMucmI9MCksdGhpcy5yYisrLDE1PHRoaXMucmIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzPwp0aGlzLnR3KCk6dGhpcy51KCEwKSwhMDt0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLnUoKTp0aGlzLnUoITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5rZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhKTt0aGlzLnlhKCl8fCh0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YSgpfS5iaW5kKHRoaXMpLDEwKX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0sClk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVz1hLGIucygiYWRlcnJvciIsYSkpOmIucygiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dGhpcy5XPXRoaXMuV3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnhhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwpiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSx1OmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRihiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSD1jLm1ufHxIOyhmdW5jdGlvbihjKXtjLnBuPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLklhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJgp3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiLmh3KHRoaXMuRyksYj1uZXcgSChiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLnBufHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHA9CnRoaXMuYVsyXTt0aGlzLlRsPXRoaXMuYVszXTt0aGlzLmFtPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzJdfWMuS3E9YjtiLnByb3RvdHlwZT17R3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhwOnRoaXMuU2woYSl9LFNsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5UbDp0aGlzLiRsKGEpfSwkbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYW06dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBDYz1jLktxfHxDYyxNZD1uZXcgQ2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1NZC5HcCg0KTsoZnVuY3Rpb24oYyl7Yy5tbD1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy5jZz0KMDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVihhKTp0aGlzLmZhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jZ30sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGxhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLk4/KDAsdGhpcy5OKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse2ZxOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuY2c9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCntmcTpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sUDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIERjPWMubWx8fERjOyhmdW5jdGlvbihjKXtjLmxsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEN6OmZ1bmN0aW9uKCl7fSxXdjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnRmKG5ldyBmdW5jdGlvbigpe30pO2EuJHk9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuV3YoYSk7d2luZG93LlpkPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLlZ2fHwodGhpcy5Wdj0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnNlfHwodGhpcy5zZT0xKTtpZigyMDx0aGlzLnNlKXRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLlFhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuc2UrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LFFhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLmFhKCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMuVWUoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5ZKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sWTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5zKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLnBhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0sVWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc01hbmFnZXIpOwpiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlkoYSwhMCk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpfSx5YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFhfSxwYTpmdW5jdGlvbigpe3RoaXMucWE9ITB9LGFhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YSgpPwoodGhpcy5vKCksdGhpcy5lYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkYoYil9fSl9KShjKTt2YXIgRWM9Yy5sbHx8RWM7KGZ1bmN0aW9uKGMpe2Mubmw9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IERjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5tYXx8dGhpcy5KKGMpfHwodGhpcy5LKGMpLChuZXcgRWMoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEZjPWMubmx8fEZjLEdjPW5ldyBGYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubnQ9dGhpcy5hWzhdO3RoaXMuQng9dGhpcy5hWzddO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuSW49dGhpcy5hWzhdO3RoaXMuZ209dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbNl19Yy5zbD1iO2IucHJvdG90eXBlPXttdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnQ6dGhpcy5BeChhKX0sQXg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkJ4OnRoaXMuQXAoYSl9LEFwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5CcDp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSW46dGhpcy5mbShhKX0sZm06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmdtOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgSGM9Yy5zbHx8SGMsTmQ9bmV3IEhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPU5kLm10KDQpOyhmdW5jdGlvbihjKXtjLmhsPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5TKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIGJhPWMuaGx8fGJhOyhmdW5jdGlvbihjKXtjLmdsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LApjOmZ1bmN0aW9uKCl7dGhpcy5IZz0wO3RoaXMuVz10aGlzLld8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5xYT10aGlzLnRjPXRoaXMueGE9dGhpcy5RYz0hMTt0aGlzLnBoPWUudWIoMTApO3RoaXMuUWcoKX0sUWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudmE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLlFhKCksITA7dGhpcy5IZysrO2lmKDEwPHRoaXMuSGcpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMudSghMCk6dGhpcy51KCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5RZy5iaW5kKHRoaXMpLDEwMCksITF9LFFhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMudmE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKGEpe3RoaXMuWShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlFhKCl9LmJpbmQodGhpcyksMjApfSxZOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucGEoKTticmVha319LHlhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWF9LHBhOmZ1bmN0aW9uKCl7dGhpcy5xYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlhKCk/KHRoaXMubygpLHRoaXMuZWEoKSk6dGhpcy51KGIpfS5iaW5kKHRoaXMpLDEwMCl9LHU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFwaS5wbGF5ZWQmJmEuYXBpLnBsYXllZCgpP3RoaXMuRihiKToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNhPWMuZ2x8fGNhOyhmdW5jdGlvbihjKXtjLmlsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5KKGIpfHwodGhpcy5LKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSxiLmMoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IGJhKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSihiKXx8KHRoaXMuSyhiKSxiPW5ldyBjYShiLAp0aGlzLkcpLGIuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgSWM9Yy5pbHx8SWMsSmM9bmV3IEljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs4XTt0aGlzLlhuPXRoaXMuYVsxMF07dGhpcy5Dbz10aGlzLmFbNV07dGhpcy5oaj10aGlzLmFbMTBdO3RoaXMuZmo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzddfWMuWHM9YjtiLnByb3RvdHlwZT17Zm46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmduOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLkJvKGEpfSxCbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkNvOnRoaXMuZ2ooYSl9LGdqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5oajp0aGlzLmVqKGEpfSxlajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZmo6dGhpcy5qKGEpfSwKajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIEtjPWMuWHN8fEtjLE9kPW5ldyBLYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPU9kLmZuKDQpOyhmdW5jdGlvbihjKXtjLlRqPW4uZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yj8oYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllclByZWZpeCkpPyh0aGlzLlMoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5WKGIpOnRoaXMuZmEoKSk6dGhpcy5mYSgpOnRoaXMuZmEoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxtZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaXNGdWxsc2NyZWVuP2IuaXNGdWxsc2NyZWVuOiExfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLmR1cmF0aW9uP2IudmlkZW9pbmZvLmR1cmF0aW9uOjB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8ucGxheWhlYWQ/Yi52aWRlb2luZm8ucGxheWhlYWQ6MH0sCmV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgTGM9Yy5Uanx8TGM7KGZ1bmN0aW9uKGMpe2MuU2o9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVBsYXlpbmciLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLAp0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMucygiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksdGhpcy51KCkpfSx0ZXN0OmZ1bmN0aW9uKCl7fSx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtiLmlzUGxheWluZygpPyhiLnBhdXNlKCksdGhpcy5GKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBNYz1jLlNqfHxNYzsoZnVuY3Rpb24oYyl7Yy5Vaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApjOmZ1bmN0aW9uKCl7dGhpcy5JYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuTmEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyBMYyhkKSxkLm1hfHx0aGlzLkooZCl8fCh0aGlzLksoZCksKG5ldyBNYyhkLHRoaXMuRykpLmMoKSk7ZWxzZSBicmVha310aGlzLkkoKX19KX0pKGMpO3ZhciBOYz1jLlVqfHxOYyxPYz1uZXcgTmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub2s9dGhpcy5hWzFdO3RoaXMuYXA9dGhpcy5hWzldO3RoaXMuZWs9dGhpcy5hWzFdO3RoaXMudHE9dGhpcy5hWzEwXTt0aGlzLkx1PXRoaXMuYVsxXTsKdGhpcy5sPXRoaXMuYVszXX1jLkx2PWI7Yi5wcm90b3R5cGU9e25rOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5vazp0aGlzLiRvKGEpfSwkbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXA6dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5lazp0aGlzLnNxKGEpfSxzcTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMudHE6dGhpcy5LdShhKX0sS3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkx1OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgUGM9Yy5Mdnx8UGMsUGQ9bmV3IFBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9UGQubmsoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9bi5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9CiExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmYT8odGhpcy5TKGIpLHRoaXMuVihhKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLmZhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIFFjPWMuJGp8fFFjOyhmdW5jdGlvbihjKXtjLlpqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlVmKCl9LFVmOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5GKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZighMCl9LmJpbmQodGhpcyksCjEwMCkpfX0pfSkoYyk7dmFyIFJjPWMuWmp8fFJjOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYiYmIkRJViI9PWIubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyBRYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5tYSl7dGhpcy5JKCk7cmV0dXJufWlmKCF0aGlzLkooYikpe3RoaXMuSyhiKTsobmV3IFJjKGIsdGhpcy5HKSkuYygpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgU2M9Yy5ha3x8U2MsVGM9bmV3IFNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNyPXRoaXMuYVsxMF07dGhpcy5FdD10aGlzLmFbNl07dGhpcy5NbD0KdGhpcy5hWzVdO3RoaXMubXg9dGhpcy5hWzZdO3RoaXMuaHQ9dGhpcy5hWzEwXTt0aGlzLmVvPXRoaXMuYVsxMF07dGhpcy5TcD10aGlzLmFbMTBdO3RoaXMubD10aGlzLmFbOV19Yy54aT1iO2IucHJvdG90eXBlPXticjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3I6dGhpcy5EdChhKX0sRHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkV0OnRoaXMuTGwoYSl9LExsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5NbDp0aGlzLmx4KGEpfSxseDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubXg6dGhpcy5ndChhKX0sZ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5odDp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmVvOnRoaXMuUnAoYSl9LFJwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5TcDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIFVjPWMueGl8fFVjLApRZD1uZXcgVWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1RZC5icig0KTsoZnVuY3Rpb24oYyl7Yy5jaT1uLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTtiPyh0aGlzLlMoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5WKGIpOnRoaXMuZmEoKSk6dGhpcy5mYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUDpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgVmM9Yy5jaXx8VmM7KGZ1bmN0aW9uKGMpe2MuYmk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYiwKYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy51LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcykpO3RoaXMuJGQoKTt0aGlzLlJmKCl9LFk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlc9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnBhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5wYSgpO2JyZWFrfX0seWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYX0scGE6ZnVuY3Rpb24oKXt0aGlzLnFhPSEwO3RoaXMubygiZW1wdHkgdmFzdCIpfSxSZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiYKYi5hZHNMb2FkZXIpZm9yKHZhciBhPTA7YTxiLmFkc0xvYWRlci5sZW5ndGg7YSsrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8CjMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy5vKCksdGhpcy5lYSgpKTp0aGlzLnUoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLlJmLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy4kZC5iaW5kKHRoaXMpLDEwMCl9LCRkOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaGEoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5SYS5iaW5kKHRoaXMpLDEwKSx0aGlzLm8oKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLnUoKTp0aGlzLnUoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuJGQuYmluZCh0aGlzKSwxMDApfX0sdTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlJhLmJpbmQodGhpcyksCjFFNCk7dGhpcy5GKGIpfX0pfSkoYyk7dmFyIFdjPWMuYml8fFdjOyhmdW5jdGlvbihjKXtjLmRpPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sU2E6ZnVuY3Rpb24oYil7Yj1uZXcgVmMoYik7Yi5tYT90aGlzLkkoKTp0aGlzLkooYil8fCh0aGlzLksoYiksKG5ldyBXYyhiLHRoaXMuRykpLmMoKSl9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5TYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuU2Eod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5JKCl9fSl9KShjKTt2YXIgWGM9Yy5kaXx8WGMsWWM9bmV3IFhjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5HdD10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVs3XX1jLk5tPWI7Yi5wcm90b3R5cGU9e0Z0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIFpjPWMuTm18fFpjLFJkPW5ldyBaYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVJkLkZ0KDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlNnPXRoaXMuVWc9dGhpcy5UZz0hMTt0aGlzLnNkPVtdO3RoaXMuVGU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRjP251bGw6VGMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEpjP251bGw6SmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/Cm51bGw6SWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVj9udWxsOlYsTmlja0dhbWVMb2FkZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgYmI/bnVsbDpiYixvdlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGdiP251bGw6Z2IsUmFkaWFudE1QOiJ1bmRlZmluZWQiPT09dHlwZW9mIHZjP251bGw6dmMsanc6InVuZGVmaW5lZCI9PT10eXBlb2YgeWE/bnVsbDp5YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgQmM/bnVsbDpCYyx0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB5P251bGw6eSxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHljP251bGw6eWMsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRiP251bGw6VGIsU2ltcGxlVmlkZW9BbmRJbWE6InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgR2M/bnVsbDpHYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSWI/bnVsbDoKSWIsRk9YTkVPUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIE9jP251bGw6T2MsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBxYz9udWxsOnFjLGhpdGJveDoidW5kZWZpbmVkIj09PXR5cGVvZiBtYj9udWxsOm1iLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiByYj9udWxsOnJiLEthbHR1cmE6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIGJjP251bGw6YmMsWE9aQ09NOiJ1bmRlZmluZWQiPT09dHlwZW9mIERhP251bGw6RGEsQkNGbGFzaE9ubHk6InVuZGVmaW5lZCI9PT10eXBlb2YgWGE/bnVsbDpYYSxEZW1vVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB0YT9udWxsOnRhLFRPbmxpbmUyRGV0ZWN0aW9uOiJ1bmRlZmluZWQiPT09dHlwZW9mIFNhP251bGw6U2EsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgWWM/bnVsbDpZYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgWT8KbnVsbDpZfX1jLnJtPWI7Yi5wcm90b3R5cGU9e2M6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMubnMoYSk6W10sYjt0aGlzLlVnPSEwO2lmKGEubGVuZ3RoKXt0aGlzLlRnPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLnVoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5UZSl7aWYodGhpcy5TZylicmVhaztiPXRoaXMuVGVbY107dGhpcy5uZihiKSYmKHRoaXMuc2QucHVzaChiKSx0aGlzLnVoKGIpKX19LG5mOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sbnM6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuVGVbY10sdGhpcy5uZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSx1aDpmdW5jdGlvbihhKXt0aGlzLm5mKGEpJiZhLmMoKX0sSXc6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIG4mJgohdGhpcy5UZylmb3IodGhpcy5TZz0hMCxhPTA7YTx0aGlzLnNkLmxlbmd0aDthKyspdGhpcy5zZFthXS55YiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLnNkW2FdLnliKX19fSkoYyk7dmFyICRjPWMucm18fCRjLEw9bmV3ICRjO0wuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLllqPXRoaXMuYVs2XTt0aGlzLm12PXRoaXMuYVs4XTt0aGlzLmdrPXRoaXMuYVs0XTt0aGlzLmprPXRoaXMuYVs4XTt0aGlzLklqPXRoaXMuYVszXTt0aGlzLkVrPXRoaXMuYVszXTt0aGlzLmR0PXRoaXMuYVsxMF07dGhpcy5qcD10aGlzLmFbOF07dGhpcy5Tcj10aGlzLmFbOF07dGhpcy5xcj10aGlzLmFbM107dGhpcy5sPXRoaXMuYVsxMF19Yy5taT1iO2IucHJvdG90eXBlPXtYajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWWo6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5tdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZ2s6dGhpcy5payhhKX0saWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmprOnRoaXMuSGooYSl9LEhqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Jajp0aGlzLkRrKGEpfSxEazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRWs6dGhpcy5jdChhKX0sY3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmR0OnRoaXMuaXAoYSl9LGlwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qcDp0aGlzLlJyKGEpfSxScjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU3I6dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnFyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubDphfX19KShjKTt2YXIgYWQ9Yy5taXx8YWQsU2Q9bmV3IGFkKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5BPVNkLlhqKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLm9jKGsuVngpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLm9jKGsudHUpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKRi53aWR0aD0xO0YuaGVpZ2h0PTE7Ri5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEYpO3ZhciBUZD1GLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGhhPUYuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEYpO3ZhciBHPW5ldyBSLG09ITE7Ry51YygpO0cuTWcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihHLnVjKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5NZygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0cudWMoKTt2YXIgVWQ9VGQoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csRy5zdCgpLHtpZDpVZH0pfSw1MDApLGxhPWUuZ2EoMTApO2dhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkl5PXRoaXMuYVs1XTt0aGlzLnVpPXRoaXMuYVs4XTt0aGlzLk52PXRoaXMuYVsxXTt0aGlzLkt2PXRoaXMuYVsxXTt0aGlzLmJ2PXRoaXMuYVs3XTt0aGlzLlV1PXRoaXMuYVs1XTt0aGlzLld1PXRoaXMuYVsyXTt0aGlzLiRpPXRoaXMuYVsxMF07dGhpcy5paT10aGlzLmFbMl07dGhpcy5Xcz10aGlzLmFbOV07dGhpcy5sPXRoaXMuYVs3XX1jLld5PWI7Yi5wcm90b3R5cGU9e0h5OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5JeTp0aGlzLnRpKGEpfSx0aTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudWk6dGhpcy5NdihhKX0sTXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk52OnRoaXMuSnYoYSl9LEp2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ldjp0aGlzLmF2KGEpfSxhdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYnY6dGhpcy5UdShhKX0sVHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlV1OnRoaXMuVnUoYSl9LFZ1OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuV3U6dGhpcy5aaShhKX0sWmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLiRpOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5paTp0aGlzLlZzKGEpfSxWczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuV3M6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBiZD1jLld5fHxiZCxWZD1uZXcgYmQoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuQT1WZC5IeSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubWg9dGhpcy5jb25mPXRoaXMuZWI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLm5kPTA7dGhpcy5WYT0iIjt0aGlzLnRkPVtdO3RoaXMudWQ9MDt0aGlzLm9oPSExO3RoaXMuUmU9W119Yy5maT1iO2IucHJvdG90eXBlPXtxdzpmdW5jdGlvbihhKXt0aGlzLm1oPQphfSx4ZDpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuVmE9dGhpcy5wbGF5ZXIuUCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGt3OmZ1bmN0aW9uKGEpe3RoaXMuZWI9YX0saXc6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEVhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5WYV0mJnRoaXMuY29uZlt0aGlzLlZhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuVmFdW2FdKTtyZXR1cm4gYn0semM6ZnVuY3Rpb24oYSxiKXtlLnNiKCJ3ZWx0LmRlIikmJmUuVGEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwKIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLmViKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMudHQoKSl0aGlzLmViLmYodGhpcy5lYi5oZCx0aGlzLmViLkNhLHRoaXMuZWIuU2UsZnVuY3Rpb24oKXt0aGlzLnpjKGEsYil9LmJpbmQodGhpcyksdGhpcy5lYi5sYyk7ZWxzZSBpZih0aGlzLkZzKCkpdGhpcy5ldyhmdW5jdGlvbigpe3RoaXMuemMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudyhrLlljLHRoaXMucGxheWVyLnYoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLkx3KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuZWIsaCk7bC53aCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuZ3UoYSkpfHwKZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuQWUmJihjPXRoaXMucGxheWVyLkFlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLkNlKGEsYyxmKTt0aGlzLnBsYXllci54aChsKX19LHR0OmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMubmQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5uZC5nZXRUaW1lKCksdGhpcy5uZD1hLDNFNTxiPyEwOiExO3RoaXMubmQ9YTtyZXR1cm4hMX0sQnc6ZnVuY3Rpb24oKXtlLlllKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5FYSgiYWRUYWciKTt0aGlzLkVhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5FYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuamcoYSkpP3RoaXMuemMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLAowKSxlLncoay5aYyx0aGlzLnBsYXllci52KCkpKX0sQXc6ZnVuY3Rpb24oYSl7ZS5ZZSgicG9zdHJvbGwiKTtpZighdGhpcy5taCl7dGhpcy5xdyghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5FYSgiYWRUYWciKTt0aGlzLkVhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuRWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5qZyhjKSk/dGhpcy56YyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5aYyx0aGlzLnBsYXllci52KCkpKX19LGpnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxZdjpmdW5jdGlvbigpe3RoaXMucGxheWVyLnZ3KHRoaXMuQXcuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIubGEoKX0sCkFkOmZ1bmN0aW9uKGEpe2UuWWUoIm1pZHJvbGwiKTtpZighdGhpcy5aZyl7dGhpcy5aZz0hMDt2YXIgYj10aGlzLkVhKCJhZFRhZyIpO3RoaXMuRWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkVhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy56YyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5aZz0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5aYyx0aGlzLnBsYXllci52KCkpKX19LFh2OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucHcodGhpcy5BZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5HZSgpfSxjOmZ1bmN0aW9uKCl7dGhpcy5CdygpO3RoaXMucGxheWVyLkdlJiZ0aGlzLlh2KCk7dGhpcy5ZdigpfSxadjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOgphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy50ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuTnkoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnVkPXRoaXMudGQubGVuZ3RofSxGczpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy51ZCYmKGE9ITApO3JldHVybiBhfSxldzpmdW5jdGlvbihhKXt0aGlzLm9oPWE7Zm9yKGE9MDthPHRoaXMudGQubGVuZ3RoO2ErKyl0aGlzLnRkW2FdWyJmdW5jdGlvbiJdKHRoaXMuRXYuYmluZCh0aGlzKSl9LEV2OmZ1bmN0aW9uKGEpe3RoaXMudWQtLTthJiZ0aGlzLlJlLnB1c2goYSk7MD49dGhpcy51ZCYmdGhpcy5vaCgpfSxndTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5SZS5sZW5ndGg7YysrKWI9dGhpcy5SZVtjXSwKYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMuZml8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaXI9dGhpcy5hWzddO3RoaXMuS249dGhpcy5hWzldO3RoaXMuQmk9dGhpcy5hWzVdO3RoaXMuUG89dGhpcy5hWzRdO3RoaXMuRWo9dGhpcy5hWzZdO3RoaXMuaXY9dGhpcy5hWzFdO3RoaXMubnA9dGhpcy5hWzFdO3RoaXMubD10aGlzLmFbMl19Yy5XbD1iO2IucHJvdG90eXBlPXtocjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaXI6dGhpcy5KbihhKX0sSm46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktuOnRoaXMuQWkoYSl9LEFpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5CaTp0aGlzLk9vKGEpfSxPbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUG86dGhpcy5EaihhKX0sCkRqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Fajp0aGlzLmh2KGEpfSxodjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaXY6dGhpcy5tcChhKX0sbXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm5wOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgY2Q9Yy5XbHx8Y2QsV2Q9bmV3IGNkKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkE9V2QuaHIoNCl9KS5jYWxsKGllSm9qdWFiemFpcm9oR3UsaWVKb2p1YWJ6YWlyb2hHdSk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.65.40 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.40.65.243.136.clients.your-server.de
Software
TornadoServer/4.5.3 /
Resource Hash
9326b813f05efe1ac285085eef770b1036f77bdbbedf69f79eb83b35a121040c

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate, br
Host
ssl.1.damoh.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; ioam2018=000e465b7531c34525cb6ce23:1584946596535:1555484196535:.golem.de:1:1555484196535!hvb178; __utmc=21769261; __utmz=21769261.1555484197.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.980209430.1555484196.1555484196.1555484196.1; __utmb=21769261.1.10.1555484197; golem_us=5bb0cb86; golem_uv=5bb0cb86; golem_uz=5bb0cb86; __io=a4e139041.463f71015_1555484196816; __io_unique_43098=17; __io_uh=1; __io_visit_43098=1; __gads=ID=91124d6a96ce1f18:T=1555484196:S=ALNI_MajQvC0Wtmvmb0T-uT3kRdgRTFTPg
Connection
keep-alive
Content-Length
371
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Wed, 17 Apr 2019 06:56:38 GMT
Server
TornadoServer/4.5.3
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
activeview
pagead2.googlesyndication.com/pcs/ Frame D569
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjssTAI7Ir1eQ6oZyJuDOkMzWCSF0_W9xbclSiygGf78x1msk8v2rXIQ6lSpoGljJ79iWeDXv5LIS_4Kkz_4FHEYPRpvAka5PkYPJCcM63nA&sig=Cg0ArKJSzLf7Li5Q_UQxEAE&adk=4154185509&tt=-1&bs=1585%2C1185&mtos=0,1050,1050,1050,1050&tos=0,1050,0,0,0&p=10,1303,610,1603&mcvt=1050&rs=3&ht=0&tfs=1334&tls=2384&mc=0.94&lte=0.94&bas=0&bac=0&avms=geo&rst=1555484197083&rpt=692&isd=0&msd=0&lm=2&oseid=3&xdi=0&ps=1603%2C6248&ss=1600%2C1200&pt=-1&deb=1-1-6-46-15-27-91-14&tvt=2365&r=v&id=osdim&vs=4&uc=10&upc=8&tgt=DIV&cl=1&cec=6&clc=0&cac=0&cd=0x0&v=20190415
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:814::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

pragma
no-cache
date
Wed, 17 Apr 2019 06:56:38 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
usync.html
eus.rubiconproject.com/ Frame BAFA
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.111.230.142 Amsterdam, Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-111-230-142.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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Accept-Encoding
gzip, deflate, br
Cookie
khaos=JUKV4N9F-12-4F7A; rsid=1|AIfsdBUH+v3fWCPuzNowDE/csJlhLqCtkDRRTpP3Ow52wYOfOWzkL8GaZ7+D5+6kXB+stFOgDgurFSicA0miR16t7lELim1UyhM5ZM7bR0169gWtDr9dPKv+JKbHMVeVBrLxkX81aGufzJAw; ses10=241806^1; vis10=241806^1; audit=1|naVuGyos1qpZQZEhY+kZcEGcmvSnLGltgMahFLi0cQOXtG0jIHNzYG69RYya3iefKDvzDhQHTbZD+EbPh3UKYNzpQ7vzkXQ/
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html

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
Mon, 15 Apr 2019 20:45:03 GMT
Content-Encoding
gzip
Content-Length
7451
Content-Type
text/html; charset=UTF-8
Cache-Control
max-age=45671
Expires
Wed, 17 Apr 2019 19:37:50 GMT
Date
Wed, 17 Apr 2019 06:56:39 GMT
Connection
keep-alive
Vary
Accept-Encoding
pd
eu-u.openx.net/w/1.0/ Frame 98B3
0
0
Document
General
Full URL
https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
Requested by
Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
173.241.240.143 New York, United States, ASN36089 (OPENX-AS1 - OPENX TECHNOLOGIES, INC., US),
Reverse DNS
ox-173-241-240-143.xa.dc.openx.org
Software
OXGW/16.132.0 /
Resource Hash

Request headers

:method
GET
:authority
eu-u.openx.net
:scheme
https
:path
/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
accept-encoding
gzip, deflate, br
cookie
i=31dc8ac7-bb11-0822-0a08-78c6fc43fd87|1555484196
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html

Response headers

status
200
vary
Accept
set-cookie
i=31dc8ac7-bb11-0822-0a08-78c6fc43fd87|1555484196; Version=1; Expires=Thu, 16-Apr-2020 06:56:39 GMT; Max-Age=31536000; Domain=.openx.net; Path=/ pd=v2|1555484199|mOgikimWiygu; Version=1; Expires=Thu, 02-May-2019 06:56:39 GMT; Max-Age=1296000; Domain=.openx.net; Path=/
server
OXGW/16.132.0
p3p
CP="CUR ADM OUR NOR STA NID"
date
Wed, 17 Apr 2019 06:56:39 GMT
content-type
text/html
content-encoding
gzip
data
lb34.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb34.s400.meetrics.net/data?/Lod4IJOBALlnFEUkzF2BPGCAAAAAAAByQKAPAAAFAAyQKTTfPAZCAAOA55A55A85B55A58E55A55AFA0yAwzA0BErTfPAPDAAJGAMCAHTfPAPAAAgMA6DAMTfPAPAAAXUAKAAHbosASksFbFjAAAAAAAAAAAAEAAAyQKAAAAAAAHAklFzrF0vFwBFHAhyF0pFrlFsBFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA33Aw4Ey1AwBEMAxzA4yA22Ay0A20A0yAGAkpFylFj0FAAAAIAz0Ay5AwwA11AKA1wAx4A4yAwzA3zAGAihFuuFlyFKA1wAx4A4yAwzA3zAKA1wAx4A4yAwzA3zAxAlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGhFy0FprFlsFlyAGiFhuFulFyBFdJGAMCACMA6DAFAAATfPAAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFuT5ySA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.97 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h222.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:41 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 17-Apr-19 06:56:40 GMT
data
lb34.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb34.s400.meetrics.net/data?/Lod4J0pBATkzFARksFAQtjFUuJNSA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.97 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h222.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:42 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 17-Apr-19 06:56:41 GMT
data
lb34.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb34.s400.meetrics.net/data?/Lod4K0pBA/k0FmVmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A5wAz3Az0Ay0AmjEpkF9xAz4Ay2Az1Ay5A05AymAzpF6lF93A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9hEy0FprFlsFmhEwiF9iEhuFulFyyBmhEwjF90A45AwzA3zA0yA0mAhwFk9B04A5wAz3Az0Ay0AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEhyF0pFrlFslByGEihFuuFlyFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA11A10A40Ax5A32Aw0AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A4wAxyA03AmjEpkF9xAz4Ay2A34A3yA23AxmAzpF6lF9zAwxA4yB1wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9hEy0FprFlsFmhEwiF9yEljF0hFunFslFymAhwFj9B04A45A4wAxyA03AmhEwkF90A44A54AwxAy0A3mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGhFy0FprFlsFlyAGyFljF0hFunFslFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA11A10A40Ax5A33A1wAmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29Bx0A0xAw2Az3A1mAjwFpkF9kElzFr0FvwFmhEwhF91AwwAw3Az3Az3A2mAjpFk9BxzA4yA21A0xAz1A13AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9BhyF0pFrlFsmBhwFi9BzrF5mBhwFj9B1wAwwA3zA3zA32AmhEwkF91AwwAw3Az3Az3A2mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGhFy0FprFlsFlyAGzFr5FmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA11A10A40Ax5A4wA1yAmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F9zA0yA5wAw1A1mAjwFpkF9kElzFr0FvwFmhEwhF91AwxA44AywAz3AzmAjpFk9BxzA4yA22Ay0A20A0yAmzEp6Fl9B33Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9BhyF0pFrlFsmBhwFi9BihFuuFlyFmhEwjF91AwxA44AywAz3AzmAhwFk9B1wAx4A4yAwzA3zAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA11A10A40Ax5A4xA44AmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29Bz0A01Aw3A23AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A24Aw3A00AmjEpkF9xAz4Ay1A0zA2yAyzA5mAzpF6lF9zAwwA42BwxAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9hEy0FprFlsFmhEwiF9yEljF0hFunFslFmhEwjF90A44A52A4wA30A0mAhwFk9B04A45A24Aw3A00AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEhyF0pFrlFslByGEylFj0FhuFnsFlmBhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA11A10A40AywAy4Ay4ATkzFARksFAQtjFxjjddA
Requested by
Host: www.golem.de
URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.97 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h222.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:42 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 17-Apr-19 06:56:41 GMT
pl
insights.plista.com/
0
66 B
Image
General
Full URL
https://insights.plista.com/pl?i=5a9fe1dae45a1d155411456a&ct=7.21&rt=0.135&pt=7.345&pvr=&p=https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&c=desktop&t=article&s=&tg=-1&ctg=-1&_r=1555484202848:4.7.12:20190409-113831
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
23.111.11.152 Phoenix, United States, ASN33438 (HIGHWINDS2 - Highwinds Network Group, Inc., US),
Reverse DNS
Software
NetDNA-cache/2.2 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

status
204
date
Wed, 17 Apr 2019 06:56:42 GMT
server
NetDNA-cache/2.2
x-cache
MISS
map.js
js.adscale.de/
21 KB
6 KB
Script
General
Full URL
https://js.adscale.de/map.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.72 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-72.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
64d36d1aeede6488eafcd8844abb6ea473c9e8bda92b79b51517716cc9d90953

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

x-amz-version-id
x_soTKTeWkKa8VVAYf_8xh_Bj_jVduxx
Content-Encoding
gzip
Last-Modified
Mon, 01 Apr 2019 21:35:44 GMT
Server
AmazonS3
x-amz-request-id
BE2E1F59BC36100D
ETag
"0253570faeffb9f0f2478d761e0edfa7"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Wed, 17 Apr 2019 06:56:42 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5428
x-amz-id-2
XlTO7Su3yZ09xBkhvsfCPeJg0btN+qIbwS/3UaC1kR5iPB9SAecUPR+2XdPgwPaJx4uP/qQg0Vc=
adex.js
dmp.theadex.com/d/607/2256/s/
39 KB
14 KB
Script
General
Full URL
https://dmp.theadex.com/d/607/2256/s/adex.js?ts=97400322
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.104 Hattersheim, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
a5d7896fb3a07c86f0f6f78a31c7b99e2a060a4a0212cfb5d010eeaa38ad0c93

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:42 GMT
content-encoding
gzip
last-modified
Fri, 05 Apr 2019 11:26:03 GMT
server
nginx
etag
W/"5ca73b4b-9c8f"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Wed, 17 Apr 2019 07:01: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: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
194.213.222.30 , Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn3.bbmedia.cz
Software
ibillboard /
Resource Hash
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Wed, 17 Apr 2019 06:56:43 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, 23 Apr 2019 21:55:59 GMT
default.js
ups.xplosion.de/loader/69511/
2 KB
2 KB
Script
General
Full URL
https://ups.xplosion.de/loader/69511/default.js
Requested by
Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.211.90.20 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-211-90-20.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
97cd1bc4baa1de053750912b417b969fa704faeedaaab7ad51ac5276c51e14c6

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

status
200
date
Wed, 17 Apr 2019 06:56:42 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
1543
content-type
text/javascript
p.min.js
cdn.emetriq.de/adp/profiling/0.2.1/
4 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.2.1/p.min.js
Requested by
Host: ups.xplosion.de
URL: https://ups.xplosion.de/loader/69511/default.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:200c:1800:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
9a7be551755cd40ac554a0106394e6c3f757feac8149e8a0e0f8dcd08b1e0e4d

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Thu, 13 Dec 2018 13:56:26 GMT
content-encoding
gzip
last-modified
Thu, 13 Dec 2018 13:47:28 GMT
server
AmazonS3
age
10774818
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
hiWj6aE8JHqtrvyMwCZ_m8sYL51hXzoR
status
200
cache-control
max-age=31536000, no-transform, public
content-type
application/javascript; charset=utf-8
x-amz-cf-id
7nLH1xEermTDmO2r-JVkBtlUWGWB0RyOHoLT_HpaumGQQP7TWLjdCg==
via
1.1 143574384d395dec5e078f9c0bab3391.cloudfront.net (CloudFront)
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=Subdomain%20Takeover%3A%20Microsoft%20loses%20control%20over%20Windows%20Tiles%20-%20Golem.de&hostSiteUrl=https%3A%2F%2Fwww.golem.de%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=0&screen=1200x1600&mbr=5ac8baa3e28ca8cf5599ee776b575ca6&event_id=page_view&_sid=69511&_ver=0.2.1&_seg=jsonp&_=270862060646
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.1/p.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.211.90.20 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-211-90-20.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef34d95cdab4221b80f6522f4c34f74c7597f457cea4d5912b4a43c2871b2d2e

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Wed, 17 Apr 2019 06:56:43 GMT
content-encoding
gzip
access-control-allow-origin
*
vary
accept-encoding
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
status
200
cache-control
must-revalidate,no-cache,no-store
content-type
text/javascript
data
dc371.s79.research.de.com/
43 B
308 B
Image
General
Full URL
https://dc371.s79.research.de.com/data?/dlmkFNOBALl1FDKq1FKq2FMq3FrgMq4FzeKq6FK2mFLkqFK+kyBo23A52AwwA65Ax0A02A26AwhFnlFfpFtwFylFzzFpvFufFpkF6wEylF0pFtlF2qoFx1A11A04A0xA51A05AzzAw2An1F5wAu0FtBFTkzFPPYFBAZAwSAcAAAARksFAQtjFRVBSSA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
144.76.237.196 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h371.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:43 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Wed, 17-Apr-19 06:56:42 GMT
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/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.77.75.246 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-77-75-246.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.7 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Tue, 16 Apr 2019 09:09:10 GMT
Content-Encoding
gzip
Last-Modified
Tue, 16 Apr 2019 09:08:55 GMT
Server
akka-http/10.1.7
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/
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSa0WS_3Wi7ABsfCWDUkWsfABifABSfABSfABi7ABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4189937415699073958
42 B
594 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=4189937415699073958
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.211.90.20 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-211-90-20.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

status
200
date
Wed, 17 Apr 2019 06:56:43 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
42
content-type
image/gif

Redirect headers

pragma
no-cache
date
Wed, 17 Apr 2019 06:56:43 GMT
server
nginx
location
https://uss.xplosion.de/usersync?sid=65966&fpid=4189937415699073958
p3p
CP="CAO PSAa PSDa IVAa IVDa OUR UNI COM NAV"
status
307
cache-control
no-store, no-cache, must-revalidate
access-control-allow-credentials
true
content-type
text/html; charset=utf-8
content-length
107
expires
0
segments
api.theadex.com/v0.9/pub/
140 B
210 B
Script
General
Full URL
https://api.theadex.com/v0.9/pub/segments?access_token=y5fWjpPcqPTEF7fuHtSSUIh1UnD1w2hVEt2Y2PjI&callback=window.ibb_lib.ibb_store
Requested by
Host: bbcdn-bbnaut.ibillboard.com
URL: https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
89.163.159.124 Hattersheim, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
/
Resource Hash
034d63d5ae8dd718e7a38bbd336fae2ae8bd1dd02baf156a49e60921ae40c7fe

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

status
200
date
Wed, 17 Apr 2019 06:56:43 GMT
content-length
140
content-type
text/plain; charset=utf-8
activation
adstax-match.adrtx.net/ Frame 5167
0
0
Document
General
Full URL
https://adstax-match.adrtx.net/activation?receiverId=adaud
Requested by
Host: cdn.adrtx.net
URL: https://cdn.adrtx.net/adrtxtag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.213.21.157 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-213-21-157.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.7 /
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_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Wed, 17 Apr 2019 06:56:43 GMT
Server
akka-http/10.1.7
X-Error-Reason
Missing UserId in activation request for config adaud.
Content-Length
39
Connection
keep-alive
usersync
uss.xplosion.de/
42 B
594 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=5ac8baa3e28ca8cf5599ee776b575ca6
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.211.90.20 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-211-90-20.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

status
200
date
Wed, 17 Apr 2019 06:56:43 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
42
content-type
image/gif
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:time[url:%2Fnews%2Fsubdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html,type_article:shortread,article_layout:default,site_skin:desktop,device:desktop,custom_page_type:Article%20page,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1555484206848
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.118.169 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.169.118.40.188.clients.your-server.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Wed, 17 Apr 2019 06:56:46 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

203 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| onselectstart object| onselectionchange function| queueMicrotask object| Golem object| _gcpx string| gafc_rubrik string| gafc_zone number| ord function| $ function| jQuery string| IVW object| _gafccsi function| getSDG object| SDG function| showSdgDebug object| googletag object| pbjsYLHH boolean| yieldlove_prevent_autoload string| sdgMeetricsStatus object| _enqAdpParam object| fXm_Head object| SDM_head undefined| SDM_resource string| SDM_target boolean| _golem_html5ads_enable function| _onSocialClick object| closure_memoize_cache_ object| googleToken object| googleIMState object| google_js_reporting_queue function| processGoogleToken string| grmppath object| grmpfuncs function| grmpinit function| loadScript function| grmpload object| PLISTA object| de_meetrics object| yieldlove_site_settings object| YLHH object| __core-js_shared__ object| core object| yieldlove_cmd function| pbjsYLHHChunk string| logLevel object| clrm object| NUGGjson string| n_pbt object| _m6rq object| BigScreen function| PLISTA_JSONP_3A93DA object| PLISTA_ object| iAbo function| golemAcceptCookies object| stroeerCore boolean| google_measure_js_timing boolean| google_noFetch boolean| google_DisableInitialLoad number| __google_ad_urls_id number| google_unique_id object| google_reactive_ads_global_state object| gaGlobal object| adsbygoogle object| google_ad_modifications object| google_sa_queue object| google_sl_win function| google_process_slots function| google_spfd number| google_lpabyc object| google_sv_map object| google_t12n_vars function| Goog_AdSense_getAdAdapterInstance function| Goog_AdSense_OsdAdapter function| google_sa_impl object| google_jobrunner object| google_persistent_state_async object| google_pub_config 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 boolean| deliveringAds function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb boolean| subDomainCheckVar object| gtssec number| gtsrand object| gtsifr object| gtsanc function| AIYUIdd object| imucn955Flags string| imucn0a4Rnd object| imucnd3aatc object| oms_debug string| sdm_ift function| stroeerCoreConnect string| szmvars object| iom object| iam_data string| ioObject function| io object| ioPageArgs object| _io_config string| disableStr object| _gaq string| shareUrl object| ___gcfg number| _m6rApiLoaded boolean| imucn623sdl boolean| imucn623sdln string| imucnd3aagenat string| imucnd3aasthash boolean| imucn1c2forceimp object| nativendo_5964de887313b_conf boolean| imucn485Body boolean| imucnb04Detect object| imucna09Mobile object| imucnd3aa1 object| imucnd3aao1 object| imucnd3aao2 object| imucnd3aao3 object| imucnd3aa2 number| imucnd3aad3 object| imucnd3aa4 object| imucnd3aa5 boolean| imucn110ij object| _gat object| rmp3pi number| rmp3lphi function| SwfVideo object| exportz object| f object| _m6rOnce number| _m6rContainerLoaded function| dummy function| log function| debug function| info function| warn function| error object| nativendo_pc function| Nativendo object| NativendoLoader object| nativendo object| nativendo_5964de887313b object| __io object| LP4 function| doLogRequest function| isNum function| testKey function| testStr object| rmpGlobals function| RadiantMP function| FuckAdBlock object| fuckAdBlock number| BBWidth string| _io_uniques_holing_params boolean| imucn2a3Track number| mtrcs_timer number| mtrcs_pid function| mtrcs_callReadJavascript object| _lntv function| lntOnLoad number| lnt_z 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_379920 object| ieJojuabzairohGu boolean| A object| kg object| rg function| videopkgInterface object| nativendo_5964de887313b_map object| nativendo_loc object| closure_lm_110843 function| mtrcs_vpaid_trigger function| mtrcs_vpaid_trigger_914466 string| hic_qos function| _h object| _adexc object| adex object| _EQLService object| _EQPScript object| _EQPService object| _emqAdexGif object| _adrtx number| _emqUSSMutex function| _emqUSSCall string| segments object| segmentsArr undefined| result string| _emqstr object| ibb_lib

1 Cookies

Domain/Path Name / Value
www.golem.de/ Name: GED_PLAYLIST_ACTIVITY
Value: W3sidSI6InYva2oiLCJ0c2wiOjE1NTU0ODQyMDIsIm52IjowLCJ1cHQiOjE1NTU0ODQxOTYsImx0IjoxNTU1NDg0MTk2fV0.

3 Console Messages

Source Level URL
Text
console-api log URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js(Line 14)
Message:
JQMIGRATE: Migrate is installed, version 1.4.1
console-api log URL: https://www.golem.de/news/subdomain-takeover-microsoft-loses-control-over-windows-tiles-1904-140717.html(Line 1070)
Message:
gfpop
console-api log URL: https://cdn.stroeerdigitalmedia.de/Ads/script/sDm_BB_Pos.js(Line 86)
Message:
BBDomain: www.golem.de

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=11001100; includeSubDomains; preload

Indicators

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

ad.yieldlab.net
ads.golem.de
adscale.nuggad.net
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
api.theadex.com
asn.advolution.de
bbcdn-bbnaut.ibillboard.com
c.bacontent.de
c.t4ft.de
cdn-a.yieldlove.com
cdn.adnxs.com
cdn.adrtx.net
cdn.asn.advolution.de
cdn.emetriq.de
cdn.m6r.eu
cdn.onthe.io
cdn.radiantmediatechs.com
cdn.stroeerdigitalgroup.de
cdn.stroeerdigitalmedia.de
cm.g.doubleclick.net
cpx.golem.de
cpxl.golem.de
d.bacontent.de
dc371.s79.research.de.com
de.ioam.de
dmp.theadex.com
eu-u.openx.net
eus.rubiconproject.com
farm.plista.com
fastlane.rubiconproject.com
fra1-ib.adnxs.com
googleads.g.doubleclick.net
hb.adscale.de
hgc-cf-cache-1.svonm.com
ib.adnxs.com
ih.adscale.de
imasdk.googleapis.com
insight.adsrvr.org
insights.plista.com
irqs.ioam.de
js.adscale.de
lb34.s400.meetrics.net
media.plista.com
pagead2.googlesyndication.com
s0.2mdn.net
s3.amazonaws.com
s400.mxcdn.net
s79.mxcdn.net
s79.research.de.com
script.ioam.de
secure.adnxs.com
securepubads.g.doubleclick.net
si.nuggad.net
ssl-golem.met.vgwort.de
ssl.1.damoh.golem.de
ssl.google-analytics.com
static.plista.com
stats.g.doubleclick.net
t.bacontent.de
t4ft.de
tpc.googlesyndication.com
tracking.m6r.eu
tt.onthe.io
ups.xplosion.de
uss.xplosion.de
video.golem.de
www.golem.de
www.google-analytics.com
www.googletagservices.com
xpl.theadex.com
yieldlove-d.openx.net
104.111.230.142
136.243.3.97
136.243.65.40
138.201.137.174
138.68.66.61
144.76.158.35
144.76.237.196
161.156.66.178
172.217.18.98
172.217.21.194
173.241.240.143
173.241.240.220
185.33.223.208
185.33.223.221
188.40.118.169
193.46.63.75
194.213.222.30
2.18.232.130
2.18.233.67
2.18.234.72
2.23.75.186
213.19.162.31
213.9.42.202
23.111.11.152
23.211.2.78
23.38.32.164
23.8.6.177
2600:9000:200c:1800:1c:8c89:a300:93a1
2606:4700:20::6819:f07
2606:4700:30::6818:6624
2a00:13c8:f5::f:4b3d:175
2a00:13c8:f5::f:4b3d:17a
2a00:13c8:f5::f:4b3d:181
2a00:1450:4001:806::2002
2a00:1450:4001:80b::2002
2a00:1450:4001:814::2002
2a00:1450:4001:815::2001
2a00:1450:4001:815::2002
2a00:1450:4001:816::200e
2a00:1450:4001:820::200a
2a00:1450:4001:821::2006
2a00:1450:4001:825::2002
2a00:1450:400c:c00::61
2a00:1450:400c:c08::9a
2a01:4f8:120:53ef::2
2a01:4f8:202:42d4::2
2a02:26f0:6c00:18a::5f76
35.190.35.232
37.252.173.27
52.211.90.20
52.213.21.157
52.216.129.101
54.192.94.254
54.192.94.8
54.246.153.43
54.77.75.246
69.16.175.10
77.247.84.129
77.247.84.149
78.47.15.207
80.82.201.88
85.10.200.83
89.163.159.101
89.163.159.104
89.163.159.124
91.215.100.40
91.215.103.64
005b9234bb1818c7d1298e1c1ad7f62f9d11a74074657a09157092cc7e9f135b
02a8df34e2a6941840bd5caa0e5e71a7f5e773768b55c395c2f1d023042c1908
030abf52b6ae97a39b654a1501817eabbd77224dea6175a9c7a6a61f45ee4008
034d63d5ae8dd718e7a38bbd336fae2ae8bd1dd02baf156a49e60921ae40c7fe
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
0bf198aee5a9848fb9676ecfd200c4bcab821c11ac18efdad771f8a5573ecf06
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47
1228b3630117143f99622daac0928ea8b299c124bfe74e594c3990956e261e07
1259ea99bd76596239bfd3102c679eb0a5052578dc526b0452f4d42f8bcdd45f
12e1e67ef5f1ce88f9495e46e13538b1f22874b1af51833f0e03dc4b12c7f4b1
13533d8fe0663f05bac2eea2a5bd334b6936ccde08a9aa1f86257a5ce90450ea
13b219900bd84f484766a5a90357d312a6583a41591452752da8c9c12cc662b6
1478c0f24c51bfaeb59e580f11f0baa3742eecf98db25f9f60c04a42ee35f59d
149ef17980eb2cb2398c3c7e569858c8b57c2fdf723f82dda3676780cac4fe2d
14ab4b5ec62c192ebeefbf12502ff9570eff1ad636f236df06cab090803f29fb
14c912652278a80cde809c24f37f3e86754d820ca7c7b2c409af205de7d22d9a
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8
1895cdc2ac5045d44faced3b716858681fa1b94a66d713e5f75fc8993e47e871
1f405ddbb1e3b65da78d0d83af6fd0f5cd1567dce3e2af32112dc756a70ece08
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9
210f2313026c87eacf7084400de0e05dc22d269f598fc3f2401ef2fb4cbfeef2
2302ce8cf6307e809a07b5cd6ba8a546381a971b75fcc2971090154eea40c4f9
2463e73f784cd35a6c5d90c18a5ca357a23cbd33dc12479b357525cfb6e14477
250923173308c9cfd284f3afad886e18e796f1f1ed266fcb4dbb55fd6e713daa
25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d
2aa84172203be25d21a2abb41e4c6115d3a3f84664fb9008709e01445763e81e
2abfcd790056afc481c48cd6f8e35b79b3bccf309ff6f2c0dfad0650df73d645
2f9302edbbfc6fd039809ad639ab76a78ee7a176735f187b3b540dcf536a85bf
3168b9244a0039127b0265b9593da97e4eedf6baf6a12524e0f2b326d78854f3
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1
3414d646a7395a4c3d184f90cedafa2b9c568fbc9f9414547a1276ad7971244b
3738c623b836c0b4de4507f3824ed09b00a2f20c8c26198443a85e4e8b1222e6
3814609147d9cc6299925b351bf3f95074474a35b151af98d64e02944f2475ad
3a52aed15bf03666803d2c7dfe5f84fc1a8600ec4231403b66bbe7a614ec42c2
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5
44594559c81c82f38b8c87de9ce12b518f2fc71cd6927c9c5fec9a274e902448
4620e48e88152afd297b78cd9812c80de495c96d54b1c8fd46491b837fcdbb6f
46f3a2287df06b55759f8944ae178b9608de9ddf90c5136a459861df4888b0cc
48b8c07b634d64c042f313e2fb074178a45702f3529f4ec840d1b55f9951bfe1
4b5b6b15c6255109e06720cce42a06d3aead8b7874423d9c52cb0303212c25ef
4c21aea3d1e9061beaa0530ee1bd2045ad4cb87d97993987a3a17bff25c1892a
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff
4f3c6969c7740cde6552ca184d31878e93280486979b16ac52231f15516c4eb4
5149ee890a73989bdafa7c74e8aadd100cf3ac324fc386592cb708c7b3633b87
5160f205cf787448cd7177537bf9fbc93cbb11e172933d0b226e05c747baf205
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
55e30adb2faf80e59e4a70a75809a573ed0acd7b6fb703bde722bd3ddf56584d
57c2e726a99e0cd4d74abe9a1e39d0666c6f8f4c3b66fede44fdb864d014f50d
585cc11b4d20958229b3e7f944f3c7d616e947fdf93777fdee3bae2b3da47207
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd
5a7eb85e3b035673ff1e9f66977c697902a8be8235e3ebbd233b8d2636cfaed1
5bc83c1ce153350a2061ea6314c42b87fb68b61078c0d06c3d50fab595009157
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418
5ccef4c578bc4792e27c6b094f421f3948add858035cf045a8471cbe2d7d59ed
5da000b164d6eaecd142e3faff163d19cc4c2a66eefb4adcb2913937bd92f329
600a0718bc411395294d3af96651470ec26c15c3f0a6ca3b579a523c9098b4ce
614b40b2e3a1231356677db78fd4084064c30076610e4a3143237be5d052ec53
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
640f0a03cd1e9c721ac8844b006b9047b070a9f7d13a3278b98fb0461947dd8f
64d36d1aeede6488eafcd8844abb6ea473c9e8bda92b79b51517716cc9d90953
653ecfa4fbb8a0a5085d4eb14fc668c8cd30ff0b51616f7a8032c88d7468ea93
675e0cb9411504eb34cebde60790c65e7f6c50dd332e937c3a6309e8bdebf2ef
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
6a842ea462daca2a0b5a0f5f25bcfc8e0059ac811ca6c6a1bc54e4d9119621c3
7152ad98e1f372f3b835635caad24256a8b5ba093934fe38e32e342b632a1f64
71561a3bca82f8abb1c48231b9d1a6500aa76c5f3eb838f2ac1dc0c81c5811ae
72ce44d1321e5caeec893cabdf662745ce2d8af68b65665b6e62e5f7bbcd5e0f
73f3e1b6a98ae5f1890457e2a0dd0986a1a7d9487e17240ed7ffdc849580aa95
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
76ceb9b46c9787fba45d74064ac8e7ea819b8cfe3060d11a0c9cea3706f4575f
7e7fa886d5d75c745d95be4fc3c5bfb4c988019b3f643c669734612345e1b8c8
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
8453ec595b19e74278586279557ad2ed3ff9e76820a6b4c4eaa81072cbd23200
846949c5a40e3ffbb702473e54dfac0646541aa624a844369b6e24e51ddaf96b
868bf06674305de7f90c6b6c68238aa1a6313548256418f988f1f4f0fafcb040
885cd8d835b8329a2b3d8c5e437cf44c6baec7155c945e0f8616342a95128e1d
8a5ebf17c751099d2f751d23dd57cd262691ccc803fc6f8fa1712922a86a8a8d
8b7ec20255458d5b7559ce3ee3793cf5590a049c75a0abae756fa13e80485181
8d70b3e6badb6973663b398d297bb32eaedd08826a1af98d0a1cfce5324ffce0
8df226d462a064cf32788982560dbc97cbacfaa8ff9ba137cf032d6771cc9228
9326b813f05efe1ac285085eef770b1036f77bdbbedf69f79eb83b35a121040c
962bc864987517a2624229d5639cf0881e96c246d3db5d92e6b730bda976b339
96bff9a63428fcafaa40226d7ccf7b90ab5776979db144a62bdef6a7a77d5eec
97cd1bc4baa1de053750912b417b969fa704faeedaaab7ad51ac5276c51e14c6
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a
9a7be551755cd40ac554a0106394e6c3f757feac8149e8a0e0f8dcd08b1e0e4d
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627
9e08d9b8d1eb5cfb13e10bc6afb3a6f3a40f6ac1f65c6ecd076dc66b7edafb6a
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
a23a7641dea5a45304ac57263abd3595ab2fa7379b96de9e792fd916ab541936
a41946e51bc5dbf3f667aa2938c6b41e02c72b2f7479d75fae7b8f1b32c292dd
a4e2ab69b80ecc4e29d8084f4e849300660944f81f87a4960ff5a017aa750098
a5bca980db62cd62b8af6d7e13a8fca10bcf3275d804a266bac4cd2907e206d2
a5d7896fb3a07c86f0f6f78a31c7b99e2a060a4a0212cfb5d010eeaa38ad0c93
aba92b1af0abb35eca058a52b933b1436b0323ed924c0e8650deb08267425dae
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
b027fc110a1c4310d433d4be3ffa26b70886ed33a1ec1a2b8270588519507f00
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d
b5a2ce9fe5fb1d55a67996034ca0a0094564ab6ff8c284a9b921f44cf3a082ff
b71c20271d9c80d1a71aa0ab9935281c4fa8ac404533f1a0747d7fb03fc68e79
b8121230be7463e25719852162bfad7b15b22b47f76c2de50c15c49b5d589496
b8f790879457abe43314fb2ed842df1aaf949bdd68433dbb59ca7e8f02566bb4
bb7c8a563d7d215b6c66fa0fcc6d637ea9b8c1083de7ea83c51900eee4415d8a
be246e14547e2c75bbfd5f64a5d54ad7c5acf4859600970481b18a9c6dab8457
c354b19e4b3822248f56b3c7b43ce39671277cf09fc188cde217d98bc076ebb5
c7066f3d52d99699667c523192ccf1354d06672c2d21073177ea8d15043cddd2
c84c74f33c1a1dbc16e8abe0c2ad14706d00a0e9169ece5f60a114ab3cd7a7ee
ce7cecb1e1ebfd9f4e3a8c8dc00fc6c218e952fd35b2e86811f6db7f47ff700e
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
cfedbaf841d07ac07ac1a0c50542476d7b97bf14dc2121841d780ad22d0b8751
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1
d309f096791ea07b144ed52f7905e5bef30710408b7eb4fa1d62df755ed85206
d5afb0a142bbc8ca74eac73a392f8379884d08dd450f5f4e7044dc0edcfc25e0
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13
d79a2c08ec56eb5e1c76ca58af8b280d29c8792641565d3e9983a9ea8f7e9bb6
d9eb077a0ddaacd93c8b318432751908eb77569685dd1ffd5e33403b92d0c6c7
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e4885a28625faed1eddb274893c3153424206b7bd0fa0ec3b40478537f973d60
e570d0bed4f62e7c97a2849d4450f78a57dd8d80bce74c9853bce0e6b94dfe6c
e6481d35736649e0e91386eabc586257723aaac7bfa5a5e9ce4df73e1db778a1
e72acd75e28308144c191955763a907264b850d4e8e2960d724f273e4934e34d
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c
ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
eb817a345d87a4c839f62287f22590f4b4792d40cfc257ceb09dbe2857f225a0
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546
ef1897a8e51a7742e7278ff4ac5f87b0e211f02393f98e84fb9de905c82be3b2
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
ef34d95cdab4221b80f6522f4c34f74c7597f457cea4d5912b4a43c2871b2d2e
ef958e61caf88d2aaf88bbdb8c342dd4d3b330b22cc035d85825a237f414f060
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f1b0696c82aed5a85efb033561f5a8c6c5d72fae12aeb0f8d51b009cc14a33b9
ff8d0cd9b6e1af7e78d6e1c78d2e71bd6c887ec2f83277305d69f8252f6c26d6