Submitted URL: http://golem.de/
Effective URL: https://www.golem.de/
Submission: On September 21 via api from CZ

Summary

This website contacted 48 IPs in 6 countries across 32 domains to perform 194 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
1 68 77.247.84.129 25291 (SYSELEVEN...)
2 77.247.84.128 25291 (SYSELEVEN...)
6 2a00:13c8:f5:... 25291 (SYSELEVEN...)
8 2a00:13c8:f5:... 25291 (SYSELEVEN...)
2 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 91.215.100.39 43407 (INFONLINE-AS)
1 2a00:1450:400... 15169 (GOOGLE)
8 2a00:1450:400... 15169 (GOOGLE)
14 2.18.235.40 16625 (AKAMAI-AS)
1 2600:9000:200... 16509 (AMAZON-02)
2 143.204.96.211 16509 (AMAZON-02)
1 1 34.249.64.202 16509 (AMAZON-02)
2 34.251.222.238 16509 (AMAZON-02)
2 2.18.232.23 16625 (AKAMAI-AS)
1 3 89.163.159.101 24961 (MYLOC-AS)
1 2600:9000:200... 16509 (AMAZON-02)
2 2.18.232.233 16625 (AKAMAI-AS)
1 18.130.208.27 16509 (AMAZON-02)
4 2a00:1450:400... 15169 (GOOGLE)
12 172.217.22.98 15169 (GOOGLE)
1 52.94.216.48 16509 (AMAZON-02)
1 178.250.2.89 44788 (ASN-CRITE...)
1 185.33.223.204 29990 (ASN-APPNEXUS)
6 54.194.25.183 16509 (AMAZON-02)
17 2a00:1450:400... 15169 (GOOGLE)
1 2 91.215.100.40 43407 (INFONLINE-AS)
1 165.227.149.77 14061 (DIGITALOC...)
1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 2600:9000:200... 16509 (AMAZON-02)
1 1 66.117.28.86 15224 (OMNITURE)
1 1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
2 2 85.114.159.118 24961 (MYLOC-AS)
4 88.99.5.37 24940 (HETZNER-AS)
1 95.216.24.149 24940 (HETZNER-AS)
2 52.216.169.93 16509 (AMAZON-02)
1 54.72.140.158 16509 (AMAZON-02)
1 85.114.144.195 24961 (MYLOC-AS)
1 1 2001:16e0:10a... 12611 (RKOM R-KO...)
1 2001:16e0:10a... 12611 (RKOM R-KO...)
2 143.204.101.118 16509 (AMAZON-02)
1 52.208.127.173 16509 (AMAZON-02)
1 2400:cb00:204... 13335 (CLOUDFLAR...)
1 62.138.242.228 61157 (PLUSSERVE...)
2 2a00:1450:400... 15169 (GOOGLE)
1 178.250.0.130 44788 (ASN-CRITE...)
1 143.204.101.112 16509 (AMAZON-02)
1 216.58.205.230 15169 (GOOGLE)
1 148.251.0.183 24940 (HETZNER-AS)
1 2607:f8b0:400... 15169 (GOOGLE)
2 136.243.65.40 24940 (HETZNER-AS)
194 48
Apex Domain
Subdomains
Transfer
90 golem.de
golem.de
www.golem.de
iqdtms.golem.de
cpxl.golem.de
video.golem.de
ads.golem.de
cpx.golem.de
ssl.1.damoh.golem.de
2 MB
20 googlesyndication.com
tpc.googlesyndication.com
pagead2.googlesyndication.com
224 KB
18 doubleclick.net
securepubads.g.doubleclick.net
stats.g.doubleclick.net
googleads.g.doubleclick.net
117 KB
15 moatads.com
z.moatads.com
mb.moatads.com
px.moatads.com
431 KB
6 onthe.io
cdn.onthe.io
tt.onthe.io
18 KB
6 demdex.net
dpm.demdex.net
iqdigital.demdex.net
5 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
53 KB
3 yieldlab.net
ad.yieldlab.net
p.yieldlab.net
2 KB
3 theadex.com
dmp.theadex.com
xpl.theadex.com
15 KB
3 amazon-adsystem.com
c.amazon-adsystem.com
aax.amazon-adsystem.com
25 KB
3 ioam.de
script.ioam.de
de.ioam.de
10 KB
2 googleapis.com
imasdk.googleapis.com
79 KB
2 df-srv.de
d.df-srv.de
1 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 amazonaws.com
s3.amazonaws.com
1 KB
2 adition.com
dsp.adfarm1.adition.com
964 B
2 google-analytics.com
www.google-analytics.com
ssl.google-analytics.com
17 KB
2 google.com
adservice.google.com
342 B
2 google.de
adservice.google.de
342 B
2 adobedtm.com
assets.adobedtm.com
43 KB
2 xplosion.de
ups.xplosion.de
5 KB
2 emetriq.de
dyn.emetriq.de
cdn.emetriq.de
2 KB
2 cloudfront.net
dx6ctphzljkf1.cloudfront.net
d1pywvbolq0b04.cloudfront.net
32 KB
1 gstatic.com
csi.gstatic.com
56 B
1 2mdn.net
s0.2mdn.net
10 KB
1 criteo.net
static.criteo.net
12 KB
1 whitepaperdb.de
golem.whitepaperdb.de
1 radiantmediatechs.com
cdn.radiantmediatechs.com
2 KB
1 everesttech.net
cm.everesttech.net
527 B
1 adnxs.com
ib.adnxs.com
711 B
1 criteo.com
bidder.criteo.com
186 B
1 googletagservices.com
www.googletagservices.com
8 KB
194 32
Domain Requested by
67 www.golem.de www.golem.de
tpc.googlesyndication.com
12 pagead2.googlesyndication.com www.golem.de
pagead2.googlesyndication.com
securepubads.g.doubleclick.net
12 securepubads.g.doubleclick.net www.googletagservices.com
securepubads.g.doubleclick.net
www.golem.de
8 px.moatads.com www.golem.de
8 tpc.googlesyndication.com www.golem.de
securepubads.g.doubleclick.net
8 video.golem.de www.golem.de
text
6 z.moatads.com www.golem.de
6 cpxl.golem.de www.golem.de
5 googleads.g.doubleclick.net pagead2.googlesyndication.com
5 tt.onthe.io cdn.onthe.io
3 ssl.1.damoh.golem.de text
3 hgc-cf-cache-1.svonm.com www.golem.de
text
3 iqdigital.demdex.net assets.adobedtm.com
www.golem.de
3 dpm.demdex.net assets.adobedtm.com
www.golem.de
2 imasdk.googleapis.com www.golem.de
imasdk.googleapis.com
2 d.df-srv.de 1 redirects www.golem.de
2 xpl.theadex.com 1 redirects www.golem.de
2 s3.amazonaws.com www.golem.de
text
2 dsp.adfarm1.adition.com 2 redirects
2 de.ioam.de 1 redirects www.golem.de
2 adservice.google.com www.googletagservices.com
pagead2.googlesyndication.com
2 adservice.google.de www.googletagservices.com
pagead2.googlesyndication.com
2 ad.yieldlab.net www.golem.de
2 assets.adobedtm.com www.golem.de
assets.adobedtm.com
2 ups.xplosion.de www.golem.de
cdn.emetriq.de
2 c.amazon-adsystem.com www.golem.de
c.amazon-adsystem.com
2 ads.golem.de www.golem.de
2 iqdtms.golem.de www.golem.de
1 csi.gstatic.com tpc.googlesyndication.com
1 s0.2mdn.net imasdk.googleapis.com
1 static.criteo.net dx6ctphzljkf1.cloudfront.net
1 golem.whitepaperdb.de securepubads.g.doubleclick.net
1 cdn.radiantmediatechs.com www.golem.de
1 adstax-match.adrtx.net cdn.adrtx.net
1 p.yieldlab.net www.golem.de
1 cdn.adrtx.net www.golem.de
1 stats.g.doubleclick.net www.golem.de
1 ssl.google-analytics.com 1 redirects
1 cm.everesttech.net 1 redirects
1 cdn.emetriq.de ups.xplosion.de
1 cpx.golem.de www.golem.de
1 www.google-analytics.com www.golem.de
1 cdn.onthe.io www.golem.de
1 ib.adnxs.com dx6ctphzljkf1.cloudfront.net
1 bidder.criteo.com dx6ctphzljkf1.cloudfront.net
1 aax.amazon-adsystem.com c.amazon-adsystem.com
1 mb.moatads.com z.moatads.com
1 d1pywvbolq0b04.cloudfront.net www.golem.de
1 dmp.theadex.com www.golem.de
1 dyn.emetriq.de 1 redirects
1 dx6ctphzljkf1.cloudfront.net www.golem.de
1 www.googletagservices.com iqdtms.golem.de
1 script.ioam.de www.golem.de
1 golem.de 1 redirects
194 54

This site contains links to these domains. Also see Links.

Domain
video.golem.de
forum.golem.de
account.golem.de
jobs.golem.de
Subject Issuer Validity Valid
*.golem.de
GeoTrust RSA CA 2018
2018-07-27 -
2019-08-28
a year crt.sh
*.ioam.de
COMODO RSA Organization Validation Secure Server CA
2017-12-22 -
2020-12-21
3 years crt.sh
*.g.doubleclick.net
Google Internet Authority G3
2018-08-28 -
2018-11-20
3 months crt.sh
tpc.googlesyndication.com
Google Internet Authority G3
2018-08-28 -
2018-11-20
3 months crt.sh
moatads.com
DigiCert ECC Secure Server CA
2018-01-09 -
2019-01-09
a year crt.sh
*.cloudfront.net
DigiCert Global CA G2
2017-11-22 -
2018-11-21
a year crt.sh
c.amazon-adsystem.com
Amazon
2018-03-12 -
2019-03-12
a year crt.sh
*.xplosion.de
Thawte RSA CA 2018
2018-03-06 -
2019-01-12
10 months crt.sh
assets.adobedtm.com
DigiCert SHA2 High Assurance Server CA
2018-04-06 -
2019-04-11
a year crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2018-02-16 -
2019-10-19
2 years crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2018-02-08 -
2019-02-08
a year crt.sh
*.moatads.com
DigiCert SHA2 Secure Server CA
2018-04-27 -
2019-04-27
a year crt.sh
*.google.com
Google Internet Authority G3
2018-08-28 -
2018-11-20
3 months crt.sh
aax-eu.amazon-adsystem.com
Amazon
2018-03-08 -
2019-03-08
a year crt.sh
*.criteo.com
DigiCert SHA2 Secure Server CA
2017-11-21 -
2018-11-26
a year crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2018-01-25 -
2019-01-25
a year crt.sh
*.demdex.net
DigiCert SHA2 High Assurance Server CA
2018-01-09 -
2021-02-12
3 years crt.sh
*.onthe.io
COMODO RSA Domain Validation Secure Server CA
2018-03-28 -
2019-03-28
a year crt.sh
*.emetriq.de
RapidSSL TLS RSA CA G1
2018-01-08 -
2020-03-08
2 years crt.sh
s3.amazonaws.com
DigiCert Baltimore CA-2 G2
2018-08-02 -
2019-10-25
a year crt.sh
*.adrtx.net
Amazon
2017-10-25 -
2018-11-25
a year crt.sh
*.df-srv.de
thawte SHA256 SSL CA
2016-12-12 -
2019-12-12
3 years 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
2018-04-19 -
2019-04-19
a year crt.sh
golem.whitepaperdb.de
Let's Encrypt Authority X3
2018-09-04 -
2018-12-03
3 months crt.sh
*.googleapis.com
Google Internet Authority G3
2018-08-28 -
2018-11-20
3 months crt.sh
*.criteo.net
DigiCert SHA2 Secure Server CA
2017-11-21 -
2018-11-26
a year crt.sh
*.doubleclick.net
Google Internet Authority G3
2018-08-28 -
2018-11-20
3 months crt.sh
ssl.1.damoh.golem.de
Let's Encrypt Authority X3
2018-07-24 -
2018-10-22
3 months crt.sh

This page contains 20 frames:

Primary Page: https://www.golem.de/
Frame ID: 9A658E08B0E826F9F579696DE097DD15
Requests: 167 HTTP requests in this frame

Frame: https://iqdigital.demdex.net/dest5.html?d_nsid=0
Frame ID: 36F8FF608B007AF1649EB69ECB45755A
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/html/r20180917/r20180604/zrt_lookup.html
Frame ID: 36DA5F4B2C09DC89F02F36C2F000A25F
Requests: 1 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
Frame ID: 405FE2F0F2A2DC30A76F16F6902F5A5B
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/osd_listener.js
Frame ID: 545DF7D7939FE537DBC211BD8A785BDC
Requests: 3 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/osd_listener.js
Frame ID: 5A9280FD8709A582290716BE5C31C770
Requests: 3 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=6643888890&adk=3280156863&adf=3446949021&w=520&lmt=1537549838&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1537549837969&bpp=16&bdt=873&fdt=19&idt=293&shv=r20180917&cbv=r20180604&saldr=aa&abxe=1&correlator=5921099423551&frm=20&pv=2&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&ga_fc=1&iag=0&icsg=2955487960108992&dssz=82&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=453&ady=4031&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064254&oid=3&rx=0&eae=0&fc=528&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=7&osw_key=636311223&ifi=4&fsb=1&xpc=ntjkkyk7hH&p=https%3A//www.golem.de&dtd=322
Frame ID: 51A21E9FF6386D41BBE0AB228A44375B
Requests: 1 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Frame ID: CBE0426039CDCE0C5C292BDFD226D18F
Requests: 9 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
Frame ID: DE15449F8D6B926BC84C8C47543F18EE
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=9597355291&adk=1011330417&adf=2459742235&w=520&lmt=1537549838&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1537549837989&bpp=7&bdt=892&fdt=403&idt=404&shv=r20180917&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120&correlator=5921099423551&frm=20&pv=1&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&ga_fc=1&iag=0&icsg=2955487960108992&dssz=82&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=453&ady=4708&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064254&oid=3&rx=0&eae=0&fc=528&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=7&osw_key=1823298079&ifi=5&fsb=1&xpc=kgP9ZSolLA&p=https%3A//www.golem.de&dtd=410
Frame ID: 0AA990CD2FB8A13833F63DA73B11700F
Requests: 1 HTTP requests in this frame

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

Frame: https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
Frame ID: E0C0700AD56F140FE5434B57A8A00536
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=2074088491&adk=3577236908&adf=653379571&w=520&lmt=1537549838&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1537549837996&bpp=5&bdt=901&fdt=503&idt=506&shv=r20180917&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=5921099423551&frm=20&pv=1&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&ga_fc=1&iag=0&icsg=2955487960108992&dssz=82&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=453&ady=5417&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064254&oid=3&rx=0&eae=0&fc=528&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=7&osw_key=154924829&ifi=6&fsb=1&xpc=RFgQgHM55z&p=https%3A//www.golem.de&dtd=515
Frame ID: 85E9F1AAB0D1663A559E706EED8B3D27
Requests: 1 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
Frame ID: 8013FB239F722E2EA6425000BEE4F3DA
Requests: 1 HTTP requests in this frame

Frame: https://golem.whitepaperdb.de/?tag=golem
Frame ID: E7A8225FFD279A27024277C2B34030B5
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/osd_listener.js
Frame ID: DB18E85F2C911A2830AFDA2400B1FC48
Requests: 6 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
Frame ID: 115E548215DEB5BAE5833BD2899E2A85
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-6583763995580712&output=html&h=250&slotname=9888525209&adk=2573259754&adf=608545715&w=800&guci=1.2.0.0.2.2.0&format=800x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&wgl=1&adsid=NT&dt=1537549838359&bpp=5&bdt=435&fdt=471&idt=473&shv=r20180917&cbv=r20180604&saldr=aa&correlator=5921099423551&frm=23&ife=4&pv=2&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1921501932&ga_fc=1&iag=3&icsg=2728&nhd=1&dssz=14&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=393&ady=10772&biw=1585&bih=1200&isw=800&ish=250&ifk=3088420174&scr_x=0&scr_y=0&eid=20195144%2C21060853%2C62710015%2C62710017&oid=3&rx=0&eae=2&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C800%2C250&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=20&bc=7&osw_key=2012678058&ifi=1&fsb=1&dtd=481
Frame ID: 818FEE76A5C4AE42B72B0596DECA387B
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/osd_listener.js
Frame ID: 876EA96BC071060C10E12C6BD4FFD63E
Requests: 4 HTTP requests in this frame

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

Screenshot


Page URL History Show full URLs

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

Detected technologies

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

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

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

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

Overall confidence: 100%
Detected patterns
  • env /^criteo/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

194
Requests

100 %
HTTPS

37 %
IPv6

32
Domains

54
Subdomains

48
IPs

6
Countries

2996 kB
Transfer

7059 kB
Size

27
Cookies

Page URL History

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

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

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 25
  • https://dyn.emetriq.de/loader/97578/default.js HTTP 302
  • https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
Request Chain 54
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0011&i2=0011dd71c5dc0c4b75ba5260d&ep=1563766613&vr=409&id=s9k4qs&lt=1537549837796&ev=&cs=kh9di0&mo=1 HTTP 302
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0011&i2=0011dd71c5dc0c4b75ba5260d&ep=1563766613&vr=409&id=s9k4qs&lt=1537549837796&ev=&cs=kh9di0&mo=1&sr=71
Request Chain 112
  • https://cm.everesttech.net/cm/dd?d_uuid=54935172527602593263077058325949373375 HTTP 302
  • https://dpm.demdex.net/ibs:dpid=411&dpuuid=W6UmDgAABqhk7hKk
Request Chain 113
  • https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=1121452614&utmhn=www.golem.de&utme=8(HTML5)9(1)11(2)&utmcs=UTF-8&utmsr=1600x1200&utmvp=1585x1200&utmsc=24-bit&utmul=en-us&utmje=0&utmfl=-&utmdt=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&utmhid=1227408094&utmr=-&utmp=%2F&utmht=1537549837911&utmac=UA-518800-2&utmcc=__utma%3D21769261.964551683.1537549838.1537549838.1537549838.1%3B%2B__utmz%3D21769261.1537549838.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B&aip=1&utmjid=1585770111&utmredir=1&utmu=qRQAAAAAAAAAAAAAAAQAAAAE~ HTTP 302
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=964551683.1537549838&jid=1585770111&_v=5.7.2&z=1121452614
Request Chain 114
  • https://dsp.adfarm1.adition.com/cookie/?redirect=https%3A%2F%2Fdpm.demdex.net%2Fibs%3Adpid%3D385489%26dpuuid%3D%25%25COOKIE%25%25 HTTP 302
  • https://dpm.demdex.net/ibs:dpid=385489&dpuuid=6603726265934215195
Request Chain 146
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSasWsa8ESJsEiU-BDf-BiUABifkBSU0WDfABifABifABfrr HTTP 302
  • https://xpl.theadex.com/d/327/i/2.gif?_sc=1000918391910380040&axd_pid=22&axd_fuid=BSasWsa8ESJsEiU-BDf-BiUABifkBSU0WDfABifABifABfrr
Request Chain 147
  • https://d.df-srv.de/match/a.js?pid=42 HTTP 302
  • https://dsp.adfarm1.adition.com/cookie/?redirect=https%3A%2F%2Fd.df-srv.de%2Fmatch%2Fa.js%3Fpid%3D42%26l%3D1%26adition_vid%3D%25%25COOKIE%25%25 HTTP 302
  • https://d.df-srv.de/match/a.js?pid=42&l=1&adition_vid=6603726265934215195

194 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request Cookie set /
www.golem.de/
Redirect Chain
  • http://golem.de/
  • https://www.golem.de/
168 KB
169 KB
Document
General
Full URL
https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
25f44c8d49eedb2fd437fa1ad513f031ec1fb19d192552ab87fcccf79c427aaa
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
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
Fri, 21 Sep 2018 17:10:37 GMT
Content-Type
text/html; charset=UTF-8
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Set-Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; expires=Sat, 22-Sep-2018 05:10:37 GMT; Max-Age=43200; path=/; domain=.golem.de
Strict-Transport-Security
max-age=11001100; includeSubDomains; preload
Cache-Control
private
Vary
User-Agent, Accept-Encoding

Redirect headers

Location
https://www.golem.de/
Server
BigIP
Connection
Keep-Alive
Content-Length
0
golem_main_114-min.css
www.golem.de/staticrl/styles/
73 KB
20 KB
Stylesheet
General
Full URL
https://www.golem.de/staticrl/styles/golem_main_114-min.css
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2bdb9058c86c9b82b28d52d721fb75df307033cac39891be256b4f74bbb1b083

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-12251"
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
Mon, 22 Oct 2018 17:10:37 GMT
iqd_gzip_test.js.gz
iqdtms.golem.de/
23 B
491 B
Script
General
Full URL
https://iqdtms.golem.de/iqd_gzip_test.js.gz
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.128 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ec734c8897764322b10b819d78cc8933f050ba27cc3f971ee23ea91b9fdc958e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
iqdtms.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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Tue, 13 Jan 2015 08:41:49 GMT
Server
nginx
x-amz-request-id
47F755122616D4C1
ETag
"1ec37da4a5d51c998484c055cc5ae466"
Content-Type
application/x-gzip
X-UPSTREAM
52.219.73.68:443 hybrid1.golem.de
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
23
x-amz-id-2
pM6Of0u4rCNx+R+72zlUHnLZpqyOPxcwk9CTQdsYmXCLpK2RpDPJq94eLLvNQJj0NaaStCEP0BM=
logo-g.png
www.golem.de/staticrl/images/
4 KB
4 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/logo-g.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-e82"
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
3714
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136713-174463-174459_rc.jpg
www.golem.de/1809/
13 KB
13 KB
Image
General
Full URL
https://www.golem.de/1809/136713-174463-174459_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e14377a831754e15200b35a69d272a62ee592dd4130fad098e31e204276bc1d1

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 17:07:04 GMT
Server
nginx
ETag
"5ba52538-33a5"
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
13221
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136695-174400-174396_rc.jpg
www.golem.de/1809/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1809/136695-174400-174396_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
40f5cd72e661262384b23446c0d2bb80173bc39def7ce59a7aa55ec8293941df

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 10:03:04 GMT
Server
nginx
ETag
"5ba4c1d8-231a"
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
8986
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136714-174471-174467_rc.jpg
www.golem.de/1809/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1809/136714-174471-174467_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ef96621d218bcc99c0f3ba686cf5fae0cf7e770ce52226f0c3d5f90e936f39be

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 17:01:03 GMT
Server
nginx
ETag
"5ba523cf-1e36"
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
7734
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136625-174252-174249_rc.jpg
www.golem.de/1809/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1809/136625-174252-174249_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a840992524864bb0dd0fcc8659036dba39905a988b34e39d9fc9c7c0cd7b32f0

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 07:00:05 GMT
Server
nginx
ETag
"5ba496f5-1c84"
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
7300
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136686-174370-174369_rc.jpg
www.golem.de/1809/
3 KB
3 KB
Image
General
Full URL
https://www.golem.de/1809/136686-174370-174369_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
960d1b72fb1bd87c274bad6b1bc6d80ece2b140cc59a1c4ab1bf79439090c6f9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 06:00:04 GMT
Server
nginx
ETag
"5ba488e4-b0e"
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
2830
Expires
Mon, 22 Oct 2018 17:10:37 GMT
gif
cpxl.golem.de/
43 B
292 B
Image
General
Full URL
https://cpxl.golem.de/gif?u=https%3A%2F%2Fwww.golem.de%2F&d=1537549742&f=ev&v=d&t=ad%2Fjobs2016kw24
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Content-Type
image/gif
X-RateLimit-Remaining
673
Transfer-Encoding
chunked
X-RateLimit-Limit
800
Connection
keep-alive
iphonexmax-snap.jpg
video.golem.de/teaser/1/1/21844/thumb-high-1000/
40 KB
41 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/21844/thumb-high-1000/iphonexmax-snap.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9ba5f5bef8bcf5990566c187803dc1658fb65413aa39ecd6dec62f7fd9e85522

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 09:51:29 GMT
Server
nginx
ETag
"5ba4bf21-a147"
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
41287
Expires
Mon, 22 Oct 2018 17:10:37 GMT
gopro-hero-7-trailer.jpg
video.golem.de/teaser/1/1/21838/thumb-high-1000/
133 KB
133 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/21838/thumb-high-1000/gopro-hero-7-trailer.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b7ed32512f2efde476f642799e4e41420548b56eb3d1268bd8bb94f26763e669

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 07:08:58 GMT
Server
nginx
ETag
"5ba4990a-21212"
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
135698
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136668-174279-174275_rc.jpg
www.golem.de/1809/
132 KB
133 KB
Image
General
Full URL
https://www.golem.de/1809/136668-174279-174275_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e1347bd7b9e2213ea4071ff786c58976b6a62328dafa9442ce78be5d696b1e9b

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Thu, 20 Sep 2018 14:00:04 GMT
Server
nginx
ETag
"5ba3a7e4-211d2"
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
135634
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136615-174046-174045_rc.jpg
www.golem.de/1809/
61 KB
61 KB
Image
General
Full URL
https://www.golem.de/1809/136615-174046-174045_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ca75fea43fc41e52e229e3765eb71e1e1fa2d68ee71d2959f8726852d006d319

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Wed, 19 Sep 2018 10:03:08 GMT
Server
nginx
ETag
"5ba21edc-f23c"
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
62012
Expires
Mon, 22 Oct 2018 17:10:37 GMT
gif
cpxl.golem.de/
43 B
292 B
Image
General
Full URL
https://cpxl.golem.de/gif?u=https%3A%2F%2Fwww.golem.de%2F&d=1537548842&f=ev&v=d&t=ad%2Fdeals2016kw24
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Content-Type
image/gif
X-RateLimit-Remaining
670
Transfer-Encoding
chunked
X-RateLimit-Limit
800
Connection
keep-alive
golem_main_114-min.js
www.golem.de/staticrl/scripts/
100 KB
41 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-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
Mon, 22 Oct 2018 17:10:37 GMT
longread-swiper_122-min.js
www.golem.de/staticrl/scripts/
2 KB
1 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/longread-swiper_122-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
08b757c7ef1eaebe9fb2331abd30ecc0a470c2166994c1cfa941c126a698679c

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Content-Encoding
gzip
Last-Modified
Fri, 07 Sep 2018 13:24:16 GMT
Server
nginx
ETag
W/"5b927c00-8e6"
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
Mon, 22 Oct 2018 17:10:37 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/
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
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 17:10:37 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/
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
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 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
Mon, 22 Oct 2018 17:10:37 GMT
iam.js
script.ioam.de/
26 KB
9 KB
Script
General
Full URL
https://script.ioam.de/iam.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.100.39 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script4.ioam.de
Software
nginx / BLACKBIRD-SRC v0.9 0011
Resource Hash
f24798946695694a0b0aff1a66dcd3f942f31671907369e17cb1b47ddb1dc0f3

Request headers

Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Content-Encoding
gzip
Last-Modified
Fri, 21 Sep 2018 17:10:37 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.9 0011
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
Fri, 21 Sep 2018 19:10:37 GMT
iqadcontroller.js.gz
iqdtms.golem.de/cdn_golem_dt/live/
196 KB
52 KB
Script
General
Full URL
https://iqdtms.golem.de/cdn_golem_dt/live/iqadcontroller.js.gz
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.128 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5b550e95dda77ddb20905d582d604d967928b01f60a7aa2716daf4af6303ec9b

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
iqdtms.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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Content-Encoding
gzip
Last-Modified
Wed, 19 Sep 2018 13:51:08 GMT
Server
nginx
x-amz-request-id
BD2BF315E76D6308
ETag
"3b5a7ec607a56d3c25ec800e80761e4f"
Content-Type
text/javascript
X-UPSTREAM
52.219.73.68:443 hybrid1.golem.de
Cache-Control
no-cache
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
52634
x-amz-id-2
U4jV6JLEm3UYPzUfo2aeRimTENbwBsoBY9ptrSY/YOb2Yh727aNKt0DEidH5KoIlAjcpybutuQ8=
gpt.js
www.googletagservices.com/tag/js/
20 KB
8 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: iqdtms.golem.de
URL: https://iqdtms.golem.de/cdn_golem_dt/live/iqadcontroller.js.gz
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:824::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
d7922cb1ba572bd14e4dc0f423018e4f35267bda9e20a872dc850e242060087e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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

Response headers

date
Fri, 21 Sep 2018 17:10:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"8 / 62 of 1000 / last-modified: 1537489750"
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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
7872
x-xss-protection
1; mode=block
expires
Fri, 21 Sep 2018 17:10:37 GMT
imgad
tpc.googlesyndication.com/pagead/
25 B
174 B
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/imgad?id=CICAgKDTj9fOKBABGAEoATIIXhWOvj-krslA_KSrtwU
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:81f::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
eebd6f2e5a80bb5d11966fd2446842888fcefdc5b18a36a619aa6fa0756e9376
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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

Response headers

date
Fri, 21 Sep 2018 07:58:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
age
33119
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
content-type
application/x-javascript; charset=UTF-8
status
200
cache-control
public, max-age=604800
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
45
x-xss-protection
1; mode=block
expires
Fri, 28 Sep 2018 07:58:38 GMT
yield.js
z.moatads.com/iqdigitaldfpprebidheader645711382528/
98 KB
30 KB
Script
General
Full URL
https://z.moatads.com/iqdigitaldfpprebidheader645711382528/yield.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
dff33a67b61fc44fb90cd3d8dcede66b087afeb992b3338e8ffecaac478f246e

Request headers

Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Content-Encoding
gzip
Last-Modified
Tue, 10 Jul 2018 14:39:07 GMT
Server
AmazonS3
x-amz-request-id
F358812C1A08881F
ETag
"286afe07681bd2ccd695928b81a9d6e7"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=49871
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
30032
x-amz-id-2
vmyJxA6a4Kq4zDRVFuCJ/FD2sNhEq7DVg4zwOVdHzRwHD7pSJyAiDJNty+EK/Oz7nJgv87xGMAU=
prebid29082018.js
dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/
101 KB
32 KB
Script
General
Full URL
https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid29082018.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:200c:4a00:1:9777:c740:21 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
d77b6c18c0744a7ad3e394c6de665cfec35053d2ccc2e3d31aaece762cf6bbfd

Request headers

Referer
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

Response headers

date
Fri, 07 Sep 2018 08:00:09 GMT
content-encoding
gzip
last-modified
Wed, 05 Sep 2018 15:48:59 GMT
server
AmazonS3
age
1242629
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
max-age=5184000
x-amz-cf-id
lGzBkGODLXtSaY3uW7fPisIyqzknDegqlp5r2YfkvOrLtbh5ka1GOA==
via
1.1 f9448dbaac49aad821506cba2852f911.cloudfront.net (CloudFront)
apstag.js
c.amazon-adsystem.com/aax2/
58 KB
17 KB
Script
General
Full URL
https://c.amazon-adsystem.com/aax2/apstag.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.96.211 Wilmington, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-96-211.fra50.r.cloudfront.net
Software
Server /
Resource Hash
79b48588330a331f56fd0e28382880988bfbff7bca8e5ea8aef823bc310cb1e7

Request headers

Referer
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

Response headers

Date
Fri, 21 Sep 2018 16:27:42 GMT
Content-Encoding
gzip
Server
Server
Age
2574
ETag
53939d110e1ada02c63aa1fc71e83cbb
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Content-Type
application/javascript
Via
1.1 055d899361491602a9ef1eb0cdc5e337.cloudfront.net (CloudFront)
Cache-Control
public, max-age=86400
Connection
keep-alive
Accept-Ranges
bytes
X-Amz-Cf-Id
Ic7WP-DzMrVLNLkkZxwwfdsd5iat6mC8kkX-kklrkKnPinGGVhlf8A==
default.js
ups.xplosion.de/loader/97578/
Redirect Chain
  • https://dyn.emetriq.de/loader/97578/default.js
  • https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
2 KB
2 KB
Script
General
Full URL
https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.251.222.238 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-251-222-238.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
45661a3e6863d0c77529828a7bd5bc802d65fb7dbce6d7fde4df6d05f3394954

Request headers

Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Server
Apache-Coyote/1.1
P3P
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
Access-Control-Allow-Origin
*
Cache-Control
must-revalidate,no-cache,no-store
Connection
keep-alive
Content-Type
text/javascript
Content-Length
1544

Redirect headers

Location
https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
Date
Fri, 21 Sep 2018 17:10:36 GMT
Server
Apache-Coyote/1.1
Connection
keep-alive
Content-Length
0
launch-EN92e1075482f3410d81944270acba8d90.min.js
assets.adobedtm.com/
131 KB
42 KB
Script
General
Full URL
https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.23 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-23.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
964b9e4e7dce6754b83d57f47f61776751ba4f8fe9b95074f6b48d6b7e4bfec4

Request headers

Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Content-Encoding
gzip
Last-Modified
Wed, 08 Aug 2018 10:49:40 GMT
Server
Apache
ETag
"024e397a55fc778c6f3d17be0d92333a:1533725380"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=3600
Transfer-Encoding
chunked
Connection
keep-alive, Transfer-Encoding
Accept-Ranges
bytes
Timing-Allow-Origin
*, *, *
Expires
Fri, 21 Sep 2018 18:10:37 GMT
adex.js
dmp.theadex.com/d/494/1428/s/
39 KB
14 KB
Script
General
Full URL
https://dmp.theadex.com/d/494/1428/s/adex.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
89.163.159.101 Hattersheim, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
046a037b70269d7d556fcf44f52bae9aeb1f1e0b19d99db8092234582caf5944

Request headers

Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Content-Encoding
gzip
Last-Modified
Sun, 09 Sep 2018 18:54:04 GMT
Server
nginx
ETag
W/"5b956c4c-9b6f"
Transfer-Encoding
chunked
Content-Type
application/javascript
Cache-Control
max-age=300
Access-Control-Allow-Credentials
true
Connection
keep-alive
Expires
Fri, 21 Sep 2018 17:15:37 GMT
vis.js
d1pywvbolq0b04.cloudfront.net/iqdvis/golem/
1 KB
831 B
Script
General
Full URL
https://d1pywvbolq0b04.cloudfront.net/iqdvis/golem/vis.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:200c:6800:1c:9fd1:6d00:21 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
8315fa072c715bd5db90717d2062d12f9102aa9bdac64b273fd15147231ed67a

Request headers

Referer
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

Response headers

date
Fri, 07 Sep 2018 12:18:54 GMT
content-encoding
gzip
last-modified
Fri, 07 Sep 2018 12:14:06 GMT
x-amz-meta-expires
Mon, 01 Oct 2018 16:00:00 GMT
age
1227104
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
text/javascript
status
200
x-amz-meta-contenttype
text/javascript
x-amz-cf-id
m7bAFPcvOLFTl6-oDYS0u5YSB32ixqrMTjmVOfGAO4ndMpJ4k63Ugw==
via
1.1 53e3dfdf8efd0c06e5d27cfdbfbe5876.cloudfront.net (CloudFront)
server
AmazonS3
expires
Mon, 01 Oct 2018 16:00:00 GMT
26033,26034,26035,660053,660071,660107,660089,5108423,464839
ad.yieldlab.net/yp/
154 B
707 B
Script
General
Full URL
https://ad.yieldlab.net/yp/26033,26034,26035,660053,660071,660107,660089,5108423,464839?ts=1537549837483&yl_rtb_pubkey=21719_golem
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.233 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-233.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
0bdda96858933db76979b062926fc3adcf1108a88fdec7602567b0b412740bd8

Request headers

Referer
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

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:10:37 GMT
Content-Encoding
gzip
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
Vary
Accept-Encoding
Content-Language
de-DE
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
Content-Type
text/javascript;charset=UTF-8
Content-Length
123
Expires
Thu, 20 Sep 2018 17:10:37 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/
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
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/
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/
Origin
https://www.golem.de

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-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
Mon, 22 Oct 2018 17:10:37 GMT
DroidSerif.woff2
www.golem.de/staticrl/fonts/droidserif/
22 KB
22 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 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
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/
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/
Origin
https://www.golem.de

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-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
Mon, 22 Oct 2018 17:10:37 GMT
DroidSans.woff2
www.golem.de/staticrl/fonts/droidsans/
21 KB
21 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidsans/DroidSans.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 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
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/
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/
Origin
https://www.golem.de

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-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
Mon, 22 Oct 2018 17:10:37 GMT
truncated
/
325 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
352c699a724df4758e0005476752014202d4156ce13cbf91f9f948f676488088

Request headers

Response headers

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

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml
DroidSerif-Italic.woff2
www.golem.de/staticrl/fonts/droidserif/
20 KB
20 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif-Italic.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
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
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/
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/
Origin
https://www.golem.de

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-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
Mon, 22 Oct 2018 17:10:37 GMT
truncated
/
153 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
34815dfa238f8c0e9c2f0c533e27feb0c872d20ee404deb6feb781175c033f31

Request headers

Response headers

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

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml
truncated
/
126 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml
yi.js
mb.moatads.com/
2 KB
2 KB
Script
General
Full URL
https://mb.moatads.com/yi.js?ud=false&ue=false&uu=false&qm=0&qn=(%2BIb%7Cj8o%3FJ(jkkeL07ta_*JRM!6t9B%2CN%3Ey)%2ChXbvU37_*NhSfBghz%5D*vOJ%23_%3DNoUA%5DRgBU_Gr1%3E%3AHuFTn%3ADXqJHZ%3BR%23yAb%2Bho8bYLaXBjA%3AmQ)%3CF!tAbjrzJ%3BgoVYGVxc%40lQQV%23tc3%2Fh%7C%3FVKV%3BW5.NO)Wx%7C*E%24%3D!L2ux%7Ci_lOfxECSR23_hFAkD%3Dv%3CN%5B.%22%24b_o%3FtVD%5D%5BpN%7CQF%40Sy7%7BA&qp=00000&qq=000000000000&qr=0&is=voqBBkBBBBHhBBwBBZkJjBRCqUCY3CTCB6BXwUcu8gKCBS9lYBBBCCBpYFmR4BOZBBgSJTcBBBBBBBBHUoKOFCyz7BB3CZ6mv5TimBBe9oeCt9lXqBvBCfBBBBBBBBBBBBBBCBMBaBeBBkKzQClBeaKaMVMBj5iMPzyHVY9zqxknZlysGxCBcBBBC9CctORpnICyRBBB4OBBBBBBBBBBC9TiFF3dOKBCBBxBBBBBBBfBz1BD7fB3BpkBJUDyDCZ6IDDDCCCCDDCCCCCCCBdh2eBBBGI79kNB8DJoDBBBBCiBBiB&iv=6&gz=0&hh=0&hn=0&qt=0&tw=null&url=https%3A%2F%2Fwww.golem.de%2F&confidence=2&pcode=iqdigitaldfpprebidheader645711382528&callback=MoatNadoAllJsonpRequest_37456155
Requested by
Host: z.moatads.com
URL: https://z.moatads.com/iqdigitaldfpprebidheader645711382528/yield.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.130.208.27 Cambridge, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-130-208-27.eu-west-2.compute.amazonaws.com
Software
nginx/1.7.9 /
Resource Hash
2fb187e8f47fb77123e5e541c8671d60215d35b6f108207066571a96ae4767c7

Request headers

Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Server
nginx/1.7.9
Etag
"0ac5b2877b7ccd551bc21e818c3ef328ef6fad03"
Content-Type
text/html; charset=UTF-8
Cache-Control
max-age=900
Connection
keep-alive
Timing-Allow-Origin
*
Content-Length
1617
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=17&t=1537549837586&de=392665845816&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatRendered=0&zMoatSlotTargetingLoaded=0&zMoatSlotTargetingSet=0&zMoatPageDataTargetingSet=0&zMoatSafetyTargetingSet=0&zMoatEmptySlot=0&zMoatNadoDataLoadTime=Not%20Loaded&zMoatAllDataLoadTime=Not%20Loaded&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&na=945230957&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
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

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Fri, 21 Sep 2018 17:10:37 GMT
integrator.js
adservice.google.de/adsid/
109 B
171 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
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81b::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 1; mode=block

Request headers

Referer
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

Response headers

timing-allow-origin
*
date
Fri, 21 Sep 2018 17:10:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
104
x-xss-protection
1; mode=block
integrator.js
adservice.google.com/adsid/
109 B
171 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
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81b::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 1; mode=block

Request headers

Referer
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

Response headers

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

Request headers

Referer
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

Response headers

date
Fri, 21 Sep 2018 17:10:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 13 Sep 2018 13:39:46 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="44,43,39,35"
content-length
64039
x-xss-protection
1; mode=block
expires
Fri, 21 Sep 2018 17:10:37 GMT
918034,918035,918036,918038,918037,918039,918040,5196623,918310
ad.yieldlab.net/yp/
154 B
707 B
Script
General
Full URL
https://ad.yieldlab.net/yp/918034,918035,918036,918038,918037,918039,918040,5196623,918310?ts=1537549837483&yl_rtb_pubkey=781119_golem
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.233 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-233.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
0bdda96858933db76979b062926fc3adcf1108a88fdec7602567b0b412740bd8

Request headers

Referer
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

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:10:37 GMT
Content-Encoding
gzip
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
Vary
Accept-Encoding
Content-Language
de-DE
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
Content-Type
text/javascript;charset=UTF-8
Content-Length
123
Expires
Thu, 20 Sep 2018 17:10:37 GMT
aps_csm.js
c.amazon-adsystem.com/bao-csm/aps-comm/
6 KB
7 KB
XHR
General
Full URL
https://c.amazon-adsystem.com/bao-csm/aps-comm/aps_csm.js
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.96.211 Wilmington, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-96-211.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
6d6f482982f8f1a1814e279ff50df4ccc301533ca9655e4d080d6b90ec69d69e

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

Response headers

Date
Mon, 03 Sep 2018 13:45:15 GMT
Via
1.1 d627b75d0c1aedd3691390ac8498d3b0.cloudfront.net (CloudFront)
Vary
Origin
Age
12287
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
6456
Last-Modified
Fri, 24 Aug 2018 07:13:51 GMT
Server
AmazonS3
ETag
"afe2b01377d6dacb3dac3b80df6a3b24"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET
Content-Type
application/javascript
Access-Control-Allow-Origin
*
Cache-Control
public, max-age=86400
Accept-Ranges
bytes
X-Amz-Cf-Id
hRcN6PNOk5y2pcJv5UMc0fNnFS2XANToKqdb_8mCU7cjEN81a296wA==
bid
aax.amazon-adsystem.com/e/dtb/
47 B
341 B
XHR
General
Full URL
https://aax.amazon-adsystem.com/e/dtb/bid?src=3711&u=https%3A%2F%2Fwww.golem.de%2F&pid=3696452289371537549837621&cb=8226656074431537549837624&ws=1600x1200&v=7.16.00&t=2000&slots=%5B%7B%22sd%22%3A%22iqadtile1%22%2C%22s%22%3A%5B%22728x90%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile1%22%7D%2C%7B%22sd%22%3A%22iqadtile16%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22728x90%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile16%22%7D%2C%7B%22sd%22%3A%22iqadtile3%22%2C%22s%22%3A%5B%22970x90%22%2C%22970x250%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile3%22%7D%2C%7B%22sd%22%3A%22iqadtile4%22%2C%22s%22%3A%5B%22970x90%22%2C%22970x250%22%2C%22970x90%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile4%22%7D%2C%7B%22sd%22%3A%22iqadtile5%22%2C%22s%22%3A%5B%22970x90%22%2C%22970x250%22%2C%22970x90%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile5%22%7D%2C%7B%22sd%22%3A%22iqadtile8%22%2C%22s%22%3A%5B%22300x300%22%2C%22300x600%22%2C%22300x250%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile8%22%7D%2C%7B%22sd%22%3A%22iqadtile9%22%2C%22s%22%3A%5B%22300x300%22%2C%22300x600%22%2C%22300x250%22%5D%2C%22sn%22%3A%22golem-homepage-iqadtile9%22%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.94.216.48 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
Server /
Resource Hash
ac07abc3fc5a450ec41a5a82ffdd347c94ea88ceeb8f3d5ab322601375b9ff07

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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Server
Server
Vary
User-Agent
Content-Type
text/javascript;charset=UTF-8
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Timing-Allow-Origin
*
Content-Length
47
cdb
bidder.criteo.com/
0
186 B
XHR
General
Full URL
https://bidder.criteo.com/cdb?profileId=207&av=11&wv=1.20.0&cb=86354715975
Requested by
Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid29082018.js
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_256_CBC
Server
178.250.2.89 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
Finatra /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Access-Control-Allow-Origin
https://www.golem.de
Date
Fri, 21 Sep 2018 17:10:36 GMT
Access-Control-Allow-Credentials
true
Server
Finatra
Vary
Origin
prebid
ib.adnxs.com/ut/v3/
21 B
711 B
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
Requested by
Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid29082018.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.204 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
Software
nginx/1.13.4 /
Resource Hash
aaaabde3f68c325033b37bb3ebff887e3b589b7137e717e96648a52221881429
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.golem.de/
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
Fri, 21 Sep 2018 17:10:39 GMT
X-Proxy-Origin
148.251.45.254; 148.251.45.254; 319.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.70:80
AN-X-Request-Uuid
e51cbf3f-51bc-4085-a266-0224afa3b453
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
21
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
id
dpm.demdex.net/
1 KB
1 KB
XHR
General
Full URL
https://dpm.demdex.net/id?d_visid_ver=3.2.0&d_fieldgroup=MC&d_rtbd=json&d_ver=2&d_orgid=41833DF75A550B4B0A495DA6%40AdobeOrg&d_nsid=0&ts=1537549837676
Requested by
Host: assets.adobedtm.com
URL: https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.194.25.183 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-194-25-183.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
9fc61d7a3ad131cddc20b53ca3a6344ca4b2d37fe60ca2177383e551cf9b0e80

Request headers

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

DCS
dcs-prod-irl1-v002-0a7abea63.edge-irl1.demdex.com 5.38.2.20180913102145 4ms
Pragma
no-cache
Content-Encoding
gzip
X-TID
xxMkvV2gRfM=
Vary
Origin, Accept-Encoding, User-Agent
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json;charset=utf-8
Content-Length
534
Expires
Thu, 01 Jan 1970 00:00:00 GMT
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=0&t=1537549837586&de=392665845816&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatRendered=0&zMoatSlotTargetingLoaded=0&zMoatSlotTargetingSet=0&zMoatPageDataTargetingSet=0&zMoatSafetyTargetingSet=0&zMoatEmptySlot=0&zMoatNadoDataLoadTime=Not%20Loaded&zMoatAllDataLoadTime=Not%20Loaded&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=0&zMoat_YI1=0&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1695835591&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
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

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Fri, 21 Sep 2018 17:10:37 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
73 KB
27 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:812::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
6f1820fb18fd530846406f6f01440f4124b5ebb231a5bdb9f6b60ddf5737c42a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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

Response headers

date
Fri, 21 Sep 2018 17:10:37 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
27516
x-xss-protection
1; mode=block
server
cafe
etag
3406154613634451085
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Fri, 21 Sep 2018 17:10:37 GMT
golem_csi-121-min.js
www.golem.de/staticrl/scripts/adsense/
2 KB
1 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/adsense/golem_csi-121-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b027fc110a1c4310d433d4be3ffa26b70886ed33a1ec1a2b8270588519507f00

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Content-Encoding
gzip
Last-Modified
Wed, 15 Aug 2018 21:00:18 GMT
Server
nginx
ETag
W/"5b749462-7ff"
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
Mon, 22 Oct 2018 17:10:37 GMT
gx-ads.js
ads.golem.de/track.ads/
124 B
492 B
Script
General
Full URL
https://ads.golem.de/track.ads/gx-ads.js?ord=2685139772070384&adsize=300x250&adunit=11
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:17a , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
54a5c9011a4eec01cb0af8620d0ce3dd3bba04b167b7f674b074428eeb06e020

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Tue, 12 Jan 2016 21:49:10 GMT
Server
nginx
ETag
"569574d6-7c"
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
124
Expires
Mon, 22 Oct 2018 17:10:37 GMT
tx.io
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0011&i2=0011dd71c5dc0c4b75ba5260d&ep=1563766613&vr=409&id=s9k4qs&lt=1537...
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0011&i2=0011dd71c5dc0c4b75ba5260d&ep=1563766613&vr=409&id=s9k4qs&lt=1537...
0
694 B
Script
General
Full URL
https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0011&i2=0011dd71c5dc0c4b75ba5260d&ep=1563766613&vr=409&id=s9k4qs&lt=1537549837796&ev=&cs=kh9di0&mo=1&sr=71
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.100.40 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de4.ioam.de
Software
nginx / BLACKBIRD-RCV v1.04.6 0023
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.04.6 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
Fri, 21 Sep 2018 17:10:37 GMT
Access-Control-Allow-Origin
*
X-Powered-By
BLACKBIRD-RCV v1.04.6 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
Fri, 21 Sep 2018 17:10:37 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Location
/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0011&i2=0011dd71c5dc0c4b75ba5260d&ep=1563766613&vr=409&id=s9k4qs&lt=1537549837796&ev=&cs=kh9di0&mo=1&sr=71
Cache-Control
no-store, no-cache, must-revalidate
Access-Control-Allow-Credentials
true
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Expires
Thu, 21 Sep 2017 17:10:37 GMT
IjvnOpbzskTW
cdn.onthe.io/io.js/
51 KB
16 KB
Script
General
Full URL
https://cdn.onthe.io/io.js/IjvnOpbzskTW
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
165.227.149.77 New York, United States, ASN14061 (DIGITALOCEAN-ASN - DigitalOcean, LLC, US),
Reverse DNS
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash
1266568f932e7920c7b97bd0e015c494d04ac0e1f151484f977a296079135c7c

Request headers

Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Content-Encoding
gzip
Last-Modified
Thu, 20 Sep 2018 13:07:43 GMT
Server
nginx/1.14.0 (Ubuntu)
ETag
W/"5ba39b9f-cd1f"
Transfer-Encoding
chunked
X-Hostname
cdn-eu-12
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Expires
Sat, 22 Sep 2018 13:08:17 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/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:820::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/
User-Agent
Mozilla/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
Thu, 13 Sep 2018 23:12:19 GMT
server
Golfe2
age
1393
date
Fri, 21 Sep 2018 16:47:24 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="44,43,39,35"
content-length
17168
expires
Fri, 21 Sep 2018 18:47:24 GMT
RCebdd9841332744f18b2789656c4ca942-source.min.js
assets.adobedtm.com/BLed89b775744045ef81153791afe11bfc/
457 B
746 B
Script
General
Full URL
https://assets.adobedtm.com/BLed89b775744045ef81153791afe11bfc/RCebdd9841332744f18b2789656c4ca942-source.min.js
Requested by
Host: assets.adobedtm.com
URL: https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.23 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-23.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
20e2057fefe01c400caa7e2d55543e5edb23bc8e2448f6065042efb427ab4cf4

Request headers

Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Content-Encoding
gzip
Last-Modified
Wed, 08 Aug 2018 10:49:40 GMT
Server
Apache
ETag
"148bfbe8469cd372d10f2eb8302cea3f:1533725380"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=3600
Connection
keep-alive
Accept-Ranges
bytes
Timing-Allow-Origin
*, *
Content-Length
304
Expires
Fri, 21 Sep 2018 18:10:37 GMT
swiper-4.2.2.custom.min.js
www.golem.de/staticrl/scripts/external/
69 KB
23 KB
XHR
General
Full URL
https://www.golem.de/staticrl/scripts/external/swiper-4.2.2.custom.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e3e6c93defad2cf35199cb4a925b7ddd47efa939786ca22038d4d3b5ef4ea14c

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-113e8"
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
Mon, 22 Oct 2018 17:10:37 GMT
golem_cpxl_113-min.js
www.golem.de/staticrl/scripts/
8 KB
4 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/golem_cpxl_113-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-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
Mon, 22 Oct 2018 17:10:37 GMT
vlcsnap-2018-09-19-12h22m54s272.jpg
video.golem.de/teaser/1/1/21828/thumb-high-1000/
101 KB
101 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/21828/thumb-high-1000/vlcsnap-2018-09-19-12h22m54s272.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
c60fc8ba69fdc00da1d3287682209b488699b1129989fdfd5c9079c15a879af4

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Wed, 19 Sep 2018 10:23:40 GMT
Server
nginx
ETag
"5ba223ac-19451"
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
103505
Expires
Mon, 22 Oct 2018 17:10:37 GMT
2080series-snap.jpg
video.golem.de/teaser/1/1/21808/thumb-high-1000/
108 KB
108 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/21808/thumb-high-1000/2080series-snap.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e36de79c3f6dc58fa93bc282253a75bc302b395651d0a534b8a64363c410a6f7

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Mon, 17 Sep 2018 08:04:32 GMT
Server
nginx
ETag
"5b9f6010-1ae5d"
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
110173
Expires
Mon, 22 Oct 2018 17:10:37 GMT
reflectionsdemo-snap.jpg
video.golem.de/teaser/1/1/21824/thumb-high-1000/
106 KB
106 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/21824/thumb-high-1000/reflectionsdemo-snap.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2576501f0d463e493c4a8e47904cbfc9ebbc404405d2c008ca3988bfd7a146cf

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Tue, 18 Sep 2018 20:22:17 GMT
Server
nginx
ETag
"5ba15e79-1a760"
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
108384
Expires
Mon, 22 Oct 2018 17:10:37 GMT
captain-marvel-trailer.jpg
video.golem.de/teaser/1/1/21817/thumb-high-1000/
56 KB
56 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/21817/thumb-high-1000/captain-marvel-trailer.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b0f9a9ed908d0b83d12c403aef23ae40e66d2096861df79a7de4bb289eacd9b7

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Tue, 18 Sep 2018 13:11:20 GMT
Server
nginx
ETag
"5ba0f978-e02a"
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
57386
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136712-174458-174455_rc.jpg
www.golem.de/1809/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1809/136712-174458-174455_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9a60281cb9d42e781eb9518ca4b1b3abc82a475f7f41d7656e2b3411af137c3d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 15:36:04 GMT
Server
nginx
ETag
"5ba50fe4-1b75"
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
7029
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136709-174441-174437_rc.jpg
www.golem.de/1809/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1809/136709-174441-174437_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
26d2153749f3d072d437546ea05021707542178f8ae368c7fa16fd7f207d5e1b

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 14:30:04 GMT
Server
nginx
ETag
"5ba5006c-2299"
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
8857
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136711-174454-174451_rc.jpg
www.golem.de/1809/
3 KB
4 KB
Image
General
Full URL
https://www.golem.de/1809/136711-174454-174451_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8b1f2043b94ba519266137d51e5885116e863cd75d5194e9f66f731160760651

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 15:10:05 GMT
Server
nginx
ETag
"5ba509cd-de6"
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
3558
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136663-174223-174220_rc.jpg
www.golem.de/1809/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1809/136663-174223-174220_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8160e624fe5607dce796c1cccc2c8a089f3a19044888f976f46ea4b70a343d58

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Thu, 20 Sep 2018 09:30:06 GMT
Server
nginx
ETag
"5ba3689e-159d"
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
5533
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136649-174174-174171_rc.jpg
www.golem.de/1809/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1809/136649-174174-174171_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5325befafccde61035d405be5f2d3f4be3a4fe32a03583f52c9ecc9dffdb47ee

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 09:14:06 GMT
Server
nginx
ETag
"5ba4b65e-2318"
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
8984
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136629-174068-174066_rc.jpg
www.golem.de/1809/
69 KB
69 KB
Image
General
Full URL
https://www.golem.de/1809/136629-174068-174066_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e91698c8353f34207930466bfb14e60ceedd775c2f368aa9822a671540ba471a

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Wed, 19 Sep 2018 07:11:05 GMT
Server
nginx
ETag
"5ba1f689-11490"
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
70800
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136688-174358-174355_rc.jpg
www.golem.de/1809/
6 KB
7 KB
Image
General
Full URL
https://www.golem.de/1809/136688-174358-174355_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
4f5dcb45b41f95cffaaa6bcf6c71fe8acbf1bc165b6d9ece1db7362f7cdb7e2e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 05:27:03 GMT
Server
nginx
ETag
"5ba48127-1957"
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
6487
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136710-174450-174447_rc.jpg
www.golem.de/1809/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1809/136710-174450-174447_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
46e104c8cda8ec4dee994fed43b7522c38895e572f97f1715dd46f282b7a3681

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 14:45:04 GMT
Server
nginx
ETag
"5ba503f0-1ba0"
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
7072
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136664-174227-174224_rc.jpg
www.golem.de/1809/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1809/136664-174227-174224_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8511e2adf4f17819f7be222a81c3170c0547d909e5edc2bc2dd651e689c39020

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Thu, 20 Sep 2018 09:50:04 GMT
Server
nginx
ETag
"5ba36d4c-1f8b"
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
8075
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136707-174432-174429_rc.jpg
www.golem.de/1809/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1809/136707-174432-174429_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a673803ad405beddba94cec2b3939859c11132ae9f201735086f2c555cbc4c96

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 14:09:04 GMT
Server
nginx
ETag
"5ba4fb80-16ae"
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
5806
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136680-174321-174318_rc.jpg
www.golem.de/1809/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1809/136680-174321-174318_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
303546286367930885b0635816c3a1d7176bb1e4cea1a516c3daca746ce05f02

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Thu, 20 Sep 2018 16:06:04 GMT
Server
nginx
ETag
"5ba3c56c-1e6d"
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
7789
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136708-174436-174433_rc.jpg
www.golem.de/1809/
9 KB
10 KB
Image
General
Full URL
https://www.golem.de/1809/136708-174436-174433_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
233a362ae694dacf11bdd89616f44b27602feb790d74b578a814e5e13e549240

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 13:25:04 GMT
Server
nginx
ETag
"5ba4f130-24d4"
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
9428
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136667-174239-174236_rc.jpg
www.golem.de/1809/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1809/136667-174239-174236_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
0ea9d02fca10e9109db9cfefcf93b58c35e3df75b2cbe24b6cac836e456098f6

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Thu, 20 Sep 2018 11:02:05 GMT
Server
nginx
ETag
"5ba37e2d-15cb"
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
5579
Expires
Mon, 22 Oct 2018 17:10:37 GMT
134463-163375-163372_rc.jpg
www.golem.de/1805/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1805/134463-163375-163372_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9104ec08581380e5ac07c82308c6fd2db616494b51e2e2e5198443d31279b496

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Mon, 21 May 2018 10:00:06 GMT
Server
nginx
ETag
"5b0298a6-266c"
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
9836
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136655-174179-174176_rc.jpg
www.golem.de/1809/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1809/136655-174179-174176_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
cf0d957e43d18015ad871f5f33666723e4dd636d2cd7ea6c81ab33956113284a

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Thu, 20 Sep 2018 08:07:03 GMT
Server
nginx
ETag
"5ba35527-15ae"
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
5550
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136704-174426-174423_rc.jpg
www.golem.de/1809/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1809/136704-174426-174423_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a406feda7a5253763f49f67316145642dc72e745dcd6deed12fa16e3e3fd416f

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 12:11:04 GMT
Server
nginx
ETag
"5ba4dfd8-15d2"
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
5586
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136703-174422-174419_rc.jpg
www.golem.de/1809/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1809/136703-174422-174419_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8dec6deeef48efdcd9cf789b59759802d4f50069f2c8d78664e9f036f1362b26

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 11:15:04 GMT
Server
nginx
ETag
"5ba4d2b8-1b16"
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
6934
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136685-174346-174343_rc.jpg
www.golem.de/1809/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1809/136685-174346-174343_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2cb2cfdf905acc2902bec7ea0579bd0f178bdd5990749547b1298b529e983d8a

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Thu, 20 Sep 2018 19:16:03 GMT
Server
nginx
ETag
"5ba3f1f3-168c"
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
5772
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136702-174418-174415_rc.jpg
www.golem.de/1809/
4 KB
4 KB
Image
General
Full URL
https://www.golem.de/1809/136702-174418-174415_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
7b3320fc6cbf3bfb724b947adb56c9c246cd205de6ca409308003a7b899ceb94

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 10:49:04 GMT
Server
nginx
ETag
"5ba4cca0-ed7"
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
3799
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136627-174139-174138_rc.jpg
www.golem.de/1809/
6 KB
7 KB
Image
General
Full URL
https://www.golem.de/1809/136627-174139-174138_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
7087c8a16fc5d289bf4189af186fcfb7190d5e5cd5f0683cbeebce27d1fe3707

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Thu, 20 Sep 2018 10:02:05 GMT
Server
nginx
ETag
"5ba3701d-19a3"
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
6563
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136700-174413-174410_rc.jpg
www.golem.de/1809/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1809/136700-174413-174410_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
933e944e49c9a8efbc6220988536de84bdec3e2f63e3e17f4bfff78db3f1ff9f

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 10:27:04 GMT
Server
nginx
ETag
"5ba4c778-1fe8"
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
8168
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136648-174132-174131_rc.jpg
www.golem.de/1809/
6 KB
7 KB
Image
General
Full URL
https://www.golem.de/1809/136648-174132-174131_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3b1c3e0f78e681a76bd994299d1906453f6a497c5498d1f947d4e7853488d2ac

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0; __utma=21769261.1052267495.1537549838.1537549838.1537549838.1; __utmb=21769261.0.10.1537549838; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Wed, 19 Sep 2018 13:59:05 GMT
Server
nginx
ETag
"5ba25629-19e6"
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
6630
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136699-174408-174405_rc.jpg
www.golem.de/1809/
9 KB
10 KB
Image
General
Full URL
https://www.golem.de/1809/136699-174408-174405_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
475acadecd11dd2dfa21856a8055405a94ea41f28e09d5c6689efec2d36b5e32

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 09:55:03 GMT
Server
nginx
ETag
"5ba4bff7-2515"
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
9493
Expires
Mon, 22 Oct 2018 17:10:37 GMT
136185-173901-173900_rc.jpg
www.golem.de/1809/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1809/136185-173901-173900_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
fccafa91724213b8e0af8640d56eb94574f8e9a3f099ddee81319486f36a3e65

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Wed, 19 Sep 2018 13:00:07 GMT
Server
nginx
ETag
"5ba24857-231d"
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
8989
Expires
Mon, 22 Oct 2018 17:10:37 GMT
sp_136683-174341-174339_rc.jpg
www.golem.de/1809/
14 KB
14 KB
Image
General
Full URL
https://www.golem.de/1809/sp_136683-174341-174339_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
63af2e1b149907aedaedaaffbb54d95d3bb52468673502953a6dd9c87a4cb78c

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Thu, 20 Sep 2018 18:09:05 GMT
Server
nginx
ETag
"5ba3e241-36db"
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
14043
Expires
Mon, 22 Oct 2018 17:10:37 GMT
sp_136468-173737-173735_rc.jpg
www.golem.de/1809/
33 KB
33 KB
Image
General
Full URL
https://www.golem.de/1809/sp_136468-173737-173735_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
afe275fe749ceb1206c11b0e60b2d336f83a0a5c9759f3f1ea44501ca45ce7fc

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Mon, 17 Sep 2018 10:01:16 GMT
Server
nginx
ETag
"5b9f7b6c-8289"
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
33417
Expires
Mon, 22 Oct 2018 17:10:37 GMT
sp_136593-173920-173918_rc.jpg
www.golem.de/1809/
19 KB
19 KB
Image
General
Full URL
https://www.golem.de/1809/sp_136593-173920-173918_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
4fdd042e1fa7f26b0e22df0c8836b4b121f96997e2d5769e1e896b0e697d5957

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Mon, 17 Sep 2018 13:08:10 GMT
Server
nginx
ETag
"5b9fa73a-4c79"
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
19577
Expires
Mon, 22 Oct 2018 17:10:37 GMT
sp_136612-173986-173984_rc.jpg
www.golem.de/1809/
16 KB
17 KB
Image
General
Full URL
https://www.golem.de/1809/sp_136612-173986-173984_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
159c31e0fbdc1b07174c375509e096accc513b7de233c12745f7d2eb199d873f

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Tue, 18 Sep 2018 07:55:06 GMT
Server
nginx
ETag
"5ba0af5a-4187"
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
16775
Expires
Mon, 22 Oct 2018 17:10:37 GMT
sp_136564-173779-173777_rc.jpg
www.golem.de/1809/
17 KB
17 KB
Image
General
Full URL
https://www.golem.de/1809/sp_136564-173779-173777_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1252394c4f5b1453fea443eaa34f3636d64d4a88fd66fc8e95185bf8b3a6b277

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 14 Sep 2018 09:58:07 GMT
Server
nginx
ETag
"5b9b862f-42a1"
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
17057
Expires
Mon, 22 Oct 2018 17:10:37 GMT
sp_136376-173549-173547_rc.jpg
www.golem.de/1809/
23 KB
24 KB
Image
General
Full URL
https://www.golem.de/1809/sp_136376-173549-173547_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a1779f221b4f117cec29024ab805135454dd55605ab34a4fbd2b38b21fc36a6f

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Wed, 12 Sep 2018 10:02:07 GMT
Server
nginx
ETag
"5b98e41f-5dab"
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
23979
Expires
Mon, 22 Oct 2018 17:10:37 GMT
sp_136584-173857-173855_rc.jpg
www.golem.de/1809/
16 KB
16 KB
Image
General
Full URL
https://www.golem.de/1809/sp_136584-173857-173855_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f2b273d59737ef0f4b09d2f7a77489950f680ef326c48c40fd79c0de2b55d5c5

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Mon, 17 Sep 2018 06:46:12 GMT
Server
nginx
ETag
"5b9f4db4-3f88"
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
16264
Expires
Mon, 22 Oct 2018 17:10:37 GMT
sp_136561-173723-173721_rc.jpg
www.golem.de/1809/
24 KB
24 KB
Image
General
Full URL
https://www.golem.de/1809/sp_136561-173723-173721_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
718c0f396b60c5a2ed980b3f064c693cc97b9eb9460276dccc3638734b511828

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 14 Sep 2018 07:00:08 GMT
Server
nginx
ETag
"5b9b5c78-5fa9"
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
24489
Expires
Mon, 22 Oct 2018 17:10:37 GMT
sp_136578-173813-173810_rc.jpg
www.golem.de/1809/
20 KB
20 KB
Image
General
Full URL
https://www.golem.de/1809/sp_136578-173813-173810_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a884b3ab10b9fb03fb7e6ced1b446a0c1339d0995bd854f0b887aaf62a83efee

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 14 Sep 2018 15:00:09 GMT
Server
nginx
ETag
"5b9bccf9-4e3c"
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
20028
Expires
Mon, 22 Oct 2018 17:10:37 GMT
sp_136523-173784-173782_rc.jpg
www.golem.de/1809/
25 KB
25 KB
Image
General
Full URL
https://www.golem.de/1809/sp_136523-173784-173782_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
cfe3414c2956e87e23eada50b7a85319c3fb46bd4810440aa0492213a8873095

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838; __io_d=1_705468254; __io=7381ac56e.ef59e7f2f_1537549837948; __io_lv=1537549837948; __io_unique_43098=21
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 14 Sep 2018 13:00:08 GMT
Server
nginx
ETag
"5b9bb0d8-6322"
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
25378
Expires
Mon, 22 Oct 2018 17:10:37 GMT
sp_136545-173646-173644_rc.jpg
www.golem.de/1809/
14 KB
15 KB
Image
General
Full URL
https://www.golem.de/1809/sp_136545-173646-173644_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3f377efe9a5303e68f051dfb0bb7c248fb65d8b2815c7f04c98794fd0b9be4ea

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838; __io_d=1_705468254; __io=7381ac56e.ef59e7f2f_1537549837948; __io_lv=1537549837948; __io_unique_43098=21
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Wed, 12 Sep 2018 18:28:06 GMT
Server
nginx
ETag
"5b995ab6-38d3"
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
14547
Expires
Mon, 22 Oct 2018 17:10:37 GMT
sp_136537-173623-173621_rc.jpg
www.golem.de/1809/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/1809/sp_136537-173623-173621_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
0ed3fafbbcb2cb5244edfa69bf0ab308b452fd9e898c9b01906117d11c7f2a13

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838; __io_d=1_705468254; __io=7381ac56e.ef59e7f2f_1537549837948; __io_lv=1537549837948; __io_unique_43098=21; __io_uh=1; __io_visit_43098=1
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Thu, 13 Sep 2018 10:06:09 GMT
Server
nginx
ETag
"5b9a3691-56d9"
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
22233
Expires
Mon, 22 Oct 2018 17:10:37 GMT
sp_136541-173633-173631_rc.jpg
www.golem.de/1809/
23 KB
24 KB
Image
General
Full URL
https://www.golem.de/1809/sp_136541-173633-173631_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
0a54a80e336bf4ca48d6cc954d0a12acd09a155ea3967ffb87fe9e89b27c1709

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838; __io_d=1_705468254; __io=7381ac56e.ef59e7f2f_1537549837948; __io_lv=1537549837948; __io_unique_43098=21; __io_uh=1; __io_visit_43098=1
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Wed, 12 Sep 2018 15:15:06 GMT
Server
nginx
ETag
"5b992d7a-5d76"
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
23926
Expires
Mon, 22 Oct 2018 17:10:37 GMT
sp_136436-173142-173140_rc.jpg
www.golem.de/1809/
31 KB
32 KB
Image
General
Full URL
https://www.golem.de/1809/sp_136436-173142-173140_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1e1f9be6d4eb0d4609d2dc4bb89999b61eca710323718f4c5e821ef2aa16a491

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838; __io_d=1_705468254; __io=7381ac56e.ef59e7f2f_1537549837948; __io_lv=1537549837948; __io_unique_43098=21; __io_uh=1; __io_visit_43098=1
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 07 Sep 2018 07:05:07 GMT
Server
nginx
ETag
"5b922323-7cd4"
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
31956
Expires
Mon, 22 Oct 2018 17:10:37 GMT
cpx.php
cpx.golem.de/
42 B
420 B
Image
General
Full URL
https://cpx.golem.de/cpx.php?class=0&ts=1537549838&ref=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:182 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
Apache /
Resource Hash
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 21 Sep 2018 17:10: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
ads
securepubads.g.doubleclick.net/gampad/
22 KB
6 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2005241750715003&correlator=90840458499793&output=json_html&callback=googletag.impl.pubads.callbackProxy1&impl=fif&adsid=NT&eid=953563517%2C21061300%2C21062186%2C21062126&vrg=249&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C728x90&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile1%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D1&cookie_enabled=1&bc=7&abxe=1&lmt=1537549837&dt=1537549837853&dlt=1537549837095&idt=682&frm=20&biw=1585&bih=1200&oid=3&adx=293&ady=0&adk=242336818&gut=v2&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%2F&dssz=67&icsg=2955487960108992&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x-1&msz=1000x-1&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&fws=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_249.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.22.98 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s18-in-f2.1e100.net
Software
cafe /
Resource Hash
d7eed0b77cc69ab1a1c257b93201ef4590e8e4bde79ab53c02d9460edc7bacff
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

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

Response headers

date
Fri, 21 Sep 2018 17:10:37 GMT
content-encoding
gzip
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="44,43,39,35"
content-length
6348
x-xss-protection
1; mode=block
google-lineitem-id
4775329615
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138242228674
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_249.js
securepubads.g.doubleclick.net/gpt/
51 KB
19 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_249.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_249.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.22.98 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s18-in-f2.1e100.net
Software
sffe /
Resource Hash
f7eeefc1dd6f250f4c4b89a1fef2d0fb85b280042059f1f2ee0d11de20c34e98
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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

Response headers

date
Fri, 21 Sep 2018 17:10:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 13 Sep 2018 13:39:46 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="44,43,39,35"
content-length
19757
x-xss-protection
1; mode=block
expires
Fri, 21 Sep 2018 17:10:37 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-29/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-29/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_249.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:81f::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Purpose
prefetch
Referer
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

Response headers

expires
Tue, 03 Sep 2019 15:25:37 GMT
cache-control
public, immutable, max-age=31536000
last-modified
Mon, 11 Jun 2018 14:38:59 GMT
content-type
text/html
ads
securepubads.g.doubleclick.net/gampad/
22 KB
6 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2005241750715003&correlator=90840458499793&output=json_html&callback=googletag.impl.pubads.callbackProxy2&impl=fif&adsid=NT&eid=953563517%2C21061300%2C21062186%2C21062126&vrg=249&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C1000x333%7C1000x250%7C1000x100%7C970x90%7C940x250%7C970x250%7C800x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile3%2Cvis55801%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D3&cookie_enabled=1&bc=7&abxe=1&lmt=1537549837&dt=1537549837865&dlt=1537549837095&idt=682&frm=20&biw=1585&bih=1200&oid=3&adx=0&ady=0&adk=2638043459&gut=v2&ifi=2&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=68&icsg=2955487960108992&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x10370&msz=99x1&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&fws=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_249.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.22.98 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s18-in-f2.1e100.net
Software
cafe /
Resource Hash
ea8af7f609f871c9bdcda24ffc2763fe0ad8c25dcc9b2374b42abb1e1d8d00c6
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

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

Response headers

date
Fri, 21 Sep 2018 17:10:38 GMT
content-encoding
gzip
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="44,43,39,35"
content-length
6345
x-xss-protection
1; mode=block
google-lineitem-id
4686089258
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138235188578
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
ads
securepubads.g.doubleclick.net/gampad/
26 KB
7 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2005241750715003&correlator=90840458499793&output=json_html&callback=googletag.impl.pubads.callbackProxy3&impl=fif&adsid=NT&eid=953563517%2C21061300%2C21062186%2C21062126&vrg=249&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C1000x333%7C1000x167%7C1000x125%7C1000x100%7C970x250%7C800x250%7C970x90%7C728x90%7C660x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile16%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D16&cookie_enabled=1&bc=7&abxe=1&lmt=1537549837&dt=1537549837872&dlt=1537549837095&idt=682&frm=20&biw=1585&bih=1200&oid=3&adx=0&ady=0&adk=3736976088&gut=v2&ifi=3&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=68&icsg=2955487960108992&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x418&msz=99x1&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&fws=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_249.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.22.98 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s18-in-f2.1e100.net
Software
cafe /
Resource Hash
2343e09eb2e4a940546c7b87f6ef2d8a69e530c2a62cfb5ea58c33375ef1b8e1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

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

Response headers

date
Fri, 21 Sep 2018 17:10:38 GMT
content-encoding
gzip
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="44,43,39,35"
content-length
7070
x-xss-protection
1; mode=block
google-lineitem-id
4643517062
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138234541632
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
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=44&t=1537549837586&de=392665845816&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatRendered=0&zMoatSlotTargetingLoaded=0&zMoatSlotTargetingSet=0&zMoatPageDataTargetingSet=0&zMoatSafetyTargetingSet=0&zMoatEmptySlot=0&zMoatNadoDataLoadTime=289&zMoatAllDataLoadTime=289&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=289&zMoat_YI3=289&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=2116753613&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
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

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:10:37 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Fri, 21 Sep 2018 17:10:37 GMT
p.min.js
cdn.emetriq.de/adp/profiling/0.1.13/
4 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.1.13/p.min.js
Requested by
Host: ups.xplosion.de
URL: https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:200c:1000:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
03f56c523e42f36e912b7109c0a97e43703d78c0884f59c07ff115e590e9fd7f

Request headers

Referer
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

Response headers

date
Fri, 22 Sep 2017 01:02:28 GMT
content-encoding
gzip
last-modified
Tue, 11 Apr 2017 11:21:30 GMT
server
AmazonS3
age
31507690
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
FiFeAFfpoMZPPyU16IPZd0oUAvReA_Mm
status
200
cache-control
max-age=31536000, no-transform, public
content-type
application/javascript; charset=utf-8
x-amz-cf-id
a-zxekyxY-ePKMB3_SyZcVf-QJGR07QTPDlvDNFvPVdqQhRGEn7R2w==
via
1.1 0437902e99783229e3317bb4dfe27240.cloudfront.net (CloudFront)
Cookie set dest5.html
iqdigital.demdex.net/ Frame 36F8
0
0
Document
General
Full URL
https://iqdigital.demdex.net/dest5.html?d_nsid=0
Requested by
Host: assets.adobedtm.com
URL: https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.194.25.183 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-194-25-183.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash

Request headers

Host
iqdigital.demdex.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/
Accept-Encoding
gzip, deflate
Cookie
demdex=54935172527602593263077058325949373375
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/

Response headers

Accept-Ranges
bytes
Cache-Control
max-age=21600
Content-Encoding
gzip
Content-Type
text/html
Expires
Thu, 01 Jan 1970 00:00:00 GMT
Last-Modified
Tue, 18 Sep 2018 17:35:47 GMT
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Pragma
no-cache
Set-Cookie
demdex=54935172527602593263077058325949373375;Path=/;Domain=.demdex.net;Expires=Wed, 20-Mar-2019 17:10:37 GMT;Max-Age=15552000
Vary
Accept-Encoding, User-Agent
X-TID
bAxDAs1KSXI=
Content-Length
2766
Connection
keep-alive
event
iqdigital.demdex.net/
848 B
2 KB
XHR
General
Full URL
https://iqdigital.demdex.net/event?_ts=1537549837801
Requested by
Host: assets.adobedtm.com
URL: https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.194.25.183 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-194-25-183.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
a6ed9bef023b95bc4817198bf4e64f0fe1df29ad8e26b34d6fcf5ae224e4ad16

Request headers

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

DCS
dcs-prod-irl1-v002-0b7da3add.edge-irl1.demdex.com 5.38.2.20180913102145 8ms
Pragma
no-cache
X-TID
PPI2uemyTG8=
Vary
Origin
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json;charset=utf-8
Content-Length
848
Expires
Thu, 01 Jan 1970 00:00:00 GMT
ibs:dpid=411&dpuuid=W6UmDgAABqhk7hKk
dpm.demdex.net/
Redirect Chain
  • https://cm.everesttech.net/cm/dd?d_uuid=54935172527602593263077058325949373375
  • https://dpm.demdex.net/ibs:dpid=411&dpuuid=W6UmDgAABqhk7hKk
42 B
769 B
Image
General
Full URL
https://dpm.demdex.net/ibs:dpid=411&dpuuid=W6UmDgAABqhk7hKk
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.194.25.183 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-194-25-183.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

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

Response headers

DCS
dcs-prod-irl1-v002-0078cc8b3.edge-irl1.demdex.com 5.38.2.20180913102145 3ms
Pragma
no-cache
X-TID
W9W4HvzoRPc=
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Cache-Control
no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private
Connection
keep-alive
Content-Type
image/gif
Content-Length
42
Expires
Thu, 01 Jan 1970 00:00:00 GMT

Redirect headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Server
AMO-cookiemap/1.1
P3P
CP="NOI NID DEVa PSAa PSDa OUR IND PUR COM NAV INT DEM"
Location
https://dpm.demdex.net/ibs:dpid=411&dpuuid=W6UmDgAABqhk7hKk
Cache-Control
no-cache
Connection
Keep-Alive
Keep-Alive
timeout=15,max=100
Content-Length
0
collect
stats.g.doubleclick.net/r/
Redirect Chain
  • https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=1121452614&utmhn=www.golem.de&utme=8(HTML5)9(1)11(2)&utmcs=UTF-8&utmsr=1600x1200&utmvp=1585x1200&utmsc=24-bit&utmul=en-us&utmje=...
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=964551683.1537549838&jid=1585770111&_v=5.7.2&z=1121452614
35 B
113 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=964551683.1537549838&jid=1585770111&_v=5.7.2&z=1121452614
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:400c:c00::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/
User-Agent
Mozilla/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
date
Fri, 21 Sep 2018 17:10:38 GMT
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT

Redirect headers

pragma
no-cache
date
Fri, 21 Sep 2018 17:10:37 GMT
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
status
302
location
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=964551683.1537549838&jid=1585770111&_v=5.7.2&z=1121452614
content-type
text/html; charset=UTF-8
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
368
expires
Fri, 01 Jan 1990 00:00:00 GMT
ibs:dpid=385489&dpuuid=6603726265934215195
dpm.demdex.net/
Redirect Chain
  • https://dsp.adfarm1.adition.com/cookie/?redirect=https%3A%2F%2Fdpm.demdex.net%2Fibs%3Adpid%3D385489%26dpuuid%3D%25%25COOKIE%25%25
  • https://dpm.demdex.net/ibs:dpid=385489&dpuuid=6603726265934215195
42 B
769 B
Image
General
Full URL
https://dpm.demdex.net/ibs:dpid=385489&dpuuid=6603726265934215195
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.194.25.183 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-194-25-183.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

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

Response headers

DCS
dcs-prod-irl1-v002-025321d5c.edge-irl1.demdex.com 5.38.2.20180913102145 4ms
Pragma
no-cache
X-TID
NNadx8LLQLE=
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Cache-Control
no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private
Connection
keep-alive
Content-Type
image/gif
Content-Length
42
Expires
Thu, 01 Jan 1970 00:00:00 GMT

Redirect headers

Location
https://dpm.demdex.net/ibs:dpid=385489&dpuuid=6603726265934215195
Date
Fri, 21 Sep 2018 17:10:37 GMT
Server
nginx
Connection
keep-alive
p3p
policyref="http://imagesrv.adition.com/w3c/p3p.xml",CP="NON DSP ADM DEV PSD IVDo OTPi OUR IND STP PHY PRE NAV UNI"
Transfer-Encoding
chunked
Expires
Thu, 01 Jan 1970 00:00:00 GMT
sp_mug0-839065-i_rc.jpg
www.golem.de/5821/
68 B
486 B
Image
General
Full URL
https://www.golem.de/5821/sp_mug0-839065-i_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 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
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838; __io_d=1_705468254; __io=7381ac56e.ef59e7f2f_1537549837948; __io_lv=1537549837948; __io_unique_43098=21; __io_uh=1; __io_visit_43098=1; golem_us=1a9f82ad
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:10:38 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:%2F,page:Homepage,language:de,site_skin:desktop,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:7381ac56e.ef59e7f2f_1537549837948,cdn_version:0]&s=6acc7c777cce3be138a245218c439c54&1537549837952
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
88.99.5.37 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.88-99-5-37.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/
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:10: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
/
tt.onthe.io/uniques/
33 B
515 B
Script
General
Full URL
https://tt.onthe.io/uniques/?current=21&holding=108810e7aaccba71ff5759d480adc9d0&hash_user=7381ac56e.ef59e7f2f_1537549837948&1537549837953
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
95.216.24.149 , Ukraine, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.149.24.216.95.clients.your-server.de
Software
nginx /
Resource Hash
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8

Request headers

Referer
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

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:10:38 GMT
Server
nginx
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
33
Expires
Thu, 01 Jan 1970 00:00:01 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:visits_instantly[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,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:7381ac56e.ef59e7f2f_1537549837948,cdn_version:0]&s=6acc7c777cce3be138a245218c439c54&__io=7381ac56e.ef59e7f2f_1537549837948&1537549837955
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
88.99.5.37 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.88-99-5-37.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/
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:10: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
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:pageviews[domain:www.golem.de,url:%2F,page:Homepage,language:de,site_skin:desktop,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:7381ac56e.ef59e7f2f_1537549837948,cdn_version:0]&s=6acc7c777cce3be138a245218c439c54&1537549837957
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
88.99.5.37 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.88-99-5-37.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/
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:10: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
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
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/
Connection
keep-alive
Content-Length
244
Accept
*/*
Referer
https://www.golem.de/
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
Fri, 21 Sep 2018 17:10:38 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
790
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
ca-pub-2342548244565729.js
pagead2.googlesyndication.com/pub-config/r20160913/
133 B
241 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
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:812::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 1; mode=block

Request headers

Referer
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

Response headers

date
Fri, 21 Sep 2018 15:46:09 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 20 Sep 2018 20:28:42 GMT
server
sffe
age
5068
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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
125
x-xss-protection
1; mode=block
expires
Sat, 22 Sep 2018 03:46:09 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20180917/r20180604/ Frame 36DA
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20180917/r20180604/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:812::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 1; mode=block

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/html/r20180917/r20180604/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/
accept-encoding
gzip, deflate
cookie
test_cookie=CheckForPermission
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/

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, 17 Sep 2018 19:12:12 GMT
expires
Mon, 01 Oct 2018 19:12:12 GMT
content-type
text/html; charset=UTF-8
etag
18162506661661110595
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
6931
x-xss-protection
1; mode=block
cache-control
public, max-age=1209600
age
338305
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/ Frame 405F
196 KB
73 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:812::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
6e02736a6f9e93cdfe22ded97de7a301f4633fad2372bfaa40c825ed2500c4a5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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

Response headers

date
Fri, 21 Sep 2018 17:10:37 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
74155
x-xss-protection
1; mode=block
server
cafe
etag
12098869324327732531
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Fri, 21 Sep 2018 17:10:37 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
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/
Connection
keep-alive
Content-Length
252
Accept
*/*
Referer
https://www.golem.de/
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
Fri, 21 Sep 2018 17:10:38 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
789
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
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/
Connection
keep-alive
Content-Length
250
Accept
*/*
Referer
https://www.golem.de/
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
Fri, 21 Sep 2018 17:10:38 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
787
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
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/
Connection
keep-alive
Content-Length
250
Accept
*/*
Referer
https://www.golem.de/
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
Fri, 21 Sep 2018 17:10:38 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
786
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
rmpslider-rl_122-min.js
www.golem.de/staticrl/scripts/radiant/
16 KB
7 KB
XHR
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/rmpslider-rl_122-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f070a404ffa3b35fb0636c3172879da6e87e3703bdb7b225c1872aec5a201c5e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838; __io_d=1_705468254; __io=7381ac56e.ef59e7f2f_1537549837948; __io_lv=1537549837948; __io_unique_43098=21; __io_uh=1; __io_visit_43098=1; golem_us=1a9f82ad; golem_uv=1a9f82ad; golem_uz=1a9f82ad
Connection
keep-alive
Cache-Control
no-cache
Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 21 Sep 2018 17:10:38 GMT
Content-Encoding
gzip
Last-Modified
Fri, 07 Sep 2018 13:23:44 GMT
Server
nginx
ETag
W/"5b927be0-407e"
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
Mon, 22 Oct 2018 17:10:38 GMT
ads
securepubads.g.doubleclick.net/gampad/
25 KB
8 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2005241750715003&correlator=90840458499793&output=json_html&callback=googletag.impl.pubads.callbackProxy4&impl=fif&adsid=NT&eid=953563517%2C21061300%2C21062186%2C21062126&vrg=249&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C300x300%7C300x600%7C300x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile8%2Cvis70801%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D8%26m_mv%3D70%2C60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D70%2C60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe&cookie_enabled=1&bc=7&abxe=1&lmt=1537549838&dt=1537549838072&dlt=1537549837095&idt=682&frm=20&biw=1585&bih=1200&oid=3&adx=993&ady=880&adk=1289509276&gut=v2&ifi=8&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=72&icsg=2955487960108992&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x384&msz=99x1&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&ga_fc=true&fws=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_249.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.22.98 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s18-in-f2.1e100.net
Software
cafe /
Resource Hash
05d54031e10a55e5d508d2ca8d24becb16634bbc1edae0f00a6a3111acd6c5e6
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

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

Response headers

date
Fri, 21 Sep 2018 17:10:38 GMT
content-encoding
gzip
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="44,43,39,35"
content-length
7437
x-xss-protection
1; mode=block
google-lineitem-id
4550223002
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
85376452645
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
ads
securepubads.g.doubleclick.net/gampad/
22 KB
7 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2005241750715003&correlator=90840458499793&output=json_html&callback=googletag.impl.pubads.callbackProxy5&impl=fif&adsid=NT&eid=953563517%2C21061300%2C21062186%2C21062126&vrg=249&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C1000x500%7C1000x333%7C1000x250%7C1000x167%7C1000x125%7C1000x100%7C970x90%7C800x250%7C970x250%7C970x90%7C800x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile4%2Cvis55801%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D4%26m_mv%3D60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe&cookie_enabled=1&bc=7&abxe=1&lmt=1537549838&dt=1537549838084&dlt=1537549837095&idt=682&frm=20&biw=1585&bih=1200&oid=3&adx=293&ady=1213&adk=780685045&gut=v2&ifi=9&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=72&icsg=2955487960108992&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x16&msz=99x1&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&ga_fc=true&fws=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_249.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.22.98 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s18-in-f2.1e100.net
Software
cafe /
Resource Hash
060aab0c3898c5312ac10d4ba85cc2b6b9509aa776d58ea1c19bd05710efba1a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

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

Response headers

date
Fri, 21 Sep 2018 17:10:38 GMT
content-encoding
gzip
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="44,43,39,35"
content-length
6379
x-xss-protection
1; mode=block
google-lineitem-id
4686089258
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138235188476
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
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&hostSiteUrl=https%3A%2F%2Fwww.golem.de%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_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&event_id=page_view&_sid=97578&_ver=0.1.13&_seg=jsonp&_=339952935480
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.1.13/p.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.251.222.238 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-251-222-238.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
83c3baeb96c9e8de784e725a4fb9fba02c6b597ef9421512cb9fb653d563e4ea

Request headers

Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:37 GMT
Content-Encoding
gzip
Server
Apache-Coyote/1.1
Vary
Accept-Encoding
P3P
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
Access-Control-Allow-Origin
*
Cache-Control
must-revalidate,no-cache,no-store
Connection
keep-alive
Content-Type
text/javascript
Content-Length
1501
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/ Frame 545D
73 KB
27 KB
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_249.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:81f::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
939afa865a77f028eab9017820c823d2b8c103c67ac3634d52d98d7a07f8a12a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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

Response headers

date
Mon, 17 Sep 2018 13:59:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
357056
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=":443"; ma=2592000; v="44,43,39,35"
content-length
27066
x-xss-protection
1; mode=block
server
cafe
etag
8604100894867228625
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Mon, 01 Oct 2018 13:59:42 GMT
imgad
pagead2.googlesyndication.com/pagead/
2 KB
3 KB
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/imgad?id=CICAgIDQ04jCzgEQARgBKAEyCLeTE4Yu5hvQQMa81o0F
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_249.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:812::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
5b54ebb2ed254f7922b3af74610d4487b245899ac8e4178f4c6553b6781da60a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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

Response headers

date
Fri, 21 Sep 2018 10:19:28 GMT
x-content-type-options
nosniff
server
cafe
age
24670
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
content-type
image/png
status
200
cache-control
public, max-age=604800
content-disposition
attachment; filename="image.png"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
2437
x-xss-protection
1; mode=block
expires
Fri, 28 Sep 2018 10:19:28 GMT
osd.js
pagead2.googlesyndication.com/pagead/
72 KB
26 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/osd.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_249.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:812::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
f4055bd0cdf467ff6940a20d9284a60987a85578033114820b1dc605dbb70991
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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

Response headers

date
Fri, 21 Sep 2018 16:39:01 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
1897
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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
26901
x-xss-protection
1; mode=block
server
cafe
etag
11408177114345171100
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=3600
timing-allow-origin
*
expires
Fri, 21 Sep 2018 17:39:01 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 545D
0
285 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvTSuMLGPK-2ZJiYDBGm16WjzBKKKgji27KJatZ9bcsfjZrw5PUd2uGdA0Kt0OwAC8xrbWV7XerJta1BnaTUrYsz5WN47fGrCDUhPVj6hrVus7s4TGQ5rStfIlPzcKh0J0d76Hk_LtAkb3aeMeBWXVC56Q-uNeFjSG8YKKxrBgsDdEhq_MzalgJNAbS1L69OK1R9JDt54DAZEu16KySaq8q9hsYmSog4Y-31SYuMdlYCuVrSDYZ-w&sai=AMfl-YTpN1YoIXSZfy0SHBZwY-_GulgFQN3nnIAmSIVSR1orVqFUZy4ZYWga_GgB_yaR2GLF6rSXRGP6zseiGlG8IkDYSUJL3ne6b41QrPEg&sig=Cg0ArKJSzCzUylnED-AHEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.22.98 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s18-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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

Response headers

timing-allow-origin
*
date
Fri, 21 Sep 2018 17:10:38 GMT
x-content-type-options
nosniff
server
cafe
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
0
x-xss-protection
1; mode=block
expires
Fri, 21 Sep 2018 17:10:38 GMT
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1537549837586&de=392665845816&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile1&zMoatRendered=1&zMoatSlotTargetingLoaded=1&zMoatSlotTargetingSet=1&zMoatPageDataTargetingSet=1&zMoatSafetyTargetingSet=1&zMoatEmptySlot=0&zMoatNadoDataLoadTime=289&zMoatAllDataLoadTime=289&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=289&zMoat_YI3=289&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1502698028&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
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

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:10:38 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Fri, 21 Sep 2018 17:10:38 GMT
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
642 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.169.93 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/
Origin
https://www.golem.de

Response headers

Date
Fri, 21 Sep 2018 17:10:39 GMT
Last-Modified
Fri, 21 Sep 2018 15:52:04 GMT
Server
AmazonS3
x-amz-request-id
82BA5FD5492EF5E7
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
orE30mgy16+Y3t/kD6Cft6OsV4P8KJEcuMPyMNV57zQz4H/INhIlgTQRZ0ycGvZFhrodzhtZ01s=
Expires
0
homadclienthttpsle-json.php
video.golem.de/staticrl/scripts/radiant/
286 B
677 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/
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
ff4b8e8962f23810dfba6084bd82cc367d9aa3b49bfe0612bb2a98bc592eb1fe

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
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/
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/
Origin
https://www.golem.de

Response headers

Date
Fri, 21 Sep 2018 17:10:38 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 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
XHR
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/js/rmp.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838; __io_d=1_705468254; __io=7381ac56e.ef59e7f2f_1537549837948; __io_lv=1537549837948; __io_unique_43098=21; __io_uh=1; __io_visit_43098=1; golem_us=1a9f82ad; golem_uv=1a9f82ad; golem_uz=1a9f82ad; AAMC_iqdigital_0=REGION%7C6; __gads=ID=4d39258a3e0fbaf4:T=1537549837:S=ALNI_MaieZZhwvpSqAyYZ7ztXFw59OeHuQ
Connection
keep-alive
Cache-Control
no-cache
Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 21 Sep 2018 17:10:38 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-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
Mon, 22 Oct 2018 17:10:38 GMT
sp_mug0-818539-i_rc.jpg
www.golem.de/1997/adproxy/
68 B
486 B
Image
General
Full URL
https://www.golem.de/1997/adproxy/sp_mug0-818539-i_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 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
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CvVersion%7C3.2.0; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838; __io_d=1_705468254; __io=7381ac56e.ef59e7f2f_1537549837948; __io_lv=1537549837948; __io_unique_43098=21; __io_uh=1; __io_visit_43098=1; golem_us=1a9f82ad; golem_uv=1a9f82ad; golem_uz=1a9f82ad; AAMC_iqdigital_0=REGION%7C6; __gads=ID=4d39258a3e0fbaf4:T=1537549837:S=ALNI_MaieZZhwvpSqAyYZ7ztXFw59OeHuQ
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:10:38 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
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/ Frame 5A92
73 KB
27 KB
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_249.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:81f::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
939afa865a77f028eab9017820c823d2b8c103c67ac3634d52d98d7a07f8a12a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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

Response headers

date
Mon, 17 Sep 2018 13:59:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
357056
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=":443"; ma=2592000; v="44,43,39,35"
content-length
27066
x-xss-protection
1; mode=block
server
cafe
etag
8604100894867228625
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Mon, 01 Oct 2018 13:59:42 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 5A92
0
137 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuib8dG_og8wdEoFDIxYlLT7KCWZGkOWqX_FVfyKhW5k2NBaHfcVcYPjNyFu408YW54IEazyhCiWMx9mCwRfd7Z86k5JWZzgWP9gQRxrfPM0QHaAzYf0nwGtVfQ_AwEd9mTLUOhiT2znPVOYCoKcQkyjRAgQ2yYHs2fXSpAmjNMw3gJJgbsF72TspOp2XKKWb-WHEgfnrR8yfMd5md7nWsIWlWfnFfdNFZ_8yhFVlvTHeDvvHUBsA&sai=AMfl-YSz5eR3g74s8COL-OZKwX4MwaeAQ2Q9jUTTnDVnYmETZKVgscRcrxO-EVwdF3_lKwuFyEaDgV4ZritzYZX4H9dIIa8ndRRIQxiYqToz&sig=Cg0ArKJSzCly16ilmvvxEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.22.98 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s18-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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

Response headers

timing-allow-origin
*
date
Fri, 21 Sep 2018 17:10:38 GMT
x-content-type-options
nosniff
server
cafe
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
0
x-xss-protection
1; mode=block
expires
Fri, 21 Sep 2018 17:10:38 GMT
moatad.js
z.moatads.com/iqdigital277772407506/ Frame 545D
256 KB
79 KB
Script
General
Full URL
https://z.moatads.com/iqdigital277772407506/moatad.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
664942fd51beb9edaaad165a23716c9258884fd9d895c527b67b7e421f97c096

Request headers

Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:38 GMT
Content-Encoding
gzip
Last-Modified
Thu, 20 Sep 2018 19:11:36 GMT
Server
AmazonS3
x-amz-request-id
7EDFF8B2AEA7F13B
ETag
"770c31cc3ec9ce894a9ef0cbdf896f64"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=48476
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
80761
x-amz-id-2
KJC8eSrf1HCHdbilyqm3525B7i2+FwVlbLgOse+QiIzuV9BP5aBY75DFW7MsQ4sPKuQjPLYNWks=
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1537549837586&de=392665845816&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile3&zMoatRendered=2&zMoatSlotTargetingLoaded=2&zMoatSlotTargetingSet=2&zMoatPageDataTargetingSet=2&zMoatSafetyTargetingSet=2&zMoatEmptySlot=0&zMoatNadoDataLoadTime=289&zMoatAllDataLoadTime=289&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=289&zMoat_YI3=289&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1219476211&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
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

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:10:38 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Fri, 21 Sep 2018 17:10:38 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/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.72.140.158 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-72-140-158.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.3 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

Referer
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

Response headers

Date
Fri, 21 Sep 2018 06:01:35 GMT
Content-Encoding
gzip
Last-Modified
Fri, 21 Sep 2018 06:01:20 GMT
Server
akka-http/10.1.3
ETag
"8fda08a34733677008755479a59fa669"
Content-Type
application/javascript; charset=UTF-8
Cache-Control
max-age=86400, must-revalidate
Connection
keep-alive
Content-Length
509
m
p.yieldlab.net/
0
336 B
Image
General
Full URL
https://p.yieldlab.net/m?dm_id=21719&ext_id=BSasWsa8ESJsEiU-BDf-BiUABifkBSU0WDfABifABifABfrr&ddata_seg=e0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
85.114.144.195 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
lb.yieldlab.net
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:10:38 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
X-XSS-Protection
1; mode=block
X-Application-Context
application
Expires
Thu, 20 Sep 2018 17:10:38 GMT
2.gif
xpl.theadex.com/d/327/i/
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSasWsa8ESJsEiU-BDf-BiUABifkBSU0WDfABifABifABfrr
  • https://xpl.theadex.com/d/327/i/2.gif?_sc=1000918391910380040&axd_pid=22&axd_fuid=BSasWsa8ESJsEiU-BDf-BiUABifkBSU0WDfABifABifABfrr
43 B
717 B
Image
General
Full URL
https://xpl.theadex.com/d/327/i/2.gif?_sc=1000918391910380040&axd_pid=22&axd_fuid=BSasWsa8ESJsEiU-BDf-BiUABifkBSU0WDfABifABifABfrr
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
89.163.159.101 Hattersheim, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277

Request headers

Referer
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

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:10:38 GMT
Last-Modified
Fri, 21 Sep 2018 17:10:38 GMT
Server
nginx
P3P
CP="CAO PSA OUR"
Cache-Control
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Content-Transfer-Encoding
binary
Connection
keep-alive
Access-Control-Allow-Credentials
true
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT

Redirect headers

Date
Fri, 21 Sep 2018 17:10:38 GMT
Server
nginx
Transfer-Encoding
chunked
P3P
CP="CAO PSA OUR"
Location
https://xpl.theadex.com:443/d/327/i/2.gif?_sc=1000918391910380040&axd_pid=22&axd_fuid=BSasWsa8ESJsEiU-BDf-BiUABifkBSU0WDfABifABifABfrr
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html; charset=UTF-8
a.js
d.df-srv.de/match/
Redirect Chain
  • https://d.df-srv.de/match/a.js?pid=42
  • https://dsp.adfarm1.adition.com/cookie/?redirect=https%3A%2F%2Fd.df-srv.de%2Fmatch%2Fa.js%3Fpid%3D42%26l%3D1%26adition_vid%3D%25%25COOKIE%25%25
  • https://d.df-srv.de/match/a.js?pid=42&l=1&adition_vid=6603726265934215195
3 B
466 B
Image
General
Full URL
https://d.df-srv.de/match/a.js?pid=42&l=1&adition_vid=6603726265934215195
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2001:16e0:10a:1::c1:1 , Germany, ASN12611 (RKOM R-KOM Regensburger Telekommunikations GmbH & Co. KG, DE),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
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

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:09:09 GMT
Server
nginx
P3P
CP="Contact Impact does not have a P3P policy.
Cache-Control
no-cache, no-store, must-revalidate
Connection
close
Content-Type
application/javascript; charset=utf-8
Content-Length
3
Expires
0

Redirect headers

Location
https://d.df-srv.de/match/a.js?pid=42&l=1&adition_vid=6603726265934215195
Date
Fri, 21 Sep 2018 17:10:38 GMT
Server
nginx
Connection
keep-alive
p3p
policyref="http://imagesrv.adition.com/w3c/p3p.xml",CP="NON DSP ADM DEV PSD IVDo OTPi OUR IND STP PHY PRE NAV UNI"
Transfer-Encoding
chunked
Expires
Thu, 01 Jan 1970 00:00:00 GMT
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
221 B
888 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.101.118 Wilmington, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-101-118.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
4ca761566d6efd4d84cc704d3c6e61132e2163d17707ec72415c82ab22d2fe87

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

Response headers

Date
Fri, 21 Sep 2018 14:33:06 GMT
Via
1.1 bee9d99ac2913ec4167e166e6bdb691e.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
47
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
221
Last-Modified
Fri, 21 Sep 2018 14:32:18 GMT
Server
AmazonS3
ETag
"5082c0dc646eb9223054358caad7d94e"
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
alMOWdHq7LJEflWTueHY3V4-2zAi8VMp0V8Uzo4UoRfT6l25F4NojA==
Expires
0
/
iqdigital.demdex.net/event/
0
739 B
Image
General
Full URL
https://iqdigital.demdex.net/event/?d_cid_ic=emetriq%01BSasWsa8ESJsEiU-BDf-BiUABifkBSU0WDfABifABifABfrr%010
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.194.25.183 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-194-25-183.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
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

Response headers

Pragma
no-cache
Expires
Thu, 01 Jan 1970 00:00:00 GMT
Cache-Control
no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private
Content-Type
application/json;charset=utf-8
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43067:uniques_holding&s=6acc7c777cce3be138a245218c439c54&__io=7381ac56e.ef59e7f2f_1537549837948&1537549838251
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
88.99.5.37 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.88-99-5-37.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/
Origin
https://www.golem.de

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:10:38 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
moatad.js
z.moatads.com/iqdigital277772407506/ Frame 5A92
256 KB
79 KB
Script
General
Full URL
https://z.moatads.com/iqdigital277772407506/moatad.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
664942fd51beb9edaaad165a23716c9258884fd9d895c527b67b7e421f97c096

Request headers

Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:38 GMT
Content-Encoding
gzip
Last-Modified
Thu, 20 Sep 2018 19:11:36 GMT
Server
AmazonS3
x-amz-request-id
7EDFF8B2AEA7F13B
ETag
"770c31cc3ec9ce894a9ef0cbdf896f64"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=48476
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
80761
x-amz-id-2
KJC8eSrf1HCHdbilyqm3525B7i2+FwVlbLgOse+QiIzuV9BP5aBY75DFW7MsQ4sPKuQjPLYNWks=
ads
googleads.g.doubleclick.net/pagead/ Frame 51A2
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=6643888890&adk=3280156863&adf=3446949021&w=520&lmt=1537549838&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1537549837969&bpp=16&bdt=873&fdt=19&idt=293&shv=r20180917&cbv=r20180604&saldr=aa&abxe=1&correlator=5921099423551&frm=20&pv=2&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&ga_fc=1&iag=0&icsg=2955487960108992&dssz=82&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=453&ady=4031&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064254&oid=3&rx=0&eae=0&fc=528&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=7&osw_key=636311223&ifi=4&fsb=1&xpc=ntjkkyk7hH&p=https%3A//www.golem.de&dtd=322
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:812::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 1; mode=block

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=6643888890&adk=3280156863&adf=3446949021&w=520&lmt=1537549838&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1537549837969&bpp=16&bdt=873&fdt=19&idt=293&shv=r20180917&cbv=r20180604&saldr=aa&abxe=1&correlator=5921099423551&frm=20&pv=2&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&ga_fc=1&iag=0&icsg=2955487960108992&dssz=82&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=453&ady=4031&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064254&oid=3&rx=0&eae=0&fc=528&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=7&osw_key=636311223&ifi=4&fsb=1&xpc=ntjkkyk7hH&p=https%3A//www.golem.de&dtd=322
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/
accept-encoding
gzip, deflate
cookie
IDE=AHWqTUnHMvsLsj68aPwYniP-7XgXo4w_6em1bP500tvMU8LtpRDBh2yB5VcrjZS_; test_cookie=CheckForPermission
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/

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
gzip
date
Fri, 21 Sep 2018 17:10:38 GMT
server
cafe
cache-control
private
content-length
21730
x-xss-protection
1; mode=block
set-cookie
test_cookie=; domain=.doubleclick.net; path=/; expires=Mon, 21 Jul 2008 23:59:00 GMT
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
expires
Fri, 21 Sep 2018 17:10:38 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/ Frame CBE0
73 KB
0
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_249.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:812::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
6f1820fb18fd530846406f6f01440f4124b5ebb231a5bdb9f6b60ddf5737c42a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Fri, 21 Sep 2018 17:10:37 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
27516
x-xss-protection
1; mode=block
server
cafe
etag
3406154613634451085
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Fri, 21 Sep 2018 17:10:37 GMT
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/ Frame CBE0
73 KB
0
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_249.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:81f::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
939afa865a77f028eab9017820c823d2b8c103c67ac3634d52d98d7a07f8a12a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Mon, 17 Sep 2018 13:59:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
357056
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=":443"; ma=2592000; v="44,43,39,35"
content-length
27066
x-xss-protection
1; mode=block
server
cafe
etag
8604100894867228625
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Mon, 01 Oct 2018 13:59:42 GMT
moatad.js
z.moatads.com/iqdigital277772407506/ Frame CBE0
256 KB
79 KB
Script
General
Full URL
https://z.moatads.com/iqdigital277772407506/moatad.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
664942fd51beb9edaaad165a23716c9258884fd9d895c527b67b7e421f97c096

Request headers

Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:38 GMT
Content-Encoding
gzip
Last-Modified
Thu, 20 Sep 2018 19:11:36 GMT
Server
AmazonS3
x-amz-request-id
7EDFF8B2AEA7F13B
ETag
"770c31cc3ec9ce894a9ef0cbdf896f64"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=48476
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
80761
x-amz-id-2
KJC8eSrf1HCHdbilyqm3525B7i2+FwVlbLgOse+QiIzuV9BP5aBY75DFW7MsQ4sPKuQjPLYNWks=
truncated
/ Frame CBE0
214 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
72c2dd734f2818014582b8a8d635b662b84e27336341daf79c22d7761716be47

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
view
securepubads.g.doubleclick.net/pcs/ Frame CBE0
0
137 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvqsWT8hexYj6HJ7x0hGWfhqMkvg3T4IxqvricQkYokPlSO8V5DBwIRw4hdpazIy8hcnNW_mzz6iuE0qky3b3Y3dpwYzL9jyYkIbt_cnM48fFRp8EjnKaXwrYmL7Rsij9ruvkvom_GFk79W92a5ACPWzQkgpmW-OpcrycRvO82iczGbEo35m4whiu_AEOVuOqi9c5H1trXttQB2BoPOltz4gtpAQtdwss7w2eGXeCa7h4oIY3CNLLVMzBw&sai=AMfl-YSr-XtEhddFgYEFE98TVARRJW1lsK0YYCs9sl1fKggBNIh6HAQ0fmATA6uaC5vLK-JPVhIPal_SjEN1JUi5hGpN2vFrHJGmSdDpcNJ-&sig=Cg0ArKJSzCKq67zjPDeXEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.22.98 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s18-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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

Response headers

timing-allow-origin
*
date
Fri, 21 Sep 2018 17:10:38 GMT
x-content-type-options
nosniff
server
cafe
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
0
x-xss-protection
1; mode=block
expires
Fri, 21 Sep 2018 17:10:38 GMT
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1537549837586&de=392665845816&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile16&zMoatRendered=3&zMoatSlotTargetingLoaded=3&zMoatSlotTargetingSet=2&zMoatPageDataTargetingSet=3&zMoatSafetyTargetingSet=3&zMoatEmptySlot=0&zMoatNadoDataLoadTime=289&zMoatAllDataLoadTime=289&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=289&zMoat_YI3=289&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1580907549&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
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

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:10:38 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Fri, 21 Sep 2018 17:10:38 GMT
hd-main.js
hgc-cf-cache-1.svonm.com/
187 KB
51 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=jNYIcVCmcM
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.101.118 Wilmington, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-101-118.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
fe7a549a41ab7e79dea6ca3b628fa375219e4d353758f30f5bcea96b36970d9d

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

Response headers

Date
Thu, 20 Sep 2018 14:40:56 GMT
Content-Encoding
gzip
Vary
Accept-Encoding,Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
47
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Thu, 20 Sep 2018 14:40:43 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 bee9d99ac2913ec4167e166e6bdb691e.cloudfront.net (CloudFront)
Cache-Control
no-cache
X-Amz-Cf-Id
M7p0LpgjbjuIp1VGAWKE6WMkDd6Mh6BGWJFOZFJ3GDDMNxSHAyBrcw==
display-ohne-werbung3.png
www.golem.de/staticrl/images/abo/
924 B
1 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/abo/display-ohne-werbung3.png
Requested by
Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/osd_listener.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
fec4969577c947a272b6be6924b17ca584660dccaa35d17dd05471b0f0b3e548

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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_114-min.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838; __io_d=1_705468254; __io=7381ac56e.ef59e7f2f_1537549837948; __io_lv=1537549837948; __io_unique_43098=21; __io_uh=1; __io_visit_43098=1; golem_us=1a9f82ad; golem_uv=1a9f82ad; golem_uz=1a9f82ad; AAMC_iqdigital_0=REGION%7C6; adp_segs=e0; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CMCSYNCSOP%7C411-17803%7CvVersion%7C3.2.0; __gads=ID=5c9a2c3958320211:T=1537549837:S=ALNI_MZkR_EBYRkyqUmZeR685EckgIwVfQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/staticrl/styles/golem_main_114-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
Fri, 21 Sep 2018 17:10:38 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-39c"
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
924
Expires
Mon, 22 Oct 2018 17:10:38 GMT
display-mit-werbung3.png
www.golem.de/staticrl/images/abo/
1 KB
1 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/abo/display-mit-werbung3.png
Requested by
Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/osd_listener.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
e192dd8b901bad10acc59606190d742e67dc587f9d3334c609ab030fe12ed52e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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_114-min.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838; __io_d=1_705468254; __io=7381ac56e.ef59e7f2f_1537549837948; __io_lv=1537549837948; __io_unique_43098=21; __io_uh=1; __io_visit_43098=1; golem_us=1a9f82ad; golem_uv=1a9f82ad; golem_uz=1a9f82ad; AAMC_iqdigital_0=REGION%7C6; adp_segs=e0; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CMCSYNCSOP%7C411-17803%7CvVersion%7C3.2.0; __gads=ID=5c9a2c3958320211:T=1537549837:S=ALNI_MZkR_EBYRkyqUmZeR685EckgIwVfQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/staticrl/styles/golem_main_114-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
Fri, 21 Sep 2018 17:10:38 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-44b"
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
1099
Expires
Mon, 22 Oct 2018 17:10:38 GMT
integrator.js
adservice.google.de/adsid/ Frame CBE0
109 B
171 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.golem.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81b::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 1; mode=block

Request headers

Referer
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

Response headers

timing-allow-origin
*
date
Fri, 21 Sep 2018 17:10:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
104
x-xss-protection
1; mode=block
integrator.js
adservice.google.com/adsid/ Frame CBE0
109 B
171 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.golem.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81b::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 1; mode=block

Request headers

Referer
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

Response headers

timing-allow-origin
*
date
Fri, 21 Sep 2018 17:10:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
104
x-xss-protection
1; mode=block
ca-pub-6583763995580712.js
pagead2.googlesyndication.com/pub-config/r20160913/ Frame CBE0
68 B
179 B
Script
General
Full URL
https://pagead2.googlesyndication.com/pub-config/r20160913/ca-pub-6583763995580712.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:812::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
8ba131a677ea1357ae7fdc95d6a5c67c3b02d171bb286f6c9ec6bce3cef5c211
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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

Response headers

date
Fri, 21 Sep 2018 12:04:03 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
age
18395
content-type
text/javascript
status
200
cache-control
public, max-age=43200
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
88
x-xss-protection
1; mode=block
expires
Sat, 22 Sep 2018 00:04:03 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/ Frame DE15
196 KB
0
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:812::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
6e02736a6f9e93cdfe22ded97de7a301f4633fad2372bfaa40c825ed2500c4a5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Fri, 21 Sep 2018 17:10:37 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
74155
x-xss-protection
1; mode=block
server
cafe
etag
12098869324327732531
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Fri, 21 Sep 2018 17:10:37 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 0AA9
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=9597355291&adk=1011330417&adf=2459742235&w=520&lmt=1537549838&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1537549837989&bpp=7&bdt=892&fdt=403&idt=404&shv=r20180917&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120&correlator=5921099423551&frm=20&pv=1&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&ga_fc=1&iag=0&icsg=2955487960108992&dssz=82&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=453&ady=4708&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064254&oid=3&rx=0&eae=0&fc=528&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=7&osw_key=1823298079&ifi=5&fsb=1&xpc=kgP9ZSolLA&p=https%3A//www.golem.de&dtd=410
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:812::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 1; mode=block

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=9597355291&adk=1011330417&adf=2459742235&w=520&lmt=1537549838&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1537549837989&bpp=7&bdt=892&fdt=403&idt=404&shv=r20180917&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120&correlator=5921099423551&frm=20&pv=1&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&ga_fc=1&iag=0&icsg=2955487960108992&dssz=82&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=453&ady=4708&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064254&oid=3&rx=0&eae=0&fc=528&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=7&osw_key=1823298079&ifi=5&fsb=1&xpc=kgP9ZSolLA&p=https%3A//www.golem.de&dtd=410
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/
accept-encoding
gzip, deflate
cookie
IDE=AHWqTUnHMvsLsj68aPwYniP-7XgXo4w_6em1bP500tvMU8LtpRDBh2yB5VcrjZS_
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/

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
gzip
date
Fri, 21 Sep 2018 17:10:38 GMT
server
cafe
cache-control
private
content-length
13739
x-xss-protection
1; mode=block
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
activation
adstax-match.adrtx.net/ Frame 4A08
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.208.127.173 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-208-127-173.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.3 /
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/
Accept-Encoding
gzip, deflate
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/

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Fri, 21 Sep 2018 17:10:38 GMT
Server
akka-http/10.1.3
X-Error-Reason
Missing UserId in activation request for config adaud.
Content-Length
39
Connection
keep-alive
vgs.json
cdn.radiantmediatechs.com/rmp/rr/
4 KB
2 KB
XHR
General
Full URL
https://cdn.radiantmediatechs.com/rmp/rr/vgs.json?rdm=427097
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2400:cb00:2048:1::6818:6624 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
13a1b58170d2bb727a0f68a64971213928d2e3cdea1efa56b42635bc7247aa26
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/
Origin
https://www.golem.de

Response headers

date
Fri, 21 Sep 2018 17:10:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
cf-cache-status
HIT
status
200
content-length
1670
timing-allow-origin
*
last-modified
Tue, 04 Sep 2018 11:00:36 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
accept-ranges
bytes
cf-ray
45de257ab9676349-FRA
access-control-allow-headers
Origin, X-Requested-With, Content-Type, Accept, Range
expires
Fri, 21 Sep 2018 18:10:38 GMT
rmp-s2.min.css
www.golem.de/staticrl/scripts/radiant/4.9.1/css/
57 KB
12 KB
Stylesheet
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838; __io_d=1_705468254; __io=7381ac56e.ef59e7f2f_1537549837948; __io_lv=1537549837948; __io_unique_43098=21; __io_uh=1; __io_visit_43098=1; golem_us=1a9f82ad; golem_uv=1a9f82ad; golem_uz=1a9f82ad; AAMC_iqdigital_0=REGION%7C6; adp_segs=e0; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CMCSYNCSOP%7C411-17803%7CvVersion%7C3.2.0; __gads=ID=5c9a2c3958320211:T=1537549837:S=ALNI_MZkR_EBYRkyqUmZeR685EckgIwVfQ
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:38 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-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
Mon, 22 Oct 2018 17:10:38 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/ Frame E0C0
196 KB
0
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:812::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
6e02736a6f9e93cdfe22ded97de7a301f4633fad2372bfaa40c825ed2500c4a5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Fri, 21 Sep 2018 17:10:37 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
74155
x-xss-protection
1; mode=block
server
cafe
etag
12098869324327732531
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Fri, 21 Sep 2018 17:10:37 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 85E9
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=2074088491&adk=3577236908&adf=653379571&w=520&lmt=1537549838&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1537549837996&bpp=5&bdt=901&fdt=503&idt=506&shv=r20180917&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=5921099423551&frm=20&pv=1&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&ga_fc=1&iag=0&icsg=2955487960108992&dssz=82&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=453&ady=5417&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064254&oid=3&rx=0&eae=0&fc=528&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=7&osw_key=154924829&ifi=6&fsb=1&xpc=RFgQgHM55z&p=https%3A//www.golem.de&dtd=515
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:812::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 1; mode=block

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=2074088491&adk=3577236908&adf=653379571&w=520&lmt=1537549838&num_ads=1&guci=1.2.0.0.2.2.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1537549837996&bpp=5&bdt=901&fdt=503&idt=506&shv=r20180917&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=5921099423551&frm=20&pv=1&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1227408094&ga_fc=1&iag=0&icsg=2955487960108992&dssz=82&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=453&ady=5417&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C828064254&oid=3&rx=0&eae=0&fc=528&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=7&osw_key=154924829&ifi=6&fsb=1&xpc=RFgQgHM55z&p=https%3A//www.golem.de&dtd=515
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/
accept-encoding
gzip, deflate
cookie
IDE=AHWqTUnHMvsLsj68aPwYniP-7XgXo4w_6em1bP500tvMU8LtpRDBh2yB5VcrjZS_
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/

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
gzip
date
Fri, 21 Sep 2018 17:10:38 GMT
server
cafe
cache-control
private
content-length
20752
x-xss-protection
1; mode=block
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
truncated
/
187 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
fe7a549a41ab7e79dea6ca3b628fa375219e4d353758f30f5bcea96b36970d9d

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
text/javascript
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/ Frame 8013
196 KB
0
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:812::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
6e02736a6f9e93cdfe22ded97de7a301f4633fad2372bfaa40c825ed2500c4a5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Fri, 21 Sep 2018 17:10:37 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
74155
x-xss-protection
1; mode=block
server
cafe
etag
12098869324327732531
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Fri, 21 Sep 2018 17:10:37 GMT
/
golem.whitepaperdb.de/ Frame E7A8
0
0
Document
General
Full URL
https://golem.whitepaperdb.de/?tag=golem
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_249.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.138.242.228 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
mail.whitepaperdb.de
Software
nginx / PHP/7.0.32 PleskLin
Resource Hash

Request headers

:method
GET
:authority
golem.whitepaperdb.de
:scheme
https
:path
/?tag=golem
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/
accept-encoding
gzip, deflate
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/

Response headers

status
200
server
nginx
date
Fri, 21 Sep 2018 17:10:38 GMT
content-type
text/html; charset=UTF-8
vary
Accept-Encoding
x-powered-by
PHP/7.0.32 PleskLin
set-cookie
WIDS=3739
content-encoding
gzip
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/ Frame DB18
73 KB
0
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_249.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:81f::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
939afa865a77f028eab9017820c823d2b8c103c67ac3634d52d98d7a07f8a12a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Mon, 17 Sep 2018 13:59:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
357056
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=":443"; ma=2592000; v="44,43,39,35"
content-length
27066
x-xss-protection
1; mode=block
server
cafe
etag
8604100894867228625
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Mon, 01 Oct 2018 13:59:42 GMT
moatad.js
z.moatads.com/iqdigital277772407506/ Frame DB18
256 KB
79 KB
Script
General
Full URL
https://z.moatads.com/iqdigital277772407506/moatad.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
664942fd51beb9edaaad165a23716c9258884fd9d895c527b67b7e421f97c096

Request headers

Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:38 GMT
Content-Encoding
gzip
Last-Modified
Thu, 20 Sep 2018 19:11:36 GMT
Server
AmazonS3
x-amz-request-id
7EDFF8B2AEA7F13B
ETag
"770c31cc3ec9ce894a9ef0cbdf896f64"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=48476
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
80761
x-amz-id-2
KJC8eSrf1HCHdbilyqm3525B7i2+FwVlbLgOse+QiIzuV9BP5aBY75DFW7MsQ4sPKuQjPLYNWks=
truncated
/ Frame DB18
216 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
38ee16973ee8b9d225edb3cf6d8210f23c551b20a7503b7535a8562236b70bbe

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
view
securepubads.g.doubleclick.net/pcs/ Frame DB18
0
56 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssQsbwVJPlehNMVjtkqbhbxD4pUAddam_ib7oF-HX7oZ7W4NMYqII4wyh9ujfQzafTprK8W9_JMQw2nZf4j20caooIjyHUMaMO8_OyjejhEw0CLo-PJSzHLSOuKuf_RzdNvAO5ah5Ncio3JfpZtHdNLZ6fZjQEP6ysunOtZnXsW7jQpYdon4UY0eF3lRGlrLPpGvF-_oH5ZbjEHZD-KrCCXYqvKGnJsZln1LIMxJN2_69h5L1r5g3NFxVs8YeHZw6vPOHSEQZXLLw&sai=AMfl-YQVgda6IAQpXwdbIlToC8UY1tOptiRMWmb-7RCO9FUmenRztfz0rl2RucDDRwFz-69N_MJQCU1HVzZKHlXbSDbGay4UQL7vWyGBeIJnw74XspRa2mYz1c01Upse&sig=Cg0ArKJSzLcBwyL_5jz0EAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.22.98 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s18-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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

Response headers

timing-allow-origin
*
date
Fri, 21 Sep 2018 17:10:38 GMT
x-content-type-options
nosniff
server
cafe
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
0
x-xss-protection
1; mode=block
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1537549837586&de=392665845816&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile8&zMoatRendered=4&zMoatSlotTargetingLoaded=4&zMoatSlotTargetingSet=3&zMoatPageDataTargetingSet=4&zMoatSafetyTargetingSet=4&zMoatEmptySlot=0&zMoatNadoDataLoadTime=289&zMoatAllDataLoadTime=289&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=289&zMoat_YI3=289&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=98057773&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
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

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:10:38 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Fri, 21 Sep 2018 17:10:38 GMT
ima3.js
imasdk.googleapis.com/js/sdkloader/
230 KB
79 KB
Script
General
Full URL
https://imasdk.googleapis.com/js/sdkloader/ima3.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81f::200a , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
32f5f2cfa397535f89f47b3b3db8eea2594564e25d16962edca687076113d218
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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

Response headers

date
Fri, 21 Sep 2018 17:10:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
81046
x-xss-protection
1; mode=block
expires
Fri, 21 Sep 2018 17:10:38 GMT
truncated
/
68 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
431ced6916a2a21a156e38701afe55bbd7f88969fbbfc56d7fe099d47f265460

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
publishertag.prebid.js
static.criteo.net/js/ld/
34 KB
12 KB
Script
General
Full URL
https://static.criteo.net/js/ld/publishertag.prebid.js
Requested by
Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid29082018.js
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_256_CBC
Server
178.250.0.130 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
nginx /
Resource Hash
b70c29fb442ecbfaf97100b7875a539d88a9f34b2955554ae10eb89334ffb945

Request headers

Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:38 GMT
Content-Encoding
gzip
Last-Modified
Wed, 19 Sep 2007 08:50:25 GMT
Server
nginx
ETag
W/"5b509c3d-89ab"
Transfer-Encoding
chunked
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
max-age=86400, public
Connection
keep-alive
Timing-Allow-Origin
*
Expires
Sat, 22 Sep 2018 17:10:38 GMT
truncated
/
715 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd

Request headers

Response headers

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

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
rmp-font.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
8 KB
9 KB
Font
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/rmp-font.woff2?vj7w12
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
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
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838; __io_d=1_705468254; __io=7381ac56e.ef59e7f2f_1537549837948; __io_lv=1537549837948; __io_unique_43098=21; __io_uh=1; __io_visit_43098=1; golem_us=1a9f82ad; golem_uv=1a9f82ad; golem_uz=1a9f82ad; AAMC_iqdigital_0=REGION%7C6; adp_segs=e0; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CMCSYNCSOP%7C411-17803%7CvVersion%7C3.2.0; __gads=ID=98bdc78bca0dc226:T=1537549838:S=ALNI_MaHzQFgGRrGjiIz9jnWBd7Yj6skIA
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
Fri, 21 Sep 2018 17:10:38 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-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
Mon, 22 Oct 2018 17:10:38 GMT
roboto-v18-latin-regular.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
15 KB
15 KB
Font
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/roboto-v18-latin-regular.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 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
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838; __io_d=1_705468254; __io=7381ac56e.ef59e7f2f_1537549837948; __io_lv=1537549837948; __io_unique_43098=21; __io_uh=1; __io_visit_43098=1; golem_us=1a9f82ad; golem_uv=1a9f82ad; golem_uz=1a9f82ad; AAMC_iqdigital_0=REGION%7C6; adp_segs=e0; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CMCSYNCSOP%7C411-17803%7CvVersion%7C3.2.0; __gads=ID=98bdc78bca0dc226:T=1537549838:S=ALNI_MaHzQFgGRrGjiIz9jnWBd7Yj6skIA
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
Fri, 21 Sep 2018 17:10:38 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-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
Mon, 22 Oct 2018 17:10:38 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/ Frame 115E
196 KB
0
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:812::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
6e02736a6f9e93cdfe22ded97de7a301f4633fad2372bfaa40c825ed2500c4a5
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Fri, 21 Sep 2018 17:10:37 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
74155
x-xss-protection
1; mode=block
server
cafe
etag
12098869324327732531
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Fri, 21 Sep 2018 17:10:37 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 818F
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-6583763995580712&output=html&h=250&slotname=9888525209&adk=2573259754&adf=608545715&w=800&guci=1.2.0.0.2.2.0&format=800x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&wgl=1&adsid=NT&dt=1537549838359&bpp=5&bdt=435&fdt=471&idt=473&shv=r20180917&cbv=r20180604&saldr=aa&correlator=5921099423551&frm=23&ife=4&pv=2&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1921501932&ga_fc=1&iag=3&icsg=2728&nhd=1&dssz=14&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=393&ady=10772&biw=1585&bih=1200&isw=800&ish=250&ifk=3088420174&scr_x=0&scr_y=0&eid=20195144%2C21060853%2C62710015%2C62710017&oid=3&rx=0&eae=2&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C800%2C250&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=20&bc=7&osw_key=2012678058&ifi=1&fsb=1&dtd=481
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:812::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 1; mode=block

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-6583763995580712&output=html&h=250&slotname=9888525209&adk=2573259754&adf=608545715&w=800&guci=1.2.0.0.2.2.0&format=800x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&wgl=1&adsid=NT&dt=1537549838359&bpp=5&bdt=435&fdt=471&idt=473&shv=r20180917&cbv=r20180604&saldr=aa&correlator=5921099423551&frm=23&ife=4&pv=2&ga_vid=964551683.1537549838&ga_sid=1537549838&ga_hid=1921501932&ga_fc=1&iag=3&icsg=2728&nhd=1&dssz=14&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=393&ady=10772&biw=1585&bih=1200&isw=800&ish=250&ifk=3088420174&scr_x=0&scr_y=0&eid=20195144%2C21060853%2C62710015%2C62710017&oid=3&rx=0&eae=2&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C800%2C250&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=20&bc=7&osw_key=2012678058&ifi=1&fsb=1&dtd=481
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/
accept-encoding
gzip, deflate
cookie
IDE=AHWqTUnVb40D8zs_ktydJ1ewDFIw9CaN5dvDmOj-1ZnpyJe2xTVLdzBdJYk-DxTe
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/

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
gzip
date
Fri, 21 Sep 2018 17:10:39 GMT
server
cafe
cache-control
private
content-length
13918
x-xss-protection
1; mode=block
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
osd.js
pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/ Frame CBE0
72 KB
26 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/osd.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180917/r20180604/show_ads_impl.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:812::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
f4055bd0cdf467ff6940a20d9284a60987a85578033114820b1dc605dbb70991
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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

Response headers

date
Mon, 17 Sep 2018 23:08:52 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
324106
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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
26901
x-xss-protection
1; mode=block
server
cafe
etag
11408177114345171100
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Mon, 01 Oct 2018 23:08:52 GMT
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/ Frame 876E
73 KB
0
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20180917/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_249.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:81f::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
939afa865a77f028eab9017820c823d2b8c103c67ac3634d52d98d7a07f8a12a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Mon, 17 Sep 2018 13:59:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
357056
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=":443"; ma=2592000; v="44,43,39,35"
content-length
27066
x-xss-protection
1; mode=block
server
cafe
etag
8604100894867228625
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Mon, 01 Oct 2018 13:59:42 GMT
moatad.js
z.moatads.com/iqdigital277772407506/ Frame 876E
256 KB
79 KB
Script
General
Full URL
https://z.moatads.com/iqdigital277772407506/moatad.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
664942fd51beb9edaaad165a23716c9258884fd9d895c527b67b7e421f97c096

Request headers

Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:38 GMT
Content-Encoding
gzip
Last-Modified
Thu, 20 Sep 2018 19:11:36 GMT
Server
AmazonS3
x-amz-request-id
7EDFF8B2AEA7F13B
ETag
"770c31cc3ec9ce894a9ef0cbdf896f64"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=48476
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
80761
x-amz-id-2
KJC8eSrf1HCHdbilyqm3525B7i2+FwVlbLgOse+QiIzuV9BP5aBY75DFW7MsQ4sPKuQjPLYNWks=
truncated
/ Frame 876E
216 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
3ce108a8c100c4154ec5c91ac1ed7c3be6ae8ffe02c3142503bf5048bd1fdd4e

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
view
securepubads.g.doubleclick.net/pcs/ Frame 876E
0
56 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsugxTl-mSKZqyGv9YQRvcDVobZVKb3qnNpn89CKSrSU2aIcMV0xH4k4ps03KoSmvRUkJqtO5Y-tVzwz7WZUrUd-0bBpqu-tMdr0IoQ6Pg59UTsyz9ZjYe7H9ndp1P1JD5JHx-TiFbh08AIqT1dHW_vZdTg3ipePYn2KYkuJXziS-_IGV2OzyygH90LmeSfv9E4k0VGB5xkzjGZU_CrtvOhmoTvwo85OuofU05FZ1DLHYhT5E5NuBw&sai=AMfl-YRZ3-l5HWNy8yfV1EVqTOOktknMySBBi2FIqcFnEz0MOcgcb_XDOFlPgVW39NMaO6QdM75r5jB8gVXWZiNr2z0KwSH8ivBv8zs1gENNI4SkX6OMRnyK5lVdXFM&sig=Cg0ArKJSzPKrd3i1sscDEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.22.98 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s18-in-f2.1e100.net
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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

Response headers

timing-allow-origin
*
date
Fri, 21 Sep 2018 17:10:38 GMT
x-content-type-options
nosniff
server
cafe
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
cache-control
private
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
0
x-xss-protection
1; mode=block
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1537549837586&de=392665845816&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile4&zMoatRendered=5&zMoatSlotTargetingLoaded=5&zMoatSlotTargetingSet=4&zMoatPageDataTargetingSet=5&zMoatSafetyTargetingSet=5&zMoatEmptySlot=0&zMoatNadoDataLoadTime=289&zMoatAllDataLoadTime=289&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=289&zMoat_YI3=289&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1477985836&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
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

Response headers

Pragma
no-cache
Date
Fri, 21 Sep 2018 17:10:38 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Fri, 21 Sep 2018 17:10:38 GMT
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
642 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=9745547850
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIEVhcnVmYUpvTWFoc2hlTGk9RWFydWZhSm9NYWhzaGVMaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3kuJGR8fCh5LiRkPTApO3kuJGQrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS4kZCYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihrKXtrLnBhdXNlQnV0dG9ufHwoay5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKay5wbGF5QnV0dG9ufHwoay5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay5tdXRlQnV0dG9ufHwoay5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay51bm11dGVCdXR0b258fChrLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnNraXBhYmxlQnV0dG9ufHwoay5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC42O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0pO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTsKay5za2lwQnV0dG9ufHwoay5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0iKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGsuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307ay5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLkxhKGEsYixbXSxjLGMsbSl9KX1tLmMoay5nbG9iYWxDb25maWcsay5jbGllbnRDb25maWcsay5wcmVjaGVja2VkLGsub25SZWFkeSxrLm9uRmFpbHVyZSxrKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1rLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZWEoZGEsNTApfWZ1bmN0aW9uIGZhKGMsYil7Ynx8KGI9InByZSIpO2lmKGsmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTihjKSxhPW5ldyBPKGEsbSksZz1rLmFkVGFnOyJwcmUiPT1iJiZrLnByZXJvbGxBZFRhZyYmKGc9ay5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmay5wb3N0cm9sbEFkVGFnJiYoZz1rLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5xZyhrKSxhLlJkKGcpKX1lbHNlIGVhKGZ1bmN0aW9uKCl7ZmEoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihrJiZtKXsoay5hZFRhZ3x8ay5wcmVyb2xsQWRUYWcpJiZjLnBhdXNlKCk7ZS5EKGwuQmMsYy5CKCkpO2lmKGMuZ2V0Q3VycmVudFRpbWUpe3ZhciBhPWMuZ2V0Q3VycmVudFRpbWUoKTthJiZlLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLm9hPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuYmQoYyk7YS5udChtKTthLm10KGspO2EuZXQoKTthLmIoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cShjLGIpfS5iaW5kKHRoaXMpLDUwKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kbD10aGlzLmFbNl07dGhpcy5tcz10aGlzLmFbMTBdO3RoaXMuaWw9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzhdOwp0aGlzLnJuPXRoaXMuYVsxXTt0aGlzLmNwPXRoaXMuYVs5XTt0aGlzLkhsPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzldfWMuR289YjtiLnByb3RvdHlwZT17Wmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRsOnRoaXMubHMoYSl9LGxzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5tczp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaWw6dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZsOnRoaXMucW4oYSl9LHFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY3A6dGhpcy5HbChhKX0sR2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy5Hb3x8aGEsSGM9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUhjLlpsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZhPSJzZXR1cCI7dGhpcy5nYz1bXTt0aGlzLiRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuUHMuYmluZCh0aGlzKSl9Yy5MaT1iO2IucHJvdG90eXBlPXskZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxXbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJgphLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFBzOmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLk9zKGEuZGF0YSl9LE9zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0sd2Q6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sY2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5ScChhKSxkPSExO2lmKGIpcmV0dXJuIGE9YS5yZXBsYWNlKGIsIiIpKyIvZGV2L2hvbWFkX3VybC8iK2IrIi8iLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywKIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSx0aGlzLlZmKGEsIlBPU1QiLHt9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sUnA6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFVtOmZ1bmN0aW9uKGEsYil7aWYoYT09Yil7aWYoZS5FcChhKSlyZXR1cm47KGI9dGhpcy5jZihhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMubGEudXJsc1thXT1iO3RoaXMubGEudXJsc1tiXT1hO3RoaXMubGEuaG9tYWRVcmxzW2FdPWI7dGhpcy5sYS5vcmlnaW5hbFVybHNbYl09YX0sRXA6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5ob21hZFVybHNbYV0mJihiPXRoaXMubGEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sbmY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMubGEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWmE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxTcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sRWE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSx1ZjpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sSnQ6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sTWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sTmY6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGtiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/CjY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LHRnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEk9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKwoxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1rO3c9STtxPW07Zm9yKGY9CjA7MTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8fm4mdykrcStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpK3EraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZj00MDs1OT49ZjtmKyspcj1kKGMsNSkrKG4mbHxuJnd8bCZ3KStxK2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedykrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtrPWsrbCY0Mjk0OTY3Mjk1O0k9SSt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoaykrYihJKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiIiLGQsZixjLGgsZSx1LGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfGM+PjYsdT1jJjYzLGlzTmFOKGYpP2U9dT02NDppc05hTihjKSYmKHU9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sUXE6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmCi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sZmY6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxjPSExLGg9ITEsZT0hMSx1PSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocSl7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlFuPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSwKaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1jO2EuaXNGaXJlZm94PWg7YS5pc1NhZmFyaT1lO2EuaXNJRT11O2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxMcDpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuZmYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxYYTpmdW5jdGlvbigpe3ZhciBhPXt0aDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwKRWg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sc3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sbG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LE9uOmZ1bmN0aW9uKCl7cmV0dXJuIGEudGgoKXx8YS5FaCgpfHxhLnNxKCl8fGEuTGsoKXx8YS5sbSgpfX07cmV0dXJuIGEuT24oKX0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxBZjpmdW5jdGlvbihhKXthPXRoaXMuTWEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxpYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxGdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LHJmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5JZyhiKSsiOiIrdGhpcy5JZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sSWc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPgphPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkZhOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxUYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9bC5JYyhiLGQpKTtiJiYoaD1sLkljKGEsYikpO2YmJihoPWwuSWMoaCxmKSk7YyYmKGg9bC5JYyhoLGMpKTtlLlRiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uWil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uamUoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uS2EoZiwhMCk7Zj1tLkthKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uR2EoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sU2Q6ZnVuY3Rpb24oKXttJiZtLlo/bS5pc0VuYWJsZWQmJm0uaW8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2QoKX0uYmluZCh0aGlzKSw1MDApfSxIZDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVGEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LElkOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxUYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLk5jKGEpOiIifSxOYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLklkKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmCihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhuOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuU2MoYSl8fHRoaXMuU3EoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94Lm9nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpJiZ0aGlzLlphKCJlcnJfdXJsIixhKTtpZih0aGlzLm5mKGEpKXJldHVybiB0aGlzLm5mKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjtkJiYoZi5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtmLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2YuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjt2YXIgYz0hMTtkPSExO2Q9dGhpcy5MYShhLGIudWEsZixmdW5jdGlvbihhKXtjPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2N8fChjPWQpLGM9SlNPTi5wYXJzZShjKX1jYXRjaChoKXtjPSExfWMudXJsJiZjLmhhc2gmJihjPWIuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuVW0oYyxhKTtyZXR1cm4gY30sTGE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSx1KXt2YXIgaz1ofHxtO2g9ITA7dSYmKGg9ITEpO2lmKGsmJmsuWilpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suS2EoYSxoKTtoPWsuS2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5HYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxWZjpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sQXI6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuVmYoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuZ2MpZm9yKHZhciBjIGluIHRoaXMuZ2MpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5nY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueWIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sV2Y6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLGYudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkFyKGYuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LHR0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdjPWF9LHd2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5MYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxQbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE9xOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUD1jLkxpfHxQO25ldyBQO3ZhciBlPW5ldyBQO3dpbmRvdy5Odj1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLktpPWI7Yi5JYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuSnM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuUHI9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmd2PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IucnA9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5udj17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1tPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLkdtPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5KbT17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5PbT17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuRm09e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLkhtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuUXU9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk9yPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnNwPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5tdj17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xbz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnZvPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuQ2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5CYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuTG09e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkttPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5RZT17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuUGU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuUG09e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5JbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTnU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Tcj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBsPWMuS2l8fGw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGo9dGhpcy5hWzEwXTt0aGlzLmpwPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzRdfWMuQ289YjtiLnByb3RvdHlwZT0Ke09qOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Qajp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuanA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgaWE9Yy5Db3x8aWEsSmM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMuT2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5NaT1iO2IucHJvdG90eXBlPXtKZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sZWI6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KSsKbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxVcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxKYzpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMuSmMoYSsKNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuSmMoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxaYjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkpkKHRoaXMuZWIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5KYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sSnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aYigpKyIyIn0sS2Y6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KZCh0aGlzLlVwKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuSmMoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBRPQpjLk1pfHxRO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdoPXRoaXMuYVs2XTt0aGlzLkdxPXRoaXMuYVsxMF07dGhpcy50bj10aGlzLmFbM107dGhpcy5jaT10aGlzLmFbOF07dGhpcy5Vbj10aGlzLmFbNF07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLldqPWI7Yi5wcm90b3R5cGU9e2ZoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5naDp0aGlzLkZxKGEpfSxGcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdxOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50bjp0aGlzLmJpKGEpfSxiaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNpOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vbjp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sCmY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGphPWMuV2p8fGphLEtjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLmZoKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmo7dGhpcy5qPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWc7cmV0dXJuIGZ9fShjLApnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmM/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5DZT1ifSkoYyk7dmFyIEo9Yy5DZXx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5HdT10aGlzLmFbOV07dGhpcy50cj10aGlzLmFbMl07dGhpcy5yaz10aGlzLmFbMTBdO3RoaXMucnM9dGhpcy5hWzldO3RoaXMuamo9dGhpcy5hWzFdO3RoaXMuams9dGhpcy5hWzRdO3RoaXMuS2g9dGhpcy5hWzNdO3RoaXMucG89dGhpcy5hWzRdO3RoaXMuemw9dGhpcy5hWzldO3RoaXMuSHQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuUm89YjtiLnByb3RvdHlwZT17RnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5HdTp0aGlzLnNyKGEpfSxzcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHI6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLnFzKGEpfSxxczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnM6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qajp0aGlzLmlrKGEpfSxpazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuams6dGhpcy5KaChhKX0sSmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5LaDp0aGlzLm9vKGEpfSxvbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucG86dGhpcy55bChhKX0seWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpsOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5IdDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIGthPWMuUm98fGthLExjPW5ldyBrYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1MYy5GdSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLllrPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9e307dGhpcy5BPW51bGw7dGhpcy5kYz0xMDA7dGhpcy5sYj0wO3RoaXMud2E9MTUwO3RoaXMucmI9MDt0aGlzLm90KGIpfSxiOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YT8odGhpcy5sYisrLHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpOjA+dGhpcy53YSYmKHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpfSxodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiPnRoaXMud2E/ITA6ITF9LG1nOmZ1bmN0aW9uKCl7dGhpcy5sYj0wfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sCm90OmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxUcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEo6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmViKCldPWI7SyYmSy5UZiYmSy5LdChiKX0sVnY6ZnVuY3Rpb24oKXtyZXR1cm4gZS5FYSh0aGlzLnhhKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy54YSlpZihhPT10aGlzLnhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLnhhW2IuZWIoKV0/ITA6ITF9LFBxOmZ1bmN0aW9uKGIpe2I9Yi5EYSgpO2Zvcih2YXIgYSBpbiB0aGlzLnhhKWlmKGIuaWQ9PXRoaXMueGFbYV0uRGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXc6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5Za3x8cjsoZnVuY3Rpb24oYyl7Yy4kaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLmRjPTEwO3RoaXMubGI9CjA7dGhpcy53YT01MDt0aGlzLks9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLmhmPSExO3RoaXMuTigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuRGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30sZWE6ZnVuY3Rpb24oKXt9LHh0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxXdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LHJ0OmZ1bmN0aW9uKGIpe3RoaXMuV2Q9Yn0sVXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XZH0sVmQ6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLmxiPD10aGlzLndhJiYodGhpcy5sYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLAp0aGlzLmRjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSx0ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxlYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LGt3OmZ1bmN0aW9uKCl7fSxTOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLm9xKCl8fHRoaXMuUm0oKTt0aGlzLm5lKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sUm06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUucGEoMTApKX0sb3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxQOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LERhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFJjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxqYjpmdW5jdGlvbigpe3JldHVybiExfSxjdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxkYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LERiOmZ1bmN0aW9uKCl7dmFyIGI9aztyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFBkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHJnOmZ1bmN0aW9uKGIpe3RoaXMuZ2I9CmJ9LFR2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LGd0OmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxadjpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2ImJihiPSEwKTtyZXR1cm4gYn0sZXc6ZnVuY3Rpb24oKXt0aGlzLmhmfHwodGhpcy5oZj0hMCl9LEtjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFF2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLllnPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuTGU9IjEiO3RoaXMuTWU9IjIiO3RoaXMuem09IjMiO3RoaXMubGM9MDt0aGlzLlpmPTMwO3RoaXMudmI9W107dGhpcy5QYT1bXTt0aGlzLkxiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsCnVua25vd246Nn07dGhpcy5TZT10aGlzLk1nPSExO3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pZD1lLnBhKDEwKTt0aGlzLmJkKGIpO3RoaXMucHQoYSl9LGI6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5NZ3x8KHRoaXMuTWc9ITAsZS5TZCgpKX0sWmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkwoKTtSJiZSLiRiJiYhbGEmJihsYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSx3OmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMudXQoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLkVnKCksdGhpcy5TZT0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaGEoKXx8KHRoaXMudmIucHVzaChiKSx0aGlzLlBhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxFZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIiwKYT1bXTt0aGlzLnZiJiYwPHRoaXMudmIubGVuZ3RoJiYodGhpcy52Yj1lLnVuaXF1ZSh0aGlzLnZiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy52Yi5qb2luKCIsIikpKTtpZih0aGlzLlBhKXtmb3IodmFyIGc9MDtnPHRoaXMuUGEubGVuZ3RoO2crKyl0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXT09dGhpcy5MYltiXSYmYS5wdXNoKHRoaXMuUGFbZ10uZGV0YWlsKSx0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXTx0aGlzLkxiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5QYVtnXS5kZXRhaWwpLGI9dGhpcy5QYVtnXS5yZWFzb24pO3RoaXMuTGJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxZdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNlfSxtOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5MZX0sdXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy5NZX0sdnQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnptfSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGN9LE5lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxlfSxFdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMubGN9LGJkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0scHQ6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sRHI6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLllnfHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZyPXRoaXMuYVs2XTt0aGlzLkZsPXRoaXMuYVs5XTt0aGlzLlduPXRoaXMuYVszXTsKdGhpcy4kZz10aGlzLmFbM107dGhpcy5Rbz10aGlzLmFbNV07dGhpcy5ZbD10aGlzLmFbM107dGhpcy5Ucz10aGlzLmFbOV07dGhpcy5ocz10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs3XX1jLmh1PWI7Yi5wcm90b3R5cGU9e2VyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mcjp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRmw6dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlduOnRoaXMuWmcoYSl9LFpnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGc6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFvOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZbDp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVHM6dGhpcy5ncyhhKX0sZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmc6YX19fSkoYyk7dmFyIG1hPWMuaHV8fG1hLE1jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU1jLmVyKDQpOyhmdW5jdGlvbihjKXtjLlhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGVudEVsKCk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLksmJnRoaXMuSygpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkRlbW9WaWRlb0pTIn19KX0pKGMpO3ZhciBTPWMuWGh8fFM7KGZ1bmN0aW9uKGMpe2MuV2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKTt0aGlzLm1kPW51bGw7dGhpcy5WdT0xRTM7dGhpcy5mZz1udWxsO3RoaXMuZHU9MkUzfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZih3aW5kb3cuZGVtb1BsYXllciYmd2luZG93LlFuKWIub24oInBsYXkiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Iub24oImRpc2FibGUiLHRoaXMuenAuYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0Iix0aGlzLmtxLmJpbmQodGhpcykpO2Iub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuanEoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLll1KGIpfS5iaW5kKHRoaXMpKSwKYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IixmdW5jdGlvbigpe3RoaXMuWnUoYil9LmJpbmQodGhpcykpKTtiLm9uKCJhZGVuZCIsZnVuY3Rpb24oYSl7dGhpcy5pcShhLGIpfS5iaW5kKHRoaXMpKTtiLm9uKCJjb250ZW50cGxheWJhY2siLGZ1bmN0aW9uKGEpe3RoaXMudG8oYSl9LmJpbmQodGhpcykpfSx0bzpmdW5jdGlvbihiKXsiYWRzZXJyb3IiPT1iLnRyaWdnZXJldmVudCYmdGhpcy53KCl9LFl1OmZ1bmN0aW9uKGIpe3RoaXMubWR8fCh0aGlzLm1kPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kdShiKX0uYmluZCh0aGlzKSx0aGlzLlZ1KSl9LCR1OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLm1kKTt0aGlzLncoKX0sWnU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMubWQpfSxpcTpmdW5jdGlvbihiKXt0aGlzLkx2KGIpO3RoaXMuZmc9bmV3IERhdGU7dGhpcy5mZy10aGlzLkxzPHRoaXMuZHU/CnRoaXMudygpOnRoaXMubSgpfSxrcTpmdW5jdGlvbihiLGEpeyFhJiZiLnRhcmdldC5wbGF5ZXImJihhPWIudGFyZ2V0LnBsYXllcix0aGlzLmJkKG5ldyBTKGEpKSk7dGhpcy53KCl9LHpwOmZ1bmN0aW9uKCl7fSxqcTpmdW5jdGlvbigpe3RoaXMuTHM9bmV3IERhdGV9fSl9KShjKTt2YXIgbmE9Yy5XaHx8bmE7KGZ1bmN0aW9uKGMpe2MuWWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmRlbW9QbGF5ZXIpe2lmKHdpbmRvdy52aWRlb2pzJiZ2aWRlb2pzLnBsYXllcnMmJjA8ZS5FYSh2aWRlb2pzLnBsYXllcnMpKXt2YXIgYj12aWRlb2pzLnBsYXllcnMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPW5ldyBTKGJbYV0pO3RoaXMuSChnKXx8KHRoaXMuSihnKSwobmV3IG5hKGcsdGhpcy5BKSkuYigpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIG9hPWMuWWh8fG9hLHBhPW5ldyBvYShxKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHM9dGhpcy5hWzVdO3RoaXMuZnA9dGhpcy5hWzVdO3RoaXMuRnI9dGhpcy5hWzhdO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMua209dGhpcy5hWzddO3RoaXMudXE9dGhpcy5hWzRdO3RoaXMuZm49dGhpcy5hWzddO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLnhtPXRoaXMuYVsxMF07dGhpcy5maz10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVsyXX1jLlpuPWI7Yi5wcm90b3R5cGU9e0NzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Eczp0aGlzLmVwKGEpfSxlcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnA6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Gcjp0aGlzLnZrKGEpfSx2azpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMud2s6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMua206dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZm46dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnlrOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54bTp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZms6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBxYT1jLlpufHxxYSxOYz1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1OYy5Dcyg0KTsoZnVuY3Rpb24oYyl7Yy5naj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmFjPSExO3RoaXMubWYoKTsKdGhpcy5vZigpO3RoaXMudW89ITF9LG1mOmZ1bmN0aW9uKCl7dGhpcy5hYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYWM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuUChiKX0sb2Y6ZnVuY3Rpb24oKXtpZighdGhpcy5hYyl7dmFyIGI9dGhpcy5EYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYWM9ITApO3RoaXMuUyhhKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpKX0sVmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5kZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuZGQoYSl9LmJpbmQodGhpcykpfSwKZGQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLldkJiYoMCx0aGlzLldkKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6CiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sV2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciByYT1jLmdqfHxyYTsoZnVuY3Rpb24oYyl7Yy5maj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxOOmZ1bmN0aW9uKCl7fSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5uYz0hMTt0aGlzLnVkPTE7dGhpcy5wYz1bXTt0aGlzLmFiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9CnRoaXMubmM9ITE7dGhpcy51ZD0xO3RoaXMucGM9W107dGhpcy5hYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy51ZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuYWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmFiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmFiPSEwKSkpLAphLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuYWI9ITApKTp0aGlzLm0oIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ29tcGxldGUiKTt0aGlzLm5jPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuWmYmJiF0aGlzLmhhKCkmJih0aGlzLmFiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm8oKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubyghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5uYigpLHRoaXMuZ2V0UGxheWVyKCkudW89ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdiO2EmJihhLmFlKCksYS5CYSgpKX19LmJpbmQodGhpcyl9KTsKaWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRDb21wbGV0ZSIpO3RoaXMubmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMubSgib25BZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMubSgib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlpmJiYhdGhpcy5oYSgpJiYodGhpcy5hYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLnBjLmluZGV4T2YoYSkmJnRoaXMucGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5tKCksdGhpcy5uYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMubSgiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLm0oImVtcHR5Iik6KHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLnBjLmxlbmd0aD49dGhpcy51ZCYmdGhpcy5vKCkpfSxEcjpmdW5jdGlvbihiKXt0aGlzLmooIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCk7ZS5KdChhLnZpZGVvVGFnKT9hLmFjP3RoaXMubSgicGxheWVyIGlzIGludmFsZCIpOnRoaXMubmN8fHRoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSw1MCk6KGEubWYoKSxhLm9mKCkpfX0pfSkoYyk7dmFyIHNhPWMuZmp8fHNhOyhmdW5jdGlvbihjKXtjLmhqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuUHAoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT0KYi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0pLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5QcShnKXx8KHRoaXMuSihnKSwKZz1uZXcgc2EoZyx0aGlzLkEpLGcuTigpLGcuYigpKX1lbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0sU3Y6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sUHA6ZnVuY3Rpb24oKXt2YXIgYj1lLk1hKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnliKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmhqfHx0YSx1YT1uZXcgdGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHM9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOV19Yy55aT1iO2IucHJvdG90eXBlPXtjczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZHM6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB2YT1jLnlpfHx2YSxPYz1uZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9T2MuY3MoNCk7KGZ1bmN0aW9uKGMpe2MucG09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb19pZCk7dGhpcy5QKGIpO3ZhciBiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0sYT10aGlzLmdldFJhd1BsYXllcigpO2ImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlMoYik6dGhpcy5JKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSwKTDpmdW5jdGlvbigpe3JldHVybiJYT1pDT00ifX0pfSkoYyk7dmFyIHdhPWMucG18fHdhOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IudHJhY2tlci52YXN0X3ByZXJvbGx8fGIudHJhY2tlci52YXN0X3Bvc3Ryb2xsP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LG86ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHhhPWMub218fHhhOyhmdW5jdGlvbihjKXtjLnFtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmCndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyYmMDxlLkVhKHdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcykpe3ZhciBiPXdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YlthXTtpZihnLmNvbnRyb2xzJiZnLmNvbnRyb2xzLnBsYXllcilnPW5ldyB3YShnKSx0aGlzLkgoZyl8fCh0aGlzLkooZyksKG5ldyB4YShnLHRoaXMuQSkpLmIoKSk7ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19KX0pKGMpO3ZhciB5YT1jLnFtfHx5YSx6YT1uZXcgeWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMTBdfWMuYWo9YjtiLnByb3RvdHlwZT17a3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmxwOgp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEFhPWMuYWp8fEFhLFBjPW5ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLmtwKDQpOyhmdW5jdGlvbihjKXtjLmVtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlAoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUyhiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sTDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oYil7dGhpcy5xYihiKX0uYmluZCh0aGlzKSl9LHFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLksmJnRoaXMuSygpfSxSYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0sCmlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciBCYT1jLmVtfHxCYTsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5LZz0hMDt0aGlzLnlkPXRoaXMuSGY9ITE7dGhpcy5hZygpO3RoaXMuZW8oKTt0aGlzLkhhKCl9LGZ3OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKY29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuZWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuYmEsIjsiLHR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLnFkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnJkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi54ZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnhkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMua2cpfSxmYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmCih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LExjOmZ1bmN0aW9uKCl7aWYoIXRoaXMubWEpe3ZhciBiPXRoaXMuZmIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSx3ZjpmdW5jdGlvbigpe2lmKCF0aGlzLlliKXt2YXIgYj10aGlzLmZiKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWWI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlliPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWWJ9LApOcTpmdW5jdGlvbigpe2lmKCF0aGlzLkdmKXt2YXIgYj10aGlzLmZiKCksYT10aGlzLkxxKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5HZj0hMCl9cmV0dXJuIHRoaXMuR2Z9LExxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy50YyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMudGM9ITApO3JldHVybiB0aGlzLnRjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTGMoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksCmIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxrZTpmdW5jdGlvbigpe3RoaXMueWQ9ITA7dmFyIGI9dGhpcy53ZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmCmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLk5ifHwodGhpcy5sKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5YKCksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sUnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmJmJiZiLmFkcyYmKHRoaXMuYmY9Yi5hZHMpO3JldHVybiB0aGlzLmJmfSxlbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlgoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7CmIub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5aZCgpfS5iaW5kKHRoaXMpKX0sZWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLndmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZigpfS5iaW5kKHRoaXMpLDUwKX0sYWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTnEoKSl7dmFyIGE9dGhpcy5mYigpLGc9dGhpcy5MYygpO2EmJmcmJih0aGlzLmZiKCksdGhpcy5MYygpLAp0aGlzLnlkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWQ/dGhpcy5tKCk6KHRoaXMuWCghMCksdGhpcy5sKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuZmIoKX1lbHNlIHRoaXMuSGY/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmZiKCksYj10aGlzLkxjKCk7YSYmIWI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5YKCkpOih0aGlzLlgoITApLHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLkhmPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWcoKX0uYmluZCh0aGlzKSw1MCl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9CiEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5VPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMucWEoKTticmVha319LGZvOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLlFiIT1iLmFkcy5zdGF0ZSYmKHRoaXMuUWI9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuUWIpe3RoaXMubSgiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5RYj0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZm8oKX0uYmluZCh0aGlzKSwxMCl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMDt0aGlzLm0oImVtcHR5IHZhc3QiKX0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLmhhKCl8fChifHwKKHRoaXMuS2c9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuS2csZnVuY3Rpb24oKXt0aGlzLmVmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxvOmZ1bmN0aW9uKCl7dGhpcy5hd3x8KDEwPHRoaXMuV3U/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLld1KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuZnQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubG8oKX0uYmluZCh0aGlzKSw1MCkpKX0sZnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuWHUpe3RoaXMuWHU9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5YLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiKwphLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBDYT1jLmRtfHxDYTsoZnVuY3Rpb24oYyl7Yy5mbT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy54Zyh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMueGcoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5FYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBCYShiW2ddKSxhLmphfHx0aGlzLkgoYSl8fAohMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkooYSksKG5ldyBDYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy5yYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmRjKX19KX0pKGMpO3ZhciBEYT1jLmZtfHxEYSxFYT1uZXcgRGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenM9dGhpcy5hWzJdO3RoaXMuc3U9dGhpcy5hWzhdO3RoaXMuSmo9dGhpcy5hWzJdO3RoaXMuJGk9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5Scz1iO2IucHJvdG90eXBlPXt5czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenM6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnN1OnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KajoKdGhpcy5aaShhKX0sWmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgRmE9Yy5Sc3x8RmEsUWM9bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMueXMoNCk7KGZ1bmN0aW9uKGMpe2MuUmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5QKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlMoYSl9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7CmEuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEdhPWMuUmx8fEdhOyhmdW5jdGlvbihjKXtjLlFsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkFiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmhjPSExO3RoaXMubGcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubSgpOwplbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuaGM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy54YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlllKCk6dGhpcy5tKCl9LHhjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5tKCk7ZWxzZXtpZigxMDA5PT0KZ3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5oYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuaGM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy54Yy5iaW5kKHRoaXMpLDEwMCl9fSxZZTpmdW5jdGlvbigpe2lmKCF0aGlzLmhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09CmIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQWImJih0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWWUuYmluZCh0aGlzKSwKNTApfX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5oYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubSgpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGE9Yy5RbHx8CkhhOyhmdW5jdGlvbihjKXtjLlNsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBHYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSGEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIElhPWMuU2x8fElhLEphPW5ldyBJYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DdT10aGlzLmFbNV07dGhpcy5Bbz10aGlzLmFbNl07dGhpcy5Nbz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLldxPWI7Yi5wcm90b3R5cGU9e0J1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5DdTp0aGlzLnpvKGEpfSwKem86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFvOnRoaXMuTG8oYSl9LExvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Nbzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEthPWMuV3F8fEthLFJjPW5ldyBLYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkJ1KDQpOyhmdW5jdGlvbihjKXtjLnhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMuJGY9YX0sTjpmdW5jdGlvbigpe30sVGQ6ZnVuY3Rpb24oYil7dGhpcy4kZj1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy4kZikucGFyZW50Tm9kZTt0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIExhPWMueGh8fExhOyhmdW5jdGlvbihjKXtjLndoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmooYixhKX0sVGQ6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBNYT1jLndofHxNYTsoZnVuY3Rpb24oYyl7Yy55aD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBMYShkLAphKSx0aGlzLkgoZCl8fChkLlRkKGEpLHRoaXMuSihkKSxkPW5ldyBNYShkLHRoaXMuQSxnKSxkLlRkKGcpLGQuYigpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE5hPWMueWh8fE5hLE9hPW5ldyBOYShmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzhdO3RoaXMuYmw9dGhpcy5hWzhdO3RoaXMuU3U9dGhpcy5hWzldO3RoaXMuSmw9dGhpcy5hWzJdO3RoaXMuQWs9dGhpcy5hWzddO3RoaXMuRXU9dGhpcy5hWzFdO3RoaXMuZG49dGhpcy5hWzFdO3RoaXMucXU9dGhpcy5hWzJdO3RoaXMuT289dGhpcy5hWzFdO3RoaXMueXY9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5Jcz1iO2IucHJvdG90eXBlPXtsbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWw6dGhpcy5hbChhKX0sYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ibDp0aGlzLlJ1KGEpfSxSdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU3U6dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpsOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkV1OnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kbjp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucXU6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9vOnRoaXMueHYoYSl9LHh2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueXY6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBQYT1jLklzfHxQYSxTYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MubGwoNCk7KGZ1bmN0aW9uKGMpe2MuVWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nYW1lQ29udGFpbmVyWzBdO3RoaXMuUChiKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMudmlkZW9UYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpLGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxYYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmCihiPSEwKTtyZXR1cm4gYn0sTDpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgUWE9Yy5Vanx8UWE7KGZ1bmN0aW9uKGMpe2MuVGo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuWGEoKT8oJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0YXAiLGZ1bmN0aW9uKCl7dGhpcy5vYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSkpOnRoaXMub2MoKX0sb2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/CnRoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpO3ZhciBSYT1jLlRqfHxSYTsoZnVuY3Rpb24oYyl7Yy5Waj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuTklDSyYmTklDSy5HYW1lTG9hZGVyJiZOSUNLLkdhbWVMb2FkZXIuZ2FtZUNvbnRhaW5lcil7dmFyIGI9bmV3IFFhKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgUmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFNhPWMuVmp8fFNhLFRhPW5ldyBTYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbj10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzEwXTt0aGlzLk1oPXRoaXMuYVs4XTsKdGhpcy5ycj10aGlzLmFbNF07dGhpcy5hbz10aGlzLmFbOF07dGhpcy5BdD10aGlzLmFbN107dGhpcy5Ccz10aGlzLmFbNF07dGhpcy5RaD10aGlzLmFbOV07dGhpcy5qcj10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLnBzPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYms6dGhpcy5MaChhKX0sTGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1oOnRoaXMucXIoYSl9LHFyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucnI6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFvOnRoaXMuenQoYSl9LHp0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5BdDp0aGlzLkFzKGEpfSxBczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQnM6dGhpcy5QaChhKX0sUGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlFoOgp0aGlzLmlyKGEpfSxpcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuanI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBVYT1jLnBzfHxVYSxUYz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5Mbig0KTsoZnVuY3Rpb24oYyl7Yy5Oaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLlAoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlMoYik6dGhpcy5kYSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5lYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS4kYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5hZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuYmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuYmUrKztpZigxMDx0aGlzLmJlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfX0pfSkoYyk7dmFyIFZhPWMuTmt8fFZhOyhmdW5jdGlvbihjKXtjLk1rPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuR2QpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuR2Q9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnhwPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLnhwPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuTXMoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFdhPWMuTWt8fFdhOyhmdW5jdGlvbihjKXtjLk9rPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVmEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBXYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWGE9Yy5Pa3x8WGEsWWE9bmV3IFhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF1PXRoaXMuYVsxXTt0aGlzLldnPXRoaXMuYVs3XTt0aGlzLnlqPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMucGo9YjtiLnByb3RvdHlwZT17enU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkF1OnRoaXMuVmcoYSl9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV2c6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnlqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIFphPWMucGp8fFphLFVjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1VYy56dSg0KTsoZnVuY3Rpb24oYyl7Yy5GaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUChiLmVsZW1lbnQpO3RoaXMuUyhiLmVsZW1lbnQpfSxEYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZmluaXNoKCl9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSGl0Ym94In19KX0pKGMpO3ZhciAkYT1jLkZpfHwkYTsoZnVuY3Rpb24oYyl7Yy5FaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudygpfX0pfSkoYyk7dmFyIGFiPWMuRWl8fGFiOyhmdW5jdGlvbihjKXtjLkdpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoaXRib3guYWRibG9ja2VyIixmdW5jdGlvbihiKXtiPW5ldyAkYShiLmRldGFpbCk7Yi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgYWIoYix0aGlzLkEpKS5iKCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBiYj1jLkdpfHxiYixjYj1uZXcgYmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnpuPXRoaXMuYVs1XTt0aGlzLlZvPXRoaXMuYVszXTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLlNpPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzRdfWMucnE9YjtiLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpuOnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wbzp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhyOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBkYj1jLnJxfHxkYixWYz1uZXcgZGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1WYy55big0KTsoZnVuY3Rpb24oYyl7Yy5jaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUudWYoYiwiZWxlbWVudElEIik7dGhpcy5oZz1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlAoZyk7dGhpcy5TKGcpO3RoaXMuR2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5HYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuR2MpfSxXYTpmdW5jdGlvbigpe3JldHVybiEwfSxrbzpmdW5jdGlvbigpe2UuTWYodGhpcy5HYyk7ZS5OZih0aGlzLkdjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua28oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sUGQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBlYj1jLmNqfHxlYjsoZnVuY3Rpb24oYyl7Yy5iaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudyghMCl9fSl9KShjKTt2YXIgZmI9Yy5ianx8ZmI7KGZ1bmN0aW9uKGMpe2MuZGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy53YT0xNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsuaW5yZWFkKXt2YXIgYj1rLmlucmVhZCxhPWUudWYoYiwiZWxlbWVudElEIik7CmUuTWYoYSkmJihiPW5ldyBlYihiKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBmYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGdiPWMuZGp8fGdiLGhiPW5ldyBnYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55dT10aGlzLmFbMV07dGhpcy5MdT10aGlzLmFbMl07dGhpcy54bj10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLkh1PWI7Yi5wcm90b3R5cGU9e3h1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dTp0aGlzLkt1KGEpfSxLdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHU6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYj1jLkh1fHxpYixXYz1uZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1XYy54dSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuTmk9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0scXQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxTbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLk5pfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmcsZCxjKXt0aGlzLklhPWE7dGhpcy5xZj10aGlzLlVnPSExO3RoaXMuYmc9ZDt0aGlzLnlnPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLklhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnRiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLk5kKHRoaXMuSWEudXJsKSYmbS5oZCl7dmFyIGg9bmV3IHooYS51cmwpO2gucXQoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYKKGI9ITApO2J8fG0uZ2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXttLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5PaT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5xZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMueWc/dGhpcy50Yi5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCExKTp0aGlzLnRiLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITApLHRoaXMuVWd8fCh0aGlzLnRiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksInVuZGVmaW5lZCIhPXR5cGVvZiBrJiZrJiZrLnZwYWlkJiZtJiZtLlNjKHRoaXMuSWEudXJsKSx0aGlzLnRiLnNlbmQoYSl9Y2F0Y2goYyl7bSYmbS5OZCh0aGlzLklhLnVybCk/bS5oZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLk5kKHRoaXMuSWEudXJsKSx0aGlzLmJnJiZ0aGlzLmJnKCl9cmV0dXJuIHRoaXMudGJ9fX0pKGMpO3ZhciBqYj1jLk9pfHxqYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnpkPXRoaXMuYmI9bnVsbDt0aGlzLkhvPXRoaXMub2I9dGhpcy5VZj0hMTt0aGlzLnVhPSIiO3RoaXMuUGY9ITE7dGhpcy5BYT10aGlzLk9jPSIiO3RoaXMuTGY9dGhpcy5aPXRoaXMuaXNFbmFibGVkPXRoaXMuaGU9ITE7dGhpcy5PYT1bXTt0aGlzLkVmPXRoaXMuRmI9IiI7dGhpcy5FZD0hMTt0aGlzLnRlPQowO3RoaXMuR2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5FZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMua2M9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRmU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMucGI9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMudWU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5LZD0hMTt0aGlzLm1vPXRoaXMuamQ9bnVsbDt0aGlzLnVnPXRoaXMuaWM9dGhpcy5MZz10aGlzLndlPXRoaXMuaGQ9dGhpcy5BZD10aGlzLm1jPSExO3RoaXMuUWE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuUGk9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsCmFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmJiLGFkdGFncmVnZXg6dGhpcy56ZCxqc3BvcHVwczp0aGlzLlVmLHNpZGVsb2Fkczp0aGlzLm9iLGRpc2FibGV0ZXN0czp0aGlzLkhvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuUGYsZ2xvYmFsQ29uZmlnOnRoaXMuT2MsY2xpZW50Q29uZmlnOnRoaXMuQWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5aLGlzQmxvY2tlZDp0aGlzLkxmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMuRWYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5FZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy50ZSxIT01BRF9WRVJJRklFRDp0aGlzLkdlLEhPTUFEX0JMT0NLRUQ6dGhpcy5FZSxIT01BRF9OT0JMT0NLRVI6dGhpcy51YixIT01BRF9BREJMT0NLRVI6dGhpcy5rYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRmUsdGVzdEhpZGU6dGhpcy5IYiwKdGVzdFRhZ3M6dGhpcy5wYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMudWUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5LZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1vLGFkQmxvY2tlckRldGVjdGVkOnRoaXMubWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLkFkLHVzZVN0cmljdENoZWNrczp0aGlzLmhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndlLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUWEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMucGcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuaWMsc2tpcEFsbG93ZWQ6dGhpcy51Z319LG1xOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJihhPSEwKTtyZXR1cm4gYX0sbGU6ZnVuY3Rpb24oYSl7dGhpcy5RYVthXT0KITB9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0scWU6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5QbihhKX0sS2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLAplPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5TYyhhKTtlPXRoaXMuTWEoYSk7Yz8odGhpcy5iYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5qZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLk9ifHx0aGlzLmJifHx0aGlzLnpkKSYmKGs9dGhpcy5LcihrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLlNwKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7KGM9Yy5leGVjKGEpKSYmKGNbMl18fGNbNV0pP2I9ITA6dGhpcy5iYygpJiYoYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChjPWMuZXhlYyhhKSkmJmNbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZDpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7YyYmKGNbMl18fGNbNV0pP2I9ITA6Yj10aGlzLlNjKGEpO3JldHVybiBifSwKU3A6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnVhJiYwPHRoaXMudWEubGVuZ3RoKXJldHVybiB0aGlzLnVhO2ZvcihjIGluIHRoaXMudWEpaWYoYj10aGlzLnVhW2NdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSnY7cmV0dXJuIm5vbmUifSxRYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMucGddfSxqZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUWMoKSxiPXRoaXMudGcoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGM9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitjW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpjLmxlbmd0aCldKX0sS3I6ZnVuY3Rpb24oYSl7dGhpcy5PYiYmKGErPXRoaXMuT2IpO2lmKHRoaXMuYmIpZm9yKHZhciBiIGluIHRoaXMuYmIpdGhpcy5iYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsCnRoaXMuYmJbYl0pKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsYyxmLGUsaCl7bT10aGlzO3RoaXMuUGY9ITA7dGhpcy5PYz1hO3RoaXMuQWE9Yjt0aGlzLmhlPWM7dGhpcy5qZD1mO3RoaXMuRWM9ZTt0aGlzLkViPWh8fHt9O3RoaXMuenIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQWEpdGhpcy54cigpO2Vsc2UgdHJ5e3RoaXMuQWE9YigpLHRoaXMuemMoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWWE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goYyl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LHpyOmZ1bmN0aW9uKCl7dGhpcy5HYShuZXcgeih0aGlzLk9jK3RoaXMucmMoImdsb2JhbCIpKSx0aGlzLmZxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx4cjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQWErdGhpcy5yYygiY2xpZW50IikpO3RoaXMuR2EobmV3IHoodGhpcy5BYSt0aGlzLnJjKCJjbGllbnQiKSksdGhpcy56Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5sZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scmM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMua2IoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkFkKXt0aGlzLkFkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLkVjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRWM/dGhpcy5FYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5aPXRoaXMuTGY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMuRWUpKTt0aGlzLnNiKCk7ZS5UYihsLkpzKTsoYj1lLkFmKHRoaXMuUWMoKSkpfHwoYj1lLkFmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxmcTpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5aPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuQWF8fHRoaXMuRmJ8fHRoaXMudWF8fHRoaXMuemMoKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5aPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnViKSksdGhpcy5zYigpKX19LHpjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQWF9ZWxzZSBhPXRoaXMuQWE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5PYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuRWY9YS5hZHBhdGh8fCIiO3RoaXMuRWQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5wZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5PYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkZiJiZ0aGlzLnVhJiZ0aGlzLk9hLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKSwKdGhpcy5zYigpKX0sVWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5qZSgpKSxjPXRoaXMuTWEodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMucmMoImN1c3RvbWVyIikpO3RoaXMuR2EoYix0aGlzLk10LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJjdXN0b21lciIpO2E/dGhpcy54bD90aGlzLmdhKCJub1NWTUNvbmZpZyIpOih0aGlzLnhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5VYyghMCl9LmJpbmQodGhpcyksITApfX0sTXQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5oZD10aGlzLkpiKGIuc3RyaWN0KTt0aGlzLndlPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuTGc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnBiPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuYmI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuemQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVWY9Yi5qc3BvcHVwc3x8ITE7dGhpcy5vYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5pYz1iLnZwYWlkfHwhMTt0aGlzLkViLnZwYWlkPXRoaXMuaWM7dGhpcy51Zz0KYi5za2lwYWxsb3dlZHx8ITE7dGhpcy5HYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLiRwKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5FZCYmKHRoaXMuR2I9bnVsbCk7dGhpcy51ZT1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLktkJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5LZD0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmN1KCkmJih0aGlzLkhifHx0aGlzLklifHx0aGlzLnBifHx0aGlzLkdiKT90aGlzLmhlPyh0aGlzLm9hPXRoaXMuWj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy51YikpLHRoaXMuQmQoKSx0aGlzLnNiKCkpOnRoaXMuUHQoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5RdCgpKX19LFB0OmZ1bmN0aW9uKCl7dGhpcy5PdCgpfSxRdDpmdW5jdGlvbigpe3RoaXMuWj0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCl9LGdkOmZ1bmN0aW9uKGEpe3RoaXMubWM9ITA7dGhpcy5afHwodGhpcy5aPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKGEpKSx0aGlzLnNiKCksdGhpcy5CZCgpKX0sT3Q6ZnVuY3Rpb24oKXtpZih0aGlzLkhiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkhiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9Y31jYXRjaChmKXt9YT90aGlzLmdkKHRoaXMua2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLkJnKCl9ZWxzZSB0aGlzLkJnKCl9LEFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLmtiKCkpO3RoaXMuVHQoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnJlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5nZCh0aGlzLmtjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5wYj1udWxsLHRoaXMucmUoKX0sVHQ6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0aGlzLkdhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxCZzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigpKTt0aGlzLlV0KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5BZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuZ2QodGhpcy5rYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5JYiYmdGhpcy5JYi5sZW5ndGgpe3ZhciBjPXRoaXMuSWIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5BZygpfSxVdDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LHJlOmZ1bmN0aW9uKCl7dGhpcy5HYj8odGhpcy50ZSsrLHRoaXMuR2EobmV3IHoodGhpcy5HYiksdGhpcy5OdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLnpnKCl9LHNlOmZ1bmN0aW9uKGEpe3RoaXMuZ2QodGhpcy5GZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LE50OmZ1bmN0aW9uKGEpe2E9CmEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy50ZT90aGlzLnJlKCk6dGhpcy5zZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuemcoKTp0aGlzLnNlKCJBQUEiKX0semc6ZnVuY3Rpb24oKXt0aGlzLlo9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCk7dGhpcy5CZCgpfSxzYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5YYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLm1jJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy5HZSkpO3RoaXMuamQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5qZCYmdGhpcy5qZCgpfSxqbzpmdW5jdGlvbigpe2lmKHRoaXMud2UmJnRoaXMubXEoKSl7dmFyIGE9CnRoaXMuUXAoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LEVnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sR2E6ZnVuY3Rpb24oYSxiLGMsZixoLEljKXthPW5ldyBqYihhLGIsYyk7ZiYmKGEuVWc9ITApO2gmJmUuUXEoKSYmKGEucWY9ITApO0ljJiYoYS55Zz0hMCk7cmV0dXJuIGEubG9hZCgpfSxXZTpmdW5jdGlvbigpe2UuWGEoKXx8ZS5MYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fAooYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuZ2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLmJjKCl8fChhPXRoaXMuTWEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7CmguYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0saW86ZnVuY3Rpb24oKXt0aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkdhKGEsdGhpcy5QdS5iaW5kKHRoaXMpLAp0aGlzLk91LmJpbmQodGhpcykpfSxQdTpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMudHAoKX0sT3U6ZnVuY3Rpb24oKXt9LHRwOmZ1bmN0aW9uKCl7ZS5UYihsLnNwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxCZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm9iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMub2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5vYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9Cm5ldyBRO3dpbmRvd1tjLlpiKCldPXRoaXM7ZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxjdTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnVlfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sa2I6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT0KYXx8MT09YXx8IjEiPT1hfHwxPT1hfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsaz0oZiYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oZik/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpOwpyZXR1cm4gYn0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSx0ZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPQoiIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx3LHQseDtuPWEubGVuZ3RoO3ZhciB5PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHkucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PAoyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih5LnB1c2goZik7MTQhPXkubGVuZ3RoJTE2Oyl5LnB1c2goMCk7eS5wdXNoKG4+Pj4yOSk7eS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHkubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO249bDtwPW07dz1xO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfH5uJncpK3QraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj0yMDszOT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NDA7NTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8biZ3fHAmdykrdCtoW2ZdKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj02MDs3OT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cT1xK3cmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBrYj1jLlBpfHxrYixtPW5ldyBrYjt3aW5kb3cuT3Y9bTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaz10aGlzLmFbN107dGhpcy5Fbz10aGlzLmFbOV07dGhpcy52dj10aGlzLmFbNl07dGhpcy5WcT10aGlzLmFbM107dGhpcy5ZcT10aGlzLmFbOV07dGhpcy5taT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs0XX0KYy55bz1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZrOnRoaXMuRG8oYSl9LERvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbzp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnY6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlZxOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZcTp0aGlzLmxpKGEpfSxsaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubWk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBsYj1jLnlvfHxsYixYYz1uZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1YYy5Fayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmIsYyl7dGhpcy5pPWE7YS51Lkw/dGhpcy5OYT1hLnUuTCgpOnRoaXMuTmE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5pLlJhO3RoaXMucGxheWVyPXRoaXMuaS51O3RoaXMudWM9ITE7dGhpcy5Obj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmZkPXt9O3RoaXMuc2M9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5zYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmkudSkmJnRoaXMuaS51LkImJihhPXRoaXMuaS51LkIoKSksdGhpcy5zYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5YbT1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmVkPSExO3RoaXMuWGY9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOgoxNTt0aGlzLnM9e307dGhpcy5xYz0hMTt0aGlzLkhnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuJGI9ITE7dGhpcy53bz1lLnBhKDEwKTt0aGlzLlhjPWUucGEoMTApO3RoaXMuWGQ9ZS5wYSgxMCk7dGhpcy52Zz1lLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkJiPSExO3RoaXMuRmQ9bnVsbDt0aGlzLkNkPXRoaXMuRGM9dGhpcy53Zz10aGlzLmRnPXRoaXMuSGM9dGhpcy5ldT10aGlzLiRhPSExfWMuSmk9YjtiLnByb3RvdHlwZT17cWc6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5OYV0mJnRoaXMuY29uZlt0aGlzLk5hXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTmFdW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuVC5tYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6CmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGwuS20sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKX0sUmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJGE9YztpZih0aGlzLlQuWil0aGlzLlQuam8oKSx0aGlzLlQub2EmJnRoaXMuVC5pc0VuYWJsZWQ/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ULmljfSkpOmI/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuVC5pYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuQmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YuUmQoYSxiLGMpfSw1MCl9fSxjZTpmdW5jdGlvbihhKXt0aGlzLkhjPSExO3RoaXMucz1hO3RoaXMueXQodGhpcy5zKTsKdGhpcy5CZihhKX0sQmY6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuZmQ9dGhpcy5icShhKSksdGhpcy5CZihhLnBhcmVudCkpfSxicTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWSl7Yj1hLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlkuZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5ZLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYKKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVGEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLkZjJiZhLkZjLmVycm9yJiZhLkZjLmVycm9yLmNvZGUmJihiPWEuRmMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2UgeC5qYy5jb2RlOmI9PUMub2QuY29kZT9lLkQobC5ndix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpOihlLlNkKCksYj09Qy5KZS5jb2RlJiZlLkQobC5Pcix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKTtlLkQobC5ycCx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjsKYnJlYWs7Y2FzZSB4LkhlLmNvZGU6ZS5EKGwuUXUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB4LktlLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS5EKGwubXYsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2UgeC5wZC5jb2RlOmUuRChsLm52LHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2UgeC5uZC5jb2RlOmUuRChsLlByLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PQpjJiZhLmVycm9yJiZhLmVycm9yLmthJiYoYys9Il8iK2EuZXJyb3Iua2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy56YihhKTt0aGlzLkJhKCl9LHpiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS56YS5sZW5ndGg7KXRyeXt2YXIgYz1hLnphLnBvcCgpO3RoaXMuUWQoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHl0OmZ1bmN0aW9uKGEpe3RoaXMuQ2Q9ITE7dGhpcy5yYT10aGlzLmkuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuaS5DO2IuZ3c9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLlhtJiZ0aGlzLnBsYXllci5LYygpJiYKKGIudm9sdW1lPXRoaXMucGxheWVyLktjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuVG0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLkRnKGIpPyh0aGlzLlZtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5ybygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLnd0KCkpOnRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0sd3Q6ZnVuY3Rpb24oKXtlLiRlKCk7dGhpcy5zJiZ0aGlzLnMub3JpZ2luJiZ0aGlzLnMub3JpZ2luLkJlJiZlLldtKHRoaXMucy5vcmlnaW4uQmUpO2UuWmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmkuQzt0aGlzLmkuQz1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5pLkMsYSk7dGhpcy5pLmVnKCk7dGhpcy5pLmZjKCk7Zm9yKGE9dGhpcy5pLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuaS5mYygpO3RoaXMuVz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlcuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTsKdGhpcy5XLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5XLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmkuRy5hcHBlbmRDaGlsZCh0aGlzLlcpO3RoaXMuVy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnMuZXEoKSxiPXRoaXMucy5PLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sCmNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuaS5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5pLkcuc3R5bGUuaGVpZ2h0KX19fTtlLnlhKHRoaXMuVywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsCiJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuWG4oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlQpO3RoaXMuVy5zcmM9YTtlLndkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5CYSgpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuYXYoKSx0aGlzLmkuV2IoITApKSwKIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5pLldiKCEwKSx0aGlzLmJ2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuaS5XYighMCksdGhpcy5ldigpKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ2KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR2KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KCkpfS5iaW5kKHRoaXMpKTtlLndkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcykpO2Uud2QoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmkuUW0oZnVuY3Rpb24oYSl7ZS55YSh0aGlzLlcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSwKYnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0sYXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5aYSgiaW1wcmVzc2lvbiIpfSxldjpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS5aYSgic3RhcnQiKX0sUmc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5aYSgiZmlyc3RRdWFydGlsZSIpfSxmdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlphKCJ0aGlyZFF1YXJ0aWxlIil9LGR2OmZ1bmN0aW9uKCl7dGhpcy5rZCgpO2UuWmEoImNvbXBsZXRlIil9LGN2OmZ1bmN0aW9uKCl7ZS5aYSgiYWRzdG9wcGVkIik7dGhpcy5hZigpfSxUbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlQ7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmJjKCk/KGY9ZS5NYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KToKYj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5VdS5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LERnOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sVm06ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuUWcuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55ZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxhZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5RZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwKdGhpcy55ZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxRZzpmdW5jdGlvbihhKXt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZShhKX0uYmluZCh0aGlzKSx0aGlzLk5uKX0seWU6ZnVuY3Rpb24oYSl7dHJ5e2lmKCFlLlhhKCkmJnRoaXMuVC5MZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQmJ8fCh0aGlzLkJiPSEwLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMudWN8fCF0aGlzLkRnKHRoaXMudmlkZW8pfHwKdGhpcy5CYnx8KHRoaXMudWM9ITAsdGhpcy5UdSgpLHRoaXMudmlkZW8uY29udHJvbHM9ITEsdGhpcy5pLmZjKCksdGhpcy5OZygpLHRoaXMuT2coKSx0aGlzLlVlKCksdGhpcy5pLmVnKCksdGhpcy52aWRlby5wbGF5JiZ0aGlzLnBlKCkpfSxwZTpmdW5jdGlvbigpe2lmKCF0aGlzLkRjKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuRmEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuUGM9W107Zm9yKHZhciBiPXRoaXMuaS5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLlBjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIiwKYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMudGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMudGQoKX1lbHNlIHRoaXMudGQoKX0sdGQ6ZnVuY3Rpb24oKXtpZih0aGlzLlBjKWZvcih2YXIgYT0KMDthPHRoaXMuUGMubGVuZ3RoO2ErKyl0aGlzLlBjW2FdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYT10aGlzLnZpZGVvLnBsYXkoKSkmJmFbImNhdGNoIl0pYVsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuRGN8fCh0aGlzLkJhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLCIiLCEwKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5DYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkNiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkNiLmJpbmQodGhpcykpKTpIPWZ1bmN0aW9uKCl7dGhpcy5xY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGUoKSl9LmJpbmQodGhpcyk7dGhpcy56ZigpLnJnKHRoaXMpfSxrZDpmdW5jdGlvbigpe3RoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UuRChsLkZtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5hZigpfSxhZjpmdW5jdGlvbigpe3RoaXMuQ2R8fCh0aGlzLkNkPSEwLHRoaXMucy54Yj8odGhpcy51Yz0hMSx0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuZWQ9ITEsdGhpcy5pLkpnKCksdGhpcy5zLm9yaWdpbi5ZZCgpKTp0aGlzLkJhKCkpfSxVdTpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5sZChhKSl9LGxkOmZ1bmN0aW9uKGEpe2EmJgphLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5NZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SYnx8dGhpcy5ULldlKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlQuV2UoKSk7dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0semU6ZnVuY3Rpb24oKXtpZih0aGlzLmV1KXRoaXMuQmEoKTtlbHNle3RoaXMuJGI9ITA7dGhpcy5pLnUuamImJiF0aGlzLndnJiZ0aGlzLmkudS5qYigpJiZlLkQobC5CYyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tdShhKTt2YXIgYj0iIjtpZih0aGlzLnMub2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMudmcpO2MmJihiPXRoaXMucy5vZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMuZWR8fCh0aGlzLmVkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChsLkxtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5zLnhiPyh0aGlzLnVjPSExLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5jYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuY2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5lZD0hMSx0aGlzLmkuSmcoKSx0aGlzLnMub3JpZ2luLllkKCkpOnRoaXMuQmEoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuc2MucmVwbGFjZSgiW3RpbWVdIixlLnJmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMucWM9ITA7dGhpcy52aWRlby5jb250cm9scz0KITF9fSxzZzpmdW5jdGlvbigpe3RoaXMuUmI9ITA7dGhpcy5yYT10aGlzLmkuRzt0aGlzLnJhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpOwphLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuWHAoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmkuQz1hO3ZhciBiPXRoaXMuaS5DLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmkuZmMoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy5yYS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMucmEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlBnLmJpbmQodGhpcyk7dGhpcy5jYS5hcHBlbmRDaGlsZChiKTt0aGlzLk5nKCk7dGhpcy5PZygpO3RoaXMuRmQ9c2V0SW50ZXJ2YWwodGhpcy5oby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFhwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5zLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLnMuTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5UO2gub2EmJmguaXNFbmFibGVkJiYhaC5iYygpJiYoZT1oLk1hKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sCmhvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLnMuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5GZCksdGhpcy5rZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnplKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLkZkKSx0aGlzLmxkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sR2c6ZnVuY3Rpb24oKXt0aGlzLmRnfHwodGhpcy5kZz0hMCx0aGlzLkhjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sbXU6ZnVuY3Rpb24oYSl7YT09dGhpcy5IZ3x8dGhpcy5CYnx8KDA9PWEmJih0aGlzLiRhJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLiRhKSx0aGlzLiRhPQohMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuR2coKX0uYmluZCh0aGlzKSksdGhpcy5SYiYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMuQmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlhhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQobC5IbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpLGUuRChsLk1tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksdGhpcy5SYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PQpNYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuSGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLkQobC5HbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGwuSm0sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSksYT09TWF0aC5mbG9vcigzKnRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChsLk9tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpLGUuRChsLlBtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksCnRoaXMuSGc9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuQmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH1mb3IodmFyIGM9dGhpcy5jcSh0aGlzLnMuemEsYSk7Yy5sZW5ndGg7KXRyeXt2YXIgZj1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmdGhpcy5mZC5pbXByZXNzaW9ucyYmZS5PcShmLnVybCx0aGlzLmZkLmltcHJlc3Npb25zKT90aGlzLlFkKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQobC5JbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkse2FkSWQ6dGhpcy5mZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUWQoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8Cih0aGlzLnMuemE9dGhpcy5Cbyh0aGlzLnMuemEsYSkpfX0sUWQ6ZnVuY3Rpb24oYSxiLGMsZil7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGE9dGhpcy5ULkthKGEpLGMmJmEuU20oYyksZnx8KGY9dGhpcy5qZiksdGhpcy5ULkdhKGEsZix0aGlzLmpmLCExLCEwKSl9LGNxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sQm86ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sVHU6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuUGcuYmluZCh0aGlzKX0sUGc6ZnVuY3Rpb24oKXtlLkQobC5xbyx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5IYyYmZS5YYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuTHAoKSwhMCk7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5zLnljfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMucy55Yyx0aGlzLlQub2E/Il90b3AiOiJfYmxhbmsiKX19LE5nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PQoiQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLnNjLnJlcGxhY2UoIlt0aW1lXSIsZS5yZigwKSk7dGhpcy5jYXB0aW9uPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYSl9fSxPZzpmdW5jdGlvbigpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlkPXRoaXMud287dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249CiJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsdGhpcy5jZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGIuc3R5bGVbImZsb2F0Il09ImxlZnQiLGIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yi5pZD10aGlzLlhjO2IuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmd1LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLAp0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09InJpZ2h0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5YZDtjLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZ1LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxmLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZi5zdHlsZS50b3A9Ii01MHB4IixmLnN0eWxlLnJpZ2h0PSIwcHgiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLnZnO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7Zi5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMub2UmJmEuYXBwZW5kQ2hpbGQoZik7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKdGhpcy5jZC5iaW5kKHRoaXMpKTt0aGlzLmNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3RoaXMuY29udHJvbHM9dGhpcy5jYS5hcHBlbmRDaGlsZChhKTt0aGlzLmkudS5XYSYmdGhpcy5pLnUuV2EoKSYmdGhpcy5McigpO3RoaXMuVmIoKX19LFZiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sY2Q6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sZ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlhjKTt0aGlzLmkuQy5wYXVzZWQ/KHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSk6KHRoaXMuaS5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sCnRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGwuUGUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YYyk7dGhpcy5pLkMucGF1c2VkfHwodGhpcy5pLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChsLlBlLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpfSxpdDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGMpO3RoaXMuaS5DLnBhdXNlZCYmKHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YZCk7dGhpcy5pLkMubXV0ZWQ/Cih0aGlzLmkuQy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApKToodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCkpfSxMcjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGQpO3RoaXMuaS5DLm11dGVkfHwodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxDYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkNiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5DYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQ2IpO3RoaXMuRGN8fHRoaXMucWN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnBlKCkpfSxCYTpmdW5jdGlvbigpe3RoaXMuRGM9ITA7dGhpcy4kYSYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy4kYSksdGhpcy4kYT0hMSk7aWYoKCJwcmVyb2xsIj09ZS5GYSYmdGhpcy5xY3x8InBvc3Ryb2xsIj09ZS5GYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5GYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKHZhciBiPXRoaXMuaS5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmkuZmMoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuRGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5EZCgpfWVsc2UgdGhpcy5EZCgpfSxEZDpmdW5jdGlvbigpe3RoaXMud2c9ITA7dGhpcy5pLkRmKCk7CnRoaXMuaS5qdCgpO3RoaXMuJGI9ITE7ZS5EKGwudm8sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTt0aGlzLnpmKCkuZ3QoKX0semY6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuaSYmdGhpcy5pLnUmJihhPXRoaXMuaS51KTtyZXR1cm4gYX0sTWQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmKGE9ITApfXJldHVybiBhfSxVZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihlLk5mKHRoaXMudmlkZW8sYSk/dGhpcy5pdCgpOnRoaXMuYWUoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWUoKX0uYmluZCh0aGlzKSwKMTAwKSl9LFI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLnMmJihhLmNsaWNrdGhyb3VnaD10aGlzLnMueWMsYS5kdXJhdGlvbj10aGlzLnMuZHVyYXRpb24sYS5hZFBvZD10aGlzLnMueGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSkpO3JldHVybiBhfSxqZjpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIE89Yy5KaXx8TztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ubz10aGlzLmFbNl07dGhpcy5taD10aGlzLmFbNF07dGhpcy5mcz10aGlzLmFbNF07dGhpcy4kaj10aGlzLmFbOF07dGhpcy5ZdD10aGlzLmFbMV07dGhpcy5vcj10aGlzLmFbOF07dGhpcy5vcz10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLldpPWI7Yi5wcm90b3R5cGU9e1NvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuVG86dGhpcy5saChhKX0sbGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1oOnRoaXMuZXMoYSl9LGVzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5mczp0aGlzLlpqKGEpfSxaajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiRqOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZdDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm9zOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWI9Yy5XaXx8bWIsWWM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuU28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPQpkfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuSmE9bnVsbDt0aGlzLmJhPVtdO3RoaXMuWT1udWxsO3RoaXMuTWI9ITE7dGhpcy5CZT0iIjt0aGlzLkFlPSExO2QmJmQuZW1wdHk/dGhpcy5DcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmZmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkthKG0ucWUodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PQp0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJihhPWUuY2YodGhpcy51cmwpLHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5xZShhKSkrIiZ0eXBlPWpzIixiPW0uS2EobS5xZSh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpLGIuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIik7bS5HYShiLHRoaXMuQnIuYmluZCh0aGlzKSx0aGlzLnlyLmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSwKYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkZhKXRyeXt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWYuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmCiJwcmVyb2xsIj09ZS5GYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuRmEpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8Ck51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxCcjpmdW5jdGlvbihhKXt0aGlzLllzKGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5WYygpOnRoaXMuZmEodGhpcy5DYSh4LmpjLHtlcnJvcjp0aGlzLkFlP0Mub2Q6Qy5JZX0pKX0sQ3I6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/CnRoaXMuVmMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5qYyx7ZXJyb3I6dGhpcy5BZT9DLm9kOkMuSWV9KSl9LHlyOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkNhKHguSGUse2RlcHRoOmF9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5ZPXRoaXMuYmEuc2hpZnQoKTt0aGlzLlRxKCk/dGhpcy5WdCgpPyhhKyssbmV3IGIodGhpcyx0aGlzLkNmKCksZyx7QWRTeXN0ZW06dGhpcy5KcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmZhKHRoaXMuQ2EoeC5LZSkpOihhPTAsdGhpcy5NdSgpJiZ0aGlzLmNlKHRoaXMueG8oKSkpfSxZZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5ZZCgpfSxNdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlN0KCk/dGhpcy5SdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5DYSh4LkRlKSk6dGhpcy5mYSh0aGlzLkNhKHguVmgpKSwhMSk6Cih0aGlzLmZhKHRoaXMuQ2EoeC5qYyxDLkplKSksITEpfSxjZTpmdW5jdGlvbihhKXthLnphPWEuemEuY29uY2F0KHRoaXMuVWQoKSk7YS54Yj1hLnhiP2EueGI6dGhpcy5NYjt0aGlzLnBhcmVudC5jZShhKX0seG86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbmI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMueGYoKTthLnljPXRoaXMuTXAoKTthLm9yaWdpbj10aGlzO2EuTz10aGlzLklwKCk7YS5vZT10aGlzLmFxKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLlkmJihiLnphPWIuZXJyb3IuY29kZSE9eC5EZS5jb2RlP2IuemEuY29uY2F0KHRoaXMuT3AoKSk6Yi56YS5jb25jYXQodGhpcy5WcCgpKSk7dGhpcy5iYS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC56YiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnpiJiZ0aGlzLnBhcmVudC56YihiKSxhPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZhJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx6YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC56YihhKX0sa2Y6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQ2EoYSxiKSl9LENhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG9iKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sVnQ6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxTdDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMueGYoKS5sZW5ndGh9LFJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5VYigpfSxDZzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuYmEuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxZczpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuQmU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLkFlPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxUcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuQ2YoKS5sZW5ndGh9LENmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGQodGhpcy5ZLCJWQVNUQWRUYWdVUkkiKX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZCh0aGlzLlksIkFkU3lzdGVtIil9LFVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVsiSW1wcmVzc2lvbiIsIlRyYWNraW5nIiwiQ2xpY2tUcmFja2luZyIsIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBnPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZykpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGcudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5UYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LApWcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0seGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSx2YzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksCk12OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLlRhKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxiPWcuY29uY2F0KGQpfWNhdGNoKGUpe31yZXR1cm4gYn0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIiwKZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMuTmMoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2UucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuVGEodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxhcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGc9ITE7dHJ5e2M9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxnPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkZ0KGcsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZCl7Yj0hMX1yZXR1cm4gYn0sCkhkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5UYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sSWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFRhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuTmMoYSk6IiJ9LE5jOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSWQoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLmFtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkluPXRoaXMuYVs2XTt0aGlzLldrPXRoaXMuYVszXTt0aGlzLkNqPXRoaXMuYVs1XTsKdGhpcy5Vaz10aGlzLmFbN107dGhpcy5paD10aGlzLmFbN107dGhpcy5Baj10aGlzLmFbNl07dGhpcy5rcz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLnVwPWI7Yi5wcm90b3R5cGU9e0huOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbjp0aGlzLlZrKGEpfSxWazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2s6dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNqOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaWg6dGhpcy56aihhKX0semo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Bajp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmtzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy51cHx8cGIsWmM9bmV3IHBiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLkhuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuemE9W107dGhpcy5NPVtdO3RoaXMueWM9IiI7dGhpcy5PPXRoaXMueGI9ITE7dGhpcy5vcmlnaW49bnVsbH1jLlhrPWI7Yi5wcm90b3R5cGU9e3JvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGVxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgbmI9Yy5Ya3x8bmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaGs9dGhpcy5hWzldO3RoaXMucG49dGhpcy5hWzZdO3RoaXMucWg9dGhpcy5hWzFdO3RoaXMuSXE9dGhpcy5hWzhdO3RoaXMuUWs9dGhpcy5hWzVdO3RoaXMudG09dGhpcy5hWzldO3RoaXMuc2g9dGhpcy5hWzRdO3RoaXMuYm49dGhpcy5hWzRdO3RoaXMuZz0KdGhpcy5hWzVdfWMubXA9YjtiLnByb3RvdHlwZT17Z2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhrOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbjp0aGlzLnBoKGEpfSxwaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucWg6dGhpcy5IcShhKX0sSHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklxOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Razp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5yaChhKX0scmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnNoOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHFiPWMubXB8fHFiLCRjPW5ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5nayg0KTt2YXIgeD17cGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsa2E6IlhNTF9QQVJTRV9FUlJPUiJ9LFZoOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixrYToiRFVSQVRJT05fRVJST1IifSxqYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsa2E6IkVNUFRZX1ZBU1QifSxLZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKa2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGthOiJMT0FEX0VSUk9SIn0sbmQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCkJ2Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGthOiJNRURJQUZJTEVfRVJST1IifSxEZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixrYToiRFVNTVlfQUQifX0sQz17SWU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixrYToiTk9fQURTIn0sSmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGthOiJOT19NRURJQUZJTEVTIn0sRHY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxvZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuR2g9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbNl19Yy5nbD1iO2IucHJvdG90eXBlPXtGaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR2g6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciByYj1jLmdsfHxyYixhZD1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1hZC5GaCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLkZjPWI7dGhpcy56YT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuc2k9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYj1jLnNpfHxvYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Oaj10aGlzLmFbOV07dGhpcy5icj10aGlzLmFbM107CnRoaXMubHU9dGhpcy5hWzFdO3RoaXMuUnI9dGhpcy5hWzddO3RoaXMuQ3E9dGhpcy5hWzRdO3RoaXMub2g9dGhpcy5hWzRdO3RoaXMuYWk9dGhpcy5hWzJdO3RoaXMucmo9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNl19Yy5Icj1iO2IucHJvdG90eXBlPXtNajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTmo6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJyOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdTp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUnI6dGhpcy5CcShhKX0sQnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNxOnRoaXMubmgoYSl9LG5oOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vaDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmFpOnRoaXMucWooYSl9LHFqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5yajoKdGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYj1jLkhyfHxzYixiZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1iZC5Naig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLnU9YTt0aGlzLlJhPWEudGYoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUucGEoMTApO3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlNhPXt9O3RoaXMuUmY9ITE7dGhpcy5YYj1bXX1jLlpoPQpiO2IucHJvdG90eXBlPXtacDpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGY9MCxiPTAsZT17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZj1iLmxlZnQsYj1iLnRvcCk7ZT17eDpmLHk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlpwKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5NcShhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PQp3aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sTHQ6ZnVuY3Rpb24oKXt0aGlzLlJmPSEwfSxKZzpmdW5jdGlvbigpe3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sZWc6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtlLkQobC5CYyx0aGlzLnUuQigpKX0sanQ6ZnVuY3Rpb24oKXt0aGlzLlJmfHwodGhpcy51LnBsYXkoKSwKZS5EKGwuQ2MsdGhpcy51LkIoKSkpfSxmYzpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy51LnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5SYS5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuUmEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5SYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlJhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuUmEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuUmEpO3RoaXMudS5EYiYmCnRoaXMudS5EYigpP3RoaXMudS50ZigpLmFwcGVuZENoaWxkKHRoaXMuRyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkcpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2IuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy51LmV4aXRGdWxsc2NyZWVuKCl9LE1xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxOcDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LApXYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLk5wKHRoaXMuUmEpO2lmKGIueCE9dGhpcy5TYS54fHxiLnkhPXRoaXMuU2EueXx8Yi5wb3NpdGlvbiE9dGhpcy5TYS5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5TYS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuU2EuaGVpZ2h0fHxhKXtpZigwPHRoaXMuU2Eud2lkdGgmJjA8dGhpcy5TYS5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkRmKCk7cmV0dXJufXRoaXMuU2E9Yjt0aGlzLnUuRGIoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD0KYi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5YYi5sZW5ndGg7YSsrKXRoaXMuWGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9d2luZG93LnNldFRpbWVvdXQodGhpcy5XYi5iaW5kKHRoaXMpLDEwKX0sUW06ZnVuY3Rpb24oYSl7dGhpcy5YYnx8KHRoaXMuWGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlhiLnB1c2goYSl9LERmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTtmb3IodmFyIE49Yy5aaHx8TixCPVtdLHRiPTA7MTAwPnRiO3RiKyspe3ZhciBMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TC5zdHlsZS5kaXNwbGF5PSJibG9jayI7TC5pZD1lLnBhKDEwKTtMLmNvbnRyb2xzPSEwO0IucHVzaChMKX12YXIgSD0KITEsYmE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5uaz10aGlzLmFbMV07dGhpcy5BaT10aGlzLmFbMl07dGhpcy5kcj10aGlzLmFbOF07dGhpcy5rdj10aGlzLmFbMTBdO3RoaXMua2w9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzJdO3RoaXMubHI9dGhpcy5hWzhdO3RoaXMuWm09dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5wcj1iO2IucHJvdG90eXBlPXttazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubms6dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuY3IoYSl9LApjcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZHI6dGhpcy5qdihhKX0sanY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmt2OnRoaXMuamwoYSl9LGpsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbDp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU2s6dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxyOnRoaXMuWW0oYSl9LFltOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmc6YX19fSkoYyk7dmFyIHViPWMucHJ8fHViLGNkPW5ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWNkLm1rKDQpOyhmdW5jdGlvbihjKXtjLkprPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5QKGEpO3RoaXMubmUoYik7dGhpcy5nZigpfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZ2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5TKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxqYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkRhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdmI9Yy5Ka3x8dmI7KGZ1bmN0aW9uKGMpe2MuSWs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWNhKCk7dGhpcy53Yj10aGlzLndifHwhMTsKdGhpcy5PZT10aGlzLlJlPXRoaXMuSWY9dGhpcy5pYT10aGlzLnZlPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMueXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnZlPSEwO3RoaXMuSWYmJnRoaXMuWmUoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLiRiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMud2MoKTt0aGlzLklmPQohMDt0aGlzLlplKCl9LmJpbmQodGhpcykpO3RoaXMuVmUoKX0sWmU6ZnVuY3Rpb24oKXtpZighdGhpcy53Yil7dGhpcy53YygpO2lmKCF0aGlzLnZlJiYhdGhpcy53YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudmUmJnRoaXMuT2UmJiF0aGlzLlJlJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0sd2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LHlmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApWZTpmdW5jdGlvbigpe2lmKHRoaXMud2MoKSl7dmFyIGI9dGhpcy55ZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlJlPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuT2U9Yi5Jdn10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDEwMCl9LFB2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmJ3KCk6ITF9LFViOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5VYigpOi0xfSxXcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSx5cDpmdW5jdGlvbihiLGEpe3RoaXMud2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMud2J8fDMwMj09dGhpcy53Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy53Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFjKCl9LmJpbmQodGhpcyksMTAwKX0sQWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuaWE/KHRoaXMubSgpLHRoaXMubmEoKSk6Yi5SYygpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLldwKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHdiPWMuSWt8fHdiOyhmdW5jdGlvbihjKXtjLktrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sClJxOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmNsLkFtLnltP3dpbmRvdy5PTy5jbC5BbS55bS5HdihmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ScSgpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO3ZhciBiPWNhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkVhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB2YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgd2IoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHhiPWMuS2t8fHhiLHliPW5ldyB4YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuQmw9dGhpcy5hWzldO3RoaXMuWHM9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzRdO3RoaXMudGs9dGhpcy5hWzVdO3RoaXMuYnU9dGhpcy5hWzRdO3RoaXMuQm49dGhpcy5hWzhdO3RoaXMuaXY9dGhpcy5hWzhdO3RoaXMuanU9dGhpcy5hWzNdO3RoaXMuJHE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOV19Yy5RaT1iO2IucHJvdG90eXBlPXtBbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQmw6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhzOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51dTp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudGs6dGhpcy5hdShhKX0sYXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJ1OnRoaXMuQW4oYSl9LEFuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Cbjp0aGlzLmh2KGEpfSxodjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhPwp0aGlzLml2OnRoaXMuaXUoYSl9LGl1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuanU6dGhpcy5acShhKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgemI9Yy5RaXx8emIsZGQ9bmV3IHpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQuQWwoNCk7KGZ1bmN0aW9uKGMpe2MuT2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX0sRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sTDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLk9sfHxVOyhmdW5jdGlvbihjKXtjLk5sPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kudmQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnZkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLAoiYWRzTWFuYWdlckxvYWRGYWlsIik7dGhpcy53KCl9LmJpbmQodGhpcyksMUUzKX0uYmluZCh0aGlzKSk7eS52ZCgiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLiRyKGEpfS5iaW5kKHRoaXMpKTt5LmxxKCl9LCRyOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgVj1jLk5sfHxWOyhmdW5jdGlvbihjKXtjLlBsPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy5XYyYmKGI9ZS5GbyhiLHRoaXMuV2MpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5IKGQpKXt0aGlzLkooZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkEpO2YuYigpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiKwpoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5XY3x8KHRoaXMuV2M9W10pLHRoaXMuV2MucHVzaChiW2FdKSxkPW5ldyBVKGgpLHRoaXMuSChkKXx8KHRoaXMuSihkKSxmPW5ldyBWKGQsdGhpcy5BKSxmLmIoKSl9Y2F0Y2goayl7fX19dGhpcy5JKCl9LHZkOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmFhfHwodGhpcy5hYT17fSk7dGhpcy5hYVtiXXx8KHRoaXMuYWFbYl09e30pO3RoaXMuYWFbYl1bYV18fCh0aGlzLmFhW2JdW2FdPVtdKTt0aGlzLmFhW2JdW2FdLnB1c2goYyl9LFd0OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2FdKXRoaXMuY2N8fCh0aGlzLmNjPVtdKSx0aGlzLmNjLnB1c2goYiksdGhpcy5odCgpJiYodGhpcy5tZygpLHRoaXMuYigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2FdW2NdJiYKMDx0aGlzLmFhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuYWFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmFhW2FdW2NdW2RdKGIpfX0sbHE6ZnVuY3Rpb24oKXtpZih0aGlzLmNjKWZvcih2YXIgYj0wO2I8dGhpcy5jYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLmNjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmFhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5XdChiKX19KX0pKGMpO3ZhciBBYj1jLlBsfHxBYix5PW5ldyBBYihxKTsKYWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cT10aGlzLmFbN107dGhpcy5abz10aGlzLmFbNV07dGhpcy5Ybz10aGlzLmFbMl07dGhpcy5Gbj10aGlzLmFbMV07dGhpcy5JaT10aGlzLmFbN107dGhpcy5ydj10aGlzLmFbMV07dGhpcy52bT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLm5vPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cTp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWm86dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhvOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSWk6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ydjp0aGlzLnVtKGEpfSx1bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudm06dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBCYj1jLm5vfHxCYixlZD1uZXcgQmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC54cSg0KTsoZnVuY3Rpb24oYyl7Yy5CaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlMoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSwKcGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sTDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuQmh8fENiOyhmdW5jdGlvbihjKXtjLkNoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2EuaXNBZCYmYS5pc0FkKCk/dGhpcy5tKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwyNTApO3RoaXMuS3N8fCh0aGlzLktzPSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkNofHxEYjsoZnVuY3Rpb24oYyl7Yy5EaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBDYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBEYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5lYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkRofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmw9dGhpcy5hWzRdOwp0aGlzLndyPXRoaXMuYVs4XTt0aGlzLnRzPXRoaXMuYVszXTt0aGlzLllpPXRoaXMuYVs0XTt0aGlzLnRsPXRoaXMuYVsyXTt0aGlzLmRrPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzEwXX1jLnVrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybDp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMud3I6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRzOnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudGw6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmRrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy51a3x8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWZkLnFsKDQpOyhmdW5jdGlvbihjKXtjLmhtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKZWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgSGI9Yy5obXx8SGI7KGZ1bmN0aW9uKGMpe2MuZ209dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5UZXx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuRnB8fCh0aGlzLkpmKCksdGhpcy5GcD0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5UZT8odGhpcy5sKCJhZGVycm9yIiwKIm5vQ29udGFpbmVyIiksdGhpcy5vKCkpOih0aGlzLlRlPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSl9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuaW1hfSxKZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS3AoKTtiP2ImJmIuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLmlhPSEwLHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmYoKX0uYmluZCh0aGlzKSwKNTApfSwkdjpmdW5jdGlvbigpe3JldHVybiEwfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWI9Yy5nbXx8SWI7KGZ1bmN0aW9uKGMpe2MuaW09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBIYihiLml0ZW0oYSkpO3RoaXMuSChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuSihjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBKYj1jLmltfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhrPXRoaXMuYVsyXTt0aGlzLndxPXRoaXMuYVsyXTt0aGlzLlNoPXRoaXMuYVszXTt0aGlzLkxqPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzJdfWMuR3I9YjtiLnByb3RvdHlwZT17R2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhrOnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53cTp0aGlzLlJoKGEpfSxSaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNoOnRoaXMuS2ooYSl9LEtqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Majp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIExiPWMuR3J8fExiLGdkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLkdrKDQpOwooZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgTWI9Yy5uanx8TWI7KGZ1bmN0aW9uKGMpe2MubWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuU2coKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLnBmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5wZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5ObSgpfS5iaW5kKHRoaXMpKSx0aGlzLlRnPSExLHRoaXMubHY9CjFFMyx0aGlzLmdnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfSxwZjpmdW5jdGlvbigpe3RoaXMuZ2cuZG9uZXx8KHRoaXMuZ2cuZG9uZT0hMCx0aGlzLlRnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZygpfS5iaW5kKHRoaXMpLHRoaXMubHYpKX0sTm06ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVGcpO3RoaXMubSgpfSxTZzpmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMudygpKX0sdmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy52Zihtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLnZmKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBOYj1jLm1qfHxOYjsoZnVuY3Rpb24oYyl7Yy5vaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRWEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE1iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE5iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE9iPWMub2p8fE9iLFBiPW5ldyBPYihxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudmg9dGhpcy5hWzldO3RoaXMuZ2k9dGhpcy5hWzNdO3RoaXMuQnA9dGhpcy5hWzJdO3RoaXMuY289dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNl19Yy5Lbz1iO2IucHJvdG90eXBlPXt1aDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudmg6dGhpcy5maShhKX0sZmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmdpOnRoaXMuQXAoYSl9LEFwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5CcDp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBRYj1jLktvfHxRYixoZD1uZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7d2luZG93LnY9aGQudWgoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iU2ltcGxlVmlkZW9BbmRJbWEifX0pfSkoYyk7dmFyIFJiPWMuTGx8fFJiOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLApmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk7dGhpcy5QYigpfSxQYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLk9kKCkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZCgpJiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0uYmluZCh0aGlzKSw1MDApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwKX0sT2Q6ZnVuY3Rpb24oKXtyZXR1cm4haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YX0sCm86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBTYj1jLktsfHxTYjsoZnVuY3Rpb24oYyl7Yy5NbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9DT05URU5UJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1dFUkJVTkcmJjE9PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLmxlbmd0aCYmIXdpbmRvdy5fcGxheSl7dmFyIGI9bmV3IFJiKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYihiLAp0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFRiPWMuTWx8fFRiLFViPW5ldyBUYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLkduPWI7Yi5wcm90b3R5cGU9e2xuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubW46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLkdufHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5sbig0KTsoZnVuY3Rpb24oYyl7Yy52bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuZWU9ITF9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLk5zKCl9LmJpbmQodGhpcyksNTAwKX0sTnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZWUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuZWUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxJdDpmdW5jdGlvbigpe3RoaXMuZWU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sTDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLnZsfHxXYjsoZnVuY3Rpb24oYyl7Yy51bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuSnI9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5LYnx8KHRoaXMuS2I9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIik7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuSnI/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLkl0KCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgWGI9Yy51bHx8WGI7KGZ1bmN0aW9uKGMpe2Mud2w9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBZYj1jLndsfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuQXY9dGhpcy5hWzVdOwp0aGlzLmhxPXRoaXMuYVs1XTt0aGlzLiRzPXRoaXMuYVszXTt0aGlzLnBrPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuJG09YjtiLnByb3RvdHlwZT17dGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVpOnRoaXMuenYoYSl9LHp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bdjp0aGlzLmdxKGEpfSxncTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHE6dGhpcy5acyhhKX0sWnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRzOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMuJG18fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWpkLnRpKDQpOyhmdW5jdGlvbihjKXtjLm9sPQpwLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTsKcmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLm9sfHxhYzsoZnVuY3Rpb24oYyl7Yy5ubD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5EYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm5iKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuc28oKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuTWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnVyKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHNvOmZ1bmN0aW9uKCl7dGhpcy5OZSgpfHx0aGlzLm8oITApfSx1cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTWMoKTshYi5tYSYmYi5iYSYmYi5GdiYmYi5IdiYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sTWM6ZnVuY3Rpb24oKXtpZighdGhpcy5jZylmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRGEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuY2c9YltjXSk7cmV0dXJuIHRoaXMuY2d9LE9kOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG86ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5NYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYz1jLm5sfHxiYzsoZnVuY3Rpb24oYyl7Yy5wbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLnBsYXllcmFwaSl7dmFyIGI9ay5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBhYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgYmMoYyx0aGlzLkEpKS5iKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgY2M9Yy5wbHx8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52cz10aGlzLmFbOF07dGhpcy5raD10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07dGhpcy5FcT10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs1XX1jLm1yPWI7Yi5wcm90b3R5cGU9e3VzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudnM6dGhpcy5qaChhKX0samg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtoOnRoaXMuVXMoYSl9LFVzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Wczp0aGlzLkRxKGEpfSxEcTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXE6dGhpcy5zdihhKX0sc3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnR2OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGVjPWMubXJ8fGVjLGtkPW5ldyBlYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1rZC51cyg0KTsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlAoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUyhhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LERhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLlJqfHxXOyhmdW5jdGlvbihjKXtjLlFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmZlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmImJih0aGlzLmZlPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuZmUmJmIhPXRoaXMuZmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5kdyksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuUWp8fFg7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFcoYiksYi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFcoYiksYi5qYT90aGlzLm1nKCk6dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBELApmYz1jLlNqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5vYi5sZW5ndGgpe3ZhciBhPW0ub2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUudHQoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuV2YuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlrW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLldmKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzJdO3RoaXMuQ209dGhpcy5hWzhdO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuaHA9dGhpcy5hWzFdO3RoaXMuRHA9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5ybT1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWk6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNtOnRoaXMuUm4oYSl9LFJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHA6dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRwOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgaGM9Yy5ybXx8aGMsbGQ9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLmRpKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5QKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuUyhjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LApsdDpmdW5jdGlvbihiKXt0aGlzLnNkPWJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1yfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxMOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksCnRoaXMuc2QmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnNkJiYobmV3IEcodGhpcyx0aGlzLnNkKSkuYigpKX19KX0pKGMpO3ZhciBNPWMuVmx8fE07KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkdkKWlmKHRoaXMuaGJ8fCh0aGlzLmhiPTApLHRoaXMuaGIrKywxNTx0aGlzLmhiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy52dCgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubygpOnRoaXMubyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkdkPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLnZhKCl8fCh0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WYSgpfS5iaW5kKHRoaXMpLDEwKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJgotMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVT1hLGIubCgiYWRlcnJvciIsYSkpOmIubCgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlU9CnRoaXMuVXx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLlZhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgRz1jLlVsfHxHOyhmdW5jdGlvbihjKXtjLldsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKTt0aGlzLndhPS0xfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTSh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiLmx0KHRoaXMuQSksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBpYz1jLldsfHxpYyxqYz1uZXcgaWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSnU9dGhpcy5hWzZdO3RoaXMueHM9dGhpcy5hWzVdO3RoaXMuVmk9dGhpcy5hWzRdO3RoaXMuJHQ9dGhpcy5hWzZdO3RoaXMuRW09dGhpcy5hWzEwXTt0aGlzLllqPXRoaXMuYVs5XTt0aGlzLnFwPXRoaXMuYVsxXTsKdGhpcy5BaD10aGlzLmFbNF07dGhpcy5JaD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLkJrPWI7Yi5wcm90b3R5cGU9e0l1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KdTp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhzOnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5WaTp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiR0OnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5FbTp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWWo6dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuemgoYSl9LHpoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWg6dGhpcy5IaChhKX0sSGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkloOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPWMuQmt8fGtjLG1kPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW1kLkl1KDQpOyhmdW5jdGlvbihjKXtjLkVqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5kdXJhdGlvbj10aGlzLmRmPTA7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlMoYSk6dGhpcy5kYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLAo1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSx7aWQ6Yi5pZH0pfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlJFU1VNRSx7aWQ6Yi5pZH0pfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRmfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmCnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfVElNRSx7WW46ZnVuY3Rpb24oYSl7MDxhJiYodGhpcy5kZj1hKX0uYmluZCh0aGlzKSxpZDpiLmlkfSk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfREFUQSx7WW46ZnVuY3Rpb24oYSl7MDxhLmR1cmF0aW9uJiYodGhpcy5kdXJhdGlvbj1hLmR1cmF0aW9uKX0uYmluZCh0aGlzKSxpZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBsYz1jLkVqfHxsYzsoZnVuY3Rpb24oYyl7Yy5Eaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxodzpmdW5jdGlvbigpe30sYnQ6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAuQ2UobmV3IGZ1bmN0aW9uKCl7fSk7YS5Ddj0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi5idChhKTt3aW5kb3cuS3Y9Yn0sYjpmdW5jdGlvbigpe3RoaXMuYXR8fCh0aGlzLmF0PSEwKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTGR8fCh0aGlzLkxkPTEpO2lmKDIwPHRoaXMuTGQpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7ZWxzZXt2YXIgYT0hMSxjPWE9ITE7aWYoYi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmCihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy5MZCsrO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTApfX0sSGE6ZnVuY3Rpb24oYil7dmFyIGE9ImFkRXJyb3IiLGM9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmCihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMua2UoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCghMCl9LmJpbmQodGhpcykpfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJgotMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5sKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxrZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc01hbmFnZXIpO2I9ImFkRXJyb3IiO2E9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJgpnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMH0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbWM9Yy5Eanx8bWM7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXZwIiksYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKGJbYV0uaWQpe3ZhciBjPW5ldyBsYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2MuamF8fHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IG1jKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBuYz1jLkZqfHxuYyxvYz1uZXcgbmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHA9dGhpcy5hWzEwXTt0aGlzLnZuPXRoaXMuYVs0XTt0aGlzLnB2PXRoaXMuYVs0XTt0aGlzLnd1PXRoaXMuYVs3XTt0aGlzLmtuPXRoaXMuYVs3XTsKdGhpcy5nPXRoaXMuYVsxXX1jLlRpPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5IcDp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudm46dGhpcy5vdihhKX0sb3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnB2OnRoaXMudnUoYSl9LHZ1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53dTp0aGlzLmpuKGEpfSxqbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua246dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLlRpfHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5HcCg0KTsoZnVuY3Rpb24oYyl7Yy52aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKTthJiZ0aGlzLlAoYS5wYXJlbnROb2RlKX0sTDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnZqfHxZOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkZmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5PZigpfSxPZjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkhhKCksITA7dGhpcy5GZisrO2lmKDEwPHRoaXMuRmYpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmCihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsCmIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxYOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy51anx8WjsoZnVuY3Rpb24oYyl7Yy53aj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYKMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBaKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcWM9Yy53anx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVs3XTt0aGlzLnFxPXRoaXMuYVszXTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLkRsPQp0aGlzLmFbNl07dGhpcy5Wcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxMF19Yy5laj1iO2IucHJvdG90eXBlPXtnbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaG46dGhpcy5wcShhKX0scHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFxOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaWk6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhzOnRoaXMuQ2woYSl9LENsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EbDp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLmVqfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0Kb2QuZ24oNCk7KGZ1bmN0aW9uKGMpe2Mud2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiPyhiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVyUHJlZml4KSk/KHRoaXMuUChiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlMoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQ/ITE6Yi5pc1BhdXNlZD8hMTohMH0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pc0Z1bGxzY3JlZW4/Yi5pc0Z1bGxzY3JlZW46ITF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPQpjLndpfHx0YzsoZnVuY3Rpb24oYyl7Yy52aT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIiwKdGhpcy50ZXN0KTt3aW5kb3cuRkRNX1BsYXllcl92YXJzLmFkcGRldGVjdGVkJiYodGhpcy5sKCJhZGVycm9yIiwidXNpbmdBZEJsb2NraW5nU29mdHdhcmUiKSx0aGlzLm8oKSl9LHRlc3Q6ZnVuY3Rpb24oKXt9LG86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMudml8fHVjOyhmdW5jdGlvbihjKXtjLnhpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkVhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPQpiW2NdO2lmKGQudmFycy5pc1JlYWR5KWQ9bmV3IHRjKGQpLGQuamF8fHRoaXMuSChkKXx8KHRoaXMuSihkKSwobmV3IHVjKGQsdGhpcy5BKSkuYigpKTtlbHNlIGJyZWFrfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHZjPWMueGl8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5iaD10aGlzLmFbNl07dGhpcy5DdD10aGlzLmFbNV07dGhpcy5ubT10aGlzLmFbNl07dGhpcy5Ebj10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbOV07dGhpcy5laD10aGlzLmFbMTBdO3RoaXMubGs9dGhpcy5hWzFdO3RoaXMuY209dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOF19Yy5Ocj1iO2IucHJvdG90eXBlPXthaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYmg6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkN0Ogp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm06dGhpcy5DbihhKX0sQ246ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRuOnRoaXMudnAoYSl9LHZwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy53cDp0aGlzLkNrKGEpfSxDazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGs6dGhpcy5kaChhKX0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVoOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sazp0aGlzLmJtKGEpfSxibTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY206dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLk5yfHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5haCg0KTsKKGZ1bmN0aW9uKGMpe2MuQ2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlAoYiksdGhpcy5TKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5DaXx8eWM7KGZ1bmN0aW9uKGMpe2MuQmk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuWGUoKX0sWGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8CihiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZSghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgemM9Yy5CaXx8emM7KGZ1bmN0aW9uKGMpe2MuRGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHljKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5JKCk7cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLkRpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtpPXRoaXMuYVsyXTt0aGlzLm91PXRoaXMuYVs4XTt0aGlzLkFxPXRoaXMuYVs0XTt0aGlzLkhqPXRoaXMuYVsxXTt0aGlzLmxqPXRoaXMuYVs2XTt0aGlzLnJpPXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs1XTt0aGlzLmhyPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzEwXX1jLkZzPWI7Yi5wcm90b3R5cGU9e2ppOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5raTp0aGlzLm51KGEpfSxudTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm91OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5BcTp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSGo6dGhpcy5raihhKX0sa2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxqOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5yaTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLm9wOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ocjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIENjPWMuRnN8fENjLHFkPW5ldyBDYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXFkLmppKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlFmPXRoaXMuVGY9dGhpcy5TZj0hMTt0aGlzLlljPVtdO3RoaXMuaWU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PQp0eXBlb2YgQml0bW92aW5EZXRlY3Rpb24/bnVsbDpCaXRtb3ZpbkRldGVjdGlvbixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBUYT9udWxsOlRhLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgWWE/bnVsbDpZYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgZGM/bnVsbDpkYyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB1YT9udWxsOnVhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj8KbnVsbDp5YixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygd2M/bnVsbDp3YyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGNiP251bGw6Y2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIGhiP251bGw6aGIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgemE/bnVsbDp6YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBPYT9udWxsOk9hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBhP251bGw6cGF9fWMuWms9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5ZcChhKTpbXSxiO3RoaXMuVGY9ITA7aWYoYS5sZW5ndGgpe3RoaXMuU2Y9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj0KYVtjXSx0aGlzLm5nKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5pZSl7aWYodGhpcy5RZilicmVhaztiPXRoaXMuaWVbY107dGhpcy54ZShiKSYmKHRoaXMuWWMucHVzaChiKSx0aGlzLm5nKGIpKX19LHhlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2Ygcj8hMDohMX0sWXA6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWM9YVtmXSxjPXRoaXMuaWVbY10sdGhpcy54ZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxuZzpmdW5jdGlvbihhKXt0aGlzLnhlKGEpJiZhLmIoKX0sS3Q6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLlNmKWZvcih0aGlzLlFmPSEwLGE9MDthPHRoaXMuWWMubGVuZ3RoO2ErKyl0aGlzLlljW2FdLnJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuWWNbYV0ucmIpfX19KShjKTt2YXIgRGM9Yy5aa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpvPXRoaXMuYVs5XTt0aGlzLnRqPXRoaXMuYVs2XTt0aGlzLmFwPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzddfWMuRXM9YjtiLnByb3RvdHlwZT17SW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpvOnRoaXMuc2ooYSl9LHNqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50ajp0aGlzLiRvKGEpfSwkbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgRWM9Yy5Fc3x8RWMscmQ9bmV3IEVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuSW8oNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlRiKGwuTnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlRiKGwuU3IpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7CnZhciBzZD1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGVhPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBGPW5ldyBRLGs9ITE7Ri5aYigpO0YuS2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLlpiKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5LZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuWmIoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csRi5KcSgpLHtpZDp0ZH0pfSw1MDApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnI9dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzZdfWMuVGw9YjtiLnByb3RvdHlwZT17WXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5acjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMuVGx8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLllyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5pZz10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuVGM9MDt0aGlzLk5hPSIiO3RoaXMuWmM9W107dGhpcy4kYz0wO3RoaXMuamc9ITE7dGhpcy5nZT1bXX1jLlhnPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3RoaXMuaWc9YX0sYmQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLk5hPXRoaXMucGxheWVyLkwoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxudDpmdW5jdGlvbihhKXt0aGlzLlVhPWF9LG10OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj0KYX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxlYzpmdW5jdGlvbihhLGIpe2UuaWIoIndlbHQuZGUiKSYmZS5MYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5VYSk7dmFyIGM9ITEsZj0hMTtpZih0aGlzLktxKCkpdGhpcy5VYS5jKHRoaXMuVWEuT2MsdGhpcy5VYS5BYSx0aGlzLlVhLmhlLGZ1bmN0aW9uKCl7dGhpcy5lYyhhLApiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkVjKTtlbHNlIGlmKHRoaXMubnEoKSl0aGlzLmt0KGZ1bmN0aW9uKCl7dGhpcy5lYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5EKGwuQmMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuTHQoKTtrLmV4aXRGdWxsc2NyZWVuKCk7Uj1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLnFnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLklyKGEpOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5QZCYmKGM9dGhpcy5wbGF5ZXIuUGQoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2suUmQoYSwKYyxmKTt0aGlzLnBsYXllci5yZyhrKX19LEtxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuVGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5UYy5nZXRUaW1lKCksdGhpcy5UYz1hLDNFNTxiPyEwOiExO3RoaXMuVGM9YTtyZXR1cm4hMX0sRXQ6ZnVuY3Rpb24oKXtlLm1lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubGYoYSkpP3RoaXMuZWMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5EKGwuQ2MsdGhpcy5wbGF5ZXIuQigpKSl9LER0OmZ1bmN0aW9uKGEpe2UubWUoInBvc3Ryb2xsIik7aWYoIXRoaXMuaWcpe3RoaXMuc3QoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikpOwooYz10aGlzLmxmKGMpKT90aGlzLmVjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQobC5DYyx0aGlzLnBsYXllci5CKCkpKX19LGxmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxkdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnh0KHRoaXMuRHQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sZGQ6ZnVuY3Rpb24oYSl7ZS5tZSgibWlkcm9sbCIpO2lmKCF0aGlzLllmKXt0aGlzLllmPSEwO3ZhciBiPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMudGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLmVjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllmPSExfS5iaW5kKHRoaXMpLDFFMykpOgoodGhpcy5wbGF5ZXIucGxheSgpLGUuRChsLkNjLHRoaXMucGxheWVyLkIoKSkpfX0sY3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5ydCh0aGlzLmRkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlZkKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLkV0KCk7dGhpcy5wbGF5ZXIuVmQmJnRoaXMuY3QoKTt0aGlzLmR0KCl9LGV0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuWmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLnd2KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy4kYz10aGlzLlpjLmxlbmd0aH0sbnE6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLiRjJiYoYT0hMCk7cmV0dXJuIGF9LGt0OmZ1bmN0aW9uKGEpe3RoaXMuamc9YTtmb3IoYT0wO2E8dGhpcy5aYy5sZW5ndGg7YSsrKXRoaXMuWmNbYV1bImZ1bmN0aW9uIl0odGhpcy5Rcy5iaW5kKHRoaXMpKX0sUXM6ZnVuY3Rpb24oYSl7dGhpcy4kYy0tO2EmJnRoaXMuZ2UucHVzaChhKTswPj10aGlzLiRjJiZ0aGlzLmpnKCl9LElyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmdlLmxlbmd0aDtjKyspYj10aGlzLmdlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBnYT1jLlhnfHxnYSxSPSExLGxhPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVoPXRoaXMuYVs4XTt0aGlzLm9pPXRoaXMuYVsxMF07dGhpcy5icz10aGlzLmFbN107dGhpcy5PaD10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs2XX0KYy5Ucj1iO2IucHJvdG90eXBlPXtUaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVWg6dGhpcy5uaShhKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vaTp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnM6dGhpcy5OaChhKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9oOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy5Ucnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9dmQuVGgoNCl9KS5jYWxsKEVhcnVmYUpvTWFoc2hlTGksRWFydWZhSm9NYWhzaGVMaSk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.169.93 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/
Origin
https://www.golem.de

Response headers

Date
Fri, 21 Sep 2018 17:10:40 GMT
Last-Modified
Fri, 21 Sep 2018 15:52:04 GMT
Server
AmazonS3
x-amz-request-id
2829F134BF009514
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
Ot2b48Npe9f/Huyw2cwgPYSQl9XXE/7TDFiUVphJwusCmCGhrvFUfW0vcx1MpriV4cXrMXSq/+k=
Expires
0
homadclienthttpsle-json.php
video.golem.de/staticrl/scripts/radiant/
286 B
677 B
XHR
General
Full URL
https://video.golem.de/staticrl/scripts/radiant/homadclienthttpsle-json.php?cache=5326341591
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIEVhcnVmYUpvTWFoc2hlTGk9RWFydWZhSm9NYWhzaGVMaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3kuJGR8fCh5LiRkPTApO3kuJGQrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS4kZCYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihrKXtrLnBhdXNlQnV0dG9ufHwoay5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKay5wbGF5QnV0dG9ufHwoay5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay5tdXRlQnV0dG9ufHwoay5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay51bm11dGVCdXR0b258fChrLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnNraXBhYmxlQnV0dG9ufHwoay5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC42O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0pO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTsKay5za2lwQnV0dG9ufHwoay5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0iKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGsuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307ay5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLkxhKGEsYixbXSxjLGMsbSl9KX1tLmMoay5nbG9iYWxDb25maWcsay5jbGllbnRDb25maWcsay5wcmVjaGVja2VkLGsub25SZWFkeSxrLm9uRmFpbHVyZSxrKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1rLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZWEoZGEsNTApfWZ1bmN0aW9uIGZhKGMsYil7Ynx8KGI9InByZSIpO2lmKGsmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTihjKSxhPW5ldyBPKGEsbSksZz1rLmFkVGFnOyJwcmUiPT1iJiZrLnByZXJvbGxBZFRhZyYmKGc9ay5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmay5wb3N0cm9sbEFkVGFnJiYoZz1rLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5xZyhrKSxhLlJkKGcpKX1lbHNlIGVhKGZ1bmN0aW9uKCl7ZmEoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihrJiZtKXsoay5hZFRhZ3x8ay5wcmVyb2xsQWRUYWcpJiZjLnBhdXNlKCk7ZS5EKGwuQmMsYy5CKCkpO2lmKGMuZ2V0Q3VycmVudFRpbWUpe3ZhciBhPWMuZ2V0Q3VycmVudFRpbWUoKTthJiZlLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLm9hPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuYmQoYyk7YS5udChtKTthLm10KGspO2EuZXQoKTthLmIoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cShjLGIpfS5iaW5kKHRoaXMpLDUwKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kbD10aGlzLmFbNl07dGhpcy5tcz10aGlzLmFbMTBdO3RoaXMuaWw9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzhdOwp0aGlzLnJuPXRoaXMuYVsxXTt0aGlzLmNwPXRoaXMuYVs5XTt0aGlzLkhsPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzldfWMuR289YjtiLnByb3RvdHlwZT17Wmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRsOnRoaXMubHMoYSl9LGxzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5tczp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaWw6dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZsOnRoaXMucW4oYSl9LHFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY3A6dGhpcy5HbChhKX0sR2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy5Hb3x8aGEsSGM9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUhjLlpsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZhPSJzZXR1cCI7dGhpcy5nYz1bXTt0aGlzLiRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuUHMuYmluZCh0aGlzKSl9Yy5MaT1iO2IucHJvdG90eXBlPXskZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxXbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJgphLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFBzOmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLk9zKGEuZGF0YSl9LE9zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0sd2Q6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sY2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5ScChhKSxkPSExO2lmKGIpcmV0dXJuIGE9YS5yZXBsYWNlKGIsIiIpKyIvZGV2L2hvbWFkX3VybC8iK2IrIi8iLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywKIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSx0aGlzLlZmKGEsIlBPU1QiLHt9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sUnA6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFVtOmZ1bmN0aW9uKGEsYil7aWYoYT09Yil7aWYoZS5FcChhKSlyZXR1cm47KGI9dGhpcy5jZihhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMubGEudXJsc1thXT1iO3RoaXMubGEudXJsc1tiXT1hO3RoaXMubGEuaG9tYWRVcmxzW2FdPWI7dGhpcy5sYS5vcmlnaW5hbFVybHNbYl09YX0sRXA6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5ob21hZFVybHNbYV0mJihiPXRoaXMubGEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sbmY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMubGEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWmE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxTcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sRWE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSx1ZjpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sSnQ6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sTWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sTmY6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGtiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/CjY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LHRnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEk9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKwoxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1rO3c9STtxPW07Zm9yKGY9CjA7MTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8fm4mdykrcStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpK3EraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZj00MDs1OT49ZjtmKyspcj1kKGMsNSkrKG4mbHxuJnd8bCZ3KStxK2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedykrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtrPWsrbCY0Mjk0OTY3Mjk1O0k9SSt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoaykrYihJKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiIiLGQsZixjLGgsZSx1LGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfGM+PjYsdT1jJjYzLGlzTmFOKGYpP2U9dT02NDppc05hTihjKSYmKHU9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sUXE6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmCi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sZmY6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxjPSExLGg9ITEsZT0hMSx1PSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocSl7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlFuPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSwKaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1jO2EuaXNGaXJlZm94PWg7YS5pc1NhZmFyaT1lO2EuaXNJRT11O2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxMcDpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuZmYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxYYTpmdW5jdGlvbigpe3ZhciBhPXt0aDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwKRWg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sc3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sbG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LE9uOmZ1bmN0aW9uKCl7cmV0dXJuIGEudGgoKXx8YS5FaCgpfHxhLnNxKCl8fGEuTGsoKXx8YS5sbSgpfX07cmV0dXJuIGEuT24oKX0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxBZjpmdW5jdGlvbihhKXthPXRoaXMuTWEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxpYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxGdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LHJmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5JZyhiKSsiOiIrdGhpcy5JZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sSWc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPgphPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkZhOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxUYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9bC5JYyhiLGQpKTtiJiYoaD1sLkljKGEsYikpO2YmJihoPWwuSWMoaCxmKSk7YyYmKGg9bC5JYyhoLGMpKTtlLlRiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uWil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uamUoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uS2EoZiwhMCk7Zj1tLkthKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uR2EoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sU2Q6ZnVuY3Rpb24oKXttJiZtLlo/bS5pc0VuYWJsZWQmJm0uaW8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2QoKX0uYmluZCh0aGlzKSw1MDApfSxIZDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVGEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LElkOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxUYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLk5jKGEpOiIifSxOYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLklkKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmCihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhuOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuU2MoYSl8fHRoaXMuU3EoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94Lm9nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpJiZ0aGlzLlphKCJlcnJfdXJsIixhKTtpZih0aGlzLm5mKGEpKXJldHVybiB0aGlzLm5mKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjtkJiYoZi5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtmLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2YuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjt2YXIgYz0hMTtkPSExO2Q9dGhpcy5MYShhLGIudWEsZixmdW5jdGlvbihhKXtjPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2N8fChjPWQpLGM9SlNPTi5wYXJzZShjKX1jYXRjaChoKXtjPSExfWMudXJsJiZjLmhhc2gmJihjPWIuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuVW0oYyxhKTtyZXR1cm4gY30sTGE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSx1KXt2YXIgaz1ofHxtO2g9ITA7dSYmKGg9ITEpO2lmKGsmJmsuWilpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suS2EoYSxoKTtoPWsuS2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5HYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxWZjpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sQXI6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuVmYoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuZ2MpZm9yKHZhciBjIGluIHRoaXMuZ2MpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5nY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueWIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sV2Y6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLGYudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkFyKGYuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LHR0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdjPWF9LHd2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5MYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxQbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE9xOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUD1jLkxpfHxQO25ldyBQO3ZhciBlPW5ldyBQO3dpbmRvdy5Odj1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLktpPWI7Yi5JYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuSnM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuUHI9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmd2PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IucnA9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5udj17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1tPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLkdtPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5KbT17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5PbT17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuRm09e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLkhtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuUXU9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk9yPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnNwPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5tdj17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xbz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnZvPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuQ2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5CYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuTG09e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkttPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5RZT17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuUGU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuUG09e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5JbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTnU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Tcj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBsPWMuS2l8fGw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGo9dGhpcy5hWzEwXTt0aGlzLmpwPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzRdfWMuQ289YjtiLnByb3RvdHlwZT0Ke09qOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Qajp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuanA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgaWE9Yy5Db3x8aWEsSmM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMuT2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5NaT1iO2IucHJvdG90eXBlPXtKZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sZWI6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KSsKbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxVcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxKYzpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMuSmMoYSsKNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuSmMoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxaYjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkpkKHRoaXMuZWIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5KYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sSnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aYigpKyIyIn0sS2Y6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KZCh0aGlzLlVwKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuSmMoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBRPQpjLk1pfHxRO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdoPXRoaXMuYVs2XTt0aGlzLkdxPXRoaXMuYVsxMF07dGhpcy50bj10aGlzLmFbM107dGhpcy5jaT10aGlzLmFbOF07dGhpcy5Vbj10aGlzLmFbNF07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLldqPWI7Yi5wcm90b3R5cGU9e2ZoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5naDp0aGlzLkZxKGEpfSxGcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdxOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50bjp0aGlzLmJpKGEpfSxiaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNpOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vbjp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sCmY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGphPWMuV2p8fGphLEtjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLmZoKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmo7dGhpcy5qPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWc7cmV0dXJuIGZ9fShjLApnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmM/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5DZT1ifSkoYyk7dmFyIEo9Yy5DZXx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5HdT10aGlzLmFbOV07dGhpcy50cj10aGlzLmFbMl07dGhpcy5yaz10aGlzLmFbMTBdO3RoaXMucnM9dGhpcy5hWzldO3RoaXMuamo9dGhpcy5hWzFdO3RoaXMuams9dGhpcy5hWzRdO3RoaXMuS2g9dGhpcy5hWzNdO3RoaXMucG89dGhpcy5hWzRdO3RoaXMuemw9dGhpcy5hWzldO3RoaXMuSHQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuUm89YjtiLnByb3RvdHlwZT17RnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5HdTp0aGlzLnNyKGEpfSxzcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHI6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLnFzKGEpfSxxczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnM6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qajp0aGlzLmlrKGEpfSxpazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuams6dGhpcy5KaChhKX0sSmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5LaDp0aGlzLm9vKGEpfSxvbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucG86dGhpcy55bChhKX0seWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpsOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5IdDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIGthPWMuUm98fGthLExjPW5ldyBrYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1MYy5GdSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLllrPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9e307dGhpcy5BPW51bGw7dGhpcy5kYz0xMDA7dGhpcy5sYj0wO3RoaXMud2E9MTUwO3RoaXMucmI9MDt0aGlzLm90KGIpfSxiOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YT8odGhpcy5sYisrLHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpOjA+dGhpcy53YSYmKHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpfSxodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiPnRoaXMud2E/ITA6ITF9LG1nOmZ1bmN0aW9uKCl7dGhpcy5sYj0wfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sCm90OmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxUcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEo6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmViKCldPWI7SyYmSy5UZiYmSy5LdChiKX0sVnY6ZnVuY3Rpb24oKXtyZXR1cm4gZS5FYSh0aGlzLnhhKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy54YSlpZihhPT10aGlzLnhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLnhhW2IuZWIoKV0/ITA6ITF9LFBxOmZ1bmN0aW9uKGIpe2I9Yi5EYSgpO2Zvcih2YXIgYSBpbiB0aGlzLnhhKWlmKGIuaWQ9PXRoaXMueGFbYV0uRGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXc6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5Za3x8cjsoZnVuY3Rpb24oYyl7Yy4kaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLmRjPTEwO3RoaXMubGI9CjA7dGhpcy53YT01MDt0aGlzLks9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLmhmPSExO3RoaXMuTigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuRGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30sZWE6ZnVuY3Rpb24oKXt9LHh0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxXdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LHJ0OmZ1bmN0aW9uKGIpe3RoaXMuV2Q9Yn0sVXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XZH0sVmQ6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLmxiPD10aGlzLndhJiYodGhpcy5sYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLAp0aGlzLmRjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSx0ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxlYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LGt3OmZ1bmN0aW9uKCl7fSxTOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLm9xKCl8fHRoaXMuUm0oKTt0aGlzLm5lKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sUm06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUucGEoMTApKX0sb3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxQOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LERhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFJjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxqYjpmdW5jdGlvbigpe3JldHVybiExfSxjdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxkYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LERiOmZ1bmN0aW9uKCl7dmFyIGI9aztyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFBkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHJnOmZ1bmN0aW9uKGIpe3RoaXMuZ2I9CmJ9LFR2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LGd0OmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxadjpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2ImJihiPSEwKTtyZXR1cm4gYn0sZXc6ZnVuY3Rpb24oKXt0aGlzLmhmfHwodGhpcy5oZj0hMCl9LEtjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFF2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLllnPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuTGU9IjEiO3RoaXMuTWU9IjIiO3RoaXMuem09IjMiO3RoaXMubGM9MDt0aGlzLlpmPTMwO3RoaXMudmI9W107dGhpcy5QYT1bXTt0aGlzLkxiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsCnVua25vd246Nn07dGhpcy5TZT10aGlzLk1nPSExO3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pZD1lLnBhKDEwKTt0aGlzLmJkKGIpO3RoaXMucHQoYSl9LGI6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5NZ3x8KHRoaXMuTWc9ITAsZS5TZCgpKX0sWmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkwoKTtSJiZSLiRiJiYhbGEmJihsYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSx3OmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMudXQoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLkVnKCksdGhpcy5TZT0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaGEoKXx8KHRoaXMudmIucHVzaChiKSx0aGlzLlBhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxFZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIiwKYT1bXTt0aGlzLnZiJiYwPHRoaXMudmIubGVuZ3RoJiYodGhpcy52Yj1lLnVuaXF1ZSh0aGlzLnZiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy52Yi5qb2luKCIsIikpKTtpZih0aGlzLlBhKXtmb3IodmFyIGc9MDtnPHRoaXMuUGEubGVuZ3RoO2crKyl0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXT09dGhpcy5MYltiXSYmYS5wdXNoKHRoaXMuUGFbZ10uZGV0YWlsKSx0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXTx0aGlzLkxiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5QYVtnXS5kZXRhaWwpLGI9dGhpcy5QYVtnXS5yZWFzb24pO3RoaXMuTGJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxZdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNlfSxtOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5MZX0sdXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy5NZX0sdnQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnptfSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGN9LE5lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxlfSxFdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMubGN9LGJkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0scHQ6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sRHI6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLllnfHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZyPXRoaXMuYVs2XTt0aGlzLkZsPXRoaXMuYVs5XTt0aGlzLlduPXRoaXMuYVszXTsKdGhpcy4kZz10aGlzLmFbM107dGhpcy5Rbz10aGlzLmFbNV07dGhpcy5ZbD10aGlzLmFbM107dGhpcy5Ucz10aGlzLmFbOV07dGhpcy5ocz10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs3XX1jLmh1PWI7Yi5wcm90b3R5cGU9e2VyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mcjp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRmw6dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlduOnRoaXMuWmcoYSl9LFpnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGc6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFvOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZbDp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVHM6dGhpcy5ncyhhKX0sZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmc6YX19fSkoYyk7dmFyIG1hPWMuaHV8fG1hLE1jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU1jLmVyKDQpOyhmdW5jdGlvbihjKXtjLlhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGVudEVsKCk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLksmJnRoaXMuSygpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkRlbW9WaWRlb0pTIn19KX0pKGMpO3ZhciBTPWMuWGh8fFM7KGZ1bmN0aW9uKGMpe2MuV2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKTt0aGlzLm1kPW51bGw7dGhpcy5WdT0xRTM7dGhpcy5mZz1udWxsO3RoaXMuZHU9MkUzfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZih3aW5kb3cuZGVtb1BsYXllciYmd2luZG93LlFuKWIub24oInBsYXkiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Iub24oImRpc2FibGUiLHRoaXMuenAuYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0Iix0aGlzLmtxLmJpbmQodGhpcykpO2Iub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuanEoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLll1KGIpfS5iaW5kKHRoaXMpKSwKYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IixmdW5jdGlvbigpe3RoaXMuWnUoYil9LmJpbmQodGhpcykpKTtiLm9uKCJhZGVuZCIsZnVuY3Rpb24oYSl7dGhpcy5pcShhLGIpfS5iaW5kKHRoaXMpKTtiLm9uKCJjb250ZW50cGxheWJhY2siLGZ1bmN0aW9uKGEpe3RoaXMudG8oYSl9LmJpbmQodGhpcykpfSx0bzpmdW5jdGlvbihiKXsiYWRzZXJyb3IiPT1iLnRyaWdnZXJldmVudCYmdGhpcy53KCl9LFl1OmZ1bmN0aW9uKGIpe3RoaXMubWR8fCh0aGlzLm1kPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kdShiKX0uYmluZCh0aGlzKSx0aGlzLlZ1KSl9LCR1OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLm1kKTt0aGlzLncoKX0sWnU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMubWQpfSxpcTpmdW5jdGlvbihiKXt0aGlzLkx2KGIpO3RoaXMuZmc9bmV3IERhdGU7dGhpcy5mZy10aGlzLkxzPHRoaXMuZHU/CnRoaXMudygpOnRoaXMubSgpfSxrcTpmdW5jdGlvbihiLGEpeyFhJiZiLnRhcmdldC5wbGF5ZXImJihhPWIudGFyZ2V0LnBsYXllcix0aGlzLmJkKG5ldyBTKGEpKSk7dGhpcy53KCl9LHpwOmZ1bmN0aW9uKCl7fSxqcTpmdW5jdGlvbigpe3RoaXMuTHM9bmV3IERhdGV9fSl9KShjKTt2YXIgbmE9Yy5XaHx8bmE7KGZ1bmN0aW9uKGMpe2MuWWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmRlbW9QbGF5ZXIpe2lmKHdpbmRvdy52aWRlb2pzJiZ2aWRlb2pzLnBsYXllcnMmJjA8ZS5FYSh2aWRlb2pzLnBsYXllcnMpKXt2YXIgYj12aWRlb2pzLnBsYXllcnMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPW5ldyBTKGJbYV0pO3RoaXMuSChnKXx8KHRoaXMuSihnKSwobmV3IG5hKGcsdGhpcy5BKSkuYigpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIG9hPWMuWWh8fG9hLHBhPW5ldyBvYShxKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHM9dGhpcy5hWzVdO3RoaXMuZnA9dGhpcy5hWzVdO3RoaXMuRnI9dGhpcy5hWzhdO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMua209dGhpcy5hWzddO3RoaXMudXE9dGhpcy5hWzRdO3RoaXMuZm49dGhpcy5hWzddO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLnhtPXRoaXMuYVsxMF07dGhpcy5maz10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVsyXX1jLlpuPWI7Yi5wcm90b3R5cGU9e0NzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Eczp0aGlzLmVwKGEpfSxlcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnA6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Gcjp0aGlzLnZrKGEpfSx2azpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMud2s6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMua206dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZm46dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnlrOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54bTp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZms6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBxYT1jLlpufHxxYSxOYz1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1OYy5Dcyg0KTsoZnVuY3Rpb24oYyl7Yy5naj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmFjPSExO3RoaXMubWYoKTsKdGhpcy5vZigpO3RoaXMudW89ITF9LG1mOmZ1bmN0aW9uKCl7dGhpcy5hYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYWM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuUChiKX0sb2Y6ZnVuY3Rpb24oKXtpZighdGhpcy5hYyl7dmFyIGI9dGhpcy5EYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYWM9ITApO3RoaXMuUyhhKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpKX0sVmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5kZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuZGQoYSl9LmJpbmQodGhpcykpfSwKZGQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLldkJiYoMCx0aGlzLldkKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6CiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sV2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciByYT1jLmdqfHxyYTsoZnVuY3Rpb24oYyl7Yy5maj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxOOmZ1bmN0aW9uKCl7fSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5uYz0hMTt0aGlzLnVkPTE7dGhpcy5wYz1bXTt0aGlzLmFiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9CnRoaXMubmM9ITE7dGhpcy51ZD0xO3RoaXMucGM9W107dGhpcy5hYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy51ZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuYWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmFiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmFiPSEwKSkpLAphLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuYWI9ITApKTp0aGlzLm0oIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ29tcGxldGUiKTt0aGlzLm5jPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuWmYmJiF0aGlzLmhhKCkmJih0aGlzLmFiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm8oKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubyghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5uYigpLHRoaXMuZ2V0UGxheWVyKCkudW89ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdiO2EmJihhLmFlKCksYS5CYSgpKX19LmJpbmQodGhpcyl9KTsKaWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRDb21wbGV0ZSIpO3RoaXMubmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMubSgib25BZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMubSgib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlpmJiYhdGhpcy5oYSgpJiYodGhpcy5hYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLnBjLmluZGV4T2YoYSkmJnRoaXMucGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5tKCksdGhpcy5uYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMubSgiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLm0oImVtcHR5Iik6KHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLnBjLmxlbmd0aD49dGhpcy51ZCYmdGhpcy5vKCkpfSxEcjpmdW5jdGlvbihiKXt0aGlzLmooIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCk7ZS5KdChhLnZpZGVvVGFnKT9hLmFjP3RoaXMubSgicGxheWVyIGlzIGludmFsZCIpOnRoaXMubmN8fHRoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSw1MCk6KGEubWYoKSxhLm9mKCkpfX0pfSkoYyk7dmFyIHNhPWMuZmp8fHNhOyhmdW5jdGlvbihjKXtjLmhqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuUHAoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT0KYi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0pLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5QcShnKXx8KHRoaXMuSihnKSwKZz1uZXcgc2EoZyx0aGlzLkEpLGcuTigpLGcuYigpKX1lbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0sU3Y6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sUHA6ZnVuY3Rpb24oKXt2YXIgYj1lLk1hKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnliKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmhqfHx0YSx1YT1uZXcgdGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHM9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOV19Yy55aT1iO2IucHJvdG90eXBlPXtjczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZHM6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB2YT1jLnlpfHx2YSxPYz1uZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9T2MuY3MoNCk7KGZ1bmN0aW9uKGMpe2MucG09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb19pZCk7dGhpcy5QKGIpO3ZhciBiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0sYT10aGlzLmdldFJhd1BsYXllcigpO2ImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlMoYik6dGhpcy5JKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSwKTDpmdW5jdGlvbigpe3JldHVybiJYT1pDT00ifX0pfSkoYyk7dmFyIHdhPWMucG18fHdhOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IudHJhY2tlci52YXN0X3ByZXJvbGx8fGIudHJhY2tlci52YXN0X3Bvc3Ryb2xsP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LG86ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHhhPWMub218fHhhOyhmdW5jdGlvbihjKXtjLnFtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmCndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyYmMDxlLkVhKHdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcykpe3ZhciBiPXdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YlthXTtpZihnLmNvbnRyb2xzJiZnLmNvbnRyb2xzLnBsYXllcilnPW5ldyB3YShnKSx0aGlzLkgoZyl8fCh0aGlzLkooZyksKG5ldyB4YShnLHRoaXMuQSkpLmIoKSk7ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19KX0pKGMpO3ZhciB5YT1jLnFtfHx5YSx6YT1uZXcgeWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMTBdfWMuYWo9YjtiLnByb3RvdHlwZT17a3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmxwOgp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEFhPWMuYWp8fEFhLFBjPW5ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLmtwKDQpOyhmdW5jdGlvbihjKXtjLmVtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlAoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUyhiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sTDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oYil7dGhpcy5xYihiKX0uYmluZCh0aGlzKSl9LHFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLksmJnRoaXMuSygpfSxSYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0sCmlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciBCYT1jLmVtfHxCYTsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5LZz0hMDt0aGlzLnlkPXRoaXMuSGY9ITE7dGhpcy5hZygpO3RoaXMuZW8oKTt0aGlzLkhhKCl9LGZ3OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKY29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuZWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuYmEsIjsiLHR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLnFkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnJkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi54ZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnhkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMua2cpfSxmYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmCih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LExjOmZ1bmN0aW9uKCl7aWYoIXRoaXMubWEpe3ZhciBiPXRoaXMuZmIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSx3ZjpmdW5jdGlvbigpe2lmKCF0aGlzLlliKXt2YXIgYj10aGlzLmZiKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWWI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlliPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWWJ9LApOcTpmdW5jdGlvbigpe2lmKCF0aGlzLkdmKXt2YXIgYj10aGlzLmZiKCksYT10aGlzLkxxKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5HZj0hMCl9cmV0dXJuIHRoaXMuR2Z9LExxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy50YyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMudGM9ITApO3JldHVybiB0aGlzLnRjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTGMoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksCmIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxrZTpmdW5jdGlvbigpe3RoaXMueWQ9ITA7dmFyIGI9dGhpcy53ZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmCmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLk5ifHwodGhpcy5sKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5YKCksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sUnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmJmJiZiLmFkcyYmKHRoaXMuYmY9Yi5hZHMpO3JldHVybiB0aGlzLmJmfSxlbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlgoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7CmIub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5aZCgpfS5iaW5kKHRoaXMpKX0sZWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLndmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZigpfS5iaW5kKHRoaXMpLDUwKX0sYWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTnEoKSl7dmFyIGE9dGhpcy5mYigpLGc9dGhpcy5MYygpO2EmJmcmJih0aGlzLmZiKCksdGhpcy5MYygpLAp0aGlzLnlkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWQ/dGhpcy5tKCk6KHRoaXMuWCghMCksdGhpcy5sKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuZmIoKX1lbHNlIHRoaXMuSGY/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmZiKCksYj10aGlzLkxjKCk7YSYmIWI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5YKCkpOih0aGlzLlgoITApLHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLkhmPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWcoKX0uYmluZCh0aGlzKSw1MCl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9CiEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5VPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMucWEoKTticmVha319LGZvOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLlFiIT1iLmFkcy5zdGF0ZSYmKHRoaXMuUWI9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuUWIpe3RoaXMubSgiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5RYj0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZm8oKX0uYmluZCh0aGlzKSwxMCl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMDt0aGlzLm0oImVtcHR5IHZhc3QiKX0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLmhhKCl8fChifHwKKHRoaXMuS2c9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuS2csZnVuY3Rpb24oKXt0aGlzLmVmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxvOmZ1bmN0aW9uKCl7dGhpcy5hd3x8KDEwPHRoaXMuV3U/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLld1KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuZnQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubG8oKX0uYmluZCh0aGlzKSw1MCkpKX0sZnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuWHUpe3RoaXMuWHU9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5YLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiKwphLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBDYT1jLmRtfHxDYTsoZnVuY3Rpb24oYyl7Yy5mbT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy54Zyh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMueGcoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5FYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBCYShiW2ddKSxhLmphfHx0aGlzLkgoYSl8fAohMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkooYSksKG5ldyBDYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy5yYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmRjKX19KX0pKGMpO3ZhciBEYT1jLmZtfHxEYSxFYT1uZXcgRGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenM9dGhpcy5hWzJdO3RoaXMuc3U9dGhpcy5hWzhdO3RoaXMuSmo9dGhpcy5hWzJdO3RoaXMuJGk9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5Scz1iO2IucHJvdG90eXBlPXt5czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenM6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnN1OnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KajoKdGhpcy5aaShhKX0sWmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgRmE9Yy5Sc3x8RmEsUWM9bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMueXMoNCk7KGZ1bmN0aW9uKGMpe2MuUmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5QKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlMoYSl9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7CmEuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEdhPWMuUmx8fEdhOyhmdW5jdGlvbihjKXtjLlFsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkFiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmhjPSExO3RoaXMubGcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubSgpOwplbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuaGM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy54YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlllKCk6dGhpcy5tKCl9LHhjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5tKCk7ZWxzZXtpZigxMDA5PT0KZ3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5oYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuaGM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy54Yy5iaW5kKHRoaXMpLDEwMCl9fSxZZTpmdW5jdGlvbigpe2lmKCF0aGlzLmhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09CmIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQWImJih0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWWUuYmluZCh0aGlzKSwKNTApfX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5oYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubSgpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGE9Yy5RbHx8CkhhOyhmdW5jdGlvbihjKXtjLlNsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBHYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSGEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIElhPWMuU2x8fElhLEphPW5ldyBJYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DdT10aGlzLmFbNV07dGhpcy5Bbz10aGlzLmFbNl07dGhpcy5Nbz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLldxPWI7Yi5wcm90b3R5cGU9e0J1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5DdTp0aGlzLnpvKGEpfSwKem86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFvOnRoaXMuTG8oYSl9LExvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Nbzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEthPWMuV3F8fEthLFJjPW5ldyBLYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkJ1KDQpOyhmdW5jdGlvbihjKXtjLnhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMuJGY9YX0sTjpmdW5jdGlvbigpe30sVGQ6ZnVuY3Rpb24oYil7dGhpcy4kZj1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy4kZikucGFyZW50Tm9kZTt0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIExhPWMueGh8fExhOyhmdW5jdGlvbihjKXtjLndoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmooYixhKX0sVGQ6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBNYT1jLndofHxNYTsoZnVuY3Rpb24oYyl7Yy55aD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBMYShkLAphKSx0aGlzLkgoZCl8fChkLlRkKGEpLHRoaXMuSihkKSxkPW5ldyBNYShkLHRoaXMuQSxnKSxkLlRkKGcpLGQuYigpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE5hPWMueWh8fE5hLE9hPW5ldyBOYShmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzhdO3RoaXMuYmw9dGhpcy5hWzhdO3RoaXMuU3U9dGhpcy5hWzldO3RoaXMuSmw9dGhpcy5hWzJdO3RoaXMuQWs9dGhpcy5hWzddO3RoaXMuRXU9dGhpcy5hWzFdO3RoaXMuZG49dGhpcy5hWzFdO3RoaXMucXU9dGhpcy5hWzJdO3RoaXMuT289dGhpcy5hWzFdO3RoaXMueXY9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5Jcz1iO2IucHJvdG90eXBlPXtsbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWw6dGhpcy5hbChhKX0sYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ibDp0aGlzLlJ1KGEpfSxSdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU3U6dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpsOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkV1OnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kbjp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucXU6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9vOnRoaXMueHYoYSl9LHh2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueXY6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBQYT1jLklzfHxQYSxTYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MubGwoNCk7KGZ1bmN0aW9uKGMpe2MuVWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nYW1lQ29udGFpbmVyWzBdO3RoaXMuUChiKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMudmlkZW9UYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpLGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxYYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmCihiPSEwKTtyZXR1cm4gYn0sTDpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgUWE9Yy5Vanx8UWE7KGZ1bmN0aW9uKGMpe2MuVGo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuWGEoKT8oJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0YXAiLGZ1bmN0aW9uKCl7dGhpcy5vYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSkpOnRoaXMub2MoKX0sb2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/CnRoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpO3ZhciBSYT1jLlRqfHxSYTsoZnVuY3Rpb24oYyl7Yy5Waj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuTklDSyYmTklDSy5HYW1lTG9hZGVyJiZOSUNLLkdhbWVMb2FkZXIuZ2FtZUNvbnRhaW5lcil7dmFyIGI9bmV3IFFhKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgUmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFNhPWMuVmp8fFNhLFRhPW5ldyBTYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbj10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzEwXTt0aGlzLk1oPXRoaXMuYVs4XTsKdGhpcy5ycj10aGlzLmFbNF07dGhpcy5hbz10aGlzLmFbOF07dGhpcy5BdD10aGlzLmFbN107dGhpcy5Ccz10aGlzLmFbNF07dGhpcy5RaD10aGlzLmFbOV07dGhpcy5qcj10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLnBzPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYms6dGhpcy5MaChhKX0sTGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1oOnRoaXMucXIoYSl9LHFyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucnI6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFvOnRoaXMuenQoYSl9LHp0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5BdDp0aGlzLkFzKGEpfSxBczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQnM6dGhpcy5QaChhKX0sUGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlFoOgp0aGlzLmlyKGEpfSxpcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuanI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBVYT1jLnBzfHxVYSxUYz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5Mbig0KTsoZnVuY3Rpb24oYyl7Yy5Oaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLlAoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlMoYik6dGhpcy5kYSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5lYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS4kYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5hZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuYmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuYmUrKztpZigxMDx0aGlzLmJlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfX0pfSkoYyk7dmFyIFZhPWMuTmt8fFZhOyhmdW5jdGlvbihjKXtjLk1rPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuR2QpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuR2Q9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnhwPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLnhwPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuTXMoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFdhPWMuTWt8fFdhOyhmdW5jdGlvbihjKXtjLk9rPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVmEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBXYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWGE9Yy5Pa3x8WGEsWWE9bmV3IFhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF1PXRoaXMuYVsxXTt0aGlzLldnPXRoaXMuYVs3XTt0aGlzLnlqPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMucGo9YjtiLnByb3RvdHlwZT17enU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkF1OnRoaXMuVmcoYSl9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV2c6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnlqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIFphPWMucGp8fFphLFVjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1VYy56dSg0KTsoZnVuY3Rpb24oYyl7Yy5GaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUChiLmVsZW1lbnQpO3RoaXMuUyhiLmVsZW1lbnQpfSxEYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZmluaXNoKCl9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSGl0Ym94In19KX0pKGMpO3ZhciAkYT1jLkZpfHwkYTsoZnVuY3Rpb24oYyl7Yy5FaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudygpfX0pfSkoYyk7dmFyIGFiPWMuRWl8fGFiOyhmdW5jdGlvbihjKXtjLkdpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoaXRib3guYWRibG9ja2VyIixmdW5jdGlvbihiKXtiPW5ldyAkYShiLmRldGFpbCk7Yi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgYWIoYix0aGlzLkEpKS5iKCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBiYj1jLkdpfHxiYixjYj1uZXcgYmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnpuPXRoaXMuYVs1XTt0aGlzLlZvPXRoaXMuYVszXTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLlNpPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzRdfWMucnE9YjtiLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpuOnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wbzp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhyOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBkYj1jLnJxfHxkYixWYz1uZXcgZGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1WYy55big0KTsoZnVuY3Rpb24oYyl7Yy5jaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUudWYoYiwiZWxlbWVudElEIik7dGhpcy5oZz1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlAoZyk7dGhpcy5TKGcpO3RoaXMuR2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5HYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuR2MpfSxXYTpmdW5jdGlvbigpe3JldHVybiEwfSxrbzpmdW5jdGlvbigpe2UuTWYodGhpcy5HYyk7ZS5OZih0aGlzLkdjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua28oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sUGQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBlYj1jLmNqfHxlYjsoZnVuY3Rpb24oYyl7Yy5iaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudyghMCl9fSl9KShjKTt2YXIgZmI9Yy5ianx8ZmI7KGZ1bmN0aW9uKGMpe2MuZGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy53YT0xNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsuaW5yZWFkKXt2YXIgYj1rLmlucmVhZCxhPWUudWYoYiwiZWxlbWVudElEIik7CmUuTWYoYSkmJihiPW5ldyBlYihiKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBmYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGdiPWMuZGp8fGdiLGhiPW5ldyBnYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55dT10aGlzLmFbMV07dGhpcy5MdT10aGlzLmFbMl07dGhpcy54bj10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLkh1PWI7Yi5wcm90b3R5cGU9e3h1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dTp0aGlzLkt1KGEpfSxLdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHU6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYj1jLkh1fHxpYixXYz1uZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1XYy54dSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuTmk9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0scXQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxTbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLk5pfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmcsZCxjKXt0aGlzLklhPWE7dGhpcy5xZj10aGlzLlVnPSExO3RoaXMuYmc9ZDt0aGlzLnlnPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLklhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnRiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLk5kKHRoaXMuSWEudXJsKSYmbS5oZCl7dmFyIGg9bmV3IHooYS51cmwpO2gucXQoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYKKGI9ITApO2J8fG0uZ2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXttLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5PaT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5xZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMueWc/dGhpcy50Yi5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCExKTp0aGlzLnRiLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITApLHRoaXMuVWd8fCh0aGlzLnRiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksInVuZGVmaW5lZCIhPXR5cGVvZiBrJiZrJiZrLnZwYWlkJiZtJiZtLlNjKHRoaXMuSWEudXJsKSx0aGlzLnRiLnNlbmQoYSl9Y2F0Y2goYyl7bSYmbS5OZCh0aGlzLklhLnVybCk/bS5oZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLk5kKHRoaXMuSWEudXJsKSx0aGlzLmJnJiZ0aGlzLmJnKCl9cmV0dXJuIHRoaXMudGJ9fX0pKGMpO3ZhciBqYj1jLk9pfHxqYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnpkPXRoaXMuYmI9bnVsbDt0aGlzLkhvPXRoaXMub2I9dGhpcy5VZj0hMTt0aGlzLnVhPSIiO3RoaXMuUGY9ITE7dGhpcy5BYT10aGlzLk9jPSIiO3RoaXMuTGY9dGhpcy5aPXRoaXMuaXNFbmFibGVkPXRoaXMuaGU9ITE7dGhpcy5PYT1bXTt0aGlzLkVmPXRoaXMuRmI9IiI7dGhpcy5FZD0hMTt0aGlzLnRlPQowO3RoaXMuR2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5FZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMua2M9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRmU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMucGI9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMudWU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5LZD0hMTt0aGlzLm1vPXRoaXMuamQ9bnVsbDt0aGlzLnVnPXRoaXMuaWM9dGhpcy5MZz10aGlzLndlPXRoaXMuaGQ9dGhpcy5BZD10aGlzLm1jPSExO3RoaXMuUWE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuUGk9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsCmFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmJiLGFkdGFncmVnZXg6dGhpcy56ZCxqc3BvcHVwczp0aGlzLlVmLHNpZGVsb2Fkczp0aGlzLm9iLGRpc2FibGV0ZXN0czp0aGlzLkhvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuUGYsZ2xvYmFsQ29uZmlnOnRoaXMuT2MsY2xpZW50Q29uZmlnOnRoaXMuQWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5aLGlzQmxvY2tlZDp0aGlzLkxmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMuRWYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5FZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy50ZSxIT01BRF9WRVJJRklFRDp0aGlzLkdlLEhPTUFEX0JMT0NLRUQ6dGhpcy5FZSxIT01BRF9OT0JMT0NLRVI6dGhpcy51YixIT01BRF9BREJMT0NLRVI6dGhpcy5rYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRmUsdGVzdEhpZGU6dGhpcy5IYiwKdGVzdFRhZ3M6dGhpcy5wYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMudWUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5LZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1vLGFkQmxvY2tlckRldGVjdGVkOnRoaXMubWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLkFkLHVzZVN0cmljdENoZWNrczp0aGlzLmhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndlLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUWEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMucGcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuaWMsc2tpcEFsbG93ZWQ6dGhpcy51Z319LG1xOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJihhPSEwKTtyZXR1cm4gYX0sbGU6ZnVuY3Rpb24oYSl7dGhpcy5RYVthXT0KITB9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0scWU6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5QbihhKX0sS2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLAplPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5TYyhhKTtlPXRoaXMuTWEoYSk7Yz8odGhpcy5iYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5qZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLk9ifHx0aGlzLmJifHx0aGlzLnpkKSYmKGs9dGhpcy5LcihrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLlNwKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7KGM9Yy5leGVjKGEpKSYmKGNbMl18fGNbNV0pP2I9ITA6dGhpcy5iYygpJiYoYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChjPWMuZXhlYyhhKSkmJmNbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZDpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7YyYmKGNbMl18fGNbNV0pP2I9ITA6Yj10aGlzLlNjKGEpO3JldHVybiBifSwKU3A6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnVhJiYwPHRoaXMudWEubGVuZ3RoKXJldHVybiB0aGlzLnVhO2ZvcihjIGluIHRoaXMudWEpaWYoYj10aGlzLnVhW2NdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSnY7cmV0dXJuIm5vbmUifSxRYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMucGddfSxqZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUWMoKSxiPXRoaXMudGcoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGM9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitjW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpjLmxlbmd0aCldKX0sS3I6ZnVuY3Rpb24oYSl7dGhpcy5PYiYmKGErPXRoaXMuT2IpO2lmKHRoaXMuYmIpZm9yKHZhciBiIGluIHRoaXMuYmIpdGhpcy5iYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsCnRoaXMuYmJbYl0pKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsYyxmLGUsaCl7bT10aGlzO3RoaXMuUGY9ITA7dGhpcy5PYz1hO3RoaXMuQWE9Yjt0aGlzLmhlPWM7dGhpcy5qZD1mO3RoaXMuRWM9ZTt0aGlzLkViPWh8fHt9O3RoaXMuenIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQWEpdGhpcy54cigpO2Vsc2UgdHJ5e3RoaXMuQWE9YigpLHRoaXMuemMoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWWE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goYyl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LHpyOmZ1bmN0aW9uKCl7dGhpcy5HYShuZXcgeih0aGlzLk9jK3RoaXMucmMoImdsb2JhbCIpKSx0aGlzLmZxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx4cjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQWErdGhpcy5yYygiY2xpZW50IikpO3RoaXMuR2EobmV3IHoodGhpcy5BYSt0aGlzLnJjKCJjbGllbnQiKSksdGhpcy56Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5sZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scmM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMua2IoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkFkKXt0aGlzLkFkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLkVjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRWM/dGhpcy5FYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5aPXRoaXMuTGY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMuRWUpKTt0aGlzLnNiKCk7ZS5UYihsLkpzKTsoYj1lLkFmKHRoaXMuUWMoKSkpfHwoYj1lLkFmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxmcTpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5aPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuQWF8fHRoaXMuRmJ8fHRoaXMudWF8fHRoaXMuemMoKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5aPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnViKSksdGhpcy5zYigpKX19LHpjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQWF9ZWxzZSBhPXRoaXMuQWE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5PYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuRWY9YS5hZHBhdGh8fCIiO3RoaXMuRWQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5wZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5PYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkZiJiZ0aGlzLnVhJiZ0aGlzLk9hLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKSwKdGhpcy5zYigpKX0sVWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5qZSgpKSxjPXRoaXMuTWEodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMucmMoImN1c3RvbWVyIikpO3RoaXMuR2EoYix0aGlzLk10LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJjdXN0b21lciIpO2E/dGhpcy54bD90aGlzLmdhKCJub1NWTUNvbmZpZyIpOih0aGlzLnhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5VYyghMCl9LmJpbmQodGhpcyksITApfX0sTXQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5oZD10aGlzLkpiKGIuc3RyaWN0KTt0aGlzLndlPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuTGc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnBiPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuYmI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuemQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVWY9Yi5qc3BvcHVwc3x8ITE7dGhpcy5vYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5pYz1iLnZwYWlkfHwhMTt0aGlzLkViLnZwYWlkPXRoaXMuaWM7dGhpcy51Zz0KYi5za2lwYWxsb3dlZHx8ITE7dGhpcy5HYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLiRwKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5FZCYmKHRoaXMuR2I9bnVsbCk7dGhpcy51ZT1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLktkJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5LZD0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmN1KCkmJih0aGlzLkhifHx0aGlzLklifHx0aGlzLnBifHx0aGlzLkdiKT90aGlzLmhlPyh0aGlzLm9hPXRoaXMuWj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy51YikpLHRoaXMuQmQoKSx0aGlzLnNiKCkpOnRoaXMuUHQoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5RdCgpKX19LFB0OmZ1bmN0aW9uKCl7dGhpcy5PdCgpfSxRdDpmdW5jdGlvbigpe3RoaXMuWj0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCl9LGdkOmZ1bmN0aW9uKGEpe3RoaXMubWM9ITA7dGhpcy5afHwodGhpcy5aPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKGEpKSx0aGlzLnNiKCksdGhpcy5CZCgpKX0sT3Q6ZnVuY3Rpb24oKXtpZih0aGlzLkhiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkhiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9Y31jYXRjaChmKXt9YT90aGlzLmdkKHRoaXMua2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLkJnKCl9ZWxzZSB0aGlzLkJnKCl9LEFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLmtiKCkpO3RoaXMuVHQoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnJlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5nZCh0aGlzLmtjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5wYj1udWxsLHRoaXMucmUoKX0sVHQ6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0aGlzLkdhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxCZzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigpKTt0aGlzLlV0KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5BZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuZ2QodGhpcy5rYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5JYiYmdGhpcy5JYi5sZW5ndGgpe3ZhciBjPXRoaXMuSWIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5BZygpfSxVdDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LHJlOmZ1bmN0aW9uKCl7dGhpcy5HYj8odGhpcy50ZSsrLHRoaXMuR2EobmV3IHoodGhpcy5HYiksdGhpcy5OdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLnpnKCl9LHNlOmZ1bmN0aW9uKGEpe3RoaXMuZ2QodGhpcy5GZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LE50OmZ1bmN0aW9uKGEpe2E9CmEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy50ZT90aGlzLnJlKCk6dGhpcy5zZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuemcoKTp0aGlzLnNlKCJBQUEiKX0semc6ZnVuY3Rpb24oKXt0aGlzLlo9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCk7dGhpcy5CZCgpfSxzYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5YYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLm1jJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy5HZSkpO3RoaXMuamQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5qZCYmdGhpcy5qZCgpfSxqbzpmdW5jdGlvbigpe2lmKHRoaXMud2UmJnRoaXMubXEoKSl7dmFyIGE9CnRoaXMuUXAoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LEVnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sR2E6ZnVuY3Rpb24oYSxiLGMsZixoLEljKXthPW5ldyBqYihhLGIsYyk7ZiYmKGEuVWc9ITApO2gmJmUuUXEoKSYmKGEucWY9ITApO0ljJiYoYS55Zz0hMCk7cmV0dXJuIGEubG9hZCgpfSxXZTpmdW5jdGlvbigpe2UuWGEoKXx8ZS5MYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fAooYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuZ2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLmJjKCl8fChhPXRoaXMuTWEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7CmguYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0saW86ZnVuY3Rpb24oKXt0aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkdhKGEsdGhpcy5QdS5iaW5kKHRoaXMpLAp0aGlzLk91LmJpbmQodGhpcykpfSxQdTpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMudHAoKX0sT3U6ZnVuY3Rpb24oKXt9LHRwOmZ1bmN0aW9uKCl7ZS5UYihsLnNwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxCZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm9iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMub2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5vYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9Cm5ldyBRO3dpbmRvd1tjLlpiKCldPXRoaXM7ZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxjdTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnVlfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sa2I6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT0KYXx8MT09YXx8IjEiPT1hfHwxPT1hfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsaz0oZiYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oZik/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpOwpyZXR1cm4gYn0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSx0ZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPQoiIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx3LHQseDtuPWEubGVuZ3RoO3ZhciB5PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHkucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PAoyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih5LnB1c2goZik7MTQhPXkubGVuZ3RoJTE2Oyl5LnB1c2goMCk7eS5wdXNoKG4+Pj4yOSk7eS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHkubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO249bDtwPW07dz1xO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfH5uJncpK3QraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj0yMDszOT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NDA7NTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8biZ3fHAmdykrdCtoW2ZdKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj02MDs3OT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cT1xK3cmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBrYj1jLlBpfHxrYixtPW5ldyBrYjt3aW5kb3cuT3Y9bTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaz10aGlzLmFbN107dGhpcy5Fbz10aGlzLmFbOV07dGhpcy52dj10aGlzLmFbNl07dGhpcy5WcT10aGlzLmFbM107dGhpcy5ZcT10aGlzLmFbOV07dGhpcy5taT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs0XX0KYy55bz1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZrOnRoaXMuRG8oYSl9LERvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbzp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnY6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlZxOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZcTp0aGlzLmxpKGEpfSxsaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubWk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBsYj1jLnlvfHxsYixYYz1uZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1YYy5Fayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmIsYyl7dGhpcy5pPWE7YS51Lkw/dGhpcy5OYT1hLnUuTCgpOnRoaXMuTmE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5pLlJhO3RoaXMucGxheWVyPXRoaXMuaS51O3RoaXMudWM9ITE7dGhpcy5Obj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmZkPXt9O3RoaXMuc2M9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5zYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmkudSkmJnRoaXMuaS51LkImJihhPXRoaXMuaS51LkIoKSksdGhpcy5zYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5YbT1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmVkPSExO3RoaXMuWGY9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOgoxNTt0aGlzLnM9e307dGhpcy5xYz0hMTt0aGlzLkhnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuJGI9ITE7dGhpcy53bz1lLnBhKDEwKTt0aGlzLlhjPWUucGEoMTApO3RoaXMuWGQ9ZS5wYSgxMCk7dGhpcy52Zz1lLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkJiPSExO3RoaXMuRmQ9bnVsbDt0aGlzLkNkPXRoaXMuRGM9dGhpcy53Zz10aGlzLmRnPXRoaXMuSGM9dGhpcy5ldT10aGlzLiRhPSExfWMuSmk9YjtiLnByb3RvdHlwZT17cWc6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5OYV0mJnRoaXMuY29uZlt0aGlzLk5hXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTmFdW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuVC5tYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6CmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGwuS20sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKX0sUmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJGE9YztpZih0aGlzLlQuWil0aGlzLlQuam8oKSx0aGlzLlQub2EmJnRoaXMuVC5pc0VuYWJsZWQ/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ULmljfSkpOmI/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuVC5pYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuQmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YuUmQoYSxiLGMpfSw1MCl9fSxjZTpmdW5jdGlvbihhKXt0aGlzLkhjPSExO3RoaXMucz1hO3RoaXMueXQodGhpcy5zKTsKdGhpcy5CZihhKX0sQmY6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuZmQ9dGhpcy5icShhKSksdGhpcy5CZihhLnBhcmVudCkpfSxicTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWSl7Yj1hLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlkuZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5ZLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYKKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVGEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLkZjJiZhLkZjLmVycm9yJiZhLkZjLmVycm9yLmNvZGUmJihiPWEuRmMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2UgeC5qYy5jb2RlOmI9PUMub2QuY29kZT9lLkQobC5ndix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpOihlLlNkKCksYj09Qy5KZS5jb2RlJiZlLkQobC5Pcix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKTtlLkQobC5ycCx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjsKYnJlYWs7Y2FzZSB4LkhlLmNvZGU6ZS5EKGwuUXUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB4LktlLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS5EKGwubXYsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2UgeC5wZC5jb2RlOmUuRChsLm52LHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2UgeC5uZC5jb2RlOmUuRChsLlByLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PQpjJiZhLmVycm9yJiZhLmVycm9yLmthJiYoYys9Il8iK2EuZXJyb3Iua2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy56YihhKTt0aGlzLkJhKCl9LHpiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS56YS5sZW5ndGg7KXRyeXt2YXIgYz1hLnphLnBvcCgpO3RoaXMuUWQoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHl0OmZ1bmN0aW9uKGEpe3RoaXMuQ2Q9ITE7dGhpcy5yYT10aGlzLmkuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuaS5DO2IuZ3c9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLlhtJiZ0aGlzLnBsYXllci5LYygpJiYKKGIudm9sdW1lPXRoaXMucGxheWVyLktjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuVG0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLkRnKGIpPyh0aGlzLlZtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5ybygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLnd0KCkpOnRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0sd3Q6ZnVuY3Rpb24oKXtlLiRlKCk7dGhpcy5zJiZ0aGlzLnMub3JpZ2luJiZ0aGlzLnMub3JpZ2luLkJlJiZlLldtKHRoaXMucy5vcmlnaW4uQmUpO2UuWmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmkuQzt0aGlzLmkuQz1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5pLkMsYSk7dGhpcy5pLmVnKCk7dGhpcy5pLmZjKCk7Zm9yKGE9dGhpcy5pLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuaS5mYygpO3RoaXMuVz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlcuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTsKdGhpcy5XLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5XLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmkuRy5hcHBlbmRDaGlsZCh0aGlzLlcpO3RoaXMuVy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnMuZXEoKSxiPXRoaXMucy5PLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sCmNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuaS5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5pLkcuc3R5bGUuaGVpZ2h0KX19fTtlLnlhKHRoaXMuVywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsCiJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuWG4oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlQpO3RoaXMuVy5zcmM9YTtlLndkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5CYSgpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuYXYoKSx0aGlzLmkuV2IoITApKSwKIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5pLldiKCEwKSx0aGlzLmJ2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuaS5XYighMCksdGhpcy5ldigpKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ2KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR2KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KCkpfS5iaW5kKHRoaXMpKTtlLndkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcykpO2Uud2QoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmkuUW0oZnVuY3Rpb24oYSl7ZS55YSh0aGlzLlcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSwKYnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0sYXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5aYSgiaW1wcmVzc2lvbiIpfSxldjpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS5aYSgic3RhcnQiKX0sUmc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5aYSgiZmlyc3RRdWFydGlsZSIpfSxmdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlphKCJ0aGlyZFF1YXJ0aWxlIil9LGR2OmZ1bmN0aW9uKCl7dGhpcy5rZCgpO2UuWmEoImNvbXBsZXRlIil9LGN2OmZ1bmN0aW9uKCl7ZS5aYSgiYWRzdG9wcGVkIik7dGhpcy5hZigpfSxUbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlQ7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmJjKCk/KGY9ZS5NYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KToKYj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5VdS5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LERnOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sVm06ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuUWcuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55ZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxhZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5RZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwKdGhpcy55ZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxRZzpmdW5jdGlvbihhKXt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZShhKX0uYmluZCh0aGlzKSx0aGlzLk5uKX0seWU6ZnVuY3Rpb24oYSl7dHJ5e2lmKCFlLlhhKCkmJnRoaXMuVC5MZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQmJ8fCh0aGlzLkJiPSEwLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMudWN8fCF0aGlzLkRnKHRoaXMudmlkZW8pfHwKdGhpcy5CYnx8KHRoaXMudWM9ITAsdGhpcy5UdSgpLHRoaXMudmlkZW8uY29udHJvbHM9ITEsdGhpcy5pLmZjKCksdGhpcy5OZygpLHRoaXMuT2coKSx0aGlzLlVlKCksdGhpcy5pLmVnKCksdGhpcy52aWRlby5wbGF5JiZ0aGlzLnBlKCkpfSxwZTpmdW5jdGlvbigpe2lmKCF0aGlzLkRjKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuRmEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuUGM9W107Zm9yKHZhciBiPXRoaXMuaS5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLlBjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIiwKYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMudGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMudGQoKX1lbHNlIHRoaXMudGQoKX0sdGQ6ZnVuY3Rpb24oKXtpZih0aGlzLlBjKWZvcih2YXIgYT0KMDthPHRoaXMuUGMubGVuZ3RoO2ErKyl0aGlzLlBjW2FdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYT10aGlzLnZpZGVvLnBsYXkoKSkmJmFbImNhdGNoIl0pYVsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuRGN8fCh0aGlzLkJhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLCIiLCEwKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5DYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkNiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkNiLmJpbmQodGhpcykpKTpIPWZ1bmN0aW9uKCl7dGhpcy5xY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGUoKSl9LmJpbmQodGhpcyk7dGhpcy56ZigpLnJnKHRoaXMpfSxrZDpmdW5jdGlvbigpe3RoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UuRChsLkZtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5hZigpfSxhZjpmdW5jdGlvbigpe3RoaXMuQ2R8fCh0aGlzLkNkPSEwLHRoaXMucy54Yj8odGhpcy51Yz0hMSx0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuZWQ9ITEsdGhpcy5pLkpnKCksdGhpcy5zLm9yaWdpbi5ZZCgpKTp0aGlzLkJhKCkpfSxVdTpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5sZChhKSl9LGxkOmZ1bmN0aW9uKGEpe2EmJgphLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5NZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SYnx8dGhpcy5ULldlKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlQuV2UoKSk7dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0semU6ZnVuY3Rpb24oKXtpZih0aGlzLmV1KXRoaXMuQmEoKTtlbHNle3RoaXMuJGI9ITA7dGhpcy5pLnUuamImJiF0aGlzLndnJiZ0aGlzLmkudS5qYigpJiZlLkQobC5CYyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tdShhKTt2YXIgYj0iIjtpZih0aGlzLnMub2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMudmcpO2MmJihiPXRoaXMucy5vZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMuZWR8fCh0aGlzLmVkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChsLkxtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5zLnhiPyh0aGlzLnVjPSExLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5jYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuY2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5lZD0hMSx0aGlzLmkuSmcoKSx0aGlzLnMub3JpZ2luLllkKCkpOnRoaXMuQmEoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuc2MucmVwbGFjZSgiW3RpbWVdIixlLnJmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMucWM9ITA7dGhpcy52aWRlby5jb250cm9scz0KITF9fSxzZzpmdW5jdGlvbigpe3RoaXMuUmI9ITA7dGhpcy5yYT10aGlzLmkuRzt0aGlzLnJhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpOwphLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuWHAoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmkuQz1hO3ZhciBiPXRoaXMuaS5DLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmkuZmMoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy5yYS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMucmEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlBnLmJpbmQodGhpcyk7dGhpcy5jYS5hcHBlbmRDaGlsZChiKTt0aGlzLk5nKCk7dGhpcy5PZygpO3RoaXMuRmQ9c2V0SW50ZXJ2YWwodGhpcy5oby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFhwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5zLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLnMuTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5UO2gub2EmJmguaXNFbmFibGVkJiYhaC5iYygpJiYoZT1oLk1hKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sCmhvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLnMuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5GZCksdGhpcy5rZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnplKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLkZkKSx0aGlzLmxkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sR2c6ZnVuY3Rpb24oKXt0aGlzLmRnfHwodGhpcy5kZz0hMCx0aGlzLkhjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sbXU6ZnVuY3Rpb24oYSl7YT09dGhpcy5IZ3x8dGhpcy5CYnx8KDA9PWEmJih0aGlzLiRhJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLiRhKSx0aGlzLiRhPQohMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuR2coKX0uYmluZCh0aGlzKSksdGhpcy5SYiYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMuQmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlhhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQobC5IbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpLGUuRChsLk1tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksdGhpcy5SYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PQpNYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuSGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLkQobC5HbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGwuSm0sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSksYT09TWF0aC5mbG9vcigzKnRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChsLk9tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpLGUuRChsLlBtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksCnRoaXMuSGc9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuQmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH1mb3IodmFyIGM9dGhpcy5jcSh0aGlzLnMuemEsYSk7Yy5sZW5ndGg7KXRyeXt2YXIgZj1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmdGhpcy5mZC5pbXByZXNzaW9ucyYmZS5PcShmLnVybCx0aGlzLmZkLmltcHJlc3Npb25zKT90aGlzLlFkKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQobC5JbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkse2FkSWQ6dGhpcy5mZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUWQoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8Cih0aGlzLnMuemE9dGhpcy5Cbyh0aGlzLnMuemEsYSkpfX0sUWQ6ZnVuY3Rpb24oYSxiLGMsZil7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGE9dGhpcy5ULkthKGEpLGMmJmEuU20oYyksZnx8KGY9dGhpcy5qZiksdGhpcy5ULkdhKGEsZix0aGlzLmpmLCExLCEwKSl9LGNxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sQm86ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sVHU6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuUGcuYmluZCh0aGlzKX0sUGc6ZnVuY3Rpb24oKXtlLkQobC5xbyx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5IYyYmZS5YYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuTHAoKSwhMCk7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5zLnljfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMucy55Yyx0aGlzLlQub2E/Il90b3AiOiJfYmxhbmsiKX19LE5nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PQoiQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLnNjLnJlcGxhY2UoIlt0aW1lXSIsZS5yZigwKSk7dGhpcy5jYXB0aW9uPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYSl9fSxPZzpmdW5jdGlvbigpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlkPXRoaXMud287dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249CiJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsdGhpcy5jZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGIuc3R5bGVbImZsb2F0Il09ImxlZnQiLGIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yi5pZD10aGlzLlhjO2IuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmd1LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLAp0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09InJpZ2h0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5YZDtjLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZ1LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxmLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZi5zdHlsZS50b3A9Ii01MHB4IixmLnN0eWxlLnJpZ2h0PSIwcHgiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLnZnO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7Zi5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMub2UmJmEuYXBwZW5kQ2hpbGQoZik7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKdGhpcy5jZC5iaW5kKHRoaXMpKTt0aGlzLmNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3RoaXMuY29udHJvbHM9dGhpcy5jYS5hcHBlbmRDaGlsZChhKTt0aGlzLmkudS5XYSYmdGhpcy5pLnUuV2EoKSYmdGhpcy5McigpO3RoaXMuVmIoKX19LFZiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sY2Q6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sZ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlhjKTt0aGlzLmkuQy5wYXVzZWQ/KHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSk6KHRoaXMuaS5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sCnRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGwuUGUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YYyk7dGhpcy5pLkMucGF1c2VkfHwodGhpcy5pLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChsLlBlLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpfSxpdDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGMpO3RoaXMuaS5DLnBhdXNlZCYmKHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YZCk7dGhpcy5pLkMubXV0ZWQ/Cih0aGlzLmkuQy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApKToodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCkpfSxMcjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGQpO3RoaXMuaS5DLm11dGVkfHwodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxDYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkNiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5DYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQ2IpO3RoaXMuRGN8fHRoaXMucWN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnBlKCkpfSxCYTpmdW5jdGlvbigpe3RoaXMuRGM9ITA7dGhpcy4kYSYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy4kYSksdGhpcy4kYT0hMSk7aWYoKCJwcmVyb2xsIj09ZS5GYSYmdGhpcy5xY3x8InBvc3Ryb2xsIj09ZS5GYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5GYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKHZhciBiPXRoaXMuaS5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmkuZmMoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuRGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5EZCgpfWVsc2UgdGhpcy5EZCgpfSxEZDpmdW5jdGlvbigpe3RoaXMud2c9ITA7dGhpcy5pLkRmKCk7CnRoaXMuaS5qdCgpO3RoaXMuJGI9ITE7ZS5EKGwudm8sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTt0aGlzLnpmKCkuZ3QoKX0semY6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuaSYmdGhpcy5pLnUmJihhPXRoaXMuaS51KTtyZXR1cm4gYX0sTWQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmKGE9ITApfXJldHVybiBhfSxVZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihlLk5mKHRoaXMudmlkZW8sYSk/dGhpcy5pdCgpOnRoaXMuYWUoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWUoKX0uYmluZCh0aGlzKSwKMTAwKSl9LFI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLnMmJihhLmNsaWNrdGhyb3VnaD10aGlzLnMueWMsYS5kdXJhdGlvbj10aGlzLnMuZHVyYXRpb24sYS5hZFBvZD10aGlzLnMueGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSkpO3JldHVybiBhfSxqZjpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIE89Yy5KaXx8TztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ubz10aGlzLmFbNl07dGhpcy5taD10aGlzLmFbNF07dGhpcy5mcz10aGlzLmFbNF07dGhpcy4kaj10aGlzLmFbOF07dGhpcy5ZdD10aGlzLmFbMV07dGhpcy5vcj10aGlzLmFbOF07dGhpcy5vcz10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLldpPWI7Yi5wcm90b3R5cGU9e1NvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuVG86dGhpcy5saChhKX0sbGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1oOnRoaXMuZXMoYSl9LGVzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5mczp0aGlzLlpqKGEpfSxaajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiRqOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZdDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm9zOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWI9Yy5XaXx8bWIsWWM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuU28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPQpkfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuSmE9bnVsbDt0aGlzLmJhPVtdO3RoaXMuWT1udWxsO3RoaXMuTWI9ITE7dGhpcy5CZT0iIjt0aGlzLkFlPSExO2QmJmQuZW1wdHk/dGhpcy5DcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmZmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkthKG0ucWUodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PQp0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJihhPWUuY2YodGhpcy51cmwpLHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5xZShhKSkrIiZ0eXBlPWpzIixiPW0uS2EobS5xZSh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpLGIuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIik7bS5HYShiLHRoaXMuQnIuYmluZCh0aGlzKSx0aGlzLnlyLmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSwKYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkZhKXRyeXt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWYuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmCiJwcmVyb2xsIj09ZS5GYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuRmEpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8Ck51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxCcjpmdW5jdGlvbihhKXt0aGlzLllzKGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5WYygpOnRoaXMuZmEodGhpcy5DYSh4LmpjLHtlcnJvcjp0aGlzLkFlP0Mub2Q6Qy5JZX0pKX0sQ3I6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/CnRoaXMuVmMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5qYyx7ZXJyb3I6dGhpcy5BZT9DLm9kOkMuSWV9KSl9LHlyOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkNhKHguSGUse2RlcHRoOmF9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5ZPXRoaXMuYmEuc2hpZnQoKTt0aGlzLlRxKCk/dGhpcy5WdCgpPyhhKyssbmV3IGIodGhpcyx0aGlzLkNmKCksZyx7QWRTeXN0ZW06dGhpcy5KcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmZhKHRoaXMuQ2EoeC5LZSkpOihhPTAsdGhpcy5NdSgpJiZ0aGlzLmNlKHRoaXMueG8oKSkpfSxZZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5ZZCgpfSxNdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlN0KCk/dGhpcy5SdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5DYSh4LkRlKSk6dGhpcy5mYSh0aGlzLkNhKHguVmgpKSwhMSk6Cih0aGlzLmZhKHRoaXMuQ2EoeC5qYyxDLkplKSksITEpfSxjZTpmdW5jdGlvbihhKXthLnphPWEuemEuY29uY2F0KHRoaXMuVWQoKSk7YS54Yj1hLnhiP2EueGI6dGhpcy5NYjt0aGlzLnBhcmVudC5jZShhKX0seG86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbmI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMueGYoKTthLnljPXRoaXMuTXAoKTthLm9yaWdpbj10aGlzO2EuTz10aGlzLklwKCk7YS5vZT10aGlzLmFxKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLlkmJihiLnphPWIuZXJyb3IuY29kZSE9eC5EZS5jb2RlP2IuemEuY29uY2F0KHRoaXMuT3AoKSk6Yi56YS5jb25jYXQodGhpcy5WcCgpKSk7dGhpcy5iYS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC56YiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnpiJiZ0aGlzLnBhcmVudC56YihiKSxhPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZhJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx6YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC56YihhKX0sa2Y6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQ2EoYSxiKSl9LENhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG9iKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sVnQ6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxTdDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMueGYoKS5sZW5ndGh9LFJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5VYigpfSxDZzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuYmEuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxZczpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuQmU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLkFlPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxUcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuQ2YoKS5sZW5ndGh9LENmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGQodGhpcy5ZLCJWQVNUQWRUYWdVUkkiKX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZCh0aGlzLlksIkFkU3lzdGVtIil9LFVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVsiSW1wcmVzc2lvbiIsIlRyYWNraW5nIiwiQ2xpY2tUcmFja2luZyIsIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBnPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZykpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGcudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5UYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LApWcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0seGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSx2YzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksCk12OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLlRhKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxiPWcuY29uY2F0KGQpfWNhdGNoKGUpe31yZXR1cm4gYn0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIiwKZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMuTmMoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2UucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuVGEodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxhcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGc9ITE7dHJ5e2M9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxnPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkZ0KGcsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZCl7Yj0hMX1yZXR1cm4gYn0sCkhkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5UYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sSWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFRhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuTmMoYSk6IiJ9LE5jOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSWQoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLmFtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkluPXRoaXMuYVs2XTt0aGlzLldrPXRoaXMuYVszXTt0aGlzLkNqPXRoaXMuYVs1XTsKdGhpcy5Vaz10aGlzLmFbN107dGhpcy5paD10aGlzLmFbN107dGhpcy5Baj10aGlzLmFbNl07dGhpcy5rcz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLnVwPWI7Yi5wcm90b3R5cGU9e0huOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbjp0aGlzLlZrKGEpfSxWazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2s6dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNqOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaWg6dGhpcy56aihhKX0semo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Bajp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmtzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy51cHx8cGIsWmM9bmV3IHBiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLkhuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuemE9W107dGhpcy5NPVtdO3RoaXMueWM9IiI7dGhpcy5PPXRoaXMueGI9ITE7dGhpcy5vcmlnaW49bnVsbH1jLlhrPWI7Yi5wcm90b3R5cGU9e3JvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGVxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgbmI9Yy5Ya3x8bmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaGs9dGhpcy5hWzldO3RoaXMucG49dGhpcy5hWzZdO3RoaXMucWg9dGhpcy5hWzFdO3RoaXMuSXE9dGhpcy5hWzhdO3RoaXMuUWs9dGhpcy5hWzVdO3RoaXMudG09dGhpcy5hWzldO3RoaXMuc2g9dGhpcy5hWzRdO3RoaXMuYm49dGhpcy5hWzRdO3RoaXMuZz0KdGhpcy5hWzVdfWMubXA9YjtiLnByb3RvdHlwZT17Z2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhrOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbjp0aGlzLnBoKGEpfSxwaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucWg6dGhpcy5IcShhKX0sSHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklxOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Razp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5yaChhKX0scmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnNoOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHFiPWMubXB8fHFiLCRjPW5ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5nayg0KTt2YXIgeD17cGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsa2E6IlhNTF9QQVJTRV9FUlJPUiJ9LFZoOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixrYToiRFVSQVRJT05fRVJST1IifSxqYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsa2E6IkVNUFRZX1ZBU1QifSxLZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKa2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGthOiJMT0FEX0VSUk9SIn0sbmQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCkJ2Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGthOiJNRURJQUZJTEVfRVJST1IifSxEZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixrYToiRFVNTVlfQUQifX0sQz17SWU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixrYToiTk9fQURTIn0sSmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGthOiJOT19NRURJQUZJTEVTIn0sRHY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxvZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuR2g9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbNl19Yy5nbD1iO2IucHJvdG90eXBlPXtGaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR2g6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciByYj1jLmdsfHxyYixhZD1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1hZC5GaCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLkZjPWI7dGhpcy56YT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuc2k9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYj1jLnNpfHxvYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Oaj10aGlzLmFbOV07dGhpcy5icj10aGlzLmFbM107CnRoaXMubHU9dGhpcy5hWzFdO3RoaXMuUnI9dGhpcy5hWzddO3RoaXMuQ3E9dGhpcy5hWzRdO3RoaXMub2g9dGhpcy5hWzRdO3RoaXMuYWk9dGhpcy5hWzJdO3RoaXMucmo9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNl19Yy5Icj1iO2IucHJvdG90eXBlPXtNajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTmo6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJyOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdTp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUnI6dGhpcy5CcShhKX0sQnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNxOnRoaXMubmgoYSl9LG5oOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vaDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmFpOnRoaXMucWooYSl9LHFqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5yajoKdGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYj1jLkhyfHxzYixiZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1iZC5Naig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLnU9YTt0aGlzLlJhPWEudGYoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUucGEoMTApO3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlNhPXt9O3RoaXMuUmY9ITE7dGhpcy5YYj1bXX1jLlpoPQpiO2IucHJvdG90eXBlPXtacDpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGY9MCxiPTAsZT17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZj1iLmxlZnQsYj1iLnRvcCk7ZT17eDpmLHk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlpwKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5NcShhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PQp3aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sTHQ6ZnVuY3Rpb24oKXt0aGlzLlJmPSEwfSxKZzpmdW5jdGlvbigpe3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sZWc6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtlLkQobC5CYyx0aGlzLnUuQigpKX0sanQ6ZnVuY3Rpb24oKXt0aGlzLlJmfHwodGhpcy51LnBsYXkoKSwKZS5EKGwuQ2MsdGhpcy51LkIoKSkpfSxmYzpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy51LnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5SYS5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuUmEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5SYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlJhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuUmEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuUmEpO3RoaXMudS5EYiYmCnRoaXMudS5EYigpP3RoaXMudS50ZigpLmFwcGVuZENoaWxkKHRoaXMuRyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkcpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2IuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy51LmV4aXRGdWxsc2NyZWVuKCl9LE1xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxOcDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LApXYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLk5wKHRoaXMuUmEpO2lmKGIueCE9dGhpcy5TYS54fHxiLnkhPXRoaXMuU2EueXx8Yi5wb3NpdGlvbiE9dGhpcy5TYS5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5TYS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuU2EuaGVpZ2h0fHxhKXtpZigwPHRoaXMuU2Eud2lkdGgmJjA8dGhpcy5TYS5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkRmKCk7cmV0dXJufXRoaXMuU2E9Yjt0aGlzLnUuRGIoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD0KYi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5YYi5sZW5ndGg7YSsrKXRoaXMuWGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9d2luZG93LnNldFRpbWVvdXQodGhpcy5XYi5iaW5kKHRoaXMpLDEwKX0sUW06ZnVuY3Rpb24oYSl7dGhpcy5YYnx8KHRoaXMuWGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlhiLnB1c2goYSl9LERmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTtmb3IodmFyIE49Yy5aaHx8TixCPVtdLHRiPTA7MTAwPnRiO3RiKyspe3ZhciBMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TC5zdHlsZS5kaXNwbGF5PSJibG9jayI7TC5pZD1lLnBhKDEwKTtMLmNvbnRyb2xzPSEwO0IucHVzaChMKX12YXIgSD0KITEsYmE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5uaz10aGlzLmFbMV07dGhpcy5BaT10aGlzLmFbMl07dGhpcy5kcj10aGlzLmFbOF07dGhpcy5rdj10aGlzLmFbMTBdO3RoaXMua2w9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzJdO3RoaXMubHI9dGhpcy5hWzhdO3RoaXMuWm09dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5wcj1iO2IucHJvdG90eXBlPXttazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubms6dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuY3IoYSl9LApjcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZHI6dGhpcy5qdihhKX0sanY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmt2OnRoaXMuamwoYSl9LGpsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbDp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU2s6dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxyOnRoaXMuWW0oYSl9LFltOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmc6YX19fSkoYyk7dmFyIHViPWMucHJ8fHViLGNkPW5ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWNkLm1rKDQpOyhmdW5jdGlvbihjKXtjLkprPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5QKGEpO3RoaXMubmUoYik7dGhpcy5nZigpfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZ2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5TKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxqYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkRhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdmI9Yy5Ka3x8dmI7KGZ1bmN0aW9uKGMpe2MuSWs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWNhKCk7dGhpcy53Yj10aGlzLndifHwhMTsKdGhpcy5PZT10aGlzLlJlPXRoaXMuSWY9dGhpcy5pYT10aGlzLnZlPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMueXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnZlPSEwO3RoaXMuSWYmJnRoaXMuWmUoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLiRiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMud2MoKTt0aGlzLklmPQohMDt0aGlzLlplKCl9LmJpbmQodGhpcykpO3RoaXMuVmUoKX0sWmU6ZnVuY3Rpb24oKXtpZighdGhpcy53Yil7dGhpcy53YygpO2lmKCF0aGlzLnZlJiYhdGhpcy53YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudmUmJnRoaXMuT2UmJiF0aGlzLlJlJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0sd2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LHlmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApWZTpmdW5jdGlvbigpe2lmKHRoaXMud2MoKSl7dmFyIGI9dGhpcy55ZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlJlPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuT2U9Yi5Jdn10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDEwMCl9LFB2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmJ3KCk6ITF9LFViOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5VYigpOi0xfSxXcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSx5cDpmdW5jdGlvbihiLGEpe3RoaXMud2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMud2J8fDMwMj09dGhpcy53Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy53Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFjKCl9LmJpbmQodGhpcyksMTAwKX0sQWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuaWE/KHRoaXMubSgpLHRoaXMubmEoKSk6Yi5SYygpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLldwKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHdiPWMuSWt8fHdiOyhmdW5jdGlvbihjKXtjLktrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sClJxOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmNsLkFtLnltP3dpbmRvdy5PTy5jbC5BbS55bS5HdihmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ScSgpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO3ZhciBiPWNhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkVhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB2YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgd2IoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHhiPWMuS2t8fHhiLHliPW5ldyB4YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuQmw9dGhpcy5hWzldO3RoaXMuWHM9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzRdO3RoaXMudGs9dGhpcy5hWzVdO3RoaXMuYnU9dGhpcy5hWzRdO3RoaXMuQm49dGhpcy5hWzhdO3RoaXMuaXY9dGhpcy5hWzhdO3RoaXMuanU9dGhpcy5hWzNdO3RoaXMuJHE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOV19Yy5RaT1iO2IucHJvdG90eXBlPXtBbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQmw6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhzOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51dTp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudGs6dGhpcy5hdShhKX0sYXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJ1OnRoaXMuQW4oYSl9LEFuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Cbjp0aGlzLmh2KGEpfSxodjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhPwp0aGlzLml2OnRoaXMuaXUoYSl9LGl1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuanU6dGhpcy5acShhKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgemI9Yy5RaXx8emIsZGQ9bmV3IHpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQuQWwoNCk7KGZ1bmN0aW9uKGMpe2MuT2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX0sRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sTDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLk9sfHxVOyhmdW5jdGlvbihjKXtjLk5sPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kudmQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnZkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLAoiYWRzTWFuYWdlckxvYWRGYWlsIik7dGhpcy53KCl9LmJpbmQodGhpcyksMUUzKX0uYmluZCh0aGlzKSk7eS52ZCgiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLiRyKGEpfS5iaW5kKHRoaXMpKTt5LmxxKCl9LCRyOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgVj1jLk5sfHxWOyhmdW5jdGlvbihjKXtjLlBsPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy5XYyYmKGI9ZS5GbyhiLHRoaXMuV2MpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5IKGQpKXt0aGlzLkooZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkEpO2YuYigpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiKwpoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5XY3x8KHRoaXMuV2M9W10pLHRoaXMuV2MucHVzaChiW2FdKSxkPW5ldyBVKGgpLHRoaXMuSChkKXx8KHRoaXMuSihkKSxmPW5ldyBWKGQsdGhpcy5BKSxmLmIoKSl9Y2F0Y2goayl7fX19dGhpcy5JKCl9LHZkOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmFhfHwodGhpcy5hYT17fSk7dGhpcy5hYVtiXXx8KHRoaXMuYWFbYl09e30pO3RoaXMuYWFbYl1bYV18fCh0aGlzLmFhW2JdW2FdPVtdKTt0aGlzLmFhW2JdW2FdLnB1c2goYyl9LFd0OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2FdKXRoaXMuY2N8fCh0aGlzLmNjPVtdKSx0aGlzLmNjLnB1c2goYiksdGhpcy5odCgpJiYodGhpcy5tZygpLHRoaXMuYigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2FdW2NdJiYKMDx0aGlzLmFhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuYWFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmFhW2FdW2NdW2RdKGIpfX0sbHE6ZnVuY3Rpb24oKXtpZih0aGlzLmNjKWZvcih2YXIgYj0wO2I8dGhpcy5jYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLmNjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmFhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5XdChiKX19KX0pKGMpO3ZhciBBYj1jLlBsfHxBYix5PW5ldyBBYihxKTsKYWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cT10aGlzLmFbN107dGhpcy5abz10aGlzLmFbNV07dGhpcy5Ybz10aGlzLmFbMl07dGhpcy5Gbj10aGlzLmFbMV07dGhpcy5JaT10aGlzLmFbN107dGhpcy5ydj10aGlzLmFbMV07dGhpcy52bT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLm5vPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cTp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWm86dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhvOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSWk6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ydjp0aGlzLnVtKGEpfSx1bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudm06dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBCYj1jLm5vfHxCYixlZD1uZXcgQmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC54cSg0KTsoZnVuY3Rpb24oYyl7Yy5CaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlMoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSwKcGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sTDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuQmh8fENiOyhmdW5jdGlvbihjKXtjLkNoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2EuaXNBZCYmYS5pc0FkKCk/dGhpcy5tKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwyNTApO3RoaXMuS3N8fCh0aGlzLktzPSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkNofHxEYjsoZnVuY3Rpb24oYyl7Yy5EaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBDYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBEYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5lYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkRofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmw9dGhpcy5hWzRdOwp0aGlzLndyPXRoaXMuYVs4XTt0aGlzLnRzPXRoaXMuYVszXTt0aGlzLllpPXRoaXMuYVs0XTt0aGlzLnRsPXRoaXMuYVsyXTt0aGlzLmRrPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzEwXX1jLnVrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybDp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMud3I6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRzOnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudGw6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmRrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy51a3x8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWZkLnFsKDQpOyhmdW5jdGlvbihjKXtjLmhtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKZWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgSGI9Yy5obXx8SGI7KGZ1bmN0aW9uKGMpe2MuZ209dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5UZXx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuRnB8fCh0aGlzLkpmKCksdGhpcy5GcD0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5UZT8odGhpcy5sKCJhZGVycm9yIiwKIm5vQ29udGFpbmVyIiksdGhpcy5vKCkpOih0aGlzLlRlPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSl9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuaW1hfSxKZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS3AoKTtiP2ImJmIuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLmlhPSEwLHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmYoKX0uYmluZCh0aGlzKSwKNTApfSwkdjpmdW5jdGlvbigpe3JldHVybiEwfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWI9Yy5nbXx8SWI7KGZ1bmN0aW9uKGMpe2MuaW09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBIYihiLml0ZW0oYSkpO3RoaXMuSChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuSihjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBKYj1jLmltfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhrPXRoaXMuYVsyXTt0aGlzLndxPXRoaXMuYVsyXTt0aGlzLlNoPXRoaXMuYVszXTt0aGlzLkxqPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzJdfWMuR3I9YjtiLnByb3RvdHlwZT17R2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhrOnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53cTp0aGlzLlJoKGEpfSxSaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNoOnRoaXMuS2ooYSl9LEtqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Majp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIExiPWMuR3J8fExiLGdkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLkdrKDQpOwooZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgTWI9Yy5uanx8TWI7KGZ1bmN0aW9uKGMpe2MubWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuU2coKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLnBmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5wZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5ObSgpfS5iaW5kKHRoaXMpKSx0aGlzLlRnPSExLHRoaXMubHY9CjFFMyx0aGlzLmdnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfSxwZjpmdW5jdGlvbigpe3RoaXMuZ2cuZG9uZXx8KHRoaXMuZ2cuZG9uZT0hMCx0aGlzLlRnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZygpfS5iaW5kKHRoaXMpLHRoaXMubHYpKX0sTm06ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVGcpO3RoaXMubSgpfSxTZzpmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMudygpKX0sdmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy52Zihtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLnZmKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBOYj1jLm1qfHxOYjsoZnVuY3Rpb24oYyl7Yy5vaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRWEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE1iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE5iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE9iPWMub2p8fE9iLFBiPW5ldyBPYihxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudmg9dGhpcy5hWzldO3RoaXMuZ2k9dGhpcy5hWzNdO3RoaXMuQnA9dGhpcy5hWzJdO3RoaXMuY289dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNl19Yy5Lbz1iO2IucHJvdG90eXBlPXt1aDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudmg6dGhpcy5maShhKX0sZmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmdpOnRoaXMuQXAoYSl9LEFwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5CcDp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBRYj1jLktvfHxRYixoZD1uZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7d2luZG93LnY9aGQudWgoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iU2ltcGxlVmlkZW9BbmRJbWEifX0pfSkoYyk7dmFyIFJiPWMuTGx8fFJiOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLApmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk7dGhpcy5QYigpfSxQYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLk9kKCkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZCgpJiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0uYmluZCh0aGlzKSw1MDApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwKX0sT2Q6ZnVuY3Rpb24oKXtyZXR1cm4haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YX0sCm86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBTYj1jLktsfHxTYjsoZnVuY3Rpb24oYyl7Yy5NbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9DT05URU5UJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1dFUkJVTkcmJjE9PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLmxlbmd0aCYmIXdpbmRvdy5fcGxheSl7dmFyIGI9bmV3IFJiKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYihiLAp0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFRiPWMuTWx8fFRiLFViPW5ldyBUYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLkduPWI7Yi5wcm90b3R5cGU9e2xuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubW46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLkdufHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5sbig0KTsoZnVuY3Rpb24oYyl7Yy52bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuZWU9ITF9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLk5zKCl9LmJpbmQodGhpcyksNTAwKX0sTnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZWUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuZWUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxJdDpmdW5jdGlvbigpe3RoaXMuZWU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sTDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLnZsfHxXYjsoZnVuY3Rpb24oYyl7Yy51bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuSnI9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5LYnx8KHRoaXMuS2I9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIik7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuSnI/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLkl0KCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgWGI9Yy51bHx8WGI7KGZ1bmN0aW9uKGMpe2Mud2w9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBZYj1jLndsfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuQXY9dGhpcy5hWzVdOwp0aGlzLmhxPXRoaXMuYVs1XTt0aGlzLiRzPXRoaXMuYVszXTt0aGlzLnBrPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuJG09YjtiLnByb3RvdHlwZT17dGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVpOnRoaXMuenYoYSl9LHp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bdjp0aGlzLmdxKGEpfSxncTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHE6dGhpcy5acyhhKX0sWnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRzOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMuJG18fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWpkLnRpKDQpOyhmdW5jdGlvbihjKXtjLm9sPQpwLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTsKcmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLm9sfHxhYzsoZnVuY3Rpb24oYyl7Yy5ubD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5EYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm5iKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuc28oKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuTWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnVyKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHNvOmZ1bmN0aW9uKCl7dGhpcy5OZSgpfHx0aGlzLm8oITApfSx1cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTWMoKTshYi5tYSYmYi5iYSYmYi5GdiYmYi5IdiYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sTWM6ZnVuY3Rpb24oKXtpZighdGhpcy5jZylmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRGEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuY2c9YltjXSk7cmV0dXJuIHRoaXMuY2d9LE9kOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG86ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5NYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYz1jLm5sfHxiYzsoZnVuY3Rpb24oYyl7Yy5wbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLnBsYXllcmFwaSl7dmFyIGI9ay5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBhYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgYmMoYyx0aGlzLkEpKS5iKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgY2M9Yy5wbHx8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52cz10aGlzLmFbOF07dGhpcy5raD10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07dGhpcy5FcT10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs1XX1jLm1yPWI7Yi5wcm90b3R5cGU9e3VzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudnM6dGhpcy5qaChhKX0samg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtoOnRoaXMuVXMoYSl9LFVzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Wczp0aGlzLkRxKGEpfSxEcTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXE6dGhpcy5zdihhKX0sc3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnR2OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGVjPWMubXJ8fGVjLGtkPW5ldyBlYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1rZC51cyg0KTsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlAoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUyhhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LERhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLlJqfHxXOyhmdW5jdGlvbihjKXtjLlFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmZlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmImJih0aGlzLmZlPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuZmUmJmIhPXRoaXMuZmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5kdyksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuUWp8fFg7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFcoYiksYi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFcoYiksYi5qYT90aGlzLm1nKCk6dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBELApmYz1jLlNqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5vYi5sZW5ndGgpe3ZhciBhPW0ub2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUudHQoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuV2YuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlrW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLldmKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzJdO3RoaXMuQ209dGhpcy5hWzhdO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuaHA9dGhpcy5hWzFdO3RoaXMuRHA9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5ybT1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWk6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNtOnRoaXMuUm4oYSl9LFJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHA6dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRwOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgaGM9Yy5ybXx8aGMsbGQ9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLmRpKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5QKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuUyhjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LApsdDpmdW5jdGlvbihiKXt0aGlzLnNkPWJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1yfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxMOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksCnRoaXMuc2QmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnNkJiYobmV3IEcodGhpcyx0aGlzLnNkKSkuYigpKX19KX0pKGMpO3ZhciBNPWMuVmx8fE07KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkdkKWlmKHRoaXMuaGJ8fCh0aGlzLmhiPTApLHRoaXMuaGIrKywxNTx0aGlzLmhiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy52dCgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubygpOnRoaXMubyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkdkPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLnZhKCl8fCh0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WYSgpfS5iaW5kKHRoaXMpLDEwKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJgotMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVT1hLGIubCgiYWRlcnJvciIsYSkpOmIubCgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlU9CnRoaXMuVXx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLlZhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgRz1jLlVsfHxHOyhmdW5jdGlvbihjKXtjLldsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKTt0aGlzLndhPS0xfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTSh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiLmx0KHRoaXMuQSksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBpYz1jLldsfHxpYyxqYz1uZXcgaWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSnU9dGhpcy5hWzZdO3RoaXMueHM9dGhpcy5hWzVdO3RoaXMuVmk9dGhpcy5hWzRdO3RoaXMuJHQ9dGhpcy5hWzZdO3RoaXMuRW09dGhpcy5hWzEwXTt0aGlzLllqPXRoaXMuYVs5XTt0aGlzLnFwPXRoaXMuYVsxXTsKdGhpcy5BaD10aGlzLmFbNF07dGhpcy5JaD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLkJrPWI7Yi5wcm90b3R5cGU9e0l1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KdTp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhzOnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5WaTp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiR0OnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5FbTp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWWo6dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuemgoYSl9LHpoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWg6dGhpcy5IaChhKX0sSGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkloOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPWMuQmt8fGtjLG1kPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW1kLkl1KDQpOyhmdW5jdGlvbihjKXtjLkVqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5kdXJhdGlvbj10aGlzLmRmPTA7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlMoYSk6dGhpcy5kYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLAo1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSx7aWQ6Yi5pZH0pfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlJFU1VNRSx7aWQ6Yi5pZH0pfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRmfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmCnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfVElNRSx7WW46ZnVuY3Rpb24oYSl7MDxhJiYodGhpcy5kZj1hKX0uYmluZCh0aGlzKSxpZDpiLmlkfSk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfREFUQSx7WW46ZnVuY3Rpb24oYSl7MDxhLmR1cmF0aW9uJiYodGhpcy5kdXJhdGlvbj1hLmR1cmF0aW9uKX0uYmluZCh0aGlzKSxpZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBsYz1jLkVqfHxsYzsoZnVuY3Rpb24oYyl7Yy5Eaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxodzpmdW5jdGlvbigpe30sYnQ6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAuQ2UobmV3IGZ1bmN0aW9uKCl7fSk7YS5Ddj0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi5idChhKTt3aW5kb3cuS3Y9Yn0sYjpmdW5jdGlvbigpe3RoaXMuYXR8fCh0aGlzLmF0PSEwKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTGR8fCh0aGlzLkxkPTEpO2lmKDIwPHRoaXMuTGQpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7ZWxzZXt2YXIgYT0hMSxjPWE9ITE7aWYoYi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmCihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy5MZCsrO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTApfX0sSGE6ZnVuY3Rpb24oYil7dmFyIGE9ImFkRXJyb3IiLGM9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmCihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMua2UoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCghMCl9LmJpbmQodGhpcykpfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJgotMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5sKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxrZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc01hbmFnZXIpO2I9ImFkRXJyb3IiO2E9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJgpnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMH0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbWM9Yy5Eanx8bWM7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXZwIiksYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKGJbYV0uaWQpe3ZhciBjPW5ldyBsYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2MuamF8fHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IG1jKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBuYz1jLkZqfHxuYyxvYz1uZXcgbmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHA9dGhpcy5hWzEwXTt0aGlzLnZuPXRoaXMuYVs0XTt0aGlzLnB2PXRoaXMuYVs0XTt0aGlzLnd1PXRoaXMuYVs3XTt0aGlzLmtuPXRoaXMuYVs3XTsKdGhpcy5nPXRoaXMuYVsxXX1jLlRpPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5IcDp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudm46dGhpcy5vdihhKX0sb3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnB2OnRoaXMudnUoYSl9LHZ1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53dTp0aGlzLmpuKGEpfSxqbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua246dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLlRpfHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5HcCg0KTsoZnVuY3Rpb24oYyl7Yy52aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKTthJiZ0aGlzLlAoYS5wYXJlbnROb2RlKX0sTDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnZqfHxZOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkZmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5PZigpfSxPZjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkhhKCksITA7dGhpcy5GZisrO2lmKDEwPHRoaXMuRmYpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmCihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsCmIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxYOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy51anx8WjsoZnVuY3Rpb24oYyl7Yy53aj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYKMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBaKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcWM9Yy53anx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVs3XTt0aGlzLnFxPXRoaXMuYVszXTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLkRsPQp0aGlzLmFbNl07dGhpcy5Wcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxMF19Yy5laj1iO2IucHJvdG90eXBlPXtnbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaG46dGhpcy5wcShhKX0scHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFxOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaWk6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhzOnRoaXMuQ2woYSl9LENsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EbDp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLmVqfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0Kb2QuZ24oNCk7KGZ1bmN0aW9uKGMpe2Mud2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiPyhiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVyUHJlZml4KSk/KHRoaXMuUChiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlMoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQ/ITE6Yi5pc1BhdXNlZD8hMTohMH0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pc0Z1bGxzY3JlZW4/Yi5pc0Z1bGxzY3JlZW46ITF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPQpjLndpfHx0YzsoZnVuY3Rpb24oYyl7Yy52aT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIiwKdGhpcy50ZXN0KTt3aW5kb3cuRkRNX1BsYXllcl92YXJzLmFkcGRldGVjdGVkJiYodGhpcy5sKCJhZGVycm9yIiwidXNpbmdBZEJsb2NraW5nU29mdHdhcmUiKSx0aGlzLm8oKSl9LHRlc3Q6ZnVuY3Rpb24oKXt9LG86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMudml8fHVjOyhmdW5jdGlvbihjKXtjLnhpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkVhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPQpiW2NdO2lmKGQudmFycy5pc1JlYWR5KWQ9bmV3IHRjKGQpLGQuamF8fHRoaXMuSChkKXx8KHRoaXMuSihkKSwobmV3IHVjKGQsdGhpcy5BKSkuYigpKTtlbHNlIGJyZWFrfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHZjPWMueGl8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5iaD10aGlzLmFbNl07dGhpcy5DdD10aGlzLmFbNV07dGhpcy5ubT10aGlzLmFbNl07dGhpcy5Ebj10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbOV07dGhpcy5laD10aGlzLmFbMTBdO3RoaXMubGs9dGhpcy5hWzFdO3RoaXMuY209dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOF19Yy5Ocj1iO2IucHJvdG90eXBlPXthaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYmg6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkN0Ogp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm06dGhpcy5DbihhKX0sQ246ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRuOnRoaXMudnAoYSl9LHZwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy53cDp0aGlzLkNrKGEpfSxDazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGs6dGhpcy5kaChhKX0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVoOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sazp0aGlzLmJtKGEpfSxibTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY206dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLk5yfHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5haCg0KTsKKGZ1bmN0aW9uKGMpe2MuQ2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlAoYiksdGhpcy5TKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5DaXx8eWM7KGZ1bmN0aW9uKGMpe2MuQmk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuWGUoKX0sWGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8CihiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZSghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgemM9Yy5CaXx8emM7KGZ1bmN0aW9uKGMpe2MuRGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHljKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5JKCk7cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLkRpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtpPXRoaXMuYVsyXTt0aGlzLm91PXRoaXMuYVs4XTt0aGlzLkFxPXRoaXMuYVs0XTt0aGlzLkhqPXRoaXMuYVsxXTt0aGlzLmxqPXRoaXMuYVs2XTt0aGlzLnJpPXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs1XTt0aGlzLmhyPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzEwXX1jLkZzPWI7Yi5wcm90b3R5cGU9e2ppOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5raTp0aGlzLm51KGEpfSxudTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm91OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5BcTp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSGo6dGhpcy5raihhKX0sa2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxqOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5yaTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLm9wOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ocjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIENjPWMuRnN8fENjLHFkPW5ldyBDYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXFkLmppKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlFmPXRoaXMuVGY9dGhpcy5TZj0hMTt0aGlzLlljPVtdO3RoaXMuaWU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PQp0eXBlb2YgQml0bW92aW5EZXRlY3Rpb24/bnVsbDpCaXRtb3ZpbkRldGVjdGlvbixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBUYT9udWxsOlRhLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgWWE/bnVsbDpZYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgZGM/bnVsbDpkYyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB1YT9udWxsOnVhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj8KbnVsbDp5YixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygd2M/bnVsbDp3YyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGNiP251bGw6Y2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIGhiP251bGw6aGIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgemE/bnVsbDp6YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBPYT9udWxsOk9hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBhP251bGw6cGF9fWMuWms9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5ZcChhKTpbXSxiO3RoaXMuVGY9ITA7aWYoYS5sZW5ndGgpe3RoaXMuU2Y9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj0KYVtjXSx0aGlzLm5nKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5pZSl7aWYodGhpcy5RZilicmVhaztiPXRoaXMuaWVbY107dGhpcy54ZShiKSYmKHRoaXMuWWMucHVzaChiKSx0aGlzLm5nKGIpKX19LHhlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2Ygcj8hMDohMX0sWXA6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWM9YVtmXSxjPXRoaXMuaWVbY10sdGhpcy54ZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxuZzpmdW5jdGlvbihhKXt0aGlzLnhlKGEpJiZhLmIoKX0sS3Q6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLlNmKWZvcih0aGlzLlFmPSEwLGE9MDthPHRoaXMuWWMubGVuZ3RoO2ErKyl0aGlzLlljW2FdLnJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuWWNbYV0ucmIpfX19KShjKTt2YXIgRGM9Yy5aa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpvPXRoaXMuYVs5XTt0aGlzLnRqPXRoaXMuYVs2XTt0aGlzLmFwPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzddfWMuRXM9YjtiLnByb3RvdHlwZT17SW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpvOnRoaXMuc2ooYSl9LHNqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50ajp0aGlzLiRvKGEpfSwkbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgRWM9Yy5Fc3x8RWMscmQ9bmV3IEVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuSW8oNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlRiKGwuTnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlRiKGwuU3IpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7CnZhciBzZD1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGVhPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBGPW5ldyBRLGs9ITE7Ri5aYigpO0YuS2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLlpiKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5LZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuWmIoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csRi5KcSgpLHtpZDp0ZH0pfSw1MDApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnI9dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzZdfWMuVGw9YjtiLnByb3RvdHlwZT17WXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5acjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMuVGx8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLllyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5pZz10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuVGM9MDt0aGlzLk5hPSIiO3RoaXMuWmM9W107dGhpcy4kYz0wO3RoaXMuamc9ITE7dGhpcy5nZT1bXX1jLlhnPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3RoaXMuaWc9YX0sYmQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLk5hPXRoaXMucGxheWVyLkwoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxudDpmdW5jdGlvbihhKXt0aGlzLlVhPWF9LG10OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj0KYX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxlYzpmdW5jdGlvbihhLGIpe2UuaWIoIndlbHQuZGUiKSYmZS5MYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5VYSk7dmFyIGM9ITEsZj0hMTtpZih0aGlzLktxKCkpdGhpcy5VYS5jKHRoaXMuVWEuT2MsdGhpcy5VYS5BYSx0aGlzLlVhLmhlLGZ1bmN0aW9uKCl7dGhpcy5lYyhhLApiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkVjKTtlbHNlIGlmKHRoaXMubnEoKSl0aGlzLmt0KGZ1bmN0aW9uKCl7dGhpcy5lYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5EKGwuQmMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuTHQoKTtrLmV4aXRGdWxsc2NyZWVuKCk7Uj1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLnFnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLklyKGEpOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5QZCYmKGM9dGhpcy5wbGF5ZXIuUGQoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2suUmQoYSwKYyxmKTt0aGlzLnBsYXllci5yZyhrKX19LEtxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuVGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5UYy5nZXRUaW1lKCksdGhpcy5UYz1hLDNFNTxiPyEwOiExO3RoaXMuVGM9YTtyZXR1cm4hMX0sRXQ6ZnVuY3Rpb24oKXtlLm1lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubGYoYSkpP3RoaXMuZWMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5EKGwuQ2MsdGhpcy5wbGF5ZXIuQigpKSl9LER0OmZ1bmN0aW9uKGEpe2UubWUoInBvc3Ryb2xsIik7aWYoIXRoaXMuaWcpe3RoaXMuc3QoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikpOwooYz10aGlzLmxmKGMpKT90aGlzLmVjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQobC5DYyx0aGlzLnBsYXllci5CKCkpKX19LGxmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxkdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnh0KHRoaXMuRHQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sZGQ6ZnVuY3Rpb24oYSl7ZS5tZSgibWlkcm9sbCIpO2lmKCF0aGlzLllmKXt0aGlzLllmPSEwO3ZhciBiPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMudGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLmVjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllmPSExfS5iaW5kKHRoaXMpLDFFMykpOgoodGhpcy5wbGF5ZXIucGxheSgpLGUuRChsLkNjLHRoaXMucGxheWVyLkIoKSkpfX0sY3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5ydCh0aGlzLmRkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlZkKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLkV0KCk7dGhpcy5wbGF5ZXIuVmQmJnRoaXMuY3QoKTt0aGlzLmR0KCl9LGV0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuWmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLnd2KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy4kYz10aGlzLlpjLmxlbmd0aH0sbnE6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLiRjJiYoYT0hMCk7cmV0dXJuIGF9LGt0OmZ1bmN0aW9uKGEpe3RoaXMuamc9YTtmb3IoYT0wO2E8dGhpcy5aYy5sZW5ndGg7YSsrKXRoaXMuWmNbYV1bImZ1bmN0aW9uIl0odGhpcy5Rcy5iaW5kKHRoaXMpKX0sUXM6ZnVuY3Rpb24oYSl7dGhpcy4kYy0tO2EmJnRoaXMuZ2UucHVzaChhKTswPj10aGlzLiRjJiZ0aGlzLmpnKCl9LElyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmdlLmxlbmd0aDtjKyspYj10aGlzLmdlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBnYT1jLlhnfHxnYSxSPSExLGxhPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVoPXRoaXMuYVs4XTt0aGlzLm9pPXRoaXMuYVsxMF07dGhpcy5icz10aGlzLmFbN107dGhpcy5PaD10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs2XX0KYy5Ucj1iO2IucHJvdG90eXBlPXtUaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVWg6dGhpcy5uaShhKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vaTp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnM6dGhpcy5OaChhKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9oOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy5Ucnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9dmQuVGgoNCl9KS5jYWxsKEVhcnVmYUpvTWFoc2hlTGksRWFydWZhSm9NYWhzaGVMaSk7Cg==
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
ff4b8e8962f23810dfba6084bd82cc367d9aa3b49bfe0612bb2a98bc592eb1fe

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
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/
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/
Origin
https://www.golem.de

Response headers

Date
Fri, 21 Sep 2018 17:10:38 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 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/
221 B
888 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json?cache=6835271914
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIEVhcnVmYUpvTWFoc2hlTGk9RWFydWZhSm9NYWhzaGVMaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3kuJGR8fCh5LiRkPTApO3kuJGQrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS4kZCYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihrKXtrLnBhdXNlQnV0dG9ufHwoay5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKay5wbGF5QnV0dG9ufHwoay5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay5tdXRlQnV0dG9ufHwoay5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay51bm11dGVCdXR0b258fChrLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnNraXBhYmxlQnV0dG9ufHwoay5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC42O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0pO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTsKay5za2lwQnV0dG9ufHwoay5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0iKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGsuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307ay5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLkxhKGEsYixbXSxjLGMsbSl9KX1tLmMoay5nbG9iYWxDb25maWcsay5jbGllbnRDb25maWcsay5wcmVjaGVja2VkLGsub25SZWFkeSxrLm9uRmFpbHVyZSxrKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1rLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZWEoZGEsNTApfWZ1bmN0aW9uIGZhKGMsYil7Ynx8KGI9InByZSIpO2lmKGsmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTihjKSxhPW5ldyBPKGEsbSksZz1rLmFkVGFnOyJwcmUiPT1iJiZrLnByZXJvbGxBZFRhZyYmKGc9ay5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmay5wb3N0cm9sbEFkVGFnJiYoZz1rLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5xZyhrKSxhLlJkKGcpKX1lbHNlIGVhKGZ1bmN0aW9uKCl7ZmEoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihrJiZtKXsoay5hZFRhZ3x8ay5wcmVyb2xsQWRUYWcpJiZjLnBhdXNlKCk7ZS5EKGwuQmMsYy5CKCkpO2lmKGMuZ2V0Q3VycmVudFRpbWUpe3ZhciBhPWMuZ2V0Q3VycmVudFRpbWUoKTthJiZlLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLm9hPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuYmQoYyk7YS5udChtKTthLm10KGspO2EuZXQoKTthLmIoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cShjLGIpfS5iaW5kKHRoaXMpLDUwKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kbD10aGlzLmFbNl07dGhpcy5tcz10aGlzLmFbMTBdO3RoaXMuaWw9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzhdOwp0aGlzLnJuPXRoaXMuYVsxXTt0aGlzLmNwPXRoaXMuYVs5XTt0aGlzLkhsPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzldfWMuR289YjtiLnByb3RvdHlwZT17Wmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRsOnRoaXMubHMoYSl9LGxzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5tczp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaWw6dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZsOnRoaXMucW4oYSl9LHFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY3A6dGhpcy5HbChhKX0sR2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy5Hb3x8aGEsSGM9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUhjLlpsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZhPSJzZXR1cCI7dGhpcy5nYz1bXTt0aGlzLiRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuUHMuYmluZCh0aGlzKSl9Yy5MaT1iO2IucHJvdG90eXBlPXskZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxXbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJgphLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFBzOmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLk9zKGEuZGF0YSl9LE9zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0sd2Q6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sY2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5ScChhKSxkPSExO2lmKGIpcmV0dXJuIGE9YS5yZXBsYWNlKGIsIiIpKyIvZGV2L2hvbWFkX3VybC8iK2IrIi8iLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywKIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSx0aGlzLlZmKGEsIlBPU1QiLHt9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sUnA6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFVtOmZ1bmN0aW9uKGEsYil7aWYoYT09Yil7aWYoZS5FcChhKSlyZXR1cm47KGI9dGhpcy5jZihhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMubGEudXJsc1thXT1iO3RoaXMubGEudXJsc1tiXT1hO3RoaXMubGEuaG9tYWRVcmxzW2FdPWI7dGhpcy5sYS5vcmlnaW5hbFVybHNbYl09YX0sRXA6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5ob21hZFVybHNbYV0mJihiPXRoaXMubGEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sbmY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMubGEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWmE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxTcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sRWE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSx1ZjpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sSnQ6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sTWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sTmY6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGtiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/CjY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LHRnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEk9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKwoxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1rO3c9STtxPW07Zm9yKGY9CjA7MTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8fm4mdykrcStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpK3EraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZj00MDs1OT49ZjtmKyspcj1kKGMsNSkrKG4mbHxuJnd8bCZ3KStxK2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedykrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtrPWsrbCY0Mjk0OTY3Mjk1O0k9SSt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoaykrYihJKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiIiLGQsZixjLGgsZSx1LGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfGM+PjYsdT1jJjYzLGlzTmFOKGYpP2U9dT02NDppc05hTihjKSYmKHU9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sUXE6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmCi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sZmY6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxjPSExLGg9ITEsZT0hMSx1PSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocSl7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlFuPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSwKaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1jO2EuaXNGaXJlZm94PWg7YS5pc1NhZmFyaT1lO2EuaXNJRT11O2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxMcDpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuZmYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxYYTpmdW5jdGlvbigpe3ZhciBhPXt0aDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwKRWg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sc3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sbG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LE9uOmZ1bmN0aW9uKCl7cmV0dXJuIGEudGgoKXx8YS5FaCgpfHxhLnNxKCl8fGEuTGsoKXx8YS5sbSgpfX07cmV0dXJuIGEuT24oKX0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxBZjpmdW5jdGlvbihhKXthPXRoaXMuTWEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxpYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxGdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LHJmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5JZyhiKSsiOiIrdGhpcy5JZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sSWc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPgphPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkZhOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxUYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9bC5JYyhiLGQpKTtiJiYoaD1sLkljKGEsYikpO2YmJihoPWwuSWMoaCxmKSk7YyYmKGg9bC5JYyhoLGMpKTtlLlRiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uWil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uamUoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uS2EoZiwhMCk7Zj1tLkthKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uR2EoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sU2Q6ZnVuY3Rpb24oKXttJiZtLlo/bS5pc0VuYWJsZWQmJm0uaW8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2QoKX0uYmluZCh0aGlzKSw1MDApfSxIZDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVGEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LElkOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxUYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLk5jKGEpOiIifSxOYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLklkKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmCihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhuOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuU2MoYSl8fHRoaXMuU3EoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94Lm9nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpJiZ0aGlzLlphKCJlcnJfdXJsIixhKTtpZih0aGlzLm5mKGEpKXJldHVybiB0aGlzLm5mKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjtkJiYoZi5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtmLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2YuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjt2YXIgYz0hMTtkPSExO2Q9dGhpcy5MYShhLGIudWEsZixmdW5jdGlvbihhKXtjPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2N8fChjPWQpLGM9SlNPTi5wYXJzZShjKX1jYXRjaChoKXtjPSExfWMudXJsJiZjLmhhc2gmJihjPWIuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuVW0oYyxhKTtyZXR1cm4gY30sTGE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSx1KXt2YXIgaz1ofHxtO2g9ITA7dSYmKGg9ITEpO2lmKGsmJmsuWilpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suS2EoYSxoKTtoPWsuS2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5HYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxWZjpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sQXI6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuVmYoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuZ2MpZm9yKHZhciBjIGluIHRoaXMuZ2MpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5nY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueWIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sV2Y6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLGYudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkFyKGYuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LHR0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdjPWF9LHd2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5MYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxQbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE9xOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUD1jLkxpfHxQO25ldyBQO3ZhciBlPW5ldyBQO3dpbmRvdy5Odj1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLktpPWI7Yi5JYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuSnM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuUHI9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmd2PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IucnA9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5udj17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1tPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLkdtPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5KbT17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5PbT17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuRm09e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLkhtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuUXU9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk9yPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnNwPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5tdj17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xbz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnZvPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuQ2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5CYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuTG09e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkttPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5RZT17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuUGU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuUG09e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5JbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTnU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Tcj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBsPWMuS2l8fGw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGo9dGhpcy5hWzEwXTt0aGlzLmpwPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzRdfWMuQ289YjtiLnByb3RvdHlwZT0Ke09qOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Qajp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuanA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgaWE9Yy5Db3x8aWEsSmM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMuT2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5NaT1iO2IucHJvdG90eXBlPXtKZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sZWI6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KSsKbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxVcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxKYzpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMuSmMoYSsKNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuSmMoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxaYjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkpkKHRoaXMuZWIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5KYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sSnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aYigpKyIyIn0sS2Y6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KZCh0aGlzLlVwKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuSmMoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBRPQpjLk1pfHxRO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdoPXRoaXMuYVs2XTt0aGlzLkdxPXRoaXMuYVsxMF07dGhpcy50bj10aGlzLmFbM107dGhpcy5jaT10aGlzLmFbOF07dGhpcy5Vbj10aGlzLmFbNF07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLldqPWI7Yi5wcm90b3R5cGU9e2ZoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5naDp0aGlzLkZxKGEpfSxGcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdxOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50bjp0aGlzLmJpKGEpfSxiaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNpOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vbjp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sCmY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGphPWMuV2p8fGphLEtjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLmZoKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmo7dGhpcy5qPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWc7cmV0dXJuIGZ9fShjLApnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmM/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5DZT1ifSkoYyk7dmFyIEo9Yy5DZXx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5HdT10aGlzLmFbOV07dGhpcy50cj10aGlzLmFbMl07dGhpcy5yaz10aGlzLmFbMTBdO3RoaXMucnM9dGhpcy5hWzldO3RoaXMuamo9dGhpcy5hWzFdO3RoaXMuams9dGhpcy5hWzRdO3RoaXMuS2g9dGhpcy5hWzNdO3RoaXMucG89dGhpcy5hWzRdO3RoaXMuemw9dGhpcy5hWzldO3RoaXMuSHQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuUm89YjtiLnByb3RvdHlwZT17RnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5HdTp0aGlzLnNyKGEpfSxzcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHI6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLnFzKGEpfSxxczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnM6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qajp0aGlzLmlrKGEpfSxpazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuams6dGhpcy5KaChhKX0sSmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5LaDp0aGlzLm9vKGEpfSxvbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucG86dGhpcy55bChhKX0seWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpsOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5IdDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIGthPWMuUm98fGthLExjPW5ldyBrYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1MYy5GdSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLllrPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9e307dGhpcy5BPW51bGw7dGhpcy5kYz0xMDA7dGhpcy5sYj0wO3RoaXMud2E9MTUwO3RoaXMucmI9MDt0aGlzLm90KGIpfSxiOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YT8odGhpcy5sYisrLHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpOjA+dGhpcy53YSYmKHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpfSxodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiPnRoaXMud2E/ITA6ITF9LG1nOmZ1bmN0aW9uKCl7dGhpcy5sYj0wfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sCm90OmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxUcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEo6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmViKCldPWI7SyYmSy5UZiYmSy5LdChiKX0sVnY6ZnVuY3Rpb24oKXtyZXR1cm4gZS5FYSh0aGlzLnhhKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy54YSlpZihhPT10aGlzLnhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLnhhW2IuZWIoKV0/ITA6ITF9LFBxOmZ1bmN0aW9uKGIpe2I9Yi5EYSgpO2Zvcih2YXIgYSBpbiB0aGlzLnhhKWlmKGIuaWQ9PXRoaXMueGFbYV0uRGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXc6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5Za3x8cjsoZnVuY3Rpb24oYyl7Yy4kaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLmRjPTEwO3RoaXMubGI9CjA7dGhpcy53YT01MDt0aGlzLks9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLmhmPSExO3RoaXMuTigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuRGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30sZWE6ZnVuY3Rpb24oKXt9LHh0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxXdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LHJ0OmZ1bmN0aW9uKGIpe3RoaXMuV2Q9Yn0sVXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XZH0sVmQ6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLmxiPD10aGlzLndhJiYodGhpcy5sYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLAp0aGlzLmRjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSx0ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxlYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LGt3OmZ1bmN0aW9uKCl7fSxTOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLm9xKCl8fHRoaXMuUm0oKTt0aGlzLm5lKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sUm06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUucGEoMTApKX0sb3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxQOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LERhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFJjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxqYjpmdW5jdGlvbigpe3JldHVybiExfSxjdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxkYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LERiOmZ1bmN0aW9uKCl7dmFyIGI9aztyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFBkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHJnOmZ1bmN0aW9uKGIpe3RoaXMuZ2I9CmJ9LFR2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LGd0OmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxadjpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2ImJihiPSEwKTtyZXR1cm4gYn0sZXc6ZnVuY3Rpb24oKXt0aGlzLmhmfHwodGhpcy5oZj0hMCl9LEtjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFF2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLllnPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuTGU9IjEiO3RoaXMuTWU9IjIiO3RoaXMuem09IjMiO3RoaXMubGM9MDt0aGlzLlpmPTMwO3RoaXMudmI9W107dGhpcy5QYT1bXTt0aGlzLkxiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsCnVua25vd246Nn07dGhpcy5TZT10aGlzLk1nPSExO3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pZD1lLnBhKDEwKTt0aGlzLmJkKGIpO3RoaXMucHQoYSl9LGI6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5NZ3x8KHRoaXMuTWc9ITAsZS5TZCgpKX0sWmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkwoKTtSJiZSLiRiJiYhbGEmJihsYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSx3OmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMudXQoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLkVnKCksdGhpcy5TZT0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaGEoKXx8KHRoaXMudmIucHVzaChiKSx0aGlzLlBhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxFZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIiwKYT1bXTt0aGlzLnZiJiYwPHRoaXMudmIubGVuZ3RoJiYodGhpcy52Yj1lLnVuaXF1ZSh0aGlzLnZiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy52Yi5qb2luKCIsIikpKTtpZih0aGlzLlBhKXtmb3IodmFyIGc9MDtnPHRoaXMuUGEubGVuZ3RoO2crKyl0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXT09dGhpcy5MYltiXSYmYS5wdXNoKHRoaXMuUGFbZ10uZGV0YWlsKSx0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXTx0aGlzLkxiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5QYVtnXS5kZXRhaWwpLGI9dGhpcy5QYVtnXS5yZWFzb24pO3RoaXMuTGJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxZdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNlfSxtOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5MZX0sdXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy5NZX0sdnQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnptfSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGN9LE5lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxlfSxFdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMubGN9LGJkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0scHQ6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sRHI6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLllnfHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZyPXRoaXMuYVs2XTt0aGlzLkZsPXRoaXMuYVs5XTt0aGlzLlduPXRoaXMuYVszXTsKdGhpcy4kZz10aGlzLmFbM107dGhpcy5Rbz10aGlzLmFbNV07dGhpcy5ZbD10aGlzLmFbM107dGhpcy5Ucz10aGlzLmFbOV07dGhpcy5ocz10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs3XX1jLmh1PWI7Yi5wcm90b3R5cGU9e2VyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mcjp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRmw6dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlduOnRoaXMuWmcoYSl9LFpnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGc6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFvOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZbDp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVHM6dGhpcy5ncyhhKX0sZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmc6YX19fSkoYyk7dmFyIG1hPWMuaHV8fG1hLE1jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU1jLmVyKDQpOyhmdW5jdGlvbihjKXtjLlhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGVudEVsKCk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLksmJnRoaXMuSygpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkRlbW9WaWRlb0pTIn19KX0pKGMpO3ZhciBTPWMuWGh8fFM7KGZ1bmN0aW9uKGMpe2MuV2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKTt0aGlzLm1kPW51bGw7dGhpcy5WdT0xRTM7dGhpcy5mZz1udWxsO3RoaXMuZHU9MkUzfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZih3aW5kb3cuZGVtb1BsYXllciYmd2luZG93LlFuKWIub24oInBsYXkiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Iub24oImRpc2FibGUiLHRoaXMuenAuYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0Iix0aGlzLmtxLmJpbmQodGhpcykpO2Iub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuanEoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLll1KGIpfS5iaW5kKHRoaXMpKSwKYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IixmdW5jdGlvbigpe3RoaXMuWnUoYil9LmJpbmQodGhpcykpKTtiLm9uKCJhZGVuZCIsZnVuY3Rpb24oYSl7dGhpcy5pcShhLGIpfS5iaW5kKHRoaXMpKTtiLm9uKCJjb250ZW50cGxheWJhY2siLGZ1bmN0aW9uKGEpe3RoaXMudG8oYSl9LmJpbmQodGhpcykpfSx0bzpmdW5jdGlvbihiKXsiYWRzZXJyb3IiPT1iLnRyaWdnZXJldmVudCYmdGhpcy53KCl9LFl1OmZ1bmN0aW9uKGIpe3RoaXMubWR8fCh0aGlzLm1kPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kdShiKX0uYmluZCh0aGlzKSx0aGlzLlZ1KSl9LCR1OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLm1kKTt0aGlzLncoKX0sWnU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMubWQpfSxpcTpmdW5jdGlvbihiKXt0aGlzLkx2KGIpO3RoaXMuZmc9bmV3IERhdGU7dGhpcy5mZy10aGlzLkxzPHRoaXMuZHU/CnRoaXMudygpOnRoaXMubSgpfSxrcTpmdW5jdGlvbihiLGEpeyFhJiZiLnRhcmdldC5wbGF5ZXImJihhPWIudGFyZ2V0LnBsYXllcix0aGlzLmJkKG5ldyBTKGEpKSk7dGhpcy53KCl9LHpwOmZ1bmN0aW9uKCl7fSxqcTpmdW5jdGlvbigpe3RoaXMuTHM9bmV3IERhdGV9fSl9KShjKTt2YXIgbmE9Yy5XaHx8bmE7KGZ1bmN0aW9uKGMpe2MuWWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmRlbW9QbGF5ZXIpe2lmKHdpbmRvdy52aWRlb2pzJiZ2aWRlb2pzLnBsYXllcnMmJjA8ZS5FYSh2aWRlb2pzLnBsYXllcnMpKXt2YXIgYj12aWRlb2pzLnBsYXllcnMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPW5ldyBTKGJbYV0pO3RoaXMuSChnKXx8KHRoaXMuSihnKSwobmV3IG5hKGcsdGhpcy5BKSkuYigpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIG9hPWMuWWh8fG9hLHBhPW5ldyBvYShxKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHM9dGhpcy5hWzVdO3RoaXMuZnA9dGhpcy5hWzVdO3RoaXMuRnI9dGhpcy5hWzhdO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMua209dGhpcy5hWzddO3RoaXMudXE9dGhpcy5hWzRdO3RoaXMuZm49dGhpcy5hWzddO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLnhtPXRoaXMuYVsxMF07dGhpcy5maz10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVsyXX1jLlpuPWI7Yi5wcm90b3R5cGU9e0NzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Eczp0aGlzLmVwKGEpfSxlcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnA6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Gcjp0aGlzLnZrKGEpfSx2azpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMud2s6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMua206dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZm46dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnlrOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54bTp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZms6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBxYT1jLlpufHxxYSxOYz1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1OYy5Dcyg0KTsoZnVuY3Rpb24oYyl7Yy5naj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmFjPSExO3RoaXMubWYoKTsKdGhpcy5vZigpO3RoaXMudW89ITF9LG1mOmZ1bmN0aW9uKCl7dGhpcy5hYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYWM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuUChiKX0sb2Y6ZnVuY3Rpb24oKXtpZighdGhpcy5hYyl7dmFyIGI9dGhpcy5EYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYWM9ITApO3RoaXMuUyhhKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpKX0sVmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5kZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuZGQoYSl9LmJpbmQodGhpcykpfSwKZGQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLldkJiYoMCx0aGlzLldkKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6CiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sV2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciByYT1jLmdqfHxyYTsoZnVuY3Rpb24oYyl7Yy5maj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxOOmZ1bmN0aW9uKCl7fSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5uYz0hMTt0aGlzLnVkPTE7dGhpcy5wYz1bXTt0aGlzLmFiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9CnRoaXMubmM9ITE7dGhpcy51ZD0xO3RoaXMucGM9W107dGhpcy5hYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy51ZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuYWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmFiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmFiPSEwKSkpLAphLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuYWI9ITApKTp0aGlzLm0oIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ29tcGxldGUiKTt0aGlzLm5jPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuWmYmJiF0aGlzLmhhKCkmJih0aGlzLmFiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm8oKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubyghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5uYigpLHRoaXMuZ2V0UGxheWVyKCkudW89ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdiO2EmJihhLmFlKCksYS5CYSgpKX19LmJpbmQodGhpcyl9KTsKaWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRDb21wbGV0ZSIpO3RoaXMubmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMubSgib25BZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMubSgib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlpmJiYhdGhpcy5oYSgpJiYodGhpcy5hYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLnBjLmluZGV4T2YoYSkmJnRoaXMucGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5tKCksdGhpcy5uYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMubSgiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLm0oImVtcHR5Iik6KHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLnBjLmxlbmd0aD49dGhpcy51ZCYmdGhpcy5vKCkpfSxEcjpmdW5jdGlvbihiKXt0aGlzLmooIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCk7ZS5KdChhLnZpZGVvVGFnKT9hLmFjP3RoaXMubSgicGxheWVyIGlzIGludmFsZCIpOnRoaXMubmN8fHRoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSw1MCk6KGEubWYoKSxhLm9mKCkpfX0pfSkoYyk7dmFyIHNhPWMuZmp8fHNhOyhmdW5jdGlvbihjKXtjLmhqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuUHAoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT0KYi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0pLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5QcShnKXx8KHRoaXMuSihnKSwKZz1uZXcgc2EoZyx0aGlzLkEpLGcuTigpLGcuYigpKX1lbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0sU3Y6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sUHA6ZnVuY3Rpb24oKXt2YXIgYj1lLk1hKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnliKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmhqfHx0YSx1YT1uZXcgdGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHM9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOV19Yy55aT1iO2IucHJvdG90eXBlPXtjczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZHM6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB2YT1jLnlpfHx2YSxPYz1uZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9T2MuY3MoNCk7KGZ1bmN0aW9uKGMpe2MucG09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb19pZCk7dGhpcy5QKGIpO3ZhciBiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0sYT10aGlzLmdldFJhd1BsYXllcigpO2ImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlMoYik6dGhpcy5JKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSwKTDpmdW5jdGlvbigpe3JldHVybiJYT1pDT00ifX0pfSkoYyk7dmFyIHdhPWMucG18fHdhOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IudHJhY2tlci52YXN0X3ByZXJvbGx8fGIudHJhY2tlci52YXN0X3Bvc3Ryb2xsP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LG86ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHhhPWMub218fHhhOyhmdW5jdGlvbihjKXtjLnFtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmCndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyYmMDxlLkVhKHdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcykpe3ZhciBiPXdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YlthXTtpZihnLmNvbnRyb2xzJiZnLmNvbnRyb2xzLnBsYXllcilnPW5ldyB3YShnKSx0aGlzLkgoZyl8fCh0aGlzLkooZyksKG5ldyB4YShnLHRoaXMuQSkpLmIoKSk7ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19KX0pKGMpO3ZhciB5YT1jLnFtfHx5YSx6YT1uZXcgeWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMTBdfWMuYWo9YjtiLnByb3RvdHlwZT17a3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmxwOgp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEFhPWMuYWp8fEFhLFBjPW5ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLmtwKDQpOyhmdW5jdGlvbihjKXtjLmVtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlAoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUyhiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sTDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oYil7dGhpcy5xYihiKX0uYmluZCh0aGlzKSl9LHFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLksmJnRoaXMuSygpfSxSYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0sCmlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciBCYT1jLmVtfHxCYTsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5LZz0hMDt0aGlzLnlkPXRoaXMuSGY9ITE7dGhpcy5hZygpO3RoaXMuZW8oKTt0aGlzLkhhKCl9LGZ3OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKY29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuZWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuYmEsIjsiLHR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLnFkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnJkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi54ZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnhkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMua2cpfSxmYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmCih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LExjOmZ1bmN0aW9uKCl7aWYoIXRoaXMubWEpe3ZhciBiPXRoaXMuZmIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSx3ZjpmdW5jdGlvbigpe2lmKCF0aGlzLlliKXt2YXIgYj10aGlzLmZiKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWWI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlliPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWWJ9LApOcTpmdW5jdGlvbigpe2lmKCF0aGlzLkdmKXt2YXIgYj10aGlzLmZiKCksYT10aGlzLkxxKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5HZj0hMCl9cmV0dXJuIHRoaXMuR2Z9LExxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy50YyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMudGM9ITApO3JldHVybiB0aGlzLnRjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTGMoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksCmIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxrZTpmdW5jdGlvbigpe3RoaXMueWQ9ITA7dmFyIGI9dGhpcy53ZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmCmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLk5ifHwodGhpcy5sKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5YKCksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sUnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmJmJiZiLmFkcyYmKHRoaXMuYmY9Yi5hZHMpO3JldHVybiB0aGlzLmJmfSxlbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlgoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7CmIub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5aZCgpfS5iaW5kKHRoaXMpKX0sZWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLndmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZigpfS5iaW5kKHRoaXMpLDUwKX0sYWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTnEoKSl7dmFyIGE9dGhpcy5mYigpLGc9dGhpcy5MYygpO2EmJmcmJih0aGlzLmZiKCksdGhpcy5MYygpLAp0aGlzLnlkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWQ/dGhpcy5tKCk6KHRoaXMuWCghMCksdGhpcy5sKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuZmIoKX1lbHNlIHRoaXMuSGY/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmZiKCksYj10aGlzLkxjKCk7YSYmIWI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5YKCkpOih0aGlzLlgoITApLHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLkhmPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWcoKX0uYmluZCh0aGlzKSw1MCl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9CiEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5VPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMucWEoKTticmVha319LGZvOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLlFiIT1iLmFkcy5zdGF0ZSYmKHRoaXMuUWI9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuUWIpe3RoaXMubSgiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5RYj0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZm8oKX0uYmluZCh0aGlzKSwxMCl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMDt0aGlzLm0oImVtcHR5IHZhc3QiKX0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLmhhKCl8fChifHwKKHRoaXMuS2c9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuS2csZnVuY3Rpb24oKXt0aGlzLmVmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxvOmZ1bmN0aW9uKCl7dGhpcy5hd3x8KDEwPHRoaXMuV3U/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLld1KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuZnQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubG8oKX0uYmluZCh0aGlzKSw1MCkpKX0sZnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuWHUpe3RoaXMuWHU9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5YLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiKwphLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBDYT1jLmRtfHxDYTsoZnVuY3Rpb24oYyl7Yy5mbT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy54Zyh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMueGcoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5FYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBCYShiW2ddKSxhLmphfHx0aGlzLkgoYSl8fAohMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkooYSksKG5ldyBDYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy5yYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmRjKX19KX0pKGMpO3ZhciBEYT1jLmZtfHxEYSxFYT1uZXcgRGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenM9dGhpcy5hWzJdO3RoaXMuc3U9dGhpcy5hWzhdO3RoaXMuSmo9dGhpcy5hWzJdO3RoaXMuJGk9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5Scz1iO2IucHJvdG90eXBlPXt5czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenM6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnN1OnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KajoKdGhpcy5aaShhKX0sWmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgRmE9Yy5Sc3x8RmEsUWM9bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMueXMoNCk7KGZ1bmN0aW9uKGMpe2MuUmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5QKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlMoYSl9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7CmEuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEdhPWMuUmx8fEdhOyhmdW5jdGlvbihjKXtjLlFsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkFiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmhjPSExO3RoaXMubGcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubSgpOwplbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuaGM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy54YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlllKCk6dGhpcy5tKCl9LHhjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5tKCk7ZWxzZXtpZigxMDA5PT0KZ3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5oYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuaGM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy54Yy5iaW5kKHRoaXMpLDEwMCl9fSxZZTpmdW5jdGlvbigpe2lmKCF0aGlzLmhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09CmIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQWImJih0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWWUuYmluZCh0aGlzKSwKNTApfX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5oYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubSgpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGE9Yy5RbHx8CkhhOyhmdW5jdGlvbihjKXtjLlNsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBHYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSGEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIElhPWMuU2x8fElhLEphPW5ldyBJYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DdT10aGlzLmFbNV07dGhpcy5Bbz10aGlzLmFbNl07dGhpcy5Nbz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLldxPWI7Yi5wcm90b3R5cGU9e0J1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5DdTp0aGlzLnpvKGEpfSwKem86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFvOnRoaXMuTG8oYSl9LExvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Nbzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEthPWMuV3F8fEthLFJjPW5ldyBLYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkJ1KDQpOyhmdW5jdGlvbihjKXtjLnhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMuJGY9YX0sTjpmdW5jdGlvbigpe30sVGQ6ZnVuY3Rpb24oYil7dGhpcy4kZj1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy4kZikucGFyZW50Tm9kZTt0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIExhPWMueGh8fExhOyhmdW5jdGlvbihjKXtjLndoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmooYixhKX0sVGQ6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBNYT1jLndofHxNYTsoZnVuY3Rpb24oYyl7Yy55aD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBMYShkLAphKSx0aGlzLkgoZCl8fChkLlRkKGEpLHRoaXMuSihkKSxkPW5ldyBNYShkLHRoaXMuQSxnKSxkLlRkKGcpLGQuYigpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE5hPWMueWh8fE5hLE9hPW5ldyBOYShmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzhdO3RoaXMuYmw9dGhpcy5hWzhdO3RoaXMuU3U9dGhpcy5hWzldO3RoaXMuSmw9dGhpcy5hWzJdO3RoaXMuQWs9dGhpcy5hWzddO3RoaXMuRXU9dGhpcy5hWzFdO3RoaXMuZG49dGhpcy5hWzFdO3RoaXMucXU9dGhpcy5hWzJdO3RoaXMuT289dGhpcy5hWzFdO3RoaXMueXY9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5Jcz1iO2IucHJvdG90eXBlPXtsbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWw6dGhpcy5hbChhKX0sYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ibDp0aGlzLlJ1KGEpfSxSdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU3U6dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpsOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkV1OnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kbjp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucXU6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9vOnRoaXMueHYoYSl9LHh2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueXY6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBQYT1jLklzfHxQYSxTYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MubGwoNCk7KGZ1bmN0aW9uKGMpe2MuVWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nYW1lQ29udGFpbmVyWzBdO3RoaXMuUChiKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMudmlkZW9UYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpLGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxYYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmCihiPSEwKTtyZXR1cm4gYn0sTDpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgUWE9Yy5Vanx8UWE7KGZ1bmN0aW9uKGMpe2MuVGo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuWGEoKT8oJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0YXAiLGZ1bmN0aW9uKCl7dGhpcy5vYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSkpOnRoaXMub2MoKX0sb2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/CnRoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpO3ZhciBSYT1jLlRqfHxSYTsoZnVuY3Rpb24oYyl7Yy5Waj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuTklDSyYmTklDSy5HYW1lTG9hZGVyJiZOSUNLLkdhbWVMb2FkZXIuZ2FtZUNvbnRhaW5lcil7dmFyIGI9bmV3IFFhKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgUmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFNhPWMuVmp8fFNhLFRhPW5ldyBTYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbj10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzEwXTt0aGlzLk1oPXRoaXMuYVs4XTsKdGhpcy5ycj10aGlzLmFbNF07dGhpcy5hbz10aGlzLmFbOF07dGhpcy5BdD10aGlzLmFbN107dGhpcy5Ccz10aGlzLmFbNF07dGhpcy5RaD10aGlzLmFbOV07dGhpcy5qcj10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLnBzPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYms6dGhpcy5MaChhKX0sTGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1oOnRoaXMucXIoYSl9LHFyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucnI6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFvOnRoaXMuenQoYSl9LHp0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5BdDp0aGlzLkFzKGEpfSxBczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQnM6dGhpcy5QaChhKX0sUGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlFoOgp0aGlzLmlyKGEpfSxpcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuanI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBVYT1jLnBzfHxVYSxUYz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5Mbig0KTsoZnVuY3Rpb24oYyl7Yy5Oaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLlAoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlMoYik6dGhpcy5kYSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5lYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS4kYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5hZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuYmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuYmUrKztpZigxMDx0aGlzLmJlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfX0pfSkoYyk7dmFyIFZhPWMuTmt8fFZhOyhmdW5jdGlvbihjKXtjLk1rPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuR2QpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuR2Q9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnhwPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLnhwPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuTXMoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFdhPWMuTWt8fFdhOyhmdW5jdGlvbihjKXtjLk9rPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVmEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBXYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWGE9Yy5Pa3x8WGEsWWE9bmV3IFhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF1PXRoaXMuYVsxXTt0aGlzLldnPXRoaXMuYVs3XTt0aGlzLnlqPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMucGo9YjtiLnByb3RvdHlwZT17enU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkF1OnRoaXMuVmcoYSl9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV2c6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnlqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIFphPWMucGp8fFphLFVjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1VYy56dSg0KTsoZnVuY3Rpb24oYyl7Yy5GaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUChiLmVsZW1lbnQpO3RoaXMuUyhiLmVsZW1lbnQpfSxEYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZmluaXNoKCl9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSGl0Ym94In19KX0pKGMpO3ZhciAkYT1jLkZpfHwkYTsoZnVuY3Rpb24oYyl7Yy5FaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudygpfX0pfSkoYyk7dmFyIGFiPWMuRWl8fGFiOyhmdW5jdGlvbihjKXtjLkdpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoaXRib3guYWRibG9ja2VyIixmdW5jdGlvbihiKXtiPW5ldyAkYShiLmRldGFpbCk7Yi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgYWIoYix0aGlzLkEpKS5iKCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBiYj1jLkdpfHxiYixjYj1uZXcgYmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnpuPXRoaXMuYVs1XTt0aGlzLlZvPXRoaXMuYVszXTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLlNpPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzRdfWMucnE9YjtiLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpuOnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wbzp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhyOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBkYj1jLnJxfHxkYixWYz1uZXcgZGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1WYy55big0KTsoZnVuY3Rpb24oYyl7Yy5jaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUudWYoYiwiZWxlbWVudElEIik7dGhpcy5oZz1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlAoZyk7dGhpcy5TKGcpO3RoaXMuR2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5HYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuR2MpfSxXYTpmdW5jdGlvbigpe3JldHVybiEwfSxrbzpmdW5jdGlvbigpe2UuTWYodGhpcy5HYyk7ZS5OZih0aGlzLkdjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua28oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sUGQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBlYj1jLmNqfHxlYjsoZnVuY3Rpb24oYyl7Yy5iaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudyghMCl9fSl9KShjKTt2YXIgZmI9Yy5ianx8ZmI7KGZ1bmN0aW9uKGMpe2MuZGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy53YT0xNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsuaW5yZWFkKXt2YXIgYj1rLmlucmVhZCxhPWUudWYoYiwiZWxlbWVudElEIik7CmUuTWYoYSkmJihiPW5ldyBlYihiKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBmYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGdiPWMuZGp8fGdiLGhiPW5ldyBnYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55dT10aGlzLmFbMV07dGhpcy5MdT10aGlzLmFbMl07dGhpcy54bj10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLkh1PWI7Yi5wcm90b3R5cGU9e3h1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dTp0aGlzLkt1KGEpfSxLdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHU6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYj1jLkh1fHxpYixXYz1uZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1XYy54dSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuTmk9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0scXQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxTbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLk5pfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmcsZCxjKXt0aGlzLklhPWE7dGhpcy5xZj10aGlzLlVnPSExO3RoaXMuYmc9ZDt0aGlzLnlnPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLklhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnRiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLk5kKHRoaXMuSWEudXJsKSYmbS5oZCl7dmFyIGg9bmV3IHooYS51cmwpO2gucXQoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYKKGI9ITApO2J8fG0uZ2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXttLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5PaT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5xZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMueWc/dGhpcy50Yi5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCExKTp0aGlzLnRiLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITApLHRoaXMuVWd8fCh0aGlzLnRiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksInVuZGVmaW5lZCIhPXR5cGVvZiBrJiZrJiZrLnZwYWlkJiZtJiZtLlNjKHRoaXMuSWEudXJsKSx0aGlzLnRiLnNlbmQoYSl9Y2F0Y2goYyl7bSYmbS5OZCh0aGlzLklhLnVybCk/bS5oZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLk5kKHRoaXMuSWEudXJsKSx0aGlzLmJnJiZ0aGlzLmJnKCl9cmV0dXJuIHRoaXMudGJ9fX0pKGMpO3ZhciBqYj1jLk9pfHxqYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnpkPXRoaXMuYmI9bnVsbDt0aGlzLkhvPXRoaXMub2I9dGhpcy5VZj0hMTt0aGlzLnVhPSIiO3RoaXMuUGY9ITE7dGhpcy5BYT10aGlzLk9jPSIiO3RoaXMuTGY9dGhpcy5aPXRoaXMuaXNFbmFibGVkPXRoaXMuaGU9ITE7dGhpcy5PYT1bXTt0aGlzLkVmPXRoaXMuRmI9IiI7dGhpcy5FZD0hMTt0aGlzLnRlPQowO3RoaXMuR2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5FZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMua2M9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRmU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMucGI9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMudWU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5LZD0hMTt0aGlzLm1vPXRoaXMuamQ9bnVsbDt0aGlzLnVnPXRoaXMuaWM9dGhpcy5MZz10aGlzLndlPXRoaXMuaGQ9dGhpcy5BZD10aGlzLm1jPSExO3RoaXMuUWE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuUGk9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsCmFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmJiLGFkdGFncmVnZXg6dGhpcy56ZCxqc3BvcHVwczp0aGlzLlVmLHNpZGVsb2Fkczp0aGlzLm9iLGRpc2FibGV0ZXN0czp0aGlzLkhvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuUGYsZ2xvYmFsQ29uZmlnOnRoaXMuT2MsY2xpZW50Q29uZmlnOnRoaXMuQWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5aLGlzQmxvY2tlZDp0aGlzLkxmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMuRWYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5FZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy50ZSxIT01BRF9WRVJJRklFRDp0aGlzLkdlLEhPTUFEX0JMT0NLRUQ6dGhpcy5FZSxIT01BRF9OT0JMT0NLRVI6dGhpcy51YixIT01BRF9BREJMT0NLRVI6dGhpcy5rYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRmUsdGVzdEhpZGU6dGhpcy5IYiwKdGVzdFRhZ3M6dGhpcy5wYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMudWUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5LZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1vLGFkQmxvY2tlckRldGVjdGVkOnRoaXMubWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLkFkLHVzZVN0cmljdENoZWNrczp0aGlzLmhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndlLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUWEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMucGcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuaWMsc2tpcEFsbG93ZWQ6dGhpcy51Z319LG1xOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJihhPSEwKTtyZXR1cm4gYX0sbGU6ZnVuY3Rpb24oYSl7dGhpcy5RYVthXT0KITB9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0scWU6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5QbihhKX0sS2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLAplPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5TYyhhKTtlPXRoaXMuTWEoYSk7Yz8odGhpcy5iYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5qZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLk9ifHx0aGlzLmJifHx0aGlzLnpkKSYmKGs9dGhpcy5LcihrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLlNwKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7KGM9Yy5leGVjKGEpKSYmKGNbMl18fGNbNV0pP2I9ITA6dGhpcy5iYygpJiYoYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChjPWMuZXhlYyhhKSkmJmNbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZDpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7YyYmKGNbMl18fGNbNV0pP2I9ITA6Yj10aGlzLlNjKGEpO3JldHVybiBifSwKU3A6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnVhJiYwPHRoaXMudWEubGVuZ3RoKXJldHVybiB0aGlzLnVhO2ZvcihjIGluIHRoaXMudWEpaWYoYj10aGlzLnVhW2NdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSnY7cmV0dXJuIm5vbmUifSxRYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMucGddfSxqZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUWMoKSxiPXRoaXMudGcoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGM9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitjW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpjLmxlbmd0aCldKX0sS3I6ZnVuY3Rpb24oYSl7dGhpcy5PYiYmKGErPXRoaXMuT2IpO2lmKHRoaXMuYmIpZm9yKHZhciBiIGluIHRoaXMuYmIpdGhpcy5iYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsCnRoaXMuYmJbYl0pKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsYyxmLGUsaCl7bT10aGlzO3RoaXMuUGY9ITA7dGhpcy5PYz1hO3RoaXMuQWE9Yjt0aGlzLmhlPWM7dGhpcy5qZD1mO3RoaXMuRWM9ZTt0aGlzLkViPWh8fHt9O3RoaXMuenIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQWEpdGhpcy54cigpO2Vsc2UgdHJ5e3RoaXMuQWE9YigpLHRoaXMuemMoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWWE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goYyl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LHpyOmZ1bmN0aW9uKCl7dGhpcy5HYShuZXcgeih0aGlzLk9jK3RoaXMucmMoImdsb2JhbCIpKSx0aGlzLmZxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx4cjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQWErdGhpcy5yYygiY2xpZW50IikpO3RoaXMuR2EobmV3IHoodGhpcy5BYSt0aGlzLnJjKCJjbGllbnQiKSksdGhpcy56Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5sZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scmM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMua2IoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkFkKXt0aGlzLkFkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLkVjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRWM/dGhpcy5FYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5aPXRoaXMuTGY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMuRWUpKTt0aGlzLnNiKCk7ZS5UYihsLkpzKTsoYj1lLkFmKHRoaXMuUWMoKSkpfHwoYj1lLkFmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxmcTpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5aPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuQWF8fHRoaXMuRmJ8fHRoaXMudWF8fHRoaXMuemMoKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5aPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnViKSksdGhpcy5zYigpKX19LHpjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQWF9ZWxzZSBhPXRoaXMuQWE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5PYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuRWY9YS5hZHBhdGh8fCIiO3RoaXMuRWQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5wZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5PYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkZiJiZ0aGlzLnVhJiZ0aGlzLk9hLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKSwKdGhpcy5zYigpKX0sVWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5qZSgpKSxjPXRoaXMuTWEodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMucmMoImN1c3RvbWVyIikpO3RoaXMuR2EoYix0aGlzLk10LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJjdXN0b21lciIpO2E/dGhpcy54bD90aGlzLmdhKCJub1NWTUNvbmZpZyIpOih0aGlzLnhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5VYyghMCl9LmJpbmQodGhpcyksITApfX0sTXQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5oZD10aGlzLkpiKGIuc3RyaWN0KTt0aGlzLndlPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuTGc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnBiPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuYmI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuemQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVWY9Yi5qc3BvcHVwc3x8ITE7dGhpcy5vYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5pYz1iLnZwYWlkfHwhMTt0aGlzLkViLnZwYWlkPXRoaXMuaWM7dGhpcy51Zz0KYi5za2lwYWxsb3dlZHx8ITE7dGhpcy5HYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLiRwKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5FZCYmKHRoaXMuR2I9bnVsbCk7dGhpcy51ZT1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLktkJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5LZD0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmN1KCkmJih0aGlzLkhifHx0aGlzLklifHx0aGlzLnBifHx0aGlzLkdiKT90aGlzLmhlPyh0aGlzLm9hPXRoaXMuWj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy51YikpLHRoaXMuQmQoKSx0aGlzLnNiKCkpOnRoaXMuUHQoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5RdCgpKX19LFB0OmZ1bmN0aW9uKCl7dGhpcy5PdCgpfSxRdDpmdW5jdGlvbigpe3RoaXMuWj0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCl9LGdkOmZ1bmN0aW9uKGEpe3RoaXMubWM9ITA7dGhpcy5afHwodGhpcy5aPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKGEpKSx0aGlzLnNiKCksdGhpcy5CZCgpKX0sT3Q6ZnVuY3Rpb24oKXtpZih0aGlzLkhiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkhiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9Y31jYXRjaChmKXt9YT90aGlzLmdkKHRoaXMua2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLkJnKCl9ZWxzZSB0aGlzLkJnKCl9LEFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLmtiKCkpO3RoaXMuVHQoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnJlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5nZCh0aGlzLmtjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5wYj1udWxsLHRoaXMucmUoKX0sVHQ6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0aGlzLkdhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxCZzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigpKTt0aGlzLlV0KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5BZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuZ2QodGhpcy5rYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5JYiYmdGhpcy5JYi5sZW5ndGgpe3ZhciBjPXRoaXMuSWIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5BZygpfSxVdDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LHJlOmZ1bmN0aW9uKCl7dGhpcy5HYj8odGhpcy50ZSsrLHRoaXMuR2EobmV3IHoodGhpcy5HYiksdGhpcy5OdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLnpnKCl9LHNlOmZ1bmN0aW9uKGEpe3RoaXMuZ2QodGhpcy5GZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LE50OmZ1bmN0aW9uKGEpe2E9CmEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy50ZT90aGlzLnJlKCk6dGhpcy5zZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuemcoKTp0aGlzLnNlKCJBQUEiKX0semc6ZnVuY3Rpb24oKXt0aGlzLlo9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCk7dGhpcy5CZCgpfSxzYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5YYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLm1jJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy5HZSkpO3RoaXMuamQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5qZCYmdGhpcy5qZCgpfSxqbzpmdW5jdGlvbigpe2lmKHRoaXMud2UmJnRoaXMubXEoKSl7dmFyIGE9CnRoaXMuUXAoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LEVnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sR2E6ZnVuY3Rpb24oYSxiLGMsZixoLEljKXthPW5ldyBqYihhLGIsYyk7ZiYmKGEuVWc9ITApO2gmJmUuUXEoKSYmKGEucWY9ITApO0ljJiYoYS55Zz0hMCk7cmV0dXJuIGEubG9hZCgpfSxXZTpmdW5jdGlvbigpe2UuWGEoKXx8ZS5MYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fAooYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuZ2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLmJjKCl8fChhPXRoaXMuTWEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7CmguYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0saW86ZnVuY3Rpb24oKXt0aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkdhKGEsdGhpcy5QdS5iaW5kKHRoaXMpLAp0aGlzLk91LmJpbmQodGhpcykpfSxQdTpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMudHAoKX0sT3U6ZnVuY3Rpb24oKXt9LHRwOmZ1bmN0aW9uKCl7ZS5UYihsLnNwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxCZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm9iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMub2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5vYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9Cm5ldyBRO3dpbmRvd1tjLlpiKCldPXRoaXM7ZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxjdTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnVlfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sa2I6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT0KYXx8MT09YXx8IjEiPT1hfHwxPT1hfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsaz0oZiYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oZik/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpOwpyZXR1cm4gYn0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSx0ZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPQoiIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx3LHQseDtuPWEubGVuZ3RoO3ZhciB5PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHkucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PAoyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih5LnB1c2goZik7MTQhPXkubGVuZ3RoJTE2Oyl5LnB1c2goMCk7eS5wdXNoKG4+Pj4yOSk7eS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHkubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO249bDtwPW07dz1xO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfH5uJncpK3QraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj0yMDszOT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NDA7NTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8biZ3fHAmdykrdCtoW2ZdKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj02MDs3OT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cT1xK3cmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBrYj1jLlBpfHxrYixtPW5ldyBrYjt3aW5kb3cuT3Y9bTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaz10aGlzLmFbN107dGhpcy5Fbz10aGlzLmFbOV07dGhpcy52dj10aGlzLmFbNl07dGhpcy5WcT10aGlzLmFbM107dGhpcy5ZcT10aGlzLmFbOV07dGhpcy5taT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs0XX0KYy55bz1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZrOnRoaXMuRG8oYSl9LERvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbzp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnY6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlZxOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZcTp0aGlzLmxpKGEpfSxsaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubWk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBsYj1jLnlvfHxsYixYYz1uZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1YYy5Fayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmIsYyl7dGhpcy5pPWE7YS51Lkw/dGhpcy5OYT1hLnUuTCgpOnRoaXMuTmE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5pLlJhO3RoaXMucGxheWVyPXRoaXMuaS51O3RoaXMudWM9ITE7dGhpcy5Obj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmZkPXt9O3RoaXMuc2M9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5zYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmkudSkmJnRoaXMuaS51LkImJihhPXRoaXMuaS51LkIoKSksdGhpcy5zYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5YbT1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmVkPSExO3RoaXMuWGY9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOgoxNTt0aGlzLnM9e307dGhpcy5xYz0hMTt0aGlzLkhnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuJGI9ITE7dGhpcy53bz1lLnBhKDEwKTt0aGlzLlhjPWUucGEoMTApO3RoaXMuWGQ9ZS5wYSgxMCk7dGhpcy52Zz1lLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkJiPSExO3RoaXMuRmQ9bnVsbDt0aGlzLkNkPXRoaXMuRGM9dGhpcy53Zz10aGlzLmRnPXRoaXMuSGM9dGhpcy5ldT10aGlzLiRhPSExfWMuSmk9YjtiLnByb3RvdHlwZT17cWc6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5OYV0mJnRoaXMuY29uZlt0aGlzLk5hXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTmFdW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuVC5tYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6CmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGwuS20sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKX0sUmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJGE9YztpZih0aGlzLlQuWil0aGlzLlQuam8oKSx0aGlzLlQub2EmJnRoaXMuVC5pc0VuYWJsZWQ/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ULmljfSkpOmI/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuVC5pYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuQmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YuUmQoYSxiLGMpfSw1MCl9fSxjZTpmdW5jdGlvbihhKXt0aGlzLkhjPSExO3RoaXMucz1hO3RoaXMueXQodGhpcy5zKTsKdGhpcy5CZihhKX0sQmY6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuZmQ9dGhpcy5icShhKSksdGhpcy5CZihhLnBhcmVudCkpfSxicTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWSl7Yj1hLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlkuZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5ZLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYKKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVGEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLkZjJiZhLkZjLmVycm9yJiZhLkZjLmVycm9yLmNvZGUmJihiPWEuRmMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2UgeC5qYy5jb2RlOmI9PUMub2QuY29kZT9lLkQobC5ndix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpOihlLlNkKCksYj09Qy5KZS5jb2RlJiZlLkQobC5Pcix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKTtlLkQobC5ycCx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjsKYnJlYWs7Y2FzZSB4LkhlLmNvZGU6ZS5EKGwuUXUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB4LktlLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS5EKGwubXYsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2UgeC5wZC5jb2RlOmUuRChsLm52LHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2UgeC5uZC5jb2RlOmUuRChsLlByLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PQpjJiZhLmVycm9yJiZhLmVycm9yLmthJiYoYys9Il8iK2EuZXJyb3Iua2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy56YihhKTt0aGlzLkJhKCl9LHpiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS56YS5sZW5ndGg7KXRyeXt2YXIgYz1hLnphLnBvcCgpO3RoaXMuUWQoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHl0OmZ1bmN0aW9uKGEpe3RoaXMuQ2Q9ITE7dGhpcy5yYT10aGlzLmkuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuaS5DO2IuZ3c9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLlhtJiZ0aGlzLnBsYXllci5LYygpJiYKKGIudm9sdW1lPXRoaXMucGxheWVyLktjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuVG0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLkRnKGIpPyh0aGlzLlZtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5ybygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLnd0KCkpOnRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0sd3Q6ZnVuY3Rpb24oKXtlLiRlKCk7dGhpcy5zJiZ0aGlzLnMub3JpZ2luJiZ0aGlzLnMub3JpZ2luLkJlJiZlLldtKHRoaXMucy5vcmlnaW4uQmUpO2UuWmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmkuQzt0aGlzLmkuQz1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5pLkMsYSk7dGhpcy5pLmVnKCk7dGhpcy5pLmZjKCk7Zm9yKGE9dGhpcy5pLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuaS5mYygpO3RoaXMuVz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlcuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTsKdGhpcy5XLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5XLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmkuRy5hcHBlbmRDaGlsZCh0aGlzLlcpO3RoaXMuVy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnMuZXEoKSxiPXRoaXMucy5PLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sCmNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuaS5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5pLkcuc3R5bGUuaGVpZ2h0KX19fTtlLnlhKHRoaXMuVywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsCiJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuWG4oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlQpO3RoaXMuVy5zcmM9YTtlLndkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5CYSgpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuYXYoKSx0aGlzLmkuV2IoITApKSwKIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5pLldiKCEwKSx0aGlzLmJ2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuaS5XYighMCksdGhpcy5ldigpKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ2KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR2KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KCkpfS5iaW5kKHRoaXMpKTtlLndkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcykpO2Uud2QoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmkuUW0oZnVuY3Rpb24oYSl7ZS55YSh0aGlzLlcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSwKYnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0sYXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5aYSgiaW1wcmVzc2lvbiIpfSxldjpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS5aYSgic3RhcnQiKX0sUmc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5aYSgiZmlyc3RRdWFydGlsZSIpfSxmdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlphKCJ0aGlyZFF1YXJ0aWxlIil9LGR2OmZ1bmN0aW9uKCl7dGhpcy5rZCgpO2UuWmEoImNvbXBsZXRlIil9LGN2OmZ1bmN0aW9uKCl7ZS5aYSgiYWRzdG9wcGVkIik7dGhpcy5hZigpfSxUbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlQ7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmJjKCk/KGY9ZS5NYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KToKYj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5VdS5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LERnOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sVm06ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuUWcuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55ZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxhZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5RZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwKdGhpcy55ZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxRZzpmdW5jdGlvbihhKXt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZShhKX0uYmluZCh0aGlzKSx0aGlzLk5uKX0seWU6ZnVuY3Rpb24oYSl7dHJ5e2lmKCFlLlhhKCkmJnRoaXMuVC5MZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQmJ8fCh0aGlzLkJiPSEwLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMudWN8fCF0aGlzLkRnKHRoaXMudmlkZW8pfHwKdGhpcy5CYnx8KHRoaXMudWM9ITAsdGhpcy5UdSgpLHRoaXMudmlkZW8uY29udHJvbHM9ITEsdGhpcy5pLmZjKCksdGhpcy5OZygpLHRoaXMuT2coKSx0aGlzLlVlKCksdGhpcy5pLmVnKCksdGhpcy52aWRlby5wbGF5JiZ0aGlzLnBlKCkpfSxwZTpmdW5jdGlvbigpe2lmKCF0aGlzLkRjKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuRmEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuUGM9W107Zm9yKHZhciBiPXRoaXMuaS5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLlBjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIiwKYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMudGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMudGQoKX1lbHNlIHRoaXMudGQoKX0sdGQ6ZnVuY3Rpb24oKXtpZih0aGlzLlBjKWZvcih2YXIgYT0KMDthPHRoaXMuUGMubGVuZ3RoO2ErKyl0aGlzLlBjW2FdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYT10aGlzLnZpZGVvLnBsYXkoKSkmJmFbImNhdGNoIl0pYVsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuRGN8fCh0aGlzLkJhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLCIiLCEwKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5DYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkNiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkNiLmJpbmQodGhpcykpKTpIPWZ1bmN0aW9uKCl7dGhpcy5xY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGUoKSl9LmJpbmQodGhpcyk7dGhpcy56ZigpLnJnKHRoaXMpfSxrZDpmdW5jdGlvbigpe3RoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UuRChsLkZtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5hZigpfSxhZjpmdW5jdGlvbigpe3RoaXMuQ2R8fCh0aGlzLkNkPSEwLHRoaXMucy54Yj8odGhpcy51Yz0hMSx0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuZWQ9ITEsdGhpcy5pLkpnKCksdGhpcy5zLm9yaWdpbi5ZZCgpKTp0aGlzLkJhKCkpfSxVdTpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5sZChhKSl9LGxkOmZ1bmN0aW9uKGEpe2EmJgphLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5NZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SYnx8dGhpcy5ULldlKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlQuV2UoKSk7dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0semU6ZnVuY3Rpb24oKXtpZih0aGlzLmV1KXRoaXMuQmEoKTtlbHNle3RoaXMuJGI9ITA7dGhpcy5pLnUuamImJiF0aGlzLndnJiZ0aGlzLmkudS5qYigpJiZlLkQobC5CYyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tdShhKTt2YXIgYj0iIjtpZih0aGlzLnMub2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMudmcpO2MmJihiPXRoaXMucy5vZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMuZWR8fCh0aGlzLmVkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChsLkxtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5zLnhiPyh0aGlzLnVjPSExLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5jYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuY2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5lZD0hMSx0aGlzLmkuSmcoKSx0aGlzLnMub3JpZ2luLllkKCkpOnRoaXMuQmEoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuc2MucmVwbGFjZSgiW3RpbWVdIixlLnJmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMucWM9ITA7dGhpcy52aWRlby5jb250cm9scz0KITF9fSxzZzpmdW5jdGlvbigpe3RoaXMuUmI9ITA7dGhpcy5yYT10aGlzLmkuRzt0aGlzLnJhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpOwphLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuWHAoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmkuQz1hO3ZhciBiPXRoaXMuaS5DLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmkuZmMoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy5yYS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMucmEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlBnLmJpbmQodGhpcyk7dGhpcy5jYS5hcHBlbmRDaGlsZChiKTt0aGlzLk5nKCk7dGhpcy5PZygpO3RoaXMuRmQ9c2V0SW50ZXJ2YWwodGhpcy5oby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFhwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5zLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLnMuTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5UO2gub2EmJmguaXNFbmFibGVkJiYhaC5iYygpJiYoZT1oLk1hKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sCmhvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLnMuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5GZCksdGhpcy5rZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnplKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLkZkKSx0aGlzLmxkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sR2c6ZnVuY3Rpb24oKXt0aGlzLmRnfHwodGhpcy5kZz0hMCx0aGlzLkhjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sbXU6ZnVuY3Rpb24oYSl7YT09dGhpcy5IZ3x8dGhpcy5CYnx8KDA9PWEmJih0aGlzLiRhJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLiRhKSx0aGlzLiRhPQohMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuR2coKX0uYmluZCh0aGlzKSksdGhpcy5SYiYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMuQmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlhhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQobC5IbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpLGUuRChsLk1tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksdGhpcy5SYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PQpNYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuSGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLkQobC5HbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGwuSm0sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSksYT09TWF0aC5mbG9vcigzKnRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChsLk9tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpLGUuRChsLlBtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksCnRoaXMuSGc9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuQmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH1mb3IodmFyIGM9dGhpcy5jcSh0aGlzLnMuemEsYSk7Yy5sZW5ndGg7KXRyeXt2YXIgZj1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmdGhpcy5mZC5pbXByZXNzaW9ucyYmZS5PcShmLnVybCx0aGlzLmZkLmltcHJlc3Npb25zKT90aGlzLlFkKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQobC5JbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkse2FkSWQ6dGhpcy5mZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUWQoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8Cih0aGlzLnMuemE9dGhpcy5Cbyh0aGlzLnMuemEsYSkpfX0sUWQ6ZnVuY3Rpb24oYSxiLGMsZil7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGE9dGhpcy5ULkthKGEpLGMmJmEuU20oYyksZnx8KGY9dGhpcy5qZiksdGhpcy5ULkdhKGEsZix0aGlzLmpmLCExLCEwKSl9LGNxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sQm86ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sVHU6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuUGcuYmluZCh0aGlzKX0sUGc6ZnVuY3Rpb24oKXtlLkQobC5xbyx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5IYyYmZS5YYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuTHAoKSwhMCk7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5zLnljfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMucy55Yyx0aGlzLlQub2E/Il90b3AiOiJfYmxhbmsiKX19LE5nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PQoiQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLnNjLnJlcGxhY2UoIlt0aW1lXSIsZS5yZigwKSk7dGhpcy5jYXB0aW9uPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYSl9fSxPZzpmdW5jdGlvbigpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlkPXRoaXMud287dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249CiJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsdGhpcy5jZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGIuc3R5bGVbImZsb2F0Il09ImxlZnQiLGIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yi5pZD10aGlzLlhjO2IuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmd1LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLAp0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09InJpZ2h0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5YZDtjLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZ1LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxmLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZi5zdHlsZS50b3A9Ii01MHB4IixmLnN0eWxlLnJpZ2h0PSIwcHgiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLnZnO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7Zi5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMub2UmJmEuYXBwZW5kQ2hpbGQoZik7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKdGhpcy5jZC5iaW5kKHRoaXMpKTt0aGlzLmNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3RoaXMuY29udHJvbHM9dGhpcy5jYS5hcHBlbmRDaGlsZChhKTt0aGlzLmkudS5XYSYmdGhpcy5pLnUuV2EoKSYmdGhpcy5McigpO3RoaXMuVmIoKX19LFZiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sY2Q6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sZ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlhjKTt0aGlzLmkuQy5wYXVzZWQ/KHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSk6KHRoaXMuaS5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sCnRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGwuUGUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YYyk7dGhpcy5pLkMucGF1c2VkfHwodGhpcy5pLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChsLlBlLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpfSxpdDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGMpO3RoaXMuaS5DLnBhdXNlZCYmKHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YZCk7dGhpcy5pLkMubXV0ZWQ/Cih0aGlzLmkuQy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApKToodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCkpfSxMcjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGQpO3RoaXMuaS5DLm11dGVkfHwodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxDYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkNiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5DYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQ2IpO3RoaXMuRGN8fHRoaXMucWN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnBlKCkpfSxCYTpmdW5jdGlvbigpe3RoaXMuRGM9ITA7dGhpcy4kYSYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy4kYSksdGhpcy4kYT0hMSk7aWYoKCJwcmVyb2xsIj09ZS5GYSYmdGhpcy5xY3x8InBvc3Ryb2xsIj09ZS5GYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5GYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKHZhciBiPXRoaXMuaS5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmkuZmMoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuRGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5EZCgpfWVsc2UgdGhpcy5EZCgpfSxEZDpmdW5jdGlvbigpe3RoaXMud2c9ITA7dGhpcy5pLkRmKCk7CnRoaXMuaS5qdCgpO3RoaXMuJGI9ITE7ZS5EKGwudm8sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTt0aGlzLnpmKCkuZ3QoKX0semY6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuaSYmdGhpcy5pLnUmJihhPXRoaXMuaS51KTtyZXR1cm4gYX0sTWQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmKGE9ITApfXJldHVybiBhfSxVZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihlLk5mKHRoaXMudmlkZW8sYSk/dGhpcy5pdCgpOnRoaXMuYWUoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWUoKX0uYmluZCh0aGlzKSwKMTAwKSl9LFI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLnMmJihhLmNsaWNrdGhyb3VnaD10aGlzLnMueWMsYS5kdXJhdGlvbj10aGlzLnMuZHVyYXRpb24sYS5hZFBvZD10aGlzLnMueGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSkpO3JldHVybiBhfSxqZjpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIE89Yy5KaXx8TztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ubz10aGlzLmFbNl07dGhpcy5taD10aGlzLmFbNF07dGhpcy5mcz10aGlzLmFbNF07dGhpcy4kaj10aGlzLmFbOF07dGhpcy5ZdD10aGlzLmFbMV07dGhpcy5vcj10aGlzLmFbOF07dGhpcy5vcz10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLldpPWI7Yi5wcm90b3R5cGU9e1NvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuVG86dGhpcy5saChhKX0sbGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1oOnRoaXMuZXMoYSl9LGVzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5mczp0aGlzLlpqKGEpfSxaajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiRqOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZdDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm9zOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWI9Yy5XaXx8bWIsWWM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuU28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPQpkfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuSmE9bnVsbDt0aGlzLmJhPVtdO3RoaXMuWT1udWxsO3RoaXMuTWI9ITE7dGhpcy5CZT0iIjt0aGlzLkFlPSExO2QmJmQuZW1wdHk/dGhpcy5DcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmZmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkthKG0ucWUodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PQp0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJihhPWUuY2YodGhpcy51cmwpLHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5xZShhKSkrIiZ0eXBlPWpzIixiPW0uS2EobS5xZSh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpLGIuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIik7bS5HYShiLHRoaXMuQnIuYmluZCh0aGlzKSx0aGlzLnlyLmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSwKYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkZhKXRyeXt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWYuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmCiJwcmVyb2xsIj09ZS5GYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuRmEpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8Ck51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxCcjpmdW5jdGlvbihhKXt0aGlzLllzKGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5WYygpOnRoaXMuZmEodGhpcy5DYSh4LmpjLHtlcnJvcjp0aGlzLkFlP0Mub2Q6Qy5JZX0pKX0sQ3I6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/CnRoaXMuVmMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5qYyx7ZXJyb3I6dGhpcy5BZT9DLm9kOkMuSWV9KSl9LHlyOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkNhKHguSGUse2RlcHRoOmF9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5ZPXRoaXMuYmEuc2hpZnQoKTt0aGlzLlRxKCk/dGhpcy5WdCgpPyhhKyssbmV3IGIodGhpcyx0aGlzLkNmKCksZyx7QWRTeXN0ZW06dGhpcy5KcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmZhKHRoaXMuQ2EoeC5LZSkpOihhPTAsdGhpcy5NdSgpJiZ0aGlzLmNlKHRoaXMueG8oKSkpfSxZZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5ZZCgpfSxNdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlN0KCk/dGhpcy5SdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5DYSh4LkRlKSk6dGhpcy5mYSh0aGlzLkNhKHguVmgpKSwhMSk6Cih0aGlzLmZhKHRoaXMuQ2EoeC5qYyxDLkplKSksITEpfSxjZTpmdW5jdGlvbihhKXthLnphPWEuemEuY29uY2F0KHRoaXMuVWQoKSk7YS54Yj1hLnhiP2EueGI6dGhpcy5NYjt0aGlzLnBhcmVudC5jZShhKX0seG86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbmI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMueGYoKTthLnljPXRoaXMuTXAoKTthLm9yaWdpbj10aGlzO2EuTz10aGlzLklwKCk7YS5vZT10aGlzLmFxKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLlkmJihiLnphPWIuZXJyb3IuY29kZSE9eC5EZS5jb2RlP2IuemEuY29uY2F0KHRoaXMuT3AoKSk6Yi56YS5jb25jYXQodGhpcy5WcCgpKSk7dGhpcy5iYS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC56YiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnpiJiZ0aGlzLnBhcmVudC56YihiKSxhPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZhJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx6YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC56YihhKX0sa2Y6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQ2EoYSxiKSl9LENhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG9iKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sVnQ6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxTdDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMueGYoKS5sZW5ndGh9LFJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5VYigpfSxDZzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuYmEuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxZczpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuQmU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLkFlPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxUcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuQ2YoKS5sZW5ndGh9LENmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGQodGhpcy5ZLCJWQVNUQWRUYWdVUkkiKX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZCh0aGlzLlksIkFkU3lzdGVtIil9LFVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVsiSW1wcmVzc2lvbiIsIlRyYWNraW5nIiwiQ2xpY2tUcmFja2luZyIsIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBnPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZykpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGcudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5UYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LApWcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0seGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSx2YzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksCk12OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLlRhKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxiPWcuY29uY2F0KGQpfWNhdGNoKGUpe31yZXR1cm4gYn0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIiwKZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMuTmMoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2UucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuVGEodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxhcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGc9ITE7dHJ5e2M9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxnPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkZ0KGcsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZCl7Yj0hMX1yZXR1cm4gYn0sCkhkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5UYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sSWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFRhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuTmMoYSk6IiJ9LE5jOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSWQoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLmFtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkluPXRoaXMuYVs2XTt0aGlzLldrPXRoaXMuYVszXTt0aGlzLkNqPXRoaXMuYVs1XTsKdGhpcy5Vaz10aGlzLmFbN107dGhpcy5paD10aGlzLmFbN107dGhpcy5Baj10aGlzLmFbNl07dGhpcy5rcz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLnVwPWI7Yi5wcm90b3R5cGU9e0huOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbjp0aGlzLlZrKGEpfSxWazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2s6dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNqOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaWg6dGhpcy56aihhKX0semo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Bajp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmtzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy51cHx8cGIsWmM9bmV3IHBiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLkhuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuemE9W107dGhpcy5NPVtdO3RoaXMueWM9IiI7dGhpcy5PPXRoaXMueGI9ITE7dGhpcy5vcmlnaW49bnVsbH1jLlhrPWI7Yi5wcm90b3R5cGU9e3JvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGVxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgbmI9Yy5Ya3x8bmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaGs9dGhpcy5hWzldO3RoaXMucG49dGhpcy5hWzZdO3RoaXMucWg9dGhpcy5hWzFdO3RoaXMuSXE9dGhpcy5hWzhdO3RoaXMuUWs9dGhpcy5hWzVdO3RoaXMudG09dGhpcy5hWzldO3RoaXMuc2g9dGhpcy5hWzRdO3RoaXMuYm49dGhpcy5hWzRdO3RoaXMuZz0KdGhpcy5hWzVdfWMubXA9YjtiLnByb3RvdHlwZT17Z2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhrOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbjp0aGlzLnBoKGEpfSxwaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucWg6dGhpcy5IcShhKX0sSHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklxOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Razp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5yaChhKX0scmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnNoOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHFiPWMubXB8fHFiLCRjPW5ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5nayg0KTt2YXIgeD17cGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsa2E6IlhNTF9QQVJTRV9FUlJPUiJ9LFZoOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixrYToiRFVSQVRJT05fRVJST1IifSxqYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsa2E6IkVNUFRZX1ZBU1QifSxLZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKa2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGthOiJMT0FEX0VSUk9SIn0sbmQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCkJ2Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGthOiJNRURJQUZJTEVfRVJST1IifSxEZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixrYToiRFVNTVlfQUQifX0sQz17SWU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixrYToiTk9fQURTIn0sSmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGthOiJOT19NRURJQUZJTEVTIn0sRHY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxvZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuR2g9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbNl19Yy5nbD1iO2IucHJvdG90eXBlPXtGaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR2g6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciByYj1jLmdsfHxyYixhZD1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1hZC5GaCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLkZjPWI7dGhpcy56YT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuc2k9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYj1jLnNpfHxvYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Oaj10aGlzLmFbOV07dGhpcy5icj10aGlzLmFbM107CnRoaXMubHU9dGhpcy5hWzFdO3RoaXMuUnI9dGhpcy5hWzddO3RoaXMuQ3E9dGhpcy5hWzRdO3RoaXMub2g9dGhpcy5hWzRdO3RoaXMuYWk9dGhpcy5hWzJdO3RoaXMucmo9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNl19Yy5Icj1iO2IucHJvdG90eXBlPXtNajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTmo6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJyOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdTp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUnI6dGhpcy5CcShhKX0sQnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNxOnRoaXMubmgoYSl9LG5oOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vaDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmFpOnRoaXMucWooYSl9LHFqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5yajoKdGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYj1jLkhyfHxzYixiZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1iZC5Naig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLnU9YTt0aGlzLlJhPWEudGYoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUucGEoMTApO3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlNhPXt9O3RoaXMuUmY9ITE7dGhpcy5YYj1bXX1jLlpoPQpiO2IucHJvdG90eXBlPXtacDpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGY9MCxiPTAsZT17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZj1iLmxlZnQsYj1iLnRvcCk7ZT17eDpmLHk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlpwKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5NcShhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PQp3aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sTHQ6ZnVuY3Rpb24oKXt0aGlzLlJmPSEwfSxKZzpmdW5jdGlvbigpe3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sZWc6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtlLkQobC5CYyx0aGlzLnUuQigpKX0sanQ6ZnVuY3Rpb24oKXt0aGlzLlJmfHwodGhpcy51LnBsYXkoKSwKZS5EKGwuQ2MsdGhpcy51LkIoKSkpfSxmYzpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy51LnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5SYS5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuUmEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5SYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlJhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuUmEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuUmEpO3RoaXMudS5EYiYmCnRoaXMudS5EYigpP3RoaXMudS50ZigpLmFwcGVuZENoaWxkKHRoaXMuRyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkcpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2IuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy51LmV4aXRGdWxsc2NyZWVuKCl9LE1xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxOcDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LApXYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLk5wKHRoaXMuUmEpO2lmKGIueCE9dGhpcy5TYS54fHxiLnkhPXRoaXMuU2EueXx8Yi5wb3NpdGlvbiE9dGhpcy5TYS5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5TYS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuU2EuaGVpZ2h0fHxhKXtpZigwPHRoaXMuU2Eud2lkdGgmJjA8dGhpcy5TYS5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkRmKCk7cmV0dXJufXRoaXMuU2E9Yjt0aGlzLnUuRGIoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD0KYi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5YYi5sZW5ndGg7YSsrKXRoaXMuWGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9d2luZG93LnNldFRpbWVvdXQodGhpcy5XYi5iaW5kKHRoaXMpLDEwKX0sUW06ZnVuY3Rpb24oYSl7dGhpcy5YYnx8KHRoaXMuWGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlhiLnB1c2goYSl9LERmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTtmb3IodmFyIE49Yy5aaHx8TixCPVtdLHRiPTA7MTAwPnRiO3RiKyspe3ZhciBMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TC5zdHlsZS5kaXNwbGF5PSJibG9jayI7TC5pZD1lLnBhKDEwKTtMLmNvbnRyb2xzPSEwO0IucHVzaChMKX12YXIgSD0KITEsYmE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5uaz10aGlzLmFbMV07dGhpcy5BaT10aGlzLmFbMl07dGhpcy5kcj10aGlzLmFbOF07dGhpcy5rdj10aGlzLmFbMTBdO3RoaXMua2w9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzJdO3RoaXMubHI9dGhpcy5hWzhdO3RoaXMuWm09dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5wcj1iO2IucHJvdG90eXBlPXttazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubms6dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuY3IoYSl9LApjcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZHI6dGhpcy5qdihhKX0sanY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmt2OnRoaXMuamwoYSl9LGpsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbDp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU2s6dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxyOnRoaXMuWW0oYSl9LFltOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmc6YX19fSkoYyk7dmFyIHViPWMucHJ8fHViLGNkPW5ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWNkLm1rKDQpOyhmdW5jdGlvbihjKXtjLkprPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5QKGEpO3RoaXMubmUoYik7dGhpcy5nZigpfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZ2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5TKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxqYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkRhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdmI9Yy5Ka3x8dmI7KGZ1bmN0aW9uKGMpe2MuSWs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWNhKCk7dGhpcy53Yj10aGlzLndifHwhMTsKdGhpcy5PZT10aGlzLlJlPXRoaXMuSWY9dGhpcy5pYT10aGlzLnZlPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMueXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnZlPSEwO3RoaXMuSWYmJnRoaXMuWmUoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLiRiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMud2MoKTt0aGlzLklmPQohMDt0aGlzLlplKCl9LmJpbmQodGhpcykpO3RoaXMuVmUoKX0sWmU6ZnVuY3Rpb24oKXtpZighdGhpcy53Yil7dGhpcy53YygpO2lmKCF0aGlzLnZlJiYhdGhpcy53YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudmUmJnRoaXMuT2UmJiF0aGlzLlJlJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0sd2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LHlmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApWZTpmdW5jdGlvbigpe2lmKHRoaXMud2MoKSl7dmFyIGI9dGhpcy55ZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlJlPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuT2U9Yi5Jdn10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDEwMCl9LFB2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmJ3KCk6ITF9LFViOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5VYigpOi0xfSxXcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSx5cDpmdW5jdGlvbihiLGEpe3RoaXMud2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMud2J8fDMwMj09dGhpcy53Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy53Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFjKCl9LmJpbmQodGhpcyksMTAwKX0sQWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuaWE/KHRoaXMubSgpLHRoaXMubmEoKSk6Yi5SYygpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLldwKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHdiPWMuSWt8fHdiOyhmdW5jdGlvbihjKXtjLktrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sClJxOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmNsLkFtLnltP3dpbmRvdy5PTy5jbC5BbS55bS5HdihmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ScSgpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO3ZhciBiPWNhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkVhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB2YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgd2IoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHhiPWMuS2t8fHhiLHliPW5ldyB4YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuQmw9dGhpcy5hWzldO3RoaXMuWHM9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzRdO3RoaXMudGs9dGhpcy5hWzVdO3RoaXMuYnU9dGhpcy5hWzRdO3RoaXMuQm49dGhpcy5hWzhdO3RoaXMuaXY9dGhpcy5hWzhdO3RoaXMuanU9dGhpcy5hWzNdO3RoaXMuJHE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOV19Yy5RaT1iO2IucHJvdG90eXBlPXtBbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQmw6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhzOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51dTp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudGs6dGhpcy5hdShhKX0sYXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJ1OnRoaXMuQW4oYSl9LEFuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Cbjp0aGlzLmh2KGEpfSxodjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhPwp0aGlzLml2OnRoaXMuaXUoYSl9LGl1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuanU6dGhpcy5acShhKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgemI9Yy5RaXx8emIsZGQ9bmV3IHpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQuQWwoNCk7KGZ1bmN0aW9uKGMpe2MuT2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX0sRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sTDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLk9sfHxVOyhmdW5jdGlvbihjKXtjLk5sPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kudmQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnZkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLAoiYWRzTWFuYWdlckxvYWRGYWlsIik7dGhpcy53KCl9LmJpbmQodGhpcyksMUUzKX0uYmluZCh0aGlzKSk7eS52ZCgiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLiRyKGEpfS5iaW5kKHRoaXMpKTt5LmxxKCl9LCRyOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgVj1jLk5sfHxWOyhmdW5jdGlvbihjKXtjLlBsPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy5XYyYmKGI9ZS5GbyhiLHRoaXMuV2MpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5IKGQpKXt0aGlzLkooZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkEpO2YuYigpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiKwpoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5XY3x8KHRoaXMuV2M9W10pLHRoaXMuV2MucHVzaChiW2FdKSxkPW5ldyBVKGgpLHRoaXMuSChkKXx8KHRoaXMuSihkKSxmPW5ldyBWKGQsdGhpcy5BKSxmLmIoKSl9Y2F0Y2goayl7fX19dGhpcy5JKCl9LHZkOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmFhfHwodGhpcy5hYT17fSk7dGhpcy5hYVtiXXx8KHRoaXMuYWFbYl09e30pO3RoaXMuYWFbYl1bYV18fCh0aGlzLmFhW2JdW2FdPVtdKTt0aGlzLmFhW2JdW2FdLnB1c2goYyl9LFd0OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2FdKXRoaXMuY2N8fCh0aGlzLmNjPVtdKSx0aGlzLmNjLnB1c2goYiksdGhpcy5odCgpJiYodGhpcy5tZygpLHRoaXMuYigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2FdW2NdJiYKMDx0aGlzLmFhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuYWFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmFhW2FdW2NdW2RdKGIpfX0sbHE6ZnVuY3Rpb24oKXtpZih0aGlzLmNjKWZvcih2YXIgYj0wO2I8dGhpcy5jYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLmNjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmFhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5XdChiKX19KX0pKGMpO3ZhciBBYj1jLlBsfHxBYix5PW5ldyBBYihxKTsKYWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cT10aGlzLmFbN107dGhpcy5abz10aGlzLmFbNV07dGhpcy5Ybz10aGlzLmFbMl07dGhpcy5Gbj10aGlzLmFbMV07dGhpcy5JaT10aGlzLmFbN107dGhpcy5ydj10aGlzLmFbMV07dGhpcy52bT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLm5vPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cTp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWm86dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhvOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSWk6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ydjp0aGlzLnVtKGEpfSx1bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudm06dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBCYj1jLm5vfHxCYixlZD1uZXcgQmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC54cSg0KTsoZnVuY3Rpb24oYyl7Yy5CaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlMoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSwKcGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sTDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuQmh8fENiOyhmdW5jdGlvbihjKXtjLkNoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2EuaXNBZCYmYS5pc0FkKCk/dGhpcy5tKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwyNTApO3RoaXMuS3N8fCh0aGlzLktzPSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkNofHxEYjsoZnVuY3Rpb24oYyl7Yy5EaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBDYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBEYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5lYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkRofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmw9dGhpcy5hWzRdOwp0aGlzLndyPXRoaXMuYVs4XTt0aGlzLnRzPXRoaXMuYVszXTt0aGlzLllpPXRoaXMuYVs0XTt0aGlzLnRsPXRoaXMuYVsyXTt0aGlzLmRrPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzEwXX1jLnVrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybDp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMud3I6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRzOnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudGw6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmRrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy51a3x8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWZkLnFsKDQpOyhmdW5jdGlvbihjKXtjLmhtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKZWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgSGI9Yy5obXx8SGI7KGZ1bmN0aW9uKGMpe2MuZ209dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5UZXx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuRnB8fCh0aGlzLkpmKCksdGhpcy5GcD0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5UZT8odGhpcy5sKCJhZGVycm9yIiwKIm5vQ29udGFpbmVyIiksdGhpcy5vKCkpOih0aGlzLlRlPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSl9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuaW1hfSxKZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS3AoKTtiP2ImJmIuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLmlhPSEwLHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmYoKX0uYmluZCh0aGlzKSwKNTApfSwkdjpmdW5jdGlvbigpe3JldHVybiEwfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWI9Yy5nbXx8SWI7KGZ1bmN0aW9uKGMpe2MuaW09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBIYihiLml0ZW0oYSkpO3RoaXMuSChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuSihjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBKYj1jLmltfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhrPXRoaXMuYVsyXTt0aGlzLndxPXRoaXMuYVsyXTt0aGlzLlNoPXRoaXMuYVszXTt0aGlzLkxqPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzJdfWMuR3I9YjtiLnByb3RvdHlwZT17R2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhrOnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53cTp0aGlzLlJoKGEpfSxSaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNoOnRoaXMuS2ooYSl9LEtqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Majp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIExiPWMuR3J8fExiLGdkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLkdrKDQpOwooZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgTWI9Yy5uanx8TWI7KGZ1bmN0aW9uKGMpe2MubWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuU2coKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLnBmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5wZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5ObSgpfS5iaW5kKHRoaXMpKSx0aGlzLlRnPSExLHRoaXMubHY9CjFFMyx0aGlzLmdnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfSxwZjpmdW5jdGlvbigpe3RoaXMuZ2cuZG9uZXx8KHRoaXMuZ2cuZG9uZT0hMCx0aGlzLlRnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZygpfS5iaW5kKHRoaXMpLHRoaXMubHYpKX0sTm06ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVGcpO3RoaXMubSgpfSxTZzpmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMudygpKX0sdmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy52Zihtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLnZmKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBOYj1jLm1qfHxOYjsoZnVuY3Rpb24oYyl7Yy5vaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRWEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE1iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE5iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE9iPWMub2p8fE9iLFBiPW5ldyBPYihxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudmg9dGhpcy5hWzldO3RoaXMuZ2k9dGhpcy5hWzNdO3RoaXMuQnA9dGhpcy5hWzJdO3RoaXMuY289dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNl19Yy5Lbz1iO2IucHJvdG90eXBlPXt1aDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudmg6dGhpcy5maShhKX0sZmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmdpOnRoaXMuQXAoYSl9LEFwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5CcDp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBRYj1jLktvfHxRYixoZD1uZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7d2luZG93LnY9aGQudWgoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iU2ltcGxlVmlkZW9BbmRJbWEifX0pfSkoYyk7dmFyIFJiPWMuTGx8fFJiOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLApmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk7dGhpcy5QYigpfSxQYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLk9kKCkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZCgpJiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0uYmluZCh0aGlzKSw1MDApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwKX0sT2Q6ZnVuY3Rpb24oKXtyZXR1cm4haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YX0sCm86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBTYj1jLktsfHxTYjsoZnVuY3Rpb24oYyl7Yy5NbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9DT05URU5UJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1dFUkJVTkcmJjE9PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLmxlbmd0aCYmIXdpbmRvdy5fcGxheSl7dmFyIGI9bmV3IFJiKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYihiLAp0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFRiPWMuTWx8fFRiLFViPW5ldyBUYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLkduPWI7Yi5wcm90b3R5cGU9e2xuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubW46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLkdufHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5sbig0KTsoZnVuY3Rpb24oYyl7Yy52bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuZWU9ITF9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLk5zKCl9LmJpbmQodGhpcyksNTAwKX0sTnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZWUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuZWUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxJdDpmdW5jdGlvbigpe3RoaXMuZWU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sTDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLnZsfHxXYjsoZnVuY3Rpb24oYyl7Yy51bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuSnI9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5LYnx8KHRoaXMuS2I9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIik7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuSnI/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLkl0KCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgWGI9Yy51bHx8WGI7KGZ1bmN0aW9uKGMpe2Mud2w9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBZYj1jLndsfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuQXY9dGhpcy5hWzVdOwp0aGlzLmhxPXRoaXMuYVs1XTt0aGlzLiRzPXRoaXMuYVszXTt0aGlzLnBrPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuJG09YjtiLnByb3RvdHlwZT17dGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVpOnRoaXMuenYoYSl9LHp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bdjp0aGlzLmdxKGEpfSxncTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHE6dGhpcy5acyhhKX0sWnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRzOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMuJG18fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWpkLnRpKDQpOyhmdW5jdGlvbihjKXtjLm9sPQpwLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTsKcmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLm9sfHxhYzsoZnVuY3Rpb24oYyl7Yy5ubD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5EYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm5iKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuc28oKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuTWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnVyKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHNvOmZ1bmN0aW9uKCl7dGhpcy5OZSgpfHx0aGlzLm8oITApfSx1cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTWMoKTshYi5tYSYmYi5iYSYmYi5GdiYmYi5IdiYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sTWM6ZnVuY3Rpb24oKXtpZighdGhpcy5jZylmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRGEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuY2c9YltjXSk7cmV0dXJuIHRoaXMuY2d9LE9kOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG86ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5NYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYz1jLm5sfHxiYzsoZnVuY3Rpb24oYyl7Yy5wbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLnBsYXllcmFwaSl7dmFyIGI9ay5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBhYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgYmMoYyx0aGlzLkEpKS5iKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgY2M9Yy5wbHx8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52cz10aGlzLmFbOF07dGhpcy5raD10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07dGhpcy5FcT10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs1XX1jLm1yPWI7Yi5wcm90b3R5cGU9e3VzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudnM6dGhpcy5qaChhKX0samg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtoOnRoaXMuVXMoYSl9LFVzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Wczp0aGlzLkRxKGEpfSxEcTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXE6dGhpcy5zdihhKX0sc3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnR2OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGVjPWMubXJ8fGVjLGtkPW5ldyBlYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1rZC51cyg0KTsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlAoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUyhhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LERhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLlJqfHxXOyhmdW5jdGlvbihjKXtjLlFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmZlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmImJih0aGlzLmZlPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuZmUmJmIhPXRoaXMuZmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5kdyksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuUWp8fFg7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFcoYiksYi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFcoYiksYi5qYT90aGlzLm1nKCk6dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBELApmYz1jLlNqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5vYi5sZW5ndGgpe3ZhciBhPW0ub2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUudHQoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuV2YuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlrW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLldmKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzJdO3RoaXMuQ209dGhpcy5hWzhdO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuaHA9dGhpcy5hWzFdO3RoaXMuRHA9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5ybT1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWk6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNtOnRoaXMuUm4oYSl9LFJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHA6dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRwOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgaGM9Yy5ybXx8aGMsbGQ9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLmRpKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5QKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuUyhjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LApsdDpmdW5jdGlvbihiKXt0aGlzLnNkPWJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1yfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxMOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksCnRoaXMuc2QmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnNkJiYobmV3IEcodGhpcyx0aGlzLnNkKSkuYigpKX19KX0pKGMpO3ZhciBNPWMuVmx8fE07KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkdkKWlmKHRoaXMuaGJ8fCh0aGlzLmhiPTApLHRoaXMuaGIrKywxNTx0aGlzLmhiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy52dCgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubygpOnRoaXMubyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkdkPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLnZhKCl8fCh0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WYSgpfS5iaW5kKHRoaXMpLDEwKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJgotMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVT1hLGIubCgiYWRlcnJvciIsYSkpOmIubCgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlU9CnRoaXMuVXx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLlZhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgRz1jLlVsfHxHOyhmdW5jdGlvbihjKXtjLldsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKTt0aGlzLndhPS0xfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTSh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiLmx0KHRoaXMuQSksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBpYz1jLldsfHxpYyxqYz1uZXcgaWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSnU9dGhpcy5hWzZdO3RoaXMueHM9dGhpcy5hWzVdO3RoaXMuVmk9dGhpcy5hWzRdO3RoaXMuJHQ9dGhpcy5hWzZdO3RoaXMuRW09dGhpcy5hWzEwXTt0aGlzLllqPXRoaXMuYVs5XTt0aGlzLnFwPXRoaXMuYVsxXTsKdGhpcy5BaD10aGlzLmFbNF07dGhpcy5JaD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLkJrPWI7Yi5wcm90b3R5cGU9e0l1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KdTp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhzOnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5WaTp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiR0OnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5FbTp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWWo6dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuemgoYSl9LHpoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWg6dGhpcy5IaChhKX0sSGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkloOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPWMuQmt8fGtjLG1kPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW1kLkl1KDQpOyhmdW5jdGlvbihjKXtjLkVqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5kdXJhdGlvbj10aGlzLmRmPTA7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlMoYSk6dGhpcy5kYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLAo1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSx7aWQ6Yi5pZH0pfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlJFU1VNRSx7aWQ6Yi5pZH0pfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRmfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmCnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfVElNRSx7WW46ZnVuY3Rpb24oYSl7MDxhJiYodGhpcy5kZj1hKX0uYmluZCh0aGlzKSxpZDpiLmlkfSk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfREFUQSx7WW46ZnVuY3Rpb24oYSl7MDxhLmR1cmF0aW9uJiYodGhpcy5kdXJhdGlvbj1hLmR1cmF0aW9uKX0uYmluZCh0aGlzKSxpZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBsYz1jLkVqfHxsYzsoZnVuY3Rpb24oYyl7Yy5Eaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxodzpmdW5jdGlvbigpe30sYnQ6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAuQ2UobmV3IGZ1bmN0aW9uKCl7fSk7YS5Ddj0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi5idChhKTt3aW5kb3cuS3Y9Yn0sYjpmdW5jdGlvbigpe3RoaXMuYXR8fCh0aGlzLmF0PSEwKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTGR8fCh0aGlzLkxkPTEpO2lmKDIwPHRoaXMuTGQpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7ZWxzZXt2YXIgYT0hMSxjPWE9ITE7aWYoYi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmCihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy5MZCsrO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTApfX0sSGE6ZnVuY3Rpb24oYil7dmFyIGE9ImFkRXJyb3IiLGM9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmCihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMua2UoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCghMCl9LmJpbmQodGhpcykpfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJgotMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5sKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxrZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc01hbmFnZXIpO2I9ImFkRXJyb3IiO2E9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJgpnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMH0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbWM9Yy5Eanx8bWM7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXZwIiksYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKGJbYV0uaWQpe3ZhciBjPW5ldyBsYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2MuamF8fHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IG1jKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBuYz1jLkZqfHxuYyxvYz1uZXcgbmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHA9dGhpcy5hWzEwXTt0aGlzLnZuPXRoaXMuYVs0XTt0aGlzLnB2PXRoaXMuYVs0XTt0aGlzLnd1PXRoaXMuYVs3XTt0aGlzLmtuPXRoaXMuYVs3XTsKdGhpcy5nPXRoaXMuYVsxXX1jLlRpPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5IcDp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudm46dGhpcy5vdihhKX0sb3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnB2OnRoaXMudnUoYSl9LHZ1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53dTp0aGlzLmpuKGEpfSxqbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua246dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLlRpfHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5HcCg0KTsoZnVuY3Rpb24oYyl7Yy52aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKTthJiZ0aGlzLlAoYS5wYXJlbnROb2RlKX0sTDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnZqfHxZOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkZmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5PZigpfSxPZjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkhhKCksITA7dGhpcy5GZisrO2lmKDEwPHRoaXMuRmYpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmCihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsCmIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxYOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy51anx8WjsoZnVuY3Rpb24oYyl7Yy53aj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYKMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBaKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcWM9Yy53anx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVs3XTt0aGlzLnFxPXRoaXMuYVszXTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLkRsPQp0aGlzLmFbNl07dGhpcy5Wcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxMF19Yy5laj1iO2IucHJvdG90eXBlPXtnbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaG46dGhpcy5wcShhKX0scHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFxOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaWk6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhzOnRoaXMuQ2woYSl9LENsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EbDp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLmVqfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0Kb2QuZ24oNCk7KGZ1bmN0aW9uKGMpe2Mud2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiPyhiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVyUHJlZml4KSk/KHRoaXMuUChiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlMoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQ/ITE6Yi5pc1BhdXNlZD8hMTohMH0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pc0Z1bGxzY3JlZW4/Yi5pc0Z1bGxzY3JlZW46ITF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPQpjLndpfHx0YzsoZnVuY3Rpb24oYyl7Yy52aT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIiwKdGhpcy50ZXN0KTt3aW5kb3cuRkRNX1BsYXllcl92YXJzLmFkcGRldGVjdGVkJiYodGhpcy5sKCJhZGVycm9yIiwidXNpbmdBZEJsb2NraW5nU29mdHdhcmUiKSx0aGlzLm8oKSl9LHRlc3Q6ZnVuY3Rpb24oKXt9LG86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMudml8fHVjOyhmdW5jdGlvbihjKXtjLnhpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkVhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPQpiW2NdO2lmKGQudmFycy5pc1JlYWR5KWQ9bmV3IHRjKGQpLGQuamF8fHRoaXMuSChkKXx8KHRoaXMuSihkKSwobmV3IHVjKGQsdGhpcy5BKSkuYigpKTtlbHNlIGJyZWFrfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHZjPWMueGl8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5iaD10aGlzLmFbNl07dGhpcy5DdD10aGlzLmFbNV07dGhpcy5ubT10aGlzLmFbNl07dGhpcy5Ebj10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbOV07dGhpcy5laD10aGlzLmFbMTBdO3RoaXMubGs9dGhpcy5hWzFdO3RoaXMuY209dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOF19Yy5Ocj1iO2IucHJvdG90eXBlPXthaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYmg6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkN0Ogp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm06dGhpcy5DbihhKX0sQ246ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRuOnRoaXMudnAoYSl9LHZwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy53cDp0aGlzLkNrKGEpfSxDazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGs6dGhpcy5kaChhKX0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVoOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sazp0aGlzLmJtKGEpfSxibTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY206dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLk5yfHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5haCg0KTsKKGZ1bmN0aW9uKGMpe2MuQ2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlAoYiksdGhpcy5TKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5DaXx8eWM7KGZ1bmN0aW9uKGMpe2MuQmk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuWGUoKX0sWGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8CihiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZSghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgemM9Yy5CaXx8emM7KGZ1bmN0aW9uKGMpe2MuRGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHljKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5JKCk7cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLkRpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtpPXRoaXMuYVsyXTt0aGlzLm91PXRoaXMuYVs4XTt0aGlzLkFxPXRoaXMuYVs0XTt0aGlzLkhqPXRoaXMuYVsxXTt0aGlzLmxqPXRoaXMuYVs2XTt0aGlzLnJpPXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs1XTt0aGlzLmhyPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzEwXX1jLkZzPWI7Yi5wcm90b3R5cGU9e2ppOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5raTp0aGlzLm51KGEpfSxudTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm91OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5BcTp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSGo6dGhpcy5raihhKX0sa2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxqOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5yaTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLm9wOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ocjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIENjPWMuRnN8fENjLHFkPW5ldyBDYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXFkLmppKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlFmPXRoaXMuVGY9dGhpcy5TZj0hMTt0aGlzLlljPVtdO3RoaXMuaWU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PQp0eXBlb2YgQml0bW92aW5EZXRlY3Rpb24/bnVsbDpCaXRtb3ZpbkRldGVjdGlvbixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBUYT9udWxsOlRhLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgWWE/bnVsbDpZYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgZGM/bnVsbDpkYyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB1YT9udWxsOnVhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj8KbnVsbDp5YixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygd2M/bnVsbDp3YyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGNiP251bGw6Y2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIGhiP251bGw6aGIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgemE/bnVsbDp6YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBPYT9udWxsOk9hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBhP251bGw6cGF9fWMuWms9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5ZcChhKTpbXSxiO3RoaXMuVGY9ITA7aWYoYS5sZW5ndGgpe3RoaXMuU2Y9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj0KYVtjXSx0aGlzLm5nKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5pZSl7aWYodGhpcy5RZilicmVhaztiPXRoaXMuaWVbY107dGhpcy54ZShiKSYmKHRoaXMuWWMucHVzaChiKSx0aGlzLm5nKGIpKX19LHhlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2Ygcj8hMDohMX0sWXA6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWM9YVtmXSxjPXRoaXMuaWVbY10sdGhpcy54ZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxuZzpmdW5jdGlvbihhKXt0aGlzLnhlKGEpJiZhLmIoKX0sS3Q6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLlNmKWZvcih0aGlzLlFmPSEwLGE9MDthPHRoaXMuWWMubGVuZ3RoO2ErKyl0aGlzLlljW2FdLnJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuWWNbYV0ucmIpfX19KShjKTt2YXIgRGM9Yy5aa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpvPXRoaXMuYVs5XTt0aGlzLnRqPXRoaXMuYVs2XTt0aGlzLmFwPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzddfWMuRXM9YjtiLnByb3RvdHlwZT17SW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpvOnRoaXMuc2ooYSl9LHNqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50ajp0aGlzLiRvKGEpfSwkbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgRWM9Yy5Fc3x8RWMscmQ9bmV3IEVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuSW8oNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlRiKGwuTnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlRiKGwuU3IpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7CnZhciBzZD1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGVhPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBGPW5ldyBRLGs9ITE7Ri5aYigpO0YuS2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLlpiKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5LZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuWmIoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csRi5KcSgpLHtpZDp0ZH0pfSw1MDApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnI9dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzZdfWMuVGw9YjtiLnByb3RvdHlwZT17WXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5acjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMuVGx8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLllyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5pZz10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuVGM9MDt0aGlzLk5hPSIiO3RoaXMuWmM9W107dGhpcy4kYz0wO3RoaXMuamc9ITE7dGhpcy5nZT1bXX1jLlhnPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3RoaXMuaWc9YX0sYmQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLk5hPXRoaXMucGxheWVyLkwoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxudDpmdW5jdGlvbihhKXt0aGlzLlVhPWF9LG10OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj0KYX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxlYzpmdW5jdGlvbihhLGIpe2UuaWIoIndlbHQuZGUiKSYmZS5MYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5VYSk7dmFyIGM9ITEsZj0hMTtpZih0aGlzLktxKCkpdGhpcy5VYS5jKHRoaXMuVWEuT2MsdGhpcy5VYS5BYSx0aGlzLlVhLmhlLGZ1bmN0aW9uKCl7dGhpcy5lYyhhLApiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkVjKTtlbHNlIGlmKHRoaXMubnEoKSl0aGlzLmt0KGZ1bmN0aW9uKCl7dGhpcy5lYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5EKGwuQmMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuTHQoKTtrLmV4aXRGdWxsc2NyZWVuKCk7Uj1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLnFnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLklyKGEpOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5QZCYmKGM9dGhpcy5wbGF5ZXIuUGQoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2suUmQoYSwKYyxmKTt0aGlzLnBsYXllci5yZyhrKX19LEtxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuVGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5UYy5nZXRUaW1lKCksdGhpcy5UYz1hLDNFNTxiPyEwOiExO3RoaXMuVGM9YTtyZXR1cm4hMX0sRXQ6ZnVuY3Rpb24oKXtlLm1lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubGYoYSkpP3RoaXMuZWMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5EKGwuQ2MsdGhpcy5wbGF5ZXIuQigpKSl9LER0OmZ1bmN0aW9uKGEpe2UubWUoInBvc3Ryb2xsIik7aWYoIXRoaXMuaWcpe3RoaXMuc3QoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikpOwooYz10aGlzLmxmKGMpKT90aGlzLmVjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQobC5DYyx0aGlzLnBsYXllci5CKCkpKX19LGxmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxkdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnh0KHRoaXMuRHQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sZGQ6ZnVuY3Rpb24oYSl7ZS5tZSgibWlkcm9sbCIpO2lmKCF0aGlzLllmKXt0aGlzLllmPSEwO3ZhciBiPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMudGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLmVjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllmPSExfS5iaW5kKHRoaXMpLDFFMykpOgoodGhpcy5wbGF5ZXIucGxheSgpLGUuRChsLkNjLHRoaXMucGxheWVyLkIoKSkpfX0sY3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5ydCh0aGlzLmRkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlZkKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLkV0KCk7dGhpcy5wbGF5ZXIuVmQmJnRoaXMuY3QoKTt0aGlzLmR0KCl9LGV0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuWmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLnd2KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy4kYz10aGlzLlpjLmxlbmd0aH0sbnE6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLiRjJiYoYT0hMCk7cmV0dXJuIGF9LGt0OmZ1bmN0aW9uKGEpe3RoaXMuamc9YTtmb3IoYT0wO2E8dGhpcy5aYy5sZW5ndGg7YSsrKXRoaXMuWmNbYV1bImZ1bmN0aW9uIl0odGhpcy5Rcy5iaW5kKHRoaXMpKX0sUXM6ZnVuY3Rpb24oYSl7dGhpcy4kYy0tO2EmJnRoaXMuZ2UucHVzaChhKTswPj10aGlzLiRjJiZ0aGlzLmpnKCl9LElyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmdlLmxlbmd0aDtjKyspYj10aGlzLmdlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBnYT1jLlhnfHxnYSxSPSExLGxhPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVoPXRoaXMuYVs4XTt0aGlzLm9pPXRoaXMuYVsxMF07dGhpcy5icz10aGlzLmFbN107dGhpcy5PaD10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs2XX0KYy5Ucj1iO2IucHJvdG90eXBlPXtUaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVWg6dGhpcy5uaShhKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vaTp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnM6dGhpcy5OaChhKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9oOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy5Ucnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9dmQuVGgoNCl9KS5jYWxsKEVhcnVmYUpvTWFoc2hlTGksRWFydWZhSm9NYWhzaGVMaSk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.101.112 Wilmington, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-101-112.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
4ca761566d6efd4d84cc704d3c6e61132e2163d17707ec72415c82ab22d2fe87

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

Response headers

Date
Fri, 21 Sep 2018 14:34:08 GMT
Via
1.1 fa5a3d5abd34c6fac657b045a4dcbdc5.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
48
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
221
Last-Modified
Fri, 21 Sep 2018 14:32:18 GMT
Server
AmazonS3
ETag
"5082c0dc646eb9223054358caad7d94e"
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
7xCUqJ_6eLFm8Hd7IXN4nQKKN4sZFspO1tdHeJuwmehLPG8SZO8Q4Q==
Expires
0
bridge3.236.0_de.html
imasdk.googleapis.com/js/core/ Frame BA72
0
0
Document
General
Full URL
https://imasdk.googleapis.com/js/core/bridge3.236.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:81f::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 1; mode=block

Request headers

:method
GET
:authority
imasdk.googleapis.com
:scheme
https
:path
/js/core/bridge3.236.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/
accept-encoding
gzip, deflate
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/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
170272
date
Mon, 17 Sep 2018 17:36:03 GMT
expires
Tue, 17 Sep 2019 17:36:03 GMT
last-modified
Mon, 17 Sep 2018 17:26:46 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
1; mode=block
cache-control
public, max-age=31536000
age
344076
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
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
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
216.58.205.230 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s24-in-f230.1e100.net
Software
sffe /
Resource Hash
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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

Response headers

date
Fri, 21 Sep 2018 17:10:39 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="44,43,39,35"
content-length
10523
x-xss-protection
1; mode=block
expires
Fri, 21 Sep 2018 17:10:39 GMT
/
ssl.1.damoh.golem.de/d5a86b046d006a032b7d94f27c7b10c6bc1cbfea/
221 B
1 KB
XHR
General
Full URL
https://ssl.1.damoh.golem.de/d5a86b046d006a032b7d94f27c7b10c6bc1cbfea/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIEVhcnVmYUpvTWFoc2hlTGk9RWFydWZhSm9NYWhzaGVMaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3kuJGR8fCh5LiRkPTApO3kuJGQrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS4kZCYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihrKXtrLnBhdXNlQnV0dG9ufHwoay5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKay5wbGF5QnV0dG9ufHwoay5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay5tdXRlQnV0dG9ufHwoay5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay51bm11dGVCdXR0b258fChrLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnNraXBhYmxlQnV0dG9ufHwoay5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC42O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0pO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTsKay5za2lwQnV0dG9ufHwoay5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0iKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGsuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307ay5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLkxhKGEsYixbXSxjLGMsbSl9KX1tLmMoay5nbG9iYWxDb25maWcsay5jbGllbnRDb25maWcsay5wcmVjaGVja2VkLGsub25SZWFkeSxrLm9uRmFpbHVyZSxrKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1rLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZWEoZGEsNTApfWZ1bmN0aW9uIGZhKGMsYil7Ynx8KGI9InByZSIpO2lmKGsmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTihjKSxhPW5ldyBPKGEsbSksZz1rLmFkVGFnOyJwcmUiPT1iJiZrLnByZXJvbGxBZFRhZyYmKGc9ay5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmay5wb3N0cm9sbEFkVGFnJiYoZz1rLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5xZyhrKSxhLlJkKGcpKX1lbHNlIGVhKGZ1bmN0aW9uKCl7ZmEoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihrJiZtKXsoay5hZFRhZ3x8ay5wcmVyb2xsQWRUYWcpJiZjLnBhdXNlKCk7ZS5EKGwuQmMsYy5CKCkpO2lmKGMuZ2V0Q3VycmVudFRpbWUpe3ZhciBhPWMuZ2V0Q3VycmVudFRpbWUoKTthJiZlLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLm9hPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuYmQoYyk7YS5udChtKTthLm10KGspO2EuZXQoKTthLmIoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cShjLGIpfS5iaW5kKHRoaXMpLDUwKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kbD10aGlzLmFbNl07dGhpcy5tcz10aGlzLmFbMTBdO3RoaXMuaWw9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzhdOwp0aGlzLnJuPXRoaXMuYVsxXTt0aGlzLmNwPXRoaXMuYVs5XTt0aGlzLkhsPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzldfWMuR289YjtiLnByb3RvdHlwZT17Wmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRsOnRoaXMubHMoYSl9LGxzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5tczp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaWw6dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZsOnRoaXMucW4oYSl9LHFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY3A6dGhpcy5HbChhKX0sR2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy5Hb3x8aGEsSGM9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUhjLlpsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZhPSJzZXR1cCI7dGhpcy5nYz1bXTt0aGlzLiRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuUHMuYmluZCh0aGlzKSl9Yy5MaT1iO2IucHJvdG90eXBlPXskZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxXbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJgphLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFBzOmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLk9zKGEuZGF0YSl9LE9zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0sd2Q6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sY2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5ScChhKSxkPSExO2lmKGIpcmV0dXJuIGE9YS5yZXBsYWNlKGIsIiIpKyIvZGV2L2hvbWFkX3VybC8iK2IrIi8iLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywKIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSx0aGlzLlZmKGEsIlBPU1QiLHt9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sUnA6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFVtOmZ1bmN0aW9uKGEsYil7aWYoYT09Yil7aWYoZS5FcChhKSlyZXR1cm47KGI9dGhpcy5jZihhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMubGEudXJsc1thXT1iO3RoaXMubGEudXJsc1tiXT1hO3RoaXMubGEuaG9tYWRVcmxzW2FdPWI7dGhpcy5sYS5vcmlnaW5hbFVybHNbYl09YX0sRXA6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5ob21hZFVybHNbYV0mJihiPXRoaXMubGEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sbmY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMubGEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWmE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxTcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sRWE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSx1ZjpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sSnQ6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sTWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sTmY6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGtiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/CjY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LHRnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEk9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKwoxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1rO3c9STtxPW07Zm9yKGY9CjA7MTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8fm4mdykrcStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpK3EraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZj00MDs1OT49ZjtmKyspcj1kKGMsNSkrKG4mbHxuJnd8bCZ3KStxK2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedykrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtrPWsrbCY0Mjk0OTY3Mjk1O0k9SSt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoaykrYihJKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiIiLGQsZixjLGgsZSx1LGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfGM+PjYsdT1jJjYzLGlzTmFOKGYpP2U9dT02NDppc05hTihjKSYmKHU9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sUXE6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmCi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sZmY6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxjPSExLGg9ITEsZT0hMSx1PSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocSl7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlFuPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSwKaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1jO2EuaXNGaXJlZm94PWg7YS5pc1NhZmFyaT1lO2EuaXNJRT11O2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxMcDpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuZmYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxYYTpmdW5jdGlvbigpe3ZhciBhPXt0aDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwKRWg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sc3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sbG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LE9uOmZ1bmN0aW9uKCl7cmV0dXJuIGEudGgoKXx8YS5FaCgpfHxhLnNxKCl8fGEuTGsoKXx8YS5sbSgpfX07cmV0dXJuIGEuT24oKX0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxBZjpmdW5jdGlvbihhKXthPXRoaXMuTWEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxpYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxGdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LHJmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5JZyhiKSsiOiIrdGhpcy5JZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sSWc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPgphPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkZhOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxUYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9bC5JYyhiLGQpKTtiJiYoaD1sLkljKGEsYikpO2YmJihoPWwuSWMoaCxmKSk7YyYmKGg9bC5JYyhoLGMpKTtlLlRiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uWil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uamUoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uS2EoZiwhMCk7Zj1tLkthKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uR2EoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sU2Q6ZnVuY3Rpb24oKXttJiZtLlo/bS5pc0VuYWJsZWQmJm0uaW8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2QoKX0uYmluZCh0aGlzKSw1MDApfSxIZDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVGEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LElkOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxUYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLk5jKGEpOiIifSxOYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLklkKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmCihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhuOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuU2MoYSl8fHRoaXMuU3EoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94Lm9nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpJiZ0aGlzLlphKCJlcnJfdXJsIixhKTtpZih0aGlzLm5mKGEpKXJldHVybiB0aGlzLm5mKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjtkJiYoZi5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtmLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2YuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjt2YXIgYz0hMTtkPSExO2Q9dGhpcy5MYShhLGIudWEsZixmdW5jdGlvbihhKXtjPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2N8fChjPWQpLGM9SlNPTi5wYXJzZShjKX1jYXRjaChoKXtjPSExfWMudXJsJiZjLmhhc2gmJihjPWIuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuVW0oYyxhKTtyZXR1cm4gY30sTGE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSx1KXt2YXIgaz1ofHxtO2g9ITA7dSYmKGg9ITEpO2lmKGsmJmsuWilpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suS2EoYSxoKTtoPWsuS2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5HYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxWZjpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sQXI6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuVmYoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuZ2MpZm9yKHZhciBjIGluIHRoaXMuZ2MpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5nY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueWIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sV2Y6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLGYudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkFyKGYuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LHR0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdjPWF9LHd2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5MYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxQbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE9xOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUD1jLkxpfHxQO25ldyBQO3ZhciBlPW5ldyBQO3dpbmRvdy5Odj1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLktpPWI7Yi5JYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuSnM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuUHI9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmd2PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IucnA9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5udj17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1tPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLkdtPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5KbT17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5PbT17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuRm09e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLkhtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuUXU9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk9yPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnNwPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5tdj17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xbz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnZvPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuQ2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5CYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuTG09e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkttPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5RZT17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuUGU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuUG09e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5JbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTnU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Tcj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBsPWMuS2l8fGw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGo9dGhpcy5hWzEwXTt0aGlzLmpwPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzRdfWMuQ289YjtiLnByb3RvdHlwZT0Ke09qOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Qajp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuanA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgaWE9Yy5Db3x8aWEsSmM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMuT2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5NaT1iO2IucHJvdG90eXBlPXtKZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sZWI6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KSsKbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxVcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxKYzpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMuSmMoYSsKNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuSmMoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxaYjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkpkKHRoaXMuZWIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5KYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sSnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aYigpKyIyIn0sS2Y6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KZCh0aGlzLlVwKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuSmMoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBRPQpjLk1pfHxRO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdoPXRoaXMuYVs2XTt0aGlzLkdxPXRoaXMuYVsxMF07dGhpcy50bj10aGlzLmFbM107dGhpcy5jaT10aGlzLmFbOF07dGhpcy5Vbj10aGlzLmFbNF07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLldqPWI7Yi5wcm90b3R5cGU9e2ZoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5naDp0aGlzLkZxKGEpfSxGcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdxOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50bjp0aGlzLmJpKGEpfSxiaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNpOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vbjp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sCmY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGphPWMuV2p8fGphLEtjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLmZoKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmo7dGhpcy5qPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWc7cmV0dXJuIGZ9fShjLApnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmM/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5DZT1ifSkoYyk7dmFyIEo9Yy5DZXx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5HdT10aGlzLmFbOV07dGhpcy50cj10aGlzLmFbMl07dGhpcy5yaz10aGlzLmFbMTBdO3RoaXMucnM9dGhpcy5hWzldO3RoaXMuamo9dGhpcy5hWzFdO3RoaXMuams9dGhpcy5hWzRdO3RoaXMuS2g9dGhpcy5hWzNdO3RoaXMucG89dGhpcy5hWzRdO3RoaXMuemw9dGhpcy5hWzldO3RoaXMuSHQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuUm89YjtiLnByb3RvdHlwZT17RnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5HdTp0aGlzLnNyKGEpfSxzcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHI6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLnFzKGEpfSxxczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnM6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qajp0aGlzLmlrKGEpfSxpazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuams6dGhpcy5KaChhKX0sSmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5LaDp0aGlzLm9vKGEpfSxvbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucG86dGhpcy55bChhKX0seWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpsOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5IdDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIGthPWMuUm98fGthLExjPW5ldyBrYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1MYy5GdSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLllrPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9e307dGhpcy5BPW51bGw7dGhpcy5kYz0xMDA7dGhpcy5sYj0wO3RoaXMud2E9MTUwO3RoaXMucmI9MDt0aGlzLm90KGIpfSxiOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YT8odGhpcy5sYisrLHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpOjA+dGhpcy53YSYmKHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpfSxodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiPnRoaXMud2E/ITA6ITF9LG1nOmZ1bmN0aW9uKCl7dGhpcy5sYj0wfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sCm90OmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxUcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEo6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmViKCldPWI7SyYmSy5UZiYmSy5LdChiKX0sVnY6ZnVuY3Rpb24oKXtyZXR1cm4gZS5FYSh0aGlzLnhhKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy54YSlpZihhPT10aGlzLnhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLnhhW2IuZWIoKV0/ITA6ITF9LFBxOmZ1bmN0aW9uKGIpe2I9Yi5EYSgpO2Zvcih2YXIgYSBpbiB0aGlzLnhhKWlmKGIuaWQ9PXRoaXMueGFbYV0uRGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXc6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5Za3x8cjsoZnVuY3Rpb24oYyl7Yy4kaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLmRjPTEwO3RoaXMubGI9CjA7dGhpcy53YT01MDt0aGlzLks9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLmhmPSExO3RoaXMuTigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuRGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30sZWE6ZnVuY3Rpb24oKXt9LHh0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxXdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LHJ0OmZ1bmN0aW9uKGIpe3RoaXMuV2Q9Yn0sVXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XZH0sVmQ6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLmxiPD10aGlzLndhJiYodGhpcy5sYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLAp0aGlzLmRjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSx0ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxlYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LGt3OmZ1bmN0aW9uKCl7fSxTOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLm9xKCl8fHRoaXMuUm0oKTt0aGlzLm5lKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sUm06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUucGEoMTApKX0sb3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxQOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LERhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFJjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxqYjpmdW5jdGlvbigpe3JldHVybiExfSxjdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxkYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LERiOmZ1bmN0aW9uKCl7dmFyIGI9aztyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFBkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHJnOmZ1bmN0aW9uKGIpe3RoaXMuZ2I9CmJ9LFR2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LGd0OmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxadjpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2ImJihiPSEwKTtyZXR1cm4gYn0sZXc6ZnVuY3Rpb24oKXt0aGlzLmhmfHwodGhpcy5oZj0hMCl9LEtjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFF2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLllnPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuTGU9IjEiO3RoaXMuTWU9IjIiO3RoaXMuem09IjMiO3RoaXMubGM9MDt0aGlzLlpmPTMwO3RoaXMudmI9W107dGhpcy5QYT1bXTt0aGlzLkxiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsCnVua25vd246Nn07dGhpcy5TZT10aGlzLk1nPSExO3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pZD1lLnBhKDEwKTt0aGlzLmJkKGIpO3RoaXMucHQoYSl9LGI6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5NZ3x8KHRoaXMuTWc9ITAsZS5TZCgpKX0sWmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkwoKTtSJiZSLiRiJiYhbGEmJihsYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSx3OmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMudXQoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLkVnKCksdGhpcy5TZT0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaGEoKXx8KHRoaXMudmIucHVzaChiKSx0aGlzLlBhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxFZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIiwKYT1bXTt0aGlzLnZiJiYwPHRoaXMudmIubGVuZ3RoJiYodGhpcy52Yj1lLnVuaXF1ZSh0aGlzLnZiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy52Yi5qb2luKCIsIikpKTtpZih0aGlzLlBhKXtmb3IodmFyIGc9MDtnPHRoaXMuUGEubGVuZ3RoO2crKyl0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXT09dGhpcy5MYltiXSYmYS5wdXNoKHRoaXMuUGFbZ10uZGV0YWlsKSx0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXTx0aGlzLkxiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5QYVtnXS5kZXRhaWwpLGI9dGhpcy5QYVtnXS5yZWFzb24pO3RoaXMuTGJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxZdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNlfSxtOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5MZX0sdXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy5NZX0sdnQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnptfSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGN9LE5lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxlfSxFdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMubGN9LGJkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0scHQ6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sRHI6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLllnfHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZyPXRoaXMuYVs2XTt0aGlzLkZsPXRoaXMuYVs5XTt0aGlzLlduPXRoaXMuYVszXTsKdGhpcy4kZz10aGlzLmFbM107dGhpcy5Rbz10aGlzLmFbNV07dGhpcy5ZbD10aGlzLmFbM107dGhpcy5Ucz10aGlzLmFbOV07dGhpcy5ocz10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs3XX1jLmh1PWI7Yi5wcm90b3R5cGU9e2VyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mcjp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRmw6dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlduOnRoaXMuWmcoYSl9LFpnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGc6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFvOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZbDp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVHM6dGhpcy5ncyhhKX0sZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmc6YX19fSkoYyk7dmFyIG1hPWMuaHV8fG1hLE1jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU1jLmVyKDQpOyhmdW5jdGlvbihjKXtjLlhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGVudEVsKCk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLksmJnRoaXMuSygpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkRlbW9WaWRlb0pTIn19KX0pKGMpO3ZhciBTPWMuWGh8fFM7KGZ1bmN0aW9uKGMpe2MuV2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKTt0aGlzLm1kPW51bGw7dGhpcy5WdT0xRTM7dGhpcy5mZz1udWxsO3RoaXMuZHU9MkUzfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZih3aW5kb3cuZGVtb1BsYXllciYmd2luZG93LlFuKWIub24oInBsYXkiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Iub24oImRpc2FibGUiLHRoaXMuenAuYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0Iix0aGlzLmtxLmJpbmQodGhpcykpO2Iub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuanEoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLll1KGIpfS5iaW5kKHRoaXMpKSwKYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IixmdW5jdGlvbigpe3RoaXMuWnUoYil9LmJpbmQodGhpcykpKTtiLm9uKCJhZGVuZCIsZnVuY3Rpb24oYSl7dGhpcy5pcShhLGIpfS5iaW5kKHRoaXMpKTtiLm9uKCJjb250ZW50cGxheWJhY2siLGZ1bmN0aW9uKGEpe3RoaXMudG8oYSl9LmJpbmQodGhpcykpfSx0bzpmdW5jdGlvbihiKXsiYWRzZXJyb3IiPT1iLnRyaWdnZXJldmVudCYmdGhpcy53KCl9LFl1OmZ1bmN0aW9uKGIpe3RoaXMubWR8fCh0aGlzLm1kPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kdShiKX0uYmluZCh0aGlzKSx0aGlzLlZ1KSl9LCR1OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLm1kKTt0aGlzLncoKX0sWnU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMubWQpfSxpcTpmdW5jdGlvbihiKXt0aGlzLkx2KGIpO3RoaXMuZmc9bmV3IERhdGU7dGhpcy5mZy10aGlzLkxzPHRoaXMuZHU/CnRoaXMudygpOnRoaXMubSgpfSxrcTpmdW5jdGlvbihiLGEpeyFhJiZiLnRhcmdldC5wbGF5ZXImJihhPWIudGFyZ2V0LnBsYXllcix0aGlzLmJkKG5ldyBTKGEpKSk7dGhpcy53KCl9LHpwOmZ1bmN0aW9uKCl7fSxqcTpmdW5jdGlvbigpe3RoaXMuTHM9bmV3IERhdGV9fSl9KShjKTt2YXIgbmE9Yy5XaHx8bmE7KGZ1bmN0aW9uKGMpe2MuWWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmRlbW9QbGF5ZXIpe2lmKHdpbmRvdy52aWRlb2pzJiZ2aWRlb2pzLnBsYXllcnMmJjA8ZS5FYSh2aWRlb2pzLnBsYXllcnMpKXt2YXIgYj12aWRlb2pzLnBsYXllcnMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPW5ldyBTKGJbYV0pO3RoaXMuSChnKXx8KHRoaXMuSihnKSwobmV3IG5hKGcsdGhpcy5BKSkuYigpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIG9hPWMuWWh8fG9hLHBhPW5ldyBvYShxKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHM9dGhpcy5hWzVdO3RoaXMuZnA9dGhpcy5hWzVdO3RoaXMuRnI9dGhpcy5hWzhdO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMua209dGhpcy5hWzddO3RoaXMudXE9dGhpcy5hWzRdO3RoaXMuZm49dGhpcy5hWzddO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLnhtPXRoaXMuYVsxMF07dGhpcy5maz10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVsyXX1jLlpuPWI7Yi5wcm90b3R5cGU9e0NzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Eczp0aGlzLmVwKGEpfSxlcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnA6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Gcjp0aGlzLnZrKGEpfSx2azpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMud2s6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMua206dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZm46dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnlrOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54bTp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZms6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBxYT1jLlpufHxxYSxOYz1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1OYy5Dcyg0KTsoZnVuY3Rpb24oYyl7Yy5naj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmFjPSExO3RoaXMubWYoKTsKdGhpcy5vZigpO3RoaXMudW89ITF9LG1mOmZ1bmN0aW9uKCl7dGhpcy5hYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYWM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuUChiKX0sb2Y6ZnVuY3Rpb24oKXtpZighdGhpcy5hYyl7dmFyIGI9dGhpcy5EYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYWM9ITApO3RoaXMuUyhhKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpKX0sVmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5kZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuZGQoYSl9LmJpbmQodGhpcykpfSwKZGQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLldkJiYoMCx0aGlzLldkKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6CiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sV2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciByYT1jLmdqfHxyYTsoZnVuY3Rpb24oYyl7Yy5maj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxOOmZ1bmN0aW9uKCl7fSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5uYz0hMTt0aGlzLnVkPTE7dGhpcy5wYz1bXTt0aGlzLmFiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9CnRoaXMubmM9ITE7dGhpcy51ZD0xO3RoaXMucGM9W107dGhpcy5hYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy51ZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuYWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmFiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmFiPSEwKSkpLAphLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuYWI9ITApKTp0aGlzLm0oIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ29tcGxldGUiKTt0aGlzLm5jPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuWmYmJiF0aGlzLmhhKCkmJih0aGlzLmFiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm8oKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubyghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5uYigpLHRoaXMuZ2V0UGxheWVyKCkudW89ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdiO2EmJihhLmFlKCksYS5CYSgpKX19LmJpbmQodGhpcyl9KTsKaWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRDb21wbGV0ZSIpO3RoaXMubmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMubSgib25BZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMubSgib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlpmJiYhdGhpcy5oYSgpJiYodGhpcy5hYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLnBjLmluZGV4T2YoYSkmJnRoaXMucGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5tKCksdGhpcy5uYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMubSgiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLm0oImVtcHR5Iik6KHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLnBjLmxlbmd0aD49dGhpcy51ZCYmdGhpcy5vKCkpfSxEcjpmdW5jdGlvbihiKXt0aGlzLmooIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCk7ZS5KdChhLnZpZGVvVGFnKT9hLmFjP3RoaXMubSgicGxheWVyIGlzIGludmFsZCIpOnRoaXMubmN8fHRoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSw1MCk6KGEubWYoKSxhLm9mKCkpfX0pfSkoYyk7dmFyIHNhPWMuZmp8fHNhOyhmdW5jdGlvbihjKXtjLmhqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuUHAoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT0KYi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0pLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5QcShnKXx8KHRoaXMuSihnKSwKZz1uZXcgc2EoZyx0aGlzLkEpLGcuTigpLGcuYigpKX1lbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0sU3Y6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sUHA6ZnVuY3Rpb24oKXt2YXIgYj1lLk1hKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnliKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmhqfHx0YSx1YT1uZXcgdGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHM9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOV19Yy55aT1iO2IucHJvdG90eXBlPXtjczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZHM6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB2YT1jLnlpfHx2YSxPYz1uZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9T2MuY3MoNCk7KGZ1bmN0aW9uKGMpe2MucG09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb19pZCk7dGhpcy5QKGIpO3ZhciBiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0sYT10aGlzLmdldFJhd1BsYXllcigpO2ImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlMoYik6dGhpcy5JKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSwKTDpmdW5jdGlvbigpe3JldHVybiJYT1pDT00ifX0pfSkoYyk7dmFyIHdhPWMucG18fHdhOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IudHJhY2tlci52YXN0X3ByZXJvbGx8fGIudHJhY2tlci52YXN0X3Bvc3Ryb2xsP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LG86ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHhhPWMub218fHhhOyhmdW5jdGlvbihjKXtjLnFtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmCndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyYmMDxlLkVhKHdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcykpe3ZhciBiPXdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YlthXTtpZihnLmNvbnRyb2xzJiZnLmNvbnRyb2xzLnBsYXllcilnPW5ldyB3YShnKSx0aGlzLkgoZyl8fCh0aGlzLkooZyksKG5ldyB4YShnLHRoaXMuQSkpLmIoKSk7ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19KX0pKGMpO3ZhciB5YT1jLnFtfHx5YSx6YT1uZXcgeWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMTBdfWMuYWo9YjtiLnByb3RvdHlwZT17a3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmxwOgp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEFhPWMuYWp8fEFhLFBjPW5ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLmtwKDQpOyhmdW5jdGlvbihjKXtjLmVtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlAoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUyhiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sTDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oYil7dGhpcy5xYihiKX0uYmluZCh0aGlzKSl9LHFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLksmJnRoaXMuSygpfSxSYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0sCmlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciBCYT1jLmVtfHxCYTsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5LZz0hMDt0aGlzLnlkPXRoaXMuSGY9ITE7dGhpcy5hZygpO3RoaXMuZW8oKTt0aGlzLkhhKCl9LGZ3OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKY29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuZWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuYmEsIjsiLHR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLnFkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnJkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi54ZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnhkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMua2cpfSxmYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmCih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LExjOmZ1bmN0aW9uKCl7aWYoIXRoaXMubWEpe3ZhciBiPXRoaXMuZmIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSx3ZjpmdW5jdGlvbigpe2lmKCF0aGlzLlliKXt2YXIgYj10aGlzLmZiKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWWI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlliPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWWJ9LApOcTpmdW5jdGlvbigpe2lmKCF0aGlzLkdmKXt2YXIgYj10aGlzLmZiKCksYT10aGlzLkxxKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5HZj0hMCl9cmV0dXJuIHRoaXMuR2Z9LExxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy50YyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMudGM9ITApO3JldHVybiB0aGlzLnRjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTGMoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksCmIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxrZTpmdW5jdGlvbigpe3RoaXMueWQ9ITA7dmFyIGI9dGhpcy53ZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmCmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLk5ifHwodGhpcy5sKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5YKCksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sUnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmJmJiZiLmFkcyYmKHRoaXMuYmY9Yi5hZHMpO3JldHVybiB0aGlzLmJmfSxlbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlgoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7CmIub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5aZCgpfS5iaW5kKHRoaXMpKX0sZWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLndmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZigpfS5iaW5kKHRoaXMpLDUwKX0sYWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTnEoKSl7dmFyIGE9dGhpcy5mYigpLGc9dGhpcy5MYygpO2EmJmcmJih0aGlzLmZiKCksdGhpcy5MYygpLAp0aGlzLnlkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWQ/dGhpcy5tKCk6KHRoaXMuWCghMCksdGhpcy5sKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuZmIoKX1lbHNlIHRoaXMuSGY/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmZiKCksYj10aGlzLkxjKCk7YSYmIWI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5YKCkpOih0aGlzLlgoITApLHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLkhmPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWcoKX0uYmluZCh0aGlzKSw1MCl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9CiEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5VPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMucWEoKTticmVha319LGZvOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLlFiIT1iLmFkcy5zdGF0ZSYmKHRoaXMuUWI9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuUWIpe3RoaXMubSgiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5RYj0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZm8oKX0uYmluZCh0aGlzKSwxMCl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMDt0aGlzLm0oImVtcHR5IHZhc3QiKX0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLmhhKCl8fChifHwKKHRoaXMuS2c9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuS2csZnVuY3Rpb24oKXt0aGlzLmVmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxvOmZ1bmN0aW9uKCl7dGhpcy5hd3x8KDEwPHRoaXMuV3U/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLld1KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuZnQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubG8oKX0uYmluZCh0aGlzKSw1MCkpKX0sZnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuWHUpe3RoaXMuWHU9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5YLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiKwphLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBDYT1jLmRtfHxDYTsoZnVuY3Rpb24oYyl7Yy5mbT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy54Zyh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMueGcoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5FYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBCYShiW2ddKSxhLmphfHx0aGlzLkgoYSl8fAohMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkooYSksKG5ldyBDYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy5yYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmRjKX19KX0pKGMpO3ZhciBEYT1jLmZtfHxEYSxFYT1uZXcgRGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenM9dGhpcy5hWzJdO3RoaXMuc3U9dGhpcy5hWzhdO3RoaXMuSmo9dGhpcy5hWzJdO3RoaXMuJGk9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5Scz1iO2IucHJvdG90eXBlPXt5czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenM6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnN1OnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KajoKdGhpcy5aaShhKX0sWmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgRmE9Yy5Sc3x8RmEsUWM9bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMueXMoNCk7KGZ1bmN0aW9uKGMpe2MuUmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5QKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlMoYSl9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7CmEuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEdhPWMuUmx8fEdhOyhmdW5jdGlvbihjKXtjLlFsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkFiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmhjPSExO3RoaXMubGcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubSgpOwplbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuaGM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy54YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlllKCk6dGhpcy5tKCl9LHhjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5tKCk7ZWxzZXtpZigxMDA5PT0KZ3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5oYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuaGM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy54Yy5iaW5kKHRoaXMpLDEwMCl9fSxZZTpmdW5jdGlvbigpe2lmKCF0aGlzLmhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09CmIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQWImJih0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWWUuYmluZCh0aGlzKSwKNTApfX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5oYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubSgpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGE9Yy5RbHx8CkhhOyhmdW5jdGlvbihjKXtjLlNsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBHYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSGEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIElhPWMuU2x8fElhLEphPW5ldyBJYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DdT10aGlzLmFbNV07dGhpcy5Bbz10aGlzLmFbNl07dGhpcy5Nbz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLldxPWI7Yi5wcm90b3R5cGU9e0J1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5DdTp0aGlzLnpvKGEpfSwKem86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFvOnRoaXMuTG8oYSl9LExvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Nbzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEthPWMuV3F8fEthLFJjPW5ldyBLYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkJ1KDQpOyhmdW5jdGlvbihjKXtjLnhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMuJGY9YX0sTjpmdW5jdGlvbigpe30sVGQ6ZnVuY3Rpb24oYil7dGhpcy4kZj1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy4kZikucGFyZW50Tm9kZTt0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIExhPWMueGh8fExhOyhmdW5jdGlvbihjKXtjLndoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmooYixhKX0sVGQ6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBNYT1jLndofHxNYTsoZnVuY3Rpb24oYyl7Yy55aD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBMYShkLAphKSx0aGlzLkgoZCl8fChkLlRkKGEpLHRoaXMuSihkKSxkPW5ldyBNYShkLHRoaXMuQSxnKSxkLlRkKGcpLGQuYigpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE5hPWMueWh8fE5hLE9hPW5ldyBOYShmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzhdO3RoaXMuYmw9dGhpcy5hWzhdO3RoaXMuU3U9dGhpcy5hWzldO3RoaXMuSmw9dGhpcy5hWzJdO3RoaXMuQWs9dGhpcy5hWzddO3RoaXMuRXU9dGhpcy5hWzFdO3RoaXMuZG49dGhpcy5hWzFdO3RoaXMucXU9dGhpcy5hWzJdO3RoaXMuT289dGhpcy5hWzFdO3RoaXMueXY9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5Jcz1iO2IucHJvdG90eXBlPXtsbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWw6dGhpcy5hbChhKX0sYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ibDp0aGlzLlJ1KGEpfSxSdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU3U6dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpsOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkV1OnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kbjp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucXU6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9vOnRoaXMueHYoYSl9LHh2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueXY6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBQYT1jLklzfHxQYSxTYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MubGwoNCk7KGZ1bmN0aW9uKGMpe2MuVWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nYW1lQ29udGFpbmVyWzBdO3RoaXMuUChiKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMudmlkZW9UYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpLGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxYYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmCihiPSEwKTtyZXR1cm4gYn0sTDpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgUWE9Yy5Vanx8UWE7KGZ1bmN0aW9uKGMpe2MuVGo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuWGEoKT8oJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0YXAiLGZ1bmN0aW9uKCl7dGhpcy5vYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSkpOnRoaXMub2MoKX0sb2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/CnRoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpO3ZhciBSYT1jLlRqfHxSYTsoZnVuY3Rpb24oYyl7Yy5Waj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuTklDSyYmTklDSy5HYW1lTG9hZGVyJiZOSUNLLkdhbWVMb2FkZXIuZ2FtZUNvbnRhaW5lcil7dmFyIGI9bmV3IFFhKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgUmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFNhPWMuVmp8fFNhLFRhPW5ldyBTYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbj10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzEwXTt0aGlzLk1oPXRoaXMuYVs4XTsKdGhpcy5ycj10aGlzLmFbNF07dGhpcy5hbz10aGlzLmFbOF07dGhpcy5BdD10aGlzLmFbN107dGhpcy5Ccz10aGlzLmFbNF07dGhpcy5RaD10aGlzLmFbOV07dGhpcy5qcj10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLnBzPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYms6dGhpcy5MaChhKX0sTGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1oOnRoaXMucXIoYSl9LHFyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucnI6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFvOnRoaXMuenQoYSl9LHp0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5BdDp0aGlzLkFzKGEpfSxBczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQnM6dGhpcy5QaChhKX0sUGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlFoOgp0aGlzLmlyKGEpfSxpcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuanI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBVYT1jLnBzfHxVYSxUYz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5Mbig0KTsoZnVuY3Rpb24oYyl7Yy5Oaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLlAoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlMoYik6dGhpcy5kYSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5lYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS4kYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5hZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuYmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuYmUrKztpZigxMDx0aGlzLmJlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfX0pfSkoYyk7dmFyIFZhPWMuTmt8fFZhOyhmdW5jdGlvbihjKXtjLk1rPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuR2QpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuR2Q9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnhwPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLnhwPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuTXMoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFdhPWMuTWt8fFdhOyhmdW5jdGlvbihjKXtjLk9rPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVmEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBXYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWGE9Yy5Pa3x8WGEsWWE9bmV3IFhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF1PXRoaXMuYVsxXTt0aGlzLldnPXRoaXMuYVs3XTt0aGlzLnlqPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMucGo9YjtiLnByb3RvdHlwZT17enU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkF1OnRoaXMuVmcoYSl9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV2c6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnlqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIFphPWMucGp8fFphLFVjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1VYy56dSg0KTsoZnVuY3Rpb24oYyl7Yy5GaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUChiLmVsZW1lbnQpO3RoaXMuUyhiLmVsZW1lbnQpfSxEYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZmluaXNoKCl9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSGl0Ym94In19KX0pKGMpO3ZhciAkYT1jLkZpfHwkYTsoZnVuY3Rpb24oYyl7Yy5FaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudygpfX0pfSkoYyk7dmFyIGFiPWMuRWl8fGFiOyhmdW5jdGlvbihjKXtjLkdpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoaXRib3guYWRibG9ja2VyIixmdW5jdGlvbihiKXtiPW5ldyAkYShiLmRldGFpbCk7Yi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgYWIoYix0aGlzLkEpKS5iKCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBiYj1jLkdpfHxiYixjYj1uZXcgYmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnpuPXRoaXMuYVs1XTt0aGlzLlZvPXRoaXMuYVszXTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLlNpPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzRdfWMucnE9YjtiLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpuOnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wbzp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhyOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBkYj1jLnJxfHxkYixWYz1uZXcgZGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1WYy55big0KTsoZnVuY3Rpb24oYyl7Yy5jaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUudWYoYiwiZWxlbWVudElEIik7dGhpcy5oZz1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlAoZyk7dGhpcy5TKGcpO3RoaXMuR2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5HYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuR2MpfSxXYTpmdW5jdGlvbigpe3JldHVybiEwfSxrbzpmdW5jdGlvbigpe2UuTWYodGhpcy5HYyk7ZS5OZih0aGlzLkdjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua28oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sUGQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBlYj1jLmNqfHxlYjsoZnVuY3Rpb24oYyl7Yy5iaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudyghMCl9fSl9KShjKTt2YXIgZmI9Yy5ianx8ZmI7KGZ1bmN0aW9uKGMpe2MuZGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy53YT0xNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsuaW5yZWFkKXt2YXIgYj1rLmlucmVhZCxhPWUudWYoYiwiZWxlbWVudElEIik7CmUuTWYoYSkmJihiPW5ldyBlYihiKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBmYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGdiPWMuZGp8fGdiLGhiPW5ldyBnYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55dT10aGlzLmFbMV07dGhpcy5MdT10aGlzLmFbMl07dGhpcy54bj10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLkh1PWI7Yi5wcm90b3R5cGU9e3h1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dTp0aGlzLkt1KGEpfSxLdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHU6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYj1jLkh1fHxpYixXYz1uZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1XYy54dSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuTmk9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0scXQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxTbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLk5pfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmcsZCxjKXt0aGlzLklhPWE7dGhpcy5xZj10aGlzLlVnPSExO3RoaXMuYmc9ZDt0aGlzLnlnPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLklhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnRiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLk5kKHRoaXMuSWEudXJsKSYmbS5oZCl7dmFyIGg9bmV3IHooYS51cmwpO2gucXQoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYKKGI9ITApO2J8fG0uZ2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXttLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5PaT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5xZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMueWc/dGhpcy50Yi5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCExKTp0aGlzLnRiLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITApLHRoaXMuVWd8fCh0aGlzLnRiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksInVuZGVmaW5lZCIhPXR5cGVvZiBrJiZrJiZrLnZwYWlkJiZtJiZtLlNjKHRoaXMuSWEudXJsKSx0aGlzLnRiLnNlbmQoYSl9Y2F0Y2goYyl7bSYmbS5OZCh0aGlzLklhLnVybCk/bS5oZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLk5kKHRoaXMuSWEudXJsKSx0aGlzLmJnJiZ0aGlzLmJnKCl9cmV0dXJuIHRoaXMudGJ9fX0pKGMpO3ZhciBqYj1jLk9pfHxqYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnpkPXRoaXMuYmI9bnVsbDt0aGlzLkhvPXRoaXMub2I9dGhpcy5VZj0hMTt0aGlzLnVhPSIiO3RoaXMuUGY9ITE7dGhpcy5BYT10aGlzLk9jPSIiO3RoaXMuTGY9dGhpcy5aPXRoaXMuaXNFbmFibGVkPXRoaXMuaGU9ITE7dGhpcy5PYT1bXTt0aGlzLkVmPXRoaXMuRmI9IiI7dGhpcy5FZD0hMTt0aGlzLnRlPQowO3RoaXMuR2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5FZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMua2M9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRmU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMucGI9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMudWU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5LZD0hMTt0aGlzLm1vPXRoaXMuamQ9bnVsbDt0aGlzLnVnPXRoaXMuaWM9dGhpcy5MZz10aGlzLndlPXRoaXMuaGQ9dGhpcy5BZD10aGlzLm1jPSExO3RoaXMuUWE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuUGk9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsCmFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmJiLGFkdGFncmVnZXg6dGhpcy56ZCxqc3BvcHVwczp0aGlzLlVmLHNpZGVsb2Fkczp0aGlzLm9iLGRpc2FibGV0ZXN0czp0aGlzLkhvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuUGYsZ2xvYmFsQ29uZmlnOnRoaXMuT2MsY2xpZW50Q29uZmlnOnRoaXMuQWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5aLGlzQmxvY2tlZDp0aGlzLkxmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMuRWYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5FZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy50ZSxIT01BRF9WRVJJRklFRDp0aGlzLkdlLEhPTUFEX0JMT0NLRUQ6dGhpcy5FZSxIT01BRF9OT0JMT0NLRVI6dGhpcy51YixIT01BRF9BREJMT0NLRVI6dGhpcy5rYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRmUsdGVzdEhpZGU6dGhpcy5IYiwKdGVzdFRhZ3M6dGhpcy5wYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMudWUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5LZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1vLGFkQmxvY2tlckRldGVjdGVkOnRoaXMubWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLkFkLHVzZVN0cmljdENoZWNrczp0aGlzLmhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndlLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUWEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMucGcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuaWMsc2tpcEFsbG93ZWQ6dGhpcy51Z319LG1xOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJihhPSEwKTtyZXR1cm4gYX0sbGU6ZnVuY3Rpb24oYSl7dGhpcy5RYVthXT0KITB9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0scWU6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5QbihhKX0sS2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLAplPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5TYyhhKTtlPXRoaXMuTWEoYSk7Yz8odGhpcy5iYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5qZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLk9ifHx0aGlzLmJifHx0aGlzLnpkKSYmKGs9dGhpcy5LcihrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLlNwKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7KGM9Yy5leGVjKGEpKSYmKGNbMl18fGNbNV0pP2I9ITA6dGhpcy5iYygpJiYoYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChjPWMuZXhlYyhhKSkmJmNbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZDpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7YyYmKGNbMl18fGNbNV0pP2I9ITA6Yj10aGlzLlNjKGEpO3JldHVybiBifSwKU3A6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnVhJiYwPHRoaXMudWEubGVuZ3RoKXJldHVybiB0aGlzLnVhO2ZvcihjIGluIHRoaXMudWEpaWYoYj10aGlzLnVhW2NdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSnY7cmV0dXJuIm5vbmUifSxRYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMucGddfSxqZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUWMoKSxiPXRoaXMudGcoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGM9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitjW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpjLmxlbmd0aCldKX0sS3I6ZnVuY3Rpb24oYSl7dGhpcy5PYiYmKGErPXRoaXMuT2IpO2lmKHRoaXMuYmIpZm9yKHZhciBiIGluIHRoaXMuYmIpdGhpcy5iYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsCnRoaXMuYmJbYl0pKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsYyxmLGUsaCl7bT10aGlzO3RoaXMuUGY9ITA7dGhpcy5PYz1hO3RoaXMuQWE9Yjt0aGlzLmhlPWM7dGhpcy5qZD1mO3RoaXMuRWM9ZTt0aGlzLkViPWh8fHt9O3RoaXMuenIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQWEpdGhpcy54cigpO2Vsc2UgdHJ5e3RoaXMuQWE9YigpLHRoaXMuemMoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWWE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goYyl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LHpyOmZ1bmN0aW9uKCl7dGhpcy5HYShuZXcgeih0aGlzLk9jK3RoaXMucmMoImdsb2JhbCIpKSx0aGlzLmZxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx4cjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQWErdGhpcy5yYygiY2xpZW50IikpO3RoaXMuR2EobmV3IHoodGhpcy5BYSt0aGlzLnJjKCJjbGllbnQiKSksdGhpcy56Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5sZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scmM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMua2IoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkFkKXt0aGlzLkFkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLkVjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRWM/dGhpcy5FYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5aPXRoaXMuTGY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMuRWUpKTt0aGlzLnNiKCk7ZS5UYihsLkpzKTsoYj1lLkFmKHRoaXMuUWMoKSkpfHwoYj1lLkFmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxmcTpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5aPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuQWF8fHRoaXMuRmJ8fHRoaXMudWF8fHRoaXMuemMoKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5aPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnViKSksdGhpcy5zYigpKX19LHpjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQWF9ZWxzZSBhPXRoaXMuQWE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5PYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuRWY9YS5hZHBhdGh8fCIiO3RoaXMuRWQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5wZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5PYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkZiJiZ0aGlzLnVhJiZ0aGlzLk9hLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKSwKdGhpcy5zYigpKX0sVWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5qZSgpKSxjPXRoaXMuTWEodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMucmMoImN1c3RvbWVyIikpO3RoaXMuR2EoYix0aGlzLk10LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJjdXN0b21lciIpO2E/dGhpcy54bD90aGlzLmdhKCJub1NWTUNvbmZpZyIpOih0aGlzLnhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5VYyghMCl9LmJpbmQodGhpcyksITApfX0sTXQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5oZD10aGlzLkpiKGIuc3RyaWN0KTt0aGlzLndlPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuTGc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnBiPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuYmI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuemQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVWY9Yi5qc3BvcHVwc3x8ITE7dGhpcy5vYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5pYz1iLnZwYWlkfHwhMTt0aGlzLkViLnZwYWlkPXRoaXMuaWM7dGhpcy51Zz0KYi5za2lwYWxsb3dlZHx8ITE7dGhpcy5HYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLiRwKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5FZCYmKHRoaXMuR2I9bnVsbCk7dGhpcy51ZT1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLktkJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5LZD0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmN1KCkmJih0aGlzLkhifHx0aGlzLklifHx0aGlzLnBifHx0aGlzLkdiKT90aGlzLmhlPyh0aGlzLm9hPXRoaXMuWj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy51YikpLHRoaXMuQmQoKSx0aGlzLnNiKCkpOnRoaXMuUHQoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5RdCgpKX19LFB0OmZ1bmN0aW9uKCl7dGhpcy5PdCgpfSxRdDpmdW5jdGlvbigpe3RoaXMuWj0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCl9LGdkOmZ1bmN0aW9uKGEpe3RoaXMubWM9ITA7dGhpcy5afHwodGhpcy5aPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKGEpKSx0aGlzLnNiKCksdGhpcy5CZCgpKX0sT3Q6ZnVuY3Rpb24oKXtpZih0aGlzLkhiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkhiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9Y31jYXRjaChmKXt9YT90aGlzLmdkKHRoaXMua2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLkJnKCl9ZWxzZSB0aGlzLkJnKCl9LEFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLmtiKCkpO3RoaXMuVHQoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnJlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5nZCh0aGlzLmtjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5wYj1udWxsLHRoaXMucmUoKX0sVHQ6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0aGlzLkdhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxCZzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigpKTt0aGlzLlV0KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5BZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuZ2QodGhpcy5rYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5JYiYmdGhpcy5JYi5sZW5ndGgpe3ZhciBjPXRoaXMuSWIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5BZygpfSxVdDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LHJlOmZ1bmN0aW9uKCl7dGhpcy5HYj8odGhpcy50ZSsrLHRoaXMuR2EobmV3IHoodGhpcy5HYiksdGhpcy5OdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLnpnKCl9LHNlOmZ1bmN0aW9uKGEpe3RoaXMuZ2QodGhpcy5GZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LE50OmZ1bmN0aW9uKGEpe2E9CmEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy50ZT90aGlzLnJlKCk6dGhpcy5zZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuemcoKTp0aGlzLnNlKCJBQUEiKX0semc6ZnVuY3Rpb24oKXt0aGlzLlo9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCk7dGhpcy5CZCgpfSxzYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5YYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLm1jJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy5HZSkpO3RoaXMuamQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5qZCYmdGhpcy5qZCgpfSxqbzpmdW5jdGlvbigpe2lmKHRoaXMud2UmJnRoaXMubXEoKSl7dmFyIGE9CnRoaXMuUXAoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LEVnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sR2E6ZnVuY3Rpb24oYSxiLGMsZixoLEljKXthPW5ldyBqYihhLGIsYyk7ZiYmKGEuVWc9ITApO2gmJmUuUXEoKSYmKGEucWY9ITApO0ljJiYoYS55Zz0hMCk7cmV0dXJuIGEubG9hZCgpfSxXZTpmdW5jdGlvbigpe2UuWGEoKXx8ZS5MYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fAooYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuZ2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLmJjKCl8fChhPXRoaXMuTWEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7CmguYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0saW86ZnVuY3Rpb24oKXt0aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkdhKGEsdGhpcy5QdS5iaW5kKHRoaXMpLAp0aGlzLk91LmJpbmQodGhpcykpfSxQdTpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMudHAoKX0sT3U6ZnVuY3Rpb24oKXt9LHRwOmZ1bmN0aW9uKCl7ZS5UYihsLnNwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxCZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm9iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMub2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5vYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9Cm5ldyBRO3dpbmRvd1tjLlpiKCldPXRoaXM7ZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxjdTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnVlfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sa2I6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT0KYXx8MT09YXx8IjEiPT1hfHwxPT1hfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsaz0oZiYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oZik/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpOwpyZXR1cm4gYn0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSx0ZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPQoiIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx3LHQseDtuPWEubGVuZ3RoO3ZhciB5PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHkucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PAoyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih5LnB1c2goZik7MTQhPXkubGVuZ3RoJTE2Oyl5LnB1c2goMCk7eS5wdXNoKG4+Pj4yOSk7eS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHkubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO249bDtwPW07dz1xO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfH5uJncpK3QraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj0yMDszOT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NDA7NTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8biZ3fHAmdykrdCtoW2ZdKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj02MDs3OT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cT1xK3cmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBrYj1jLlBpfHxrYixtPW5ldyBrYjt3aW5kb3cuT3Y9bTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaz10aGlzLmFbN107dGhpcy5Fbz10aGlzLmFbOV07dGhpcy52dj10aGlzLmFbNl07dGhpcy5WcT10aGlzLmFbM107dGhpcy5ZcT10aGlzLmFbOV07dGhpcy5taT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs0XX0KYy55bz1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZrOnRoaXMuRG8oYSl9LERvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbzp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnY6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlZxOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZcTp0aGlzLmxpKGEpfSxsaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubWk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBsYj1jLnlvfHxsYixYYz1uZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1YYy5Fayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmIsYyl7dGhpcy5pPWE7YS51Lkw/dGhpcy5OYT1hLnUuTCgpOnRoaXMuTmE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5pLlJhO3RoaXMucGxheWVyPXRoaXMuaS51O3RoaXMudWM9ITE7dGhpcy5Obj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmZkPXt9O3RoaXMuc2M9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5zYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmkudSkmJnRoaXMuaS51LkImJihhPXRoaXMuaS51LkIoKSksdGhpcy5zYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5YbT1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmVkPSExO3RoaXMuWGY9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOgoxNTt0aGlzLnM9e307dGhpcy5xYz0hMTt0aGlzLkhnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuJGI9ITE7dGhpcy53bz1lLnBhKDEwKTt0aGlzLlhjPWUucGEoMTApO3RoaXMuWGQ9ZS5wYSgxMCk7dGhpcy52Zz1lLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkJiPSExO3RoaXMuRmQ9bnVsbDt0aGlzLkNkPXRoaXMuRGM9dGhpcy53Zz10aGlzLmRnPXRoaXMuSGM9dGhpcy5ldT10aGlzLiRhPSExfWMuSmk9YjtiLnByb3RvdHlwZT17cWc6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5OYV0mJnRoaXMuY29uZlt0aGlzLk5hXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTmFdW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuVC5tYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6CmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGwuS20sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKX0sUmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJGE9YztpZih0aGlzLlQuWil0aGlzLlQuam8oKSx0aGlzLlQub2EmJnRoaXMuVC5pc0VuYWJsZWQ/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ULmljfSkpOmI/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuVC5pYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuQmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YuUmQoYSxiLGMpfSw1MCl9fSxjZTpmdW5jdGlvbihhKXt0aGlzLkhjPSExO3RoaXMucz1hO3RoaXMueXQodGhpcy5zKTsKdGhpcy5CZihhKX0sQmY6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuZmQ9dGhpcy5icShhKSksdGhpcy5CZihhLnBhcmVudCkpfSxicTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWSl7Yj1hLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlkuZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5ZLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYKKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVGEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLkZjJiZhLkZjLmVycm9yJiZhLkZjLmVycm9yLmNvZGUmJihiPWEuRmMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2UgeC5qYy5jb2RlOmI9PUMub2QuY29kZT9lLkQobC5ndix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpOihlLlNkKCksYj09Qy5KZS5jb2RlJiZlLkQobC5Pcix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKTtlLkQobC5ycCx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjsKYnJlYWs7Y2FzZSB4LkhlLmNvZGU6ZS5EKGwuUXUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB4LktlLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS5EKGwubXYsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2UgeC5wZC5jb2RlOmUuRChsLm52LHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2UgeC5uZC5jb2RlOmUuRChsLlByLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PQpjJiZhLmVycm9yJiZhLmVycm9yLmthJiYoYys9Il8iK2EuZXJyb3Iua2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy56YihhKTt0aGlzLkJhKCl9LHpiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS56YS5sZW5ndGg7KXRyeXt2YXIgYz1hLnphLnBvcCgpO3RoaXMuUWQoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHl0OmZ1bmN0aW9uKGEpe3RoaXMuQ2Q9ITE7dGhpcy5yYT10aGlzLmkuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuaS5DO2IuZ3c9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLlhtJiZ0aGlzLnBsYXllci5LYygpJiYKKGIudm9sdW1lPXRoaXMucGxheWVyLktjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuVG0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLkRnKGIpPyh0aGlzLlZtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5ybygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLnd0KCkpOnRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0sd3Q6ZnVuY3Rpb24oKXtlLiRlKCk7dGhpcy5zJiZ0aGlzLnMub3JpZ2luJiZ0aGlzLnMub3JpZ2luLkJlJiZlLldtKHRoaXMucy5vcmlnaW4uQmUpO2UuWmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmkuQzt0aGlzLmkuQz1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5pLkMsYSk7dGhpcy5pLmVnKCk7dGhpcy5pLmZjKCk7Zm9yKGE9dGhpcy5pLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuaS5mYygpO3RoaXMuVz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlcuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTsKdGhpcy5XLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5XLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmkuRy5hcHBlbmRDaGlsZCh0aGlzLlcpO3RoaXMuVy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnMuZXEoKSxiPXRoaXMucy5PLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sCmNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuaS5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5pLkcuc3R5bGUuaGVpZ2h0KX19fTtlLnlhKHRoaXMuVywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsCiJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuWG4oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlQpO3RoaXMuVy5zcmM9YTtlLndkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5CYSgpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuYXYoKSx0aGlzLmkuV2IoITApKSwKIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5pLldiKCEwKSx0aGlzLmJ2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuaS5XYighMCksdGhpcy5ldigpKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ2KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR2KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KCkpfS5iaW5kKHRoaXMpKTtlLndkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcykpO2Uud2QoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmkuUW0oZnVuY3Rpb24oYSl7ZS55YSh0aGlzLlcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSwKYnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0sYXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5aYSgiaW1wcmVzc2lvbiIpfSxldjpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS5aYSgic3RhcnQiKX0sUmc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5aYSgiZmlyc3RRdWFydGlsZSIpfSxmdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlphKCJ0aGlyZFF1YXJ0aWxlIil9LGR2OmZ1bmN0aW9uKCl7dGhpcy5rZCgpO2UuWmEoImNvbXBsZXRlIil9LGN2OmZ1bmN0aW9uKCl7ZS5aYSgiYWRzdG9wcGVkIik7dGhpcy5hZigpfSxUbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlQ7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmJjKCk/KGY9ZS5NYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KToKYj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5VdS5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LERnOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sVm06ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuUWcuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55ZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxhZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5RZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwKdGhpcy55ZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxRZzpmdW5jdGlvbihhKXt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZShhKX0uYmluZCh0aGlzKSx0aGlzLk5uKX0seWU6ZnVuY3Rpb24oYSl7dHJ5e2lmKCFlLlhhKCkmJnRoaXMuVC5MZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQmJ8fCh0aGlzLkJiPSEwLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMudWN8fCF0aGlzLkRnKHRoaXMudmlkZW8pfHwKdGhpcy5CYnx8KHRoaXMudWM9ITAsdGhpcy5UdSgpLHRoaXMudmlkZW8uY29udHJvbHM9ITEsdGhpcy5pLmZjKCksdGhpcy5OZygpLHRoaXMuT2coKSx0aGlzLlVlKCksdGhpcy5pLmVnKCksdGhpcy52aWRlby5wbGF5JiZ0aGlzLnBlKCkpfSxwZTpmdW5jdGlvbigpe2lmKCF0aGlzLkRjKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuRmEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuUGM9W107Zm9yKHZhciBiPXRoaXMuaS5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLlBjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIiwKYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMudGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMudGQoKX1lbHNlIHRoaXMudGQoKX0sdGQ6ZnVuY3Rpb24oKXtpZih0aGlzLlBjKWZvcih2YXIgYT0KMDthPHRoaXMuUGMubGVuZ3RoO2ErKyl0aGlzLlBjW2FdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYT10aGlzLnZpZGVvLnBsYXkoKSkmJmFbImNhdGNoIl0pYVsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuRGN8fCh0aGlzLkJhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLCIiLCEwKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5DYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkNiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkNiLmJpbmQodGhpcykpKTpIPWZ1bmN0aW9uKCl7dGhpcy5xY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGUoKSl9LmJpbmQodGhpcyk7dGhpcy56ZigpLnJnKHRoaXMpfSxrZDpmdW5jdGlvbigpe3RoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UuRChsLkZtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5hZigpfSxhZjpmdW5jdGlvbigpe3RoaXMuQ2R8fCh0aGlzLkNkPSEwLHRoaXMucy54Yj8odGhpcy51Yz0hMSx0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuZWQ9ITEsdGhpcy5pLkpnKCksdGhpcy5zLm9yaWdpbi5ZZCgpKTp0aGlzLkJhKCkpfSxVdTpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5sZChhKSl9LGxkOmZ1bmN0aW9uKGEpe2EmJgphLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5NZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SYnx8dGhpcy5ULldlKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlQuV2UoKSk7dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0semU6ZnVuY3Rpb24oKXtpZih0aGlzLmV1KXRoaXMuQmEoKTtlbHNle3RoaXMuJGI9ITA7dGhpcy5pLnUuamImJiF0aGlzLndnJiZ0aGlzLmkudS5qYigpJiZlLkQobC5CYyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tdShhKTt2YXIgYj0iIjtpZih0aGlzLnMub2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMudmcpO2MmJihiPXRoaXMucy5vZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMuZWR8fCh0aGlzLmVkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChsLkxtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5zLnhiPyh0aGlzLnVjPSExLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5jYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuY2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5lZD0hMSx0aGlzLmkuSmcoKSx0aGlzLnMub3JpZ2luLllkKCkpOnRoaXMuQmEoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuc2MucmVwbGFjZSgiW3RpbWVdIixlLnJmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMucWM9ITA7dGhpcy52aWRlby5jb250cm9scz0KITF9fSxzZzpmdW5jdGlvbigpe3RoaXMuUmI9ITA7dGhpcy5yYT10aGlzLmkuRzt0aGlzLnJhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpOwphLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuWHAoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmkuQz1hO3ZhciBiPXRoaXMuaS5DLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmkuZmMoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy5yYS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMucmEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlBnLmJpbmQodGhpcyk7dGhpcy5jYS5hcHBlbmRDaGlsZChiKTt0aGlzLk5nKCk7dGhpcy5PZygpO3RoaXMuRmQ9c2V0SW50ZXJ2YWwodGhpcy5oby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFhwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5zLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLnMuTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5UO2gub2EmJmguaXNFbmFibGVkJiYhaC5iYygpJiYoZT1oLk1hKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sCmhvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLnMuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5GZCksdGhpcy5rZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnplKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLkZkKSx0aGlzLmxkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sR2c6ZnVuY3Rpb24oKXt0aGlzLmRnfHwodGhpcy5kZz0hMCx0aGlzLkhjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sbXU6ZnVuY3Rpb24oYSl7YT09dGhpcy5IZ3x8dGhpcy5CYnx8KDA9PWEmJih0aGlzLiRhJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLiRhKSx0aGlzLiRhPQohMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuR2coKX0uYmluZCh0aGlzKSksdGhpcy5SYiYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMuQmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlhhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQobC5IbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpLGUuRChsLk1tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksdGhpcy5SYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PQpNYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuSGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLkQobC5HbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGwuSm0sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSksYT09TWF0aC5mbG9vcigzKnRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChsLk9tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpLGUuRChsLlBtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksCnRoaXMuSGc9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuQmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH1mb3IodmFyIGM9dGhpcy5jcSh0aGlzLnMuemEsYSk7Yy5sZW5ndGg7KXRyeXt2YXIgZj1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmdGhpcy5mZC5pbXByZXNzaW9ucyYmZS5PcShmLnVybCx0aGlzLmZkLmltcHJlc3Npb25zKT90aGlzLlFkKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQobC5JbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkse2FkSWQ6dGhpcy5mZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUWQoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8Cih0aGlzLnMuemE9dGhpcy5Cbyh0aGlzLnMuemEsYSkpfX0sUWQ6ZnVuY3Rpb24oYSxiLGMsZil7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGE9dGhpcy5ULkthKGEpLGMmJmEuU20oYyksZnx8KGY9dGhpcy5qZiksdGhpcy5ULkdhKGEsZix0aGlzLmpmLCExLCEwKSl9LGNxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sQm86ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sVHU6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuUGcuYmluZCh0aGlzKX0sUGc6ZnVuY3Rpb24oKXtlLkQobC5xbyx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5IYyYmZS5YYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuTHAoKSwhMCk7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5zLnljfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMucy55Yyx0aGlzLlQub2E/Il90b3AiOiJfYmxhbmsiKX19LE5nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PQoiQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLnNjLnJlcGxhY2UoIlt0aW1lXSIsZS5yZigwKSk7dGhpcy5jYXB0aW9uPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYSl9fSxPZzpmdW5jdGlvbigpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlkPXRoaXMud287dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249CiJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsdGhpcy5jZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGIuc3R5bGVbImZsb2F0Il09ImxlZnQiLGIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yi5pZD10aGlzLlhjO2IuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmd1LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLAp0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09InJpZ2h0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5YZDtjLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZ1LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxmLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZi5zdHlsZS50b3A9Ii01MHB4IixmLnN0eWxlLnJpZ2h0PSIwcHgiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLnZnO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7Zi5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMub2UmJmEuYXBwZW5kQ2hpbGQoZik7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKdGhpcy5jZC5iaW5kKHRoaXMpKTt0aGlzLmNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3RoaXMuY29udHJvbHM9dGhpcy5jYS5hcHBlbmRDaGlsZChhKTt0aGlzLmkudS5XYSYmdGhpcy5pLnUuV2EoKSYmdGhpcy5McigpO3RoaXMuVmIoKX19LFZiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sY2Q6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sZ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlhjKTt0aGlzLmkuQy5wYXVzZWQ/KHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSk6KHRoaXMuaS5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sCnRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGwuUGUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YYyk7dGhpcy5pLkMucGF1c2VkfHwodGhpcy5pLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChsLlBlLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpfSxpdDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGMpO3RoaXMuaS5DLnBhdXNlZCYmKHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YZCk7dGhpcy5pLkMubXV0ZWQ/Cih0aGlzLmkuQy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApKToodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCkpfSxMcjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGQpO3RoaXMuaS5DLm11dGVkfHwodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxDYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkNiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5DYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQ2IpO3RoaXMuRGN8fHRoaXMucWN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnBlKCkpfSxCYTpmdW5jdGlvbigpe3RoaXMuRGM9ITA7dGhpcy4kYSYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy4kYSksdGhpcy4kYT0hMSk7aWYoKCJwcmVyb2xsIj09ZS5GYSYmdGhpcy5xY3x8InBvc3Ryb2xsIj09ZS5GYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5GYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKHZhciBiPXRoaXMuaS5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmkuZmMoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuRGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5EZCgpfWVsc2UgdGhpcy5EZCgpfSxEZDpmdW5jdGlvbigpe3RoaXMud2c9ITA7dGhpcy5pLkRmKCk7CnRoaXMuaS5qdCgpO3RoaXMuJGI9ITE7ZS5EKGwudm8sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTt0aGlzLnpmKCkuZ3QoKX0semY6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuaSYmdGhpcy5pLnUmJihhPXRoaXMuaS51KTtyZXR1cm4gYX0sTWQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmKGE9ITApfXJldHVybiBhfSxVZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihlLk5mKHRoaXMudmlkZW8sYSk/dGhpcy5pdCgpOnRoaXMuYWUoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWUoKX0uYmluZCh0aGlzKSwKMTAwKSl9LFI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLnMmJihhLmNsaWNrdGhyb3VnaD10aGlzLnMueWMsYS5kdXJhdGlvbj10aGlzLnMuZHVyYXRpb24sYS5hZFBvZD10aGlzLnMueGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSkpO3JldHVybiBhfSxqZjpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIE89Yy5KaXx8TztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ubz10aGlzLmFbNl07dGhpcy5taD10aGlzLmFbNF07dGhpcy5mcz10aGlzLmFbNF07dGhpcy4kaj10aGlzLmFbOF07dGhpcy5ZdD10aGlzLmFbMV07dGhpcy5vcj10aGlzLmFbOF07dGhpcy5vcz10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLldpPWI7Yi5wcm90b3R5cGU9e1NvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuVG86dGhpcy5saChhKX0sbGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1oOnRoaXMuZXMoYSl9LGVzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5mczp0aGlzLlpqKGEpfSxaajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiRqOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZdDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm9zOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWI9Yy5XaXx8bWIsWWM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuU28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPQpkfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuSmE9bnVsbDt0aGlzLmJhPVtdO3RoaXMuWT1udWxsO3RoaXMuTWI9ITE7dGhpcy5CZT0iIjt0aGlzLkFlPSExO2QmJmQuZW1wdHk/dGhpcy5DcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmZmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkthKG0ucWUodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PQp0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJihhPWUuY2YodGhpcy51cmwpLHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5xZShhKSkrIiZ0eXBlPWpzIixiPW0uS2EobS5xZSh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpLGIuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIik7bS5HYShiLHRoaXMuQnIuYmluZCh0aGlzKSx0aGlzLnlyLmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSwKYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkZhKXRyeXt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWYuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmCiJwcmVyb2xsIj09ZS5GYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuRmEpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8Ck51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxCcjpmdW5jdGlvbihhKXt0aGlzLllzKGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5WYygpOnRoaXMuZmEodGhpcy5DYSh4LmpjLHtlcnJvcjp0aGlzLkFlP0Mub2Q6Qy5JZX0pKX0sQ3I6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/CnRoaXMuVmMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5qYyx7ZXJyb3I6dGhpcy5BZT9DLm9kOkMuSWV9KSl9LHlyOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkNhKHguSGUse2RlcHRoOmF9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5ZPXRoaXMuYmEuc2hpZnQoKTt0aGlzLlRxKCk/dGhpcy5WdCgpPyhhKyssbmV3IGIodGhpcyx0aGlzLkNmKCksZyx7QWRTeXN0ZW06dGhpcy5KcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmZhKHRoaXMuQ2EoeC5LZSkpOihhPTAsdGhpcy5NdSgpJiZ0aGlzLmNlKHRoaXMueG8oKSkpfSxZZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5ZZCgpfSxNdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlN0KCk/dGhpcy5SdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5DYSh4LkRlKSk6dGhpcy5mYSh0aGlzLkNhKHguVmgpKSwhMSk6Cih0aGlzLmZhKHRoaXMuQ2EoeC5qYyxDLkplKSksITEpfSxjZTpmdW5jdGlvbihhKXthLnphPWEuemEuY29uY2F0KHRoaXMuVWQoKSk7YS54Yj1hLnhiP2EueGI6dGhpcy5NYjt0aGlzLnBhcmVudC5jZShhKX0seG86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbmI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMueGYoKTthLnljPXRoaXMuTXAoKTthLm9yaWdpbj10aGlzO2EuTz10aGlzLklwKCk7YS5vZT10aGlzLmFxKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLlkmJihiLnphPWIuZXJyb3IuY29kZSE9eC5EZS5jb2RlP2IuemEuY29uY2F0KHRoaXMuT3AoKSk6Yi56YS5jb25jYXQodGhpcy5WcCgpKSk7dGhpcy5iYS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC56YiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnpiJiZ0aGlzLnBhcmVudC56YihiKSxhPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZhJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx6YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC56YihhKX0sa2Y6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQ2EoYSxiKSl9LENhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG9iKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sVnQ6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxTdDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMueGYoKS5sZW5ndGh9LFJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5VYigpfSxDZzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuYmEuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxZczpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuQmU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLkFlPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxUcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuQ2YoKS5sZW5ndGh9LENmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGQodGhpcy5ZLCJWQVNUQWRUYWdVUkkiKX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZCh0aGlzLlksIkFkU3lzdGVtIil9LFVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVsiSW1wcmVzc2lvbiIsIlRyYWNraW5nIiwiQ2xpY2tUcmFja2luZyIsIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBnPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZykpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGcudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5UYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LApWcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0seGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSx2YzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksCk12OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLlRhKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxiPWcuY29uY2F0KGQpfWNhdGNoKGUpe31yZXR1cm4gYn0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIiwKZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMuTmMoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2UucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuVGEodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxhcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGc9ITE7dHJ5e2M9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxnPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkZ0KGcsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZCl7Yj0hMX1yZXR1cm4gYn0sCkhkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5UYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sSWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFRhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuTmMoYSk6IiJ9LE5jOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSWQoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLmFtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkluPXRoaXMuYVs2XTt0aGlzLldrPXRoaXMuYVszXTt0aGlzLkNqPXRoaXMuYVs1XTsKdGhpcy5Vaz10aGlzLmFbN107dGhpcy5paD10aGlzLmFbN107dGhpcy5Baj10aGlzLmFbNl07dGhpcy5rcz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLnVwPWI7Yi5wcm90b3R5cGU9e0huOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbjp0aGlzLlZrKGEpfSxWazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2s6dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNqOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaWg6dGhpcy56aihhKX0semo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Bajp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmtzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy51cHx8cGIsWmM9bmV3IHBiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLkhuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuemE9W107dGhpcy5NPVtdO3RoaXMueWM9IiI7dGhpcy5PPXRoaXMueGI9ITE7dGhpcy5vcmlnaW49bnVsbH1jLlhrPWI7Yi5wcm90b3R5cGU9e3JvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGVxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgbmI9Yy5Ya3x8bmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaGs9dGhpcy5hWzldO3RoaXMucG49dGhpcy5hWzZdO3RoaXMucWg9dGhpcy5hWzFdO3RoaXMuSXE9dGhpcy5hWzhdO3RoaXMuUWs9dGhpcy5hWzVdO3RoaXMudG09dGhpcy5hWzldO3RoaXMuc2g9dGhpcy5hWzRdO3RoaXMuYm49dGhpcy5hWzRdO3RoaXMuZz0KdGhpcy5hWzVdfWMubXA9YjtiLnByb3RvdHlwZT17Z2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhrOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbjp0aGlzLnBoKGEpfSxwaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucWg6dGhpcy5IcShhKX0sSHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklxOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Razp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5yaChhKX0scmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnNoOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHFiPWMubXB8fHFiLCRjPW5ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5nayg0KTt2YXIgeD17cGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsa2E6IlhNTF9QQVJTRV9FUlJPUiJ9LFZoOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixrYToiRFVSQVRJT05fRVJST1IifSxqYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsa2E6IkVNUFRZX1ZBU1QifSxLZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKa2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGthOiJMT0FEX0VSUk9SIn0sbmQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCkJ2Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGthOiJNRURJQUZJTEVfRVJST1IifSxEZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixrYToiRFVNTVlfQUQifX0sQz17SWU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixrYToiTk9fQURTIn0sSmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGthOiJOT19NRURJQUZJTEVTIn0sRHY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxvZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuR2g9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbNl19Yy5nbD1iO2IucHJvdG90eXBlPXtGaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR2g6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciByYj1jLmdsfHxyYixhZD1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1hZC5GaCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLkZjPWI7dGhpcy56YT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuc2k9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYj1jLnNpfHxvYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Oaj10aGlzLmFbOV07dGhpcy5icj10aGlzLmFbM107CnRoaXMubHU9dGhpcy5hWzFdO3RoaXMuUnI9dGhpcy5hWzddO3RoaXMuQ3E9dGhpcy5hWzRdO3RoaXMub2g9dGhpcy5hWzRdO3RoaXMuYWk9dGhpcy5hWzJdO3RoaXMucmo9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNl19Yy5Icj1iO2IucHJvdG90eXBlPXtNajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTmo6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJyOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdTp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUnI6dGhpcy5CcShhKX0sQnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNxOnRoaXMubmgoYSl9LG5oOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vaDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmFpOnRoaXMucWooYSl9LHFqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5yajoKdGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYj1jLkhyfHxzYixiZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1iZC5Naig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLnU9YTt0aGlzLlJhPWEudGYoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUucGEoMTApO3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlNhPXt9O3RoaXMuUmY9ITE7dGhpcy5YYj1bXX1jLlpoPQpiO2IucHJvdG90eXBlPXtacDpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGY9MCxiPTAsZT17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZj1iLmxlZnQsYj1iLnRvcCk7ZT17eDpmLHk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlpwKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5NcShhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PQp3aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sTHQ6ZnVuY3Rpb24oKXt0aGlzLlJmPSEwfSxKZzpmdW5jdGlvbigpe3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sZWc6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtlLkQobC5CYyx0aGlzLnUuQigpKX0sanQ6ZnVuY3Rpb24oKXt0aGlzLlJmfHwodGhpcy51LnBsYXkoKSwKZS5EKGwuQ2MsdGhpcy51LkIoKSkpfSxmYzpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy51LnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5SYS5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuUmEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5SYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlJhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuUmEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuUmEpO3RoaXMudS5EYiYmCnRoaXMudS5EYigpP3RoaXMudS50ZigpLmFwcGVuZENoaWxkKHRoaXMuRyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkcpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2IuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy51LmV4aXRGdWxsc2NyZWVuKCl9LE1xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxOcDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LApXYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLk5wKHRoaXMuUmEpO2lmKGIueCE9dGhpcy5TYS54fHxiLnkhPXRoaXMuU2EueXx8Yi5wb3NpdGlvbiE9dGhpcy5TYS5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5TYS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuU2EuaGVpZ2h0fHxhKXtpZigwPHRoaXMuU2Eud2lkdGgmJjA8dGhpcy5TYS5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkRmKCk7cmV0dXJufXRoaXMuU2E9Yjt0aGlzLnUuRGIoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD0KYi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5YYi5sZW5ndGg7YSsrKXRoaXMuWGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9d2luZG93LnNldFRpbWVvdXQodGhpcy5XYi5iaW5kKHRoaXMpLDEwKX0sUW06ZnVuY3Rpb24oYSl7dGhpcy5YYnx8KHRoaXMuWGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlhiLnB1c2goYSl9LERmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTtmb3IodmFyIE49Yy5aaHx8TixCPVtdLHRiPTA7MTAwPnRiO3RiKyspe3ZhciBMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TC5zdHlsZS5kaXNwbGF5PSJibG9jayI7TC5pZD1lLnBhKDEwKTtMLmNvbnRyb2xzPSEwO0IucHVzaChMKX12YXIgSD0KITEsYmE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5uaz10aGlzLmFbMV07dGhpcy5BaT10aGlzLmFbMl07dGhpcy5kcj10aGlzLmFbOF07dGhpcy5rdj10aGlzLmFbMTBdO3RoaXMua2w9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzJdO3RoaXMubHI9dGhpcy5hWzhdO3RoaXMuWm09dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5wcj1iO2IucHJvdG90eXBlPXttazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubms6dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuY3IoYSl9LApjcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZHI6dGhpcy5qdihhKX0sanY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmt2OnRoaXMuamwoYSl9LGpsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbDp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU2s6dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxyOnRoaXMuWW0oYSl9LFltOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmc6YX19fSkoYyk7dmFyIHViPWMucHJ8fHViLGNkPW5ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWNkLm1rKDQpOyhmdW5jdGlvbihjKXtjLkprPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5QKGEpO3RoaXMubmUoYik7dGhpcy5nZigpfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZ2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5TKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxqYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkRhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdmI9Yy5Ka3x8dmI7KGZ1bmN0aW9uKGMpe2MuSWs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWNhKCk7dGhpcy53Yj10aGlzLndifHwhMTsKdGhpcy5PZT10aGlzLlJlPXRoaXMuSWY9dGhpcy5pYT10aGlzLnZlPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMueXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnZlPSEwO3RoaXMuSWYmJnRoaXMuWmUoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLiRiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMud2MoKTt0aGlzLklmPQohMDt0aGlzLlplKCl9LmJpbmQodGhpcykpO3RoaXMuVmUoKX0sWmU6ZnVuY3Rpb24oKXtpZighdGhpcy53Yil7dGhpcy53YygpO2lmKCF0aGlzLnZlJiYhdGhpcy53YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudmUmJnRoaXMuT2UmJiF0aGlzLlJlJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0sd2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LHlmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApWZTpmdW5jdGlvbigpe2lmKHRoaXMud2MoKSl7dmFyIGI9dGhpcy55ZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlJlPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuT2U9Yi5Jdn10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDEwMCl9LFB2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmJ3KCk6ITF9LFViOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5VYigpOi0xfSxXcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSx5cDpmdW5jdGlvbihiLGEpe3RoaXMud2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMud2J8fDMwMj09dGhpcy53Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy53Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFjKCl9LmJpbmQodGhpcyksMTAwKX0sQWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuaWE/KHRoaXMubSgpLHRoaXMubmEoKSk6Yi5SYygpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLldwKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHdiPWMuSWt8fHdiOyhmdW5jdGlvbihjKXtjLktrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sClJxOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmNsLkFtLnltP3dpbmRvdy5PTy5jbC5BbS55bS5HdihmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ScSgpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO3ZhciBiPWNhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkVhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB2YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgd2IoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHhiPWMuS2t8fHhiLHliPW5ldyB4YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuQmw9dGhpcy5hWzldO3RoaXMuWHM9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzRdO3RoaXMudGs9dGhpcy5hWzVdO3RoaXMuYnU9dGhpcy5hWzRdO3RoaXMuQm49dGhpcy5hWzhdO3RoaXMuaXY9dGhpcy5hWzhdO3RoaXMuanU9dGhpcy5hWzNdO3RoaXMuJHE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOV19Yy5RaT1iO2IucHJvdG90eXBlPXtBbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQmw6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhzOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51dTp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudGs6dGhpcy5hdShhKX0sYXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJ1OnRoaXMuQW4oYSl9LEFuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Cbjp0aGlzLmh2KGEpfSxodjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhPwp0aGlzLml2OnRoaXMuaXUoYSl9LGl1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuanU6dGhpcy5acShhKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgemI9Yy5RaXx8emIsZGQ9bmV3IHpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQuQWwoNCk7KGZ1bmN0aW9uKGMpe2MuT2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX0sRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sTDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLk9sfHxVOyhmdW5jdGlvbihjKXtjLk5sPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kudmQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnZkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLAoiYWRzTWFuYWdlckxvYWRGYWlsIik7dGhpcy53KCl9LmJpbmQodGhpcyksMUUzKX0uYmluZCh0aGlzKSk7eS52ZCgiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLiRyKGEpfS5iaW5kKHRoaXMpKTt5LmxxKCl9LCRyOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgVj1jLk5sfHxWOyhmdW5jdGlvbihjKXtjLlBsPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy5XYyYmKGI9ZS5GbyhiLHRoaXMuV2MpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5IKGQpKXt0aGlzLkooZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkEpO2YuYigpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiKwpoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5XY3x8KHRoaXMuV2M9W10pLHRoaXMuV2MucHVzaChiW2FdKSxkPW5ldyBVKGgpLHRoaXMuSChkKXx8KHRoaXMuSihkKSxmPW5ldyBWKGQsdGhpcy5BKSxmLmIoKSl9Y2F0Y2goayl7fX19dGhpcy5JKCl9LHZkOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmFhfHwodGhpcy5hYT17fSk7dGhpcy5hYVtiXXx8KHRoaXMuYWFbYl09e30pO3RoaXMuYWFbYl1bYV18fCh0aGlzLmFhW2JdW2FdPVtdKTt0aGlzLmFhW2JdW2FdLnB1c2goYyl9LFd0OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2FdKXRoaXMuY2N8fCh0aGlzLmNjPVtdKSx0aGlzLmNjLnB1c2goYiksdGhpcy5odCgpJiYodGhpcy5tZygpLHRoaXMuYigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2FdW2NdJiYKMDx0aGlzLmFhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuYWFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmFhW2FdW2NdW2RdKGIpfX0sbHE6ZnVuY3Rpb24oKXtpZih0aGlzLmNjKWZvcih2YXIgYj0wO2I8dGhpcy5jYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLmNjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmFhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5XdChiKX19KX0pKGMpO3ZhciBBYj1jLlBsfHxBYix5PW5ldyBBYihxKTsKYWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cT10aGlzLmFbN107dGhpcy5abz10aGlzLmFbNV07dGhpcy5Ybz10aGlzLmFbMl07dGhpcy5Gbj10aGlzLmFbMV07dGhpcy5JaT10aGlzLmFbN107dGhpcy5ydj10aGlzLmFbMV07dGhpcy52bT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLm5vPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cTp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWm86dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhvOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSWk6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ydjp0aGlzLnVtKGEpfSx1bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudm06dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBCYj1jLm5vfHxCYixlZD1uZXcgQmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC54cSg0KTsoZnVuY3Rpb24oYyl7Yy5CaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlMoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSwKcGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sTDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuQmh8fENiOyhmdW5jdGlvbihjKXtjLkNoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2EuaXNBZCYmYS5pc0FkKCk/dGhpcy5tKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwyNTApO3RoaXMuS3N8fCh0aGlzLktzPSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkNofHxEYjsoZnVuY3Rpb24oYyl7Yy5EaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBDYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBEYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5lYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkRofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmw9dGhpcy5hWzRdOwp0aGlzLndyPXRoaXMuYVs4XTt0aGlzLnRzPXRoaXMuYVszXTt0aGlzLllpPXRoaXMuYVs0XTt0aGlzLnRsPXRoaXMuYVsyXTt0aGlzLmRrPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzEwXX1jLnVrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybDp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMud3I6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRzOnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudGw6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmRrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy51a3x8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWZkLnFsKDQpOyhmdW5jdGlvbihjKXtjLmhtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKZWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgSGI9Yy5obXx8SGI7KGZ1bmN0aW9uKGMpe2MuZ209dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5UZXx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuRnB8fCh0aGlzLkpmKCksdGhpcy5GcD0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5UZT8odGhpcy5sKCJhZGVycm9yIiwKIm5vQ29udGFpbmVyIiksdGhpcy5vKCkpOih0aGlzLlRlPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSl9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuaW1hfSxKZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS3AoKTtiP2ImJmIuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLmlhPSEwLHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmYoKX0uYmluZCh0aGlzKSwKNTApfSwkdjpmdW5jdGlvbigpe3JldHVybiEwfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWI9Yy5nbXx8SWI7KGZ1bmN0aW9uKGMpe2MuaW09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBIYihiLml0ZW0oYSkpO3RoaXMuSChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuSihjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBKYj1jLmltfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhrPXRoaXMuYVsyXTt0aGlzLndxPXRoaXMuYVsyXTt0aGlzLlNoPXRoaXMuYVszXTt0aGlzLkxqPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzJdfWMuR3I9YjtiLnByb3RvdHlwZT17R2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhrOnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53cTp0aGlzLlJoKGEpfSxSaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNoOnRoaXMuS2ooYSl9LEtqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Majp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIExiPWMuR3J8fExiLGdkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLkdrKDQpOwooZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgTWI9Yy5uanx8TWI7KGZ1bmN0aW9uKGMpe2MubWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuU2coKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLnBmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5wZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5ObSgpfS5iaW5kKHRoaXMpKSx0aGlzLlRnPSExLHRoaXMubHY9CjFFMyx0aGlzLmdnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfSxwZjpmdW5jdGlvbigpe3RoaXMuZ2cuZG9uZXx8KHRoaXMuZ2cuZG9uZT0hMCx0aGlzLlRnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZygpfS5iaW5kKHRoaXMpLHRoaXMubHYpKX0sTm06ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVGcpO3RoaXMubSgpfSxTZzpmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMudygpKX0sdmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy52Zihtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLnZmKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBOYj1jLm1qfHxOYjsoZnVuY3Rpb24oYyl7Yy5vaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRWEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE1iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE5iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE9iPWMub2p8fE9iLFBiPW5ldyBPYihxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudmg9dGhpcy5hWzldO3RoaXMuZ2k9dGhpcy5hWzNdO3RoaXMuQnA9dGhpcy5hWzJdO3RoaXMuY289dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNl19Yy5Lbz1iO2IucHJvdG90eXBlPXt1aDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudmg6dGhpcy5maShhKX0sZmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmdpOnRoaXMuQXAoYSl9LEFwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5CcDp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBRYj1jLktvfHxRYixoZD1uZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7d2luZG93LnY9aGQudWgoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iU2ltcGxlVmlkZW9BbmRJbWEifX0pfSkoYyk7dmFyIFJiPWMuTGx8fFJiOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLApmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk7dGhpcy5QYigpfSxQYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLk9kKCkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZCgpJiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0uYmluZCh0aGlzKSw1MDApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwKX0sT2Q6ZnVuY3Rpb24oKXtyZXR1cm4haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YX0sCm86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBTYj1jLktsfHxTYjsoZnVuY3Rpb24oYyl7Yy5NbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9DT05URU5UJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1dFUkJVTkcmJjE9PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLmxlbmd0aCYmIXdpbmRvdy5fcGxheSl7dmFyIGI9bmV3IFJiKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYihiLAp0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFRiPWMuTWx8fFRiLFViPW5ldyBUYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLkduPWI7Yi5wcm90b3R5cGU9e2xuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubW46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLkdufHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5sbig0KTsoZnVuY3Rpb24oYyl7Yy52bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuZWU9ITF9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLk5zKCl9LmJpbmQodGhpcyksNTAwKX0sTnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZWUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuZWUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxJdDpmdW5jdGlvbigpe3RoaXMuZWU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sTDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLnZsfHxXYjsoZnVuY3Rpb24oYyl7Yy51bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuSnI9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5LYnx8KHRoaXMuS2I9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIik7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuSnI/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLkl0KCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgWGI9Yy51bHx8WGI7KGZ1bmN0aW9uKGMpe2Mud2w9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBZYj1jLndsfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuQXY9dGhpcy5hWzVdOwp0aGlzLmhxPXRoaXMuYVs1XTt0aGlzLiRzPXRoaXMuYVszXTt0aGlzLnBrPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuJG09YjtiLnByb3RvdHlwZT17dGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVpOnRoaXMuenYoYSl9LHp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bdjp0aGlzLmdxKGEpfSxncTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHE6dGhpcy5acyhhKX0sWnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRzOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMuJG18fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWpkLnRpKDQpOyhmdW5jdGlvbihjKXtjLm9sPQpwLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTsKcmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLm9sfHxhYzsoZnVuY3Rpb24oYyl7Yy5ubD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5EYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm5iKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuc28oKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuTWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnVyKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHNvOmZ1bmN0aW9uKCl7dGhpcy5OZSgpfHx0aGlzLm8oITApfSx1cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTWMoKTshYi5tYSYmYi5iYSYmYi5GdiYmYi5IdiYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sTWM6ZnVuY3Rpb24oKXtpZighdGhpcy5jZylmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRGEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuY2c9YltjXSk7cmV0dXJuIHRoaXMuY2d9LE9kOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG86ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5NYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYz1jLm5sfHxiYzsoZnVuY3Rpb24oYyl7Yy5wbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLnBsYXllcmFwaSl7dmFyIGI9ay5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBhYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgYmMoYyx0aGlzLkEpKS5iKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgY2M9Yy5wbHx8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52cz10aGlzLmFbOF07dGhpcy5raD10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07dGhpcy5FcT10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs1XX1jLm1yPWI7Yi5wcm90b3R5cGU9e3VzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudnM6dGhpcy5qaChhKX0samg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtoOnRoaXMuVXMoYSl9LFVzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Wczp0aGlzLkRxKGEpfSxEcTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXE6dGhpcy5zdihhKX0sc3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnR2OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGVjPWMubXJ8fGVjLGtkPW5ldyBlYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1rZC51cyg0KTsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlAoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUyhhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LERhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLlJqfHxXOyhmdW5jdGlvbihjKXtjLlFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmZlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmImJih0aGlzLmZlPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuZmUmJmIhPXRoaXMuZmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5kdyksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuUWp8fFg7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFcoYiksYi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFcoYiksYi5qYT90aGlzLm1nKCk6dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBELApmYz1jLlNqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5vYi5sZW5ndGgpe3ZhciBhPW0ub2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUudHQoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuV2YuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlrW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLldmKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzJdO3RoaXMuQ209dGhpcy5hWzhdO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuaHA9dGhpcy5hWzFdO3RoaXMuRHA9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5ybT1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWk6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNtOnRoaXMuUm4oYSl9LFJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHA6dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRwOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgaGM9Yy5ybXx8aGMsbGQ9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLmRpKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5QKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuUyhjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LApsdDpmdW5jdGlvbihiKXt0aGlzLnNkPWJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1yfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxMOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksCnRoaXMuc2QmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnNkJiYobmV3IEcodGhpcyx0aGlzLnNkKSkuYigpKX19KX0pKGMpO3ZhciBNPWMuVmx8fE07KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkdkKWlmKHRoaXMuaGJ8fCh0aGlzLmhiPTApLHRoaXMuaGIrKywxNTx0aGlzLmhiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy52dCgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubygpOnRoaXMubyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkdkPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLnZhKCl8fCh0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WYSgpfS5iaW5kKHRoaXMpLDEwKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJgotMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVT1hLGIubCgiYWRlcnJvciIsYSkpOmIubCgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlU9CnRoaXMuVXx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLlZhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgRz1jLlVsfHxHOyhmdW5jdGlvbihjKXtjLldsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKTt0aGlzLndhPS0xfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTSh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiLmx0KHRoaXMuQSksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBpYz1jLldsfHxpYyxqYz1uZXcgaWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSnU9dGhpcy5hWzZdO3RoaXMueHM9dGhpcy5hWzVdO3RoaXMuVmk9dGhpcy5hWzRdO3RoaXMuJHQ9dGhpcy5hWzZdO3RoaXMuRW09dGhpcy5hWzEwXTt0aGlzLllqPXRoaXMuYVs5XTt0aGlzLnFwPXRoaXMuYVsxXTsKdGhpcy5BaD10aGlzLmFbNF07dGhpcy5JaD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLkJrPWI7Yi5wcm90b3R5cGU9e0l1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KdTp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhzOnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5WaTp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiR0OnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5FbTp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWWo6dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuemgoYSl9LHpoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWg6dGhpcy5IaChhKX0sSGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkloOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPWMuQmt8fGtjLG1kPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW1kLkl1KDQpOyhmdW5jdGlvbihjKXtjLkVqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5kdXJhdGlvbj10aGlzLmRmPTA7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlMoYSk6dGhpcy5kYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLAo1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSx7aWQ6Yi5pZH0pfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlJFU1VNRSx7aWQ6Yi5pZH0pfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRmfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmCnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfVElNRSx7WW46ZnVuY3Rpb24oYSl7MDxhJiYodGhpcy5kZj1hKX0uYmluZCh0aGlzKSxpZDpiLmlkfSk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfREFUQSx7WW46ZnVuY3Rpb24oYSl7MDxhLmR1cmF0aW9uJiYodGhpcy5kdXJhdGlvbj1hLmR1cmF0aW9uKX0uYmluZCh0aGlzKSxpZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBsYz1jLkVqfHxsYzsoZnVuY3Rpb24oYyl7Yy5Eaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxodzpmdW5jdGlvbigpe30sYnQ6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAuQ2UobmV3IGZ1bmN0aW9uKCl7fSk7YS5Ddj0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi5idChhKTt3aW5kb3cuS3Y9Yn0sYjpmdW5jdGlvbigpe3RoaXMuYXR8fCh0aGlzLmF0PSEwKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTGR8fCh0aGlzLkxkPTEpO2lmKDIwPHRoaXMuTGQpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7ZWxzZXt2YXIgYT0hMSxjPWE9ITE7aWYoYi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmCihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy5MZCsrO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTApfX0sSGE6ZnVuY3Rpb24oYil7dmFyIGE9ImFkRXJyb3IiLGM9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmCihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMua2UoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCghMCl9LmJpbmQodGhpcykpfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJgotMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5sKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxrZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc01hbmFnZXIpO2I9ImFkRXJyb3IiO2E9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJgpnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMH0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbWM9Yy5Eanx8bWM7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXZwIiksYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKGJbYV0uaWQpe3ZhciBjPW5ldyBsYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2MuamF8fHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IG1jKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBuYz1jLkZqfHxuYyxvYz1uZXcgbmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHA9dGhpcy5hWzEwXTt0aGlzLnZuPXRoaXMuYVs0XTt0aGlzLnB2PXRoaXMuYVs0XTt0aGlzLnd1PXRoaXMuYVs3XTt0aGlzLmtuPXRoaXMuYVs3XTsKdGhpcy5nPXRoaXMuYVsxXX1jLlRpPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5IcDp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudm46dGhpcy5vdihhKX0sb3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnB2OnRoaXMudnUoYSl9LHZ1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53dTp0aGlzLmpuKGEpfSxqbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua246dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLlRpfHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5HcCg0KTsoZnVuY3Rpb24oYyl7Yy52aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKTthJiZ0aGlzLlAoYS5wYXJlbnROb2RlKX0sTDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnZqfHxZOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkZmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5PZigpfSxPZjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkhhKCksITA7dGhpcy5GZisrO2lmKDEwPHRoaXMuRmYpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmCihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsCmIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxYOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy51anx8WjsoZnVuY3Rpb24oYyl7Yy53aj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYKMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBaKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcWM9Yy53anx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVs3XTt0aGlzLnFxPXRoaXMuYVszXTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLkRsPQp0aGlzLmFbNl07dGhpcy5Wcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxMF19Yy5laj1iO2IucHJvdG90eXBlPXtnbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaG46dGhpcy5wcShhKX0scHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFxOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaWk6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhzOnRoaXMuQ2woYSl9LENsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EbDp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLmVqfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0Kb2QuZ24oNCk7KGZ1bmN0aW9uKGMpe2Mud2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiPyhiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVyUHJlZml4KSk/KHRoaXMuUChiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlMoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQ/ITE6Yi5pc1BhdXNlZD8hMTohMH0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pc0Z1bGxzY3JlZW4/Yi5pc0Z1bGxzY3JlZW46ITF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPQpjLndpfHx0YzsoZnVuY3Rpb24oYyl7Yy52aT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIiwKdGhpcy50ZXN0KTt3aW5kb3cuRkRNX1BsYXllcl92YXJzLmFkcGRldGVjdGVkJiYodGhpcy5sKCJhZGVycm9yIiwidXNpbmdBZEJsb2NraW5nU29mdHdhcmUiKSx0aGlzLm8oKSl9LHRlc3Q6ZnVuY3Rpb24oKXt9LG86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMudml8fHVjOyhmdW5jdGlvbihjKXtjLnhpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkVhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPQpiW2NdO2lmKGQudmFycy5pc1JlYWR5KWQ9bmV3IHRjKGQpLGQuamF8fHRoaXMuSChkKXx8KHRoaXMuSihkKSwobmV3IHVjKGQsdGhpcy5BKSkuYigpKTtlbHNlIGJyZWFrfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHZjPWMueGl8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5iaD10aGlzLmFbNl07dGhpcy5DdD10aGlzLmFbNV07dGhpcy5ubT10aGlzLmFbNl07dGhpcy5Ebj10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbOV07dGhpcy5laD10aGlzLmFbMTBdO3RoaXMubGs9dGhpcy5hWzFdO3RoaXMuY209dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOF19Yy5Ocj1iO2IucHJvdG90eXBlPXthaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYmg6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkN0Ogp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm06dGhpcy5DbihhKX0sQ246ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRuOnRoaXMudnAoYSl9LHZwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy53cDp0aGlzLkNrKGEpfSxDazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGs6dGhpcy5kaChhKX0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVoOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sazp0aGlzLmJtKGEpfSxibTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY206dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLk5yfHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5haCg0KTsKKGZ1bmN0aW9uKGMpe2MuQ2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlAoYiksdGhpcy5TKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5DaXx8eWM7KGZ1bmN0aW9uKGMpe2MuQmk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuWGUoKX0sWGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8CihiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZSghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgemM9Yy5CaXx8emM7KGZ1bmN0aW9uKGMpe2MuRGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHljKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5JKCk7cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLkRpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtpPXRoaXMuYVsyXTt0aGlzLm91PXRoaXMuYVs4XTt0aGlzLkFxPXRoaXMuYVs0XTt0aGlzLkhqPXRoaXMuYVsxXTt0aGlzLmxqPXRoaXMuYVs2XTt0aGlzLnJpPXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs1XTt0aGlzLmhyPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzEwXX1jLkZzPWI7Yi5wcm90b3R5cGU9e2ppOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5raTp0aGlzLm51KGEpfSxudTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm91OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5BcTp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSGo6dGhpcy5raihhKX0sa2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxqOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5yaTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLm9wOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ocjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIENjPWMuRnN8fENjLHFkPW5ldyBDYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXFkLmppKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlFmPXRoaXMuVGY9dGhpcy5TZj0hMTt0aGlzLlljPVtdO3RoaXMuaWU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PQp0eXBlb2YgQml0bW92aW5EZXRlY3Rpb24/bnVsbDpCaXRtb3ZpbkRldGVjdGlvbixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBUYT9udWxsOlRhLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgWWE/bnVsbDpZYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgZGM/bnVsbDpkYyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB1YT9udWxsOnVhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj8KbnVsbDp5YixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygd2M/bnVsbDp3YyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGNiP251bGw6Y2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIGhiP251bGw6aGIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgemE/bnVsbDp6YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBPYT9udWxsOk9hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBhP251bGw6cGF9fWMuWms9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5ZcChhKTpbXSxiO3RoaXMuVGY9ITA7aWYoYS5sZW5ndGgpe3RoaXMuU2Y9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj0KYVtjXSx0aGlzLm5nKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5pZSl7aWYodGhpcy5RZilicmVhaztiPXRoaXMuaWVbY107dGhpcy54ZShiKSYmKHRoaXMuWWMucHVzaChiKSx0aGlzLm5nKGIpKX19LHhlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2Ygcj8hMDohMX0sWXA6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWM9YVtmXSxjPXRoaXMuaWVbY10sdGhpcy54ZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxuZzpmdW5jdGlvbihhKXt0aGlzLnhlKGEpJiZhLmIoKX0sS3Q6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLlNmKWZvcih0aGlzLlFmPSEwLGE9MDthPHRoaXMuWWMubGVuZ3RoO2ErKyl0aGlzLlljW2FdLnJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuWWNbYV0ucmIpfX19KShjKTt2YXIgRGM9Yy5aa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpvPXRoaXMuYVs5XTt0aGlzLnRqPXRoaXMuYVs2XTt0aGlzLmFwPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzddfWMuRXM9YjtiLnByb3RvdHlwZT17SW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpvOnRoaXMuc2ooYSl9LHNqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50ajp0aGlzLiRvKGEpfSwkbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgRWM9Yy5Fc3x8RWMscmQ9bmV3IEVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuSW8oNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlRiKGwuTnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlRiKGwuU3IpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7CnZhciBzZD1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGVhPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBGPW5ldyBRLGs9ITE7Ri5aYigpO0YuS2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLlpiKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5LZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuWmIoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csRi5KcSgpLHtpZDp0ZH0pfSw1MDApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnI9dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzZdfWMuVGw9YjtiLnByb3RvdHlwZT17WXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5acjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMuVGx8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLllyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5pZz10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuVGM9MDt0aGlzLk5hPSIiO3RoaXMuWmM9W107dGhpcy4kYz0wO3RoaXMuamc9ITE7dGhpcy5nZT1bXX1jLlhnPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3RoaXMuaWc9YX0sYmQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLk5hPXRoaXMucGxheWVyLkwoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxudDpmdW5jdGlvbihhKXt0aGlzLlVhPWF9LG10OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj0KYX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxlYzpmdW5jdGlvbihhLGIpe2UuaWIoIndlbHQuZGUiKSYmZS5MYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5VYSk7dmFyIGM9ITEsZj0hMTtpZih0aGlzLktxKCkpdGhpcy5VYS5jKHRoaXMuVWEuT2MsdGhpcy5VYS5BYSx0aGlzLlVhLmhlLGZ1bmN0aW9uKCl7dGhpcy5lYyhhLApiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkVjKTtlbHNlIGlmKHRoaXMubnEoKSl0aGlzLmt0KGZ1bmN0aW9uKCl7dGhpcy5lYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5EKGwuQmMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuTHQoKTtrLmV4aXRGdWxsc2NyZWVuKCk7Uj1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLnFnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLklyKGEpOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5QZCYmKGM9dGhpcy5wbGF5ZXIuUGQoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2suUmQoYSwKYyxmKTt0aGlzLnBsYXllci5yZyhrKX19LEtxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuVGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5UYy5nZXRUaW1lKCksdGhpcy5UYz1hLDNFNTxiPyEwOiExO3RoaXMuVGM9YTtyZXR1cm4hMX0sRXQ6ZnVuY3Rpb24oKXtlLm1lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubGYoYSkpP3RoaXMuZWMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5EKGwuQ2MsdGhpcy5wbGF5ZXIuQigpKSl9LER0OmZ1bmN0aW9uKGEpe2UubWUoInBvc3Ryb2xsIik7aWYoIXRoaXMuaWcpe3RoaXMuc3QoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikpOwooYz10aGlzLmxmKGMpKT90aGlzLmVjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQobC5DYyx0aGlzLnBsYXllci5CKCkpKX19LGxmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxkdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnh0KHRoaXMuRHQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sZGQ6ZnVuY3Rpb24oYSl7ZS5tZSgibWlkcm9sbCIpO2lmKCF0aGlzLllmKXt0aGlzLllmPSEwO3ZhciBiPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMudGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLmVjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllmPSExfS5iaW5kKHRoaXMpLDFFMykpOgoodGhpcy5wbGF5ZXIucGxheSgpLGUuRChsLkNjLHRoaXMucGxheWVyLkIoKSkpfX0sY3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5ydCh0aGlzLmRkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlZkKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLkV0KCk7dGhpcy5wbGF5ZXIuVmQmJnRoaXMuY3QoKTt0aGlzLmR0KCl9LGV0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuWmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLnd2KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy4kYz10aGlzLlpjLmxlbmd0aH0sbnE6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLiRjJiYoYT0hMCk7cmV0dXJuIGF9LGt0OmZ1bmN0aW9uKGEpe3RoaXMuamc9YTtmb3IoYT0wO2E8dGhpcy5aYy5sZW5ndGg7YSsrKXRoaXMuWmNbYV1bImZ1bmN0aW9uIl0odGhpcy5Rcy5iaW5kKHRoaXMpKX0sUXM6ZnVuY3Rpb24oYSl7dGhpcy4kYy0tO2EmJnRoaXMuZ2UucHVzaChhKTswPj10aGlzLiRjJiZ0aGlzLmpnKCl9LElyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmdlLmxlbmd0aDtjKyspYj10aGlzLmdlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBnYT1jLlhnfHxnYSxSPSExLGxhPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVoPXRoaXMuYVs4XTt0aGlzLm9pPXRoaXMuYVsxMF07dGhpcy5icz10aGlzLmFbN107dGhpcy5PaD10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs2XX0KYy5Ucj1iO2IucHJvdG90eXBlPXtUaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVWg6dGhpcy5uaShhKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vaTp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnM6dGhpcy5OaChhKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9oOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy5Ucnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9dmQuVGgoNCl9KS5jYWxsKEVhcnVmYUpvTWFoc2hlTGksRWFydWZhSm9NYWhzaGVMaSk7Cg==
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.0.183 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.183.0.251.148.clients.your-server.de
Software
AmazonS3 /
Resource Hash
4ca761566d6efd4d84cc704d3c6e61132e2163d17707ec72415c82ab22d2fe87

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
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/
Connection
keep-alive
Content-Length
87
Referer
https://www.golem.de/
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
Fri, 21 Sep 2018 17:10:39 GMT
Connection
keep-alive
Content-Length
221
Last-Modified
Fri, 21 Sep 2018 14:32:18 GMT
Server
AmazonS3
Etag
"5082c0dc646eb9223054358caad7d94e"
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-4
X-Homad-Url
http://homad-global-configs-eu-fra.schneevonmorgen.com.s3.amazonaws.com/www.golem.de/config.json
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Expires
0
rum.js
tpc.googlesyndication.com/pagead/js/r20180917/r20110914/ Frame DB18
42 KB
16 KB
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20180917/r20110914/rum.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:81f::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
5c4bdb91d18bbb0dc7875f55a468cdb5dea73b931e316c14bc04f907ab000d6b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
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

Response headers

date
Mon, 17 Sep 2018 14:17:03 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
356016
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=":443"; ma=2592000; v="44,43,39,35"
content-length
15945
x-xss-protection
1; mode=block
server
cafe
etag
7476379871139986956
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Mon, 01 Oct 2018 14:17:03 GMT
csi
csi.gstatic.com/ Frame DB18
0
56 B
Other
General
Full URL
https://csi.gstatic.com/csi?v=2&s=pagead&action=csi_pagead&dmc=8&puid=1~jmc9h4r8&chm=1&ctx=2&gqid=DialW4irBYnKtwe795-gDA&qqid=CLmnsr_LzN0CFYPV7Qodz2EFfw&met.4=fb.gm~lb.gv~ol.t5~idt.j4~dt.6&met.3=197.gs~123.gr_3~121.gv~118.h3~118.kx_8~115.mh~118.mi~118.mp~118.oy~118.p2~115.q2~118.r4~117.t5~115.u0~118.u7~118.u8~113.v8_4~112.v6_6&met.1=1.jmc9h3w2~14.1q~15.1s~16.1s~17.1s~18.1s~19.1t~20.1t~21.1t~22.ik~23.ik&met.7=CBsQBSDXBDhQ~CAcQChgBINsEKNsEMNsEaNsEcNsEgAG60wGIAbLGBLABAbgBAQ~CBsQCiDfBDgd~CCIQBhgBIOUEKOUEMIIFOB1o7ARwgQV4OLABAbgBAw~CBgQChgBILkIKLkIMMEIOAhouQhwwAh4m32AAcl8iAGzzQKwAQG4AQM&met.2=15.5~16.cer
Requested by
Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/pagead/js/r20180917/r20110914/rum.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2607:f8b0:400d:c01::5e , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/
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
Fri, 21 Sep 2018 17:10:39 GMT
last-modified
Wed, 21 Jan 2004 19:51:30 GMT
server
Golfe2
status
204
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
hic_qos
ssl.1.damoh.golem.de/
24 B
281 B
Script
General
Full URL
https://ssl.1.damoh.golem.de/hic_qos?adv_partner&_werbebanner_
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIEVhcnVmYUpvTWFoc2hlTGk9RWFydWZhSm9NYWhzaGVMaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3kuJGR8fCh5LiRkPTApO3kuJGQrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS4kZCYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihrKXtrLnBhdXNlQnV0dG9ufHwoay5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKay5wbGF5QnV0dG9ufHwoay5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay5tdXRlQnV0dG9ufHwoay5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay51bm11dGVCdXR0b258fChrLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnNraXBhYmxlQnV0dG9ufHwoay5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC42O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0pO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTsKay5za2lwQnV0dG9ufHwoay5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0iKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGsuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307ay5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLkxhKGEsYixbXSxjLGMsbSl9KX1tLmMoay5nbG9iYWxDb25maWcsay5jbGllbnRDb25maWcsay5wcmVjaGVja2VkLGsub25SZWFkeSxrLm9uRmFpbHVyZSxrKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1rLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZWEoZGEsNTApfWZ1bmN0aW9uIGZhKGMsYil7Ynx8KGI9InByZSIpO2lmKGsmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTihjKSxhPW5ldyBPKGEsbSksZz1rLmFkVGFnOyJwcmUiPT1iJiZrLnByZXJvbGxBZFRhZyYmKGc9ay5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmay5wb3N0cm9sbEFkVGFnJiYoZz1rLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5xZyhrKSxhLlJkKGcpKX1lbHNlIGVhKGZ1bmN0aW9uKCl7ZmEoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihrJiZtKXsoay5hZFRhZ3x8ay5wcmVyb2xsQWRUYWcpJiZjLnBhdXNlKCk7ZS5EKGwuQmMsYy5CKCkpO2lmKGMuZ2V0Q3VycmVudFRpbWUpe3ZhciBhPWMuZ2V0Q3VycmVudFRpbWUoKTthJiZlLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLm9hPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuYmQoYyk7YS5udChtKTthLm10KGspO2EuZXQoKTthLmIoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cShjLGIpfS5iaW5kKHRoaXMpLDUwKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kbD10aGlzLmFbNl07dGhpcy5tcz10aGlzLmFbMTBdO3RoaXMuaWw9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzhdOwp0aGlzLnJuPXRoaXMuYVsxXTt0aGlzLmNwPXRoaXMuYVs5XTt0aGlzLkhsPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzldfWMuR289YjtiLnByb3RvdHlwZT17Wmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRsOnRoaXMubHMoYSl9LGxzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5tczp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaWw6dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZsOnRoaXMucW4oYSl9LHFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY3A6dGhpcy5HbChhKX0sR2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy5Hb3x8aGEsSGM9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUhjLlpsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZhPSJzZXR1cCI7dGhpcy5nYz1bXTt0aGlzLiRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuUHMuYmluZCh0aGlzKSl9Yy5MaT1iO2IucHJvdG90eXBlPXskZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxXbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJgphLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFBzOmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLk9zKGEuZGF0YSl9LE9zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0sd2Q6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sY2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5ScChhKSxkPSExO2lmKGIpcmV0dXJuIGE9YS5yZXBsYWNlKGIsIiIpKyIvZGV2L2hvbWFkX3VybC8iK2IrIi8iLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywKIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSx0aGlzLlZmKGEsIlBPU1QiLHt9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sUnA6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFVtOmZ1bmN0aW9uKGEsYil7aWYoYT09Yil7aWYoZS5FcChhKSlyZXR1cm47KGI9dGhpcy5jZihhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMubGEudXJsc1thXT1iO3RoaXMubGEudXJsc1tiXT1hO3RoaXMubGEuaG9tYWRVcmxzW2FdPWI7dGhpcy5sYS5vcmlnaW5hbFVybHNbYl09YX0sRXA6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5ob21hZFVybHNbYV0mJihiPXRoaXMubGEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sbmY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMubGEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWmE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxTcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sRWE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSx1ZjpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sSnQ6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sTWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sTmY6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGtiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/CjY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LHRnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEk9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKwoxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1rO3c9STtxPW07Zm9yKGY9CjA7MTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8fm4mdykrcStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpK3EraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZj00MDs1OT49ZjtmKyspcj1kKGMsNSkrKG4mbHxuJnd8bCZ3KStxK2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedykrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtrPWsrbCY0Mjk0OTY3Mjk1O0k9SSt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoaykrYihJKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiIiLGQsZixjLGgsZSx1LGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfGM+PjYsdT1jJjYzLGlzTmFOKGYpP2U9dT02NDppc05hTihjKSYmKHU9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sUXE6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmCi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sZmY6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxjPSExLGg9ITEsZT0hMSx1PSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocSl7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlFuPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSwKaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1jO2EuaXNGaXJlZm94PWg7YS5pc1NhZmFyaT1lO2EuaXNJRT11O2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxMcDpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuZmYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxYYTpmdW5jdGlvbigpe3ZhciBhPXt0aDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwKRWg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sc3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sbG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LE9uOmZ1bmN0aW9uKCl7cmV0dXJuIGEudGgoKXx8YS5FaCgpfHxhLnNxKCl8fGEuTGsoKXx8YS5sbSgpfX07cmV0dXJuIGEuT24oKX0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxBZjpmdW5jdGlvbihhKXthPXRoaXMuTWEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxpYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxGdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LHJmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5JZyhiKSsiOiIrdGhpcy5JZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sSWc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPgphPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkZhOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxUYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9bC5JYyhiLGQpKTtiJiYoaD1sLkljKGEsYikpO2YmJihoPWwuSWMoaCxmKSk7YyYmKGg9bC5JYyhoLGMpKTtlLlRiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uWil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uamUoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uS2EoZiwhMCk7Zj1tLkthKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uR2EoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sU2Q6ZnVuY3Rpb24oKXttJiZtLlo/bS5pc0VuYWJsZWQmJm0uaW8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2QoKX0uYmluZCh0aGlzKSw1MDApfSxIZDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVGEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LElkOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxUYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLk5jKGEpOiIifSxOYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLklkKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmCihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhuOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuU2MoYSl8fHRoaXMuU3EoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94Lm9nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpJiZ0aGlzLlphKCJlcnJfdXJsIixhKTtpZih0aGlzLm5mKGEpKXJldHVybiB0aGlzLm5mKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjtkJiYoZi5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtmLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2YuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjt2YXIgYz0hMTtkPSExO2Q9dGhpcy5MYShhLGIudWEsZixmdW5jdGlvbihhKXtjPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2N8fChjPWQpLGM9SlNPTi5wYXJzZShjKX1jYXRjaChoKXtjPSExfWMudXJsJiZjLmhhc2gmJihjPWIuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuVW0oYyxhKTtyZXR1cm4gY30sTGE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSx1KXt2YXIgaz1ofHxtO2g9ITA7dSYmKGg9ITEpO2lmKGsmJmsuWilpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suS2EoYSxoKTtoPWsuS2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5HYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxWZjpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sQXI6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuVmYoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuZ2MpZm9yKHZhciBjIGluIHRoaXMuZ2MpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5nY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueWIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sV2Y6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLGYudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkFyKGYuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LHR0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdjPWF9LHd2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5MYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxQbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE9xOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUD1jLkxpfHxQO25ldyBQO3ZhciBlPW5ldyBQO3dpbmRvdy5Odj1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLktpPWI7Yi5JYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuSnM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuUHI9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmd2PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IucnA9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5udj17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1tPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLkdtPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5KbT17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5PbT17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuRm09e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLkhtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuUXU9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk9yPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnNwPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5tdj17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xbz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnZvPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuQ2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5CYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuTG09e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkttPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5RZT17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuUGU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuUG09e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5JbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTnU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Tcj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBsPWMuS2l8fGw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGo9dGhpcy5hWzEwXTt0aGlzLmpwPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzRdfWMuQ289YjtiLnByb3RvdHlwZT0Ke09qOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Qajp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuanA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgaWE9Yy5Db3x8aWEsSmM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMuT2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5NaT1iO2IucHJvdG90eXBlPXtKZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sZWI6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KSsKbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxVcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxKYzpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMuSmMoYSsKNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuSmMoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxaYjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkpkKHRoaXMuZWIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5KYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sSnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aYigpKyIyIn0sS2Y6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KZCh0aGlzLlVwKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuSmMoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBRPQpjLk1pfHxRO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdoPXRoaXMuYVs2XTt0aGlzLkdxPXRoaXMuYVsxMF07dGhpcy50bj10aGlzLmFbM107dGhpcy5jaT10aGlzLmFbOF07dGhpcy5Vbj10aGlzLmFbNF07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLldqPWI7Yi5wcm90b3R5cGU9e2ZoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5naDp0aGlzLkZxKGEpfSxGcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdxOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50bjp0aGlzLmJpKGEpfSxiaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNpOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vbjp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sCmY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGphPWMuV2p8fGphLEtjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLmZoKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmo7dGhpcy5qPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWc7cmV0dXJuIGZ9fShjLApnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmM/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5DZT1ifSkoYyk7dmFyIEo9Yy5DZXx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5HdT10aGlzLmFbOV07dGhpcy50cj10aGlzLmFbMl07dGhpcy5yaz10aGlzLmFbMTBdO3RoaXMucnM9dGhpcy5hWzldO3RoaXMuamo9dGhpcy5hWzFdO3RoaXMuams9dGhpcy5hWzRdO3RoaXMuS2g9dGhpcy5hWzNdO3RoaXMucG89dGhpcy5hWzRdO3RoaXMuemw9dGhpcy5hWzldO3RoaXMuSHQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuUm89YjtiLnByb3RvdHlwZT17RnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5HdTp0aGlzLnNyKGEpfSxzcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHI6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLnFzKGEpfSxxczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnM6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qajp0aGlzLmlrKGEpfSxpazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuams6dGhpcy5KaChhKX0sSmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5LaDp0aGlzLm9vKGEpfSxvbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucG86dGhpcy55bChhKX0seWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpsOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5IdDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIGthPWMuUm98fGthLExjPW5ldyBrYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1MYy5GdSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLllrPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9e307dGhpcy5BPW51bGw7dGhpcy5kYz0xMDA7dGhpcy5sYj0wO3RoaXMud2E9MTUwO3RoaXMucmI9MDt0aGlzLm90KGIpfSxiOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YT8odGhpcy5sYisrLHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpOjA+dGhpcy53YSYmKHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpfSxodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiPnRoaXMud2E/ITA6ITF9LG1nOmZ1bmN0aW9uKCl7dGhpcy5sYj0wfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sCm90OmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxUcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEo6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmViKCldPWI7SyYmSy5UZiYmSy5LdChiKX0sVnY6ZnVuY3Rpb24oKXtyZXR1cm4gZS5FYSh0aGlzLnhhKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy54YSlpZihhPT10aGlzLnhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLnhhW2IuZWIoKV0/ITA6ITF9LFBxOmZ1bmN0aW9uKGIpe2I9Yi5EYSgpO2Zvcih2YXIgYSBpbiB0aGlzLnhhKWlmKGIuaWQ9PXRoaXMueGFbYV0uRGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXc6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5Za3x8cjsoZnVuY3Rpb24oYyl7Yy4kaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLmRjPTEwO3RoaXMubGI9CjA7dGhpcy53YT01MDt0aGlzLks9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLmhmPSExO3RoaXMuTigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuRGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30sZWE6ZnVuY3Rpb24oKXt9LHh0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxXdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LHJ0OmZ1bmN0aW9uKGIpe3RoaXMuV2Q9Yn0sVXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XZH0sVmQ6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLmxiPD10aGlzLndhJiYodGhpcy5sYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLAp0aGlzLmRjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSx0ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxlYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LGt3OmZ1bmN0aW9uKCl7fSxTOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLm9xKCl8fHRoaXMuUm0oKTt0aGlzLm5lKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sUm06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUucGEoMTApKX0sb3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxQOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LERhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFJjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxqYjpmdW5jdGlvbigpe3JldHVybiExfSxjdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxkYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LERiOmZ1bmN0aW9uKCl7dmFyIGI9aztyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFBkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHJnOmZ1bmN0aW9uKGIpe3RoaXMuZ2I9CmJ9LFR2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LGd0OmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxadjpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2ImJihiPSEwKTtyZXR1cm4gYn0sZXc6ZnVuY3Rpb24oKXt0aGlzLmhmfHwodGhpcy5oZj0hMCl9LEtjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFF2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLllnPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuTGU9IjEiO3RoaXMuTWU9IjIiO3RoaXMuem09IjMiO3RoaXMubGM9MDt0aGlzLlpmPTMwO3RoaXMudmI9W107dGhpcy5QYT1bXTt0aGlzLkxiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsCnVua25vd246Nn07dGhpcy5TZT10aGlzLk1nPSExO3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pZD1lLnBhKDEwKTt0aGlzLmJkKGIpO3RoaXMucHQoYSl9LGI6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5NZ3x8KHRoaXMuTWc9ITAsZS5TZCgpKX0sWmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkwoKTtSJiZSLiRiJiYhbGEmJihsYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSx3OmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMudXQoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLkVnKCksdGhpcy5TZT0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaGEoKXx8KHRoaXMudmIucHVzaChiKSx0aGlzLlBhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxFZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIiwKYT1bXTt0aGlzLnZiJiYwPHRoaXMudmIubGVuZ3RoJiYodGhpcy52Yj1lLnVuaXF1ZSh0aGlzLnZiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy52Yi5qb2luKCIsIikpKTtpZih0aGlzLlBhKXtmb3IodmFyIGc9MDtnPHRoaXMuUGEubGVuZ3RoO2crKyl0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXT09dGhpcy5MYltiXSYmYS5wdXNoKHRoaXMuUGFbZ10uZGV0YWlsKSx0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXTx0aGlzLkxiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5QYVtnXS5kZXRhaWwpLGI9dGhpcy5QYVtnXS5yZWFzb24pO3RoaXMuTGJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxZdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNlfSxtOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5MZX0sdXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy5NZX0sdnQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnptfSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGN9LE5lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxlfSxFdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMubGN9LGJkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0scHQ6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sRHI6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLllnfHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZyPXRoaXMuYVs2XTt0aGlzLkZsPXRoaXMuYVs5XTt0aGlzLlduPXRoaXMuYVszXTsKdGhpcy4kZz10aGlzLmFbM107dGhpcy5Rbz10aGlzLmFbNV07dGhpcy5ZbD10aGlzLmFbM107dGhpcy5Ucz10aGlzLmFbOV07dGhpcy5ocz10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs3XX1jLmh1PWI7Yi5wcm90b3R5cGU9e2VyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mcjp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRmw6dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlduOnRoaXMuWmcoYSl9LFpnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGc6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFvOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZbDp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVHM6dGhpcy5ncyhhKX0sZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmc6YX19fSkoYyk7dmFyIG1hPWMuaHV8fG1hLE1jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU1jLmVyKDQpOyhmdW5jdGlvbihjKXtjLlhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGVudEVsKCk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLksmJnRoaXMuSygpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkRlbW9WaWRlb0pTIn19KX0pKGMpO3ZhciBTPWMuWGh8fFM7KGZ1bmN0aW9uKGMpe2MuV2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKTt0aGlzLm1kPW51bGw7dGhpcy5WdT0xRTM7dGhpcy5mZz1udWxsO3RoaXMuZHU9MkUzfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZih3aW5kb3cuZGVtb1BsYXllciYmd2luZG93LlFuKWIub24oInBsYXkiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Iub24oImRpc2FibGUiLHRoaXMuenAuYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0Iix0aGlzLmtxLmJpbmQodGhpcykpO2Iub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuanEoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLll1KGIpfS5iaW5kKHRoaXMpKSwKYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IixmdW5jdGlvbigpe3RoaXMuWnUoYil9LmJpbmQodGhpcykpKTtiLm9uKCJhZGVuZCIsZnVuY3Rpb24oYSl7dGhpcy5pcShhLGIpfS5iaW5kKHRoaXMpKTtiLm9uKCJjb250ZW50cGxheWJhY2siLGZ1bmN0aW9uKGEpe3RoaXMudG8oYSl9LmJpbmQodGhpcykpfSx0bzpmdW5jdGlvbihiKXsiYWRzZXJyb3IiPT1iLnRyaWdnZXJldmVudCYmdGhpcy53KCl9LFl1OmZ1bmN0aW9uKGIpe3RoaXMubWR8fCh0aGlzLm1kPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kdShiKX0uYmluZCh0aGlzKSx0aGlzLlZ1KSl9LCR1OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLm1kKTt0aGlzLncoKX0sWnU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMubWQpfSxpcTpmdW5jdGlvbihiKXt0aGlzLkx2KGIpO3RoaXMuZmc9bmV3IERhdGU7dGhpcy5mZy10aGlzLkxzPHRoaXMuZHU/CnRoaXMudygpOnRoaXMubSgpfSxrcTpmdW5jdGlvbihiLGEpeyFhJiZiLnRhcmdldC5wbGF5ZXImJihhPWIudGFyZ2V0LnBsYXllcix0aGlzLmJkKG5ldyBTKGEpKSk7dGhpcy53KCl9LHpwOmZ1bmN0aW9uKCl7fSxqcTpmdW5jdGlvbigpe3RoaXMuTHM9bmV3IERhdGV9fSl9KShjKTt2YXIgbmE9Yy5XaHx8bmE7KGZ1bmN0aW9uKGMpe2MuWWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmRlbW9QbGF5ZXIpe2lmKHdpbmRvdy52aWRlb2pzJiZ2aWRlb2pzLnBsYXllcnMmJjA8ZS5FYSh2aWRlb2pzLnBsYXllcnMpKXt2YXIgYj12aWRlb2pzLnBsYXllcnMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPW5ldyBTKGJbYV0pO3RoaXMuSChnKXx8KHRoaXMuSihnKSwobmV3IG5hKGcsdGhpcy5BKSkuYigpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIG9hPWMuWWh8fG9hLHBhPW5ldyBvYShxKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHM9dGhpcy5hWzVdO3RoaXMuZnA9dGhpcy5hWzVdO3RoaXMuRnI9dGhpcy5hWzhdO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMua209dGhpcy5hWzddO3RoaXMudXE9dGhpcy5hWzRdO3RoaXMuZm49dGhpcy5hWzddO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLnhtPXRoaXMuYVsxMF07dGhpcy5maz10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVsyXX1jLlpuPWI7Yi5wcm90b3R5cGU9e0NzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Eczp0aGlzLmVwKGEpfSxlcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnA6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Gcjp0aGlzLnZrKGEpfSx2azpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMud2s6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMua206dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZm46dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnlrOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54bTp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZms6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBxYT1jLlpufHxxYSxOYz1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1OYy5Dcyg0KTsoZnVuY3Rpb24oYyl7Yy5naj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmFjPSExO3RoaXMubWYoKTsKdGhpcy5vZigpO3RoaXMudW89ITF9LG1mOmZ1bmN0aW9uKCl7dGhpcy5hYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYWM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuUChiKX0sb2Y6ZnVuY3Rpb24oKXtpZighdGhpcy5hYyl7dmFyIGI9dGhpcy5EYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYWM9ITApO3RoaXMuUyhhKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpKX0sVmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5kZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuZGQoYSl9LmJpbmQodGhpcykpfSwKZGQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLldkJiYoMCx0aGlzLldkKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6CiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sV2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciByYT1jLmdqfHxyYTsoZnVuY3Rpb24oYyl7Yy5maj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxOOmZ1bmN0aW9uKCl7fSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5uYz0hMTt0aGlzLnVkPTE7dGhpcy5wYz1bXTt0aGlzLmFiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9CnRoaXMubmM9ITE7dGhpcy51ZD0xO3RoaXMucGM9W107dGhpcy5hYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy51ZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuYWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmFiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmFiPSEwKSkpLAphLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuYWI9ITApKTp0aGlzLm0oIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ29tcGxldGUiKTt0aGlzLm5jPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuWmYmJiF0aGlzLmhhKCkmJih0aGlzLmFiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm8oKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubyghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5uYigpLHRoaXMuZ2V0UGxheWVyKCkudW89ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdiO2EmJihhLmFlKCksYS5CYSgpKX19LmJpbmQodGhpcyl9KTsKaWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRDb21wbGV0ZSIpO3RoaXMubmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMubSgib25BZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMubSgib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlpmJiYhdGhpcy5oYSgpJiYodGhpcy5hYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLnBjLmluZGV4T2YoYSkmJnRoaXMucGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5tKCksdGhpcy5uYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMubSgiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLm0oImVtcHR5Iik6KHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLnBjLmxlbmd0aD49dGhpcy51ZCYmdGhpcy5vKCkpfSxEcjpmdW5jdGlvbihiKXt0aGlzLmooIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCk7ZS5KdChhLnZpZGVvVGFnKT9hLmFjP3RoaXMubSgicGxheWVyIGlzIGludmFsZCIpOnRoaXMubmN8fHRoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSw1MCk6KGEubWYoKSxhLm9mKCkpfX0pfSkoYyk7dmFyIHNhPWMuZmp8fHNhOyhmdW5jdGlvbihjKXtjLmhqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuUHAoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT0KYi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0pLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5QcShnKXx8KHRoaXMuSihnKSwKZz1uZXcgc2EoZyx0aGlzLkEpLGcuTigpLGcuYigpKX1lbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0sU3Y6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sUHA6ZnVuY3Rpb24oKXt2YXIgYj1lLk1hKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnliKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmhqfHx0YSx1YT1uZXcgdGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHM9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOV19Yy55aT1iO2IucHJvdG90eXBlPXtjczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZHM6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB2YT1jLnlpfHx2YSxPYz1uZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9T2MuY3MoNCk7KGZ1bmN0aW9uKGMpe2MucG09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb19pZCk7dGhpcy5QKGIpO3ZhciBiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0sYT10aGlzLmdldFJhd1BsYXllcigpO2ImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlMoYik6dGhpcy5JKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSwKTDpmdW5jdGlvbigpe3JldHVybiJYT1pDT00ifX0pfSkoYyk7dmFyIHdhPWMucG18fHdhOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IudHJhY2tlci52YXN0X3ByZXJvbGx8fGIudHJhY2tlci52YXN0X3Bvc3Ryb2xsP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LG86ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHhhPWMub218fHhhOyhmdW5jdGlvbihjKXtjLnFtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmCndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyYmMDxlLkVhKHdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcykpe3ZhciBiPXdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YlthXTtpZihnLmNvbnRyb2xzJiZnLmNvbnRyb2xzLnBsYXllcilnPW5ldyB3YShnKSx0aGlzLkgoZyl8fCh0aGlzLkooZyksKG5ldyB4YShnLHRoaXMuQSkpLmIoKSk7ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19KX0pKGMpO3ZhciB5YT1jLnFtfHx5YSx6YT1uZXcgeWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMTBdfWMuYWo9YjtiLnByb3RvdHlwZT17a3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmxwOgp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEFhPWMuYWp8fEFhLFBjPW5ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLmtwKDQpOyhmdW5jdGlvbihjKXtjLmVtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlAoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUyhiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sTDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oYil7dGhpcy5xYihiKX0uYmluZCh0aGlzKSl9LHFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLksmJnRoaXMuSygpfSxSYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0sCmlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciBCYT1jLmVtfHxCYTsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5LZz0hMDt0aGlzLnlkPXRoaXMuSGY9ITE7dGhpcy5hZygpO3RoaXMuZW8oKTt0aGlzLkhhKCl9LGZ3OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKY29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuZWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuYmEsIjsiLHR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLnFkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnJkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi54ZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnhkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMua2cpfSxmYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmCih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LExjOmZ1bmN0aW9uKCl7aWYoIXRoaXMubWEpe3ZhciBiPXRoaXMuZmIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSx3ZjpmdW5jdGlvbigpe2lmKCF0aGlzLlliKXt2YXIgYj10aGlzLmZiKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWWI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlliPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWWJ9LApOcTpmdW5jdGlvbigpe2lmKCF0aGlzLkdmKXt2YXIgYj10aGlzLmZiKCksYT10aGlzLkxxKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5HZj0hMCl9cmV0dXJuIHRoaXMuR2Z9LExxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy50YyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMudGM9ITApO3JldHVybiB0aGlzLnRjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTGMoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksCmIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxrZTpmdW5jdGlvbigpe3RoaXMueWQ9ITA7dmFyIGI9dGhpcy53ZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmCmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLk5ifHwodGhpcy5sKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5YKCksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sUnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmJmJiZiLmFkcyYmKHRoaXMuYmY9Yi5hZHMpO3JldHVybiB0aGlzLmJmfSxlbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlgoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7CmIub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5aZCgpfS5iaW5kKHRoaXMpKX0sZWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLndmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZigpfS5iaW5kKHRoaXMpLDUwKX0sYWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTnEoKSl7dmFyIGE9dGhpcy5mYigpLGc9dGhpcy5MYygpO2EmJmcmJih0aGlzLmZiKCksdGhpcy5MYygpLAp0aGlzLnlkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWQ/dGhpcy5tKCk6KHRoaXMuWCghMCksdGhpcy5sKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuZmIoKX1lbHNlIHRoaXMuSGY/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmZiKCksYj10aGlzLkxjKCk7YSYmIWI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5YKCkpOih0aGlzLlgoITApLHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLkhmPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWcoKX0uYmluZCh0aGlzKSw1MCl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9CiEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5VPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMucWEoKTticmVha319LGZvOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLlFiIT1iLmFkcy5zdGF0ZSYmKHRoaXMuUWI9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuUWIpe3RoaXMubSgiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5RYj0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZm8oKX0uYmluZCh0aGlzKSwxMCl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMDt0aGlzLm0oImVtcHR5IHZhc3QiKX0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLmhhKCl8fChifHwKKHRoaXMuS2c9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuS2csZnVuY3Rpb24oKXt0aGlzLmVmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxvOmZ1bmN0aW9uKCl7dGhpcy5hd3x8KDEwPHRoaXMuV3U/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLld1KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuZnQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubG8oKX0uYmluZCh0aGlzKSw1MCkpKX0sZnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuWHUpe3RoaXMuWHU9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5YLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiKwphLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBDYT1jLmRtfHxDYTsoZnVuY3Rpb24oYyl7Yy5mbT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy54Zyh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMueGcoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5FYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBCYShiW2ddKSxhLmphfHx0aGlzLkgoYSl8fAohMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkooYSksKG5ldyBDYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy5yYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmRjKX19KX0pKGMpO3ZhciBEYT1jLmZtfHxEYSxFYT1uZXcgRGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenM9dGhpcy5hWzJdO3RoaXMuc3U9dGhpcy5hWzhdO3RoaXMuSmo9dGhpcy5hWzJdO3RoaXMuJGk9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5Scz1iO2IucHJvdG90eXBlPXt5czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenM6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnN1OnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KajoKdGhpcy5aaShhKX0sWmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgRmE9Yy5Sc3x8RmEsUWM9bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMueXMoNCk7KGZ1bmN0aW9uKGMpe2MuUmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5QKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlMoYSl9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7CmEuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEdhPWMuUmx8fEdhOyhmdW5jdGlvbihjKXtjLlFsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkFiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmhjPSExO3RoaXMubGcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubSgpOwplbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuaGM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy54YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlllKCk6dGhpcy5tKCl9LHhjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5tKCk7ZWxzZXtpZigxMDA5PT0KZ3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5oYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuaGM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy54Yy5iaW5kKHRoaXMpLDEwMCl9fSxZZTpmdW5jdGlvbigpe2lmKCF0aGlzLmhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09CmIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQWImJih0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWWUuYmluZCh0aGlzKSwKNTApfX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5oYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubSgpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGE9Yy5RbHx8CkhhOyhmdW5jdGlvbihjKXtjLlNsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBHYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSGEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIElhPWMuU2x8fElhLEphPW5ldyBJYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DdT10aGlzLmFbNV07dGhpcy5Bbz10aGlzLmFbNl07dGhpcy5Nbz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLldxPWI7Yi5wcm90b3R5cGU9e0J1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5DdTp0aGlzLnpvKGEpfSwKem86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFvOnRoaXMuTG8oYSl9LExvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Nbzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEthPWMuV3F8fEthLFJjPW5ldyBLYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkJ1KDQpOyhmdW5jdGlvbihjKXtjLnhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMuJGY9YX0sTjpmdW5jdGlvbigpe30sVGQ6ZnVuY3Rpb24oYil7dGhpcy4kZj1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy4kZikucGFyZW50Tm9kZTt0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIExhPWMueGh8fExhOyhmdW5jdGlvbihjKXtjLndoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmooYixhKX0sVGQ6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBNYT1jLndofHxNYTsoZnVuY3Rpb24oYyl7Yy55aD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBMYShkLAphKSx0aGlzLkgoZCl8fChkLlRkKGEpLHRoaXMuSihkKSxkPW5ldyBNYShkLHRoaXMuQSxnKSxkLlRkKGcpLGQuYigpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE5hPWMueWh8fE5hLE9hPW5ldyBOYShmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzhdO3RoaXMuYmw9dGhpcy5hWzhdO3RoaXMuU3U9dGhpcy5hWzldO3RoaXMuSmw9dGhpcy5hWzJdO3RoaXMuQWs9dGhpcy5hWzddO3RoaXMuRXU9dGhpcy5hWzFdO3RoaXMuZG49dGhpcy5hWzFdO3RoaXMucXU9dGhpcy5hWzJdO3RoaXMuT289dGhpcy5hWzFdO3RoaXMueXY9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5Jcz1iO2IucHJvdG90eXBlPXtsbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWw6dGhpcy5hbChhKX0sYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ibDp0aGlzLlJ1KGEpfSxSdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU3U6dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpsOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkV1OnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kbjp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucXU6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9vOnRoaXMueHYoYSl9LHh2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueXY6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBQYT1jLklzfHxQYSxTYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MubGwoNCk7KGZ1bmN0aW9uKGMpe2MuVWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nYW1lQ29udGFpbmVyWzBdO3RoaXMuUChiKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMudmlkZW9UYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpLGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxYYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmCihiPSEwKTtyZXR1cm4gYn0sTDpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgUWE9Yy5Vanx8UWE7KGZ1bmN0aW9uKGMpe2MuVGo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuWGEoKT8oJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0YXAiLGZ1bmN0aW9uKCl7dGhpcy5vYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSkpOnRoaXMub2MoKX0sb2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/CnRoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpO3ZhciBSYT1jLlRqfHxSYTsoZnVuY3Rpb24oYyl7Yy5Waj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuTklDSyYmTklDSy5HYW1lTG9hZGVyJiZOSUNLLkdhbWVMb2FkZXIuZ2FtZUNvbnRhaW5lcil7dmFyIGI9bmV3IFFhKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgUmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFNhPWMuVmp8fFNhLFRhPW5ldyBTYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbj10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzEwXTt0aGlzLk1oPXRoaXMuYVs4XTsKdGhpcy5ycj10aGlzLmFbNF07dGhpcy5hbz10aGlzLmFbOF07dGhpcy5BdD10aGlzLmFbN107dGhpcy5Ccz10aGlzLmFbNF07dGhpcy5RaD10aGlzLmFbOV07dGhpcy5qcj10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLnBzPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYms6dGhpcy5MaChhKX0sTGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1oOnRoaXMucXIoYSl9LHFyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucnI6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFvOnRoaXMuenQoYSl9LHp0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5BdDp0aGlzLkFzKGEpfSxBczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQnM6dGhpcy5QaChhKX0sUGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlFoOgp0aGlzLmlyKGEpfSxpcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuanI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBVYT1jLnBzfHxVYSxUYz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5Mbig0KTsoZnVuY3Rpb24oYyl7Yy5Oaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLlAoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlMoYik6dGhpcy5kYSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5lYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS4kYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5hZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuYmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuYmUrKztpZigxMDx0aGlzLmJlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfX0pfSkoYyk7dmFyIFZhPWMuTmt8fFZhOyhmdW5jdGlvbihjKXtjLk1rPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuR2QpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuR2Q9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnhwPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLnhwPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuTXMoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFdhPWMuTWt8fFdhOyhmdW5jdGlvbihjKXtjLk9rPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVmEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBXYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWGE9Yy5Pa3x8WGEsWWE9bmV3IFhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF1PXRoaXMuYVsxXTt0aGlzLldnPXRoaXMuYVs3XTt0aGlzLnlqPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMucGo9YjtiLnByb3RvdHlwZT17enU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkF1OnRoaXMuVmcoYSl9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV2c6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnlqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIFphPWMucGp8fFphLFVjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1VYy56dSg0KTsoZnVuY3Rpb24oYyl7Yy5GaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUChiLmVsZW1lbnQpO3RoaXMuUyhiLmVsZW1lbnQpfSxEYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZmluaXNoKCl9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSGl0Ym94In19KX0pKGMpO3ZhciAkYT1jLkZpfHwkYTsoZnVuY3Rpb24oYyl7Yy5FaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudygpfX0pfSkoYyk7dmFyIGFiPWMuRWl8fGFiOyhmdW5jdGlvbihjKXtjLkdpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoaXRib3guYWRibG9ja2VyIixmdW5jdGlvbihiKXtiPW5ldyAkYShiLmRldGFpbCk7Yi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgYWIoYix0aGlzLkEpKS5iKCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBiYj1jLkdpfHxiYixjYj1uZXcgYmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnpuPXRoaXMuYVs1XTt0aGlzLlZvPXRoaXMuYVszXTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLlNpPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzRdfWMucnE9YjtiLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpuOnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wbzp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhyOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBkYj1jLnJxfHxkYixWYz1uZXcgZGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1WYy55big0KTsoZnVuY3Rpb24oYyl7Yy5jaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUudWYoYiwiZWxlbWVudElEIik7dGhpcy5oZz1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlAoZyk7dGhpcy5TKGcpO3RoaXMuR2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5HYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuR2MpfSxXYTpmdW5jdGlvbigpe3JldHVybiEwfSxrbzpmdW5jdGlvbigpe2UuTWYodGhpcy5HYyk7ZS5OZih0aGlzLkdjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua28oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sUGQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBlYj1jLmNqfHxlYjsoZnVuY3Rpb24oYyl7Yy5iaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudyghMCl9fSl9KShjKTt2YXIgZmI9Yy5ianx8ZmI7KGZ1bmN0aW9uKGMpe2MuZGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy53YT0xNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsuaW5yZWFkKXt2YXIgYj1rLmlucmVhZCxhPWUudWYoYiwiZWxlbWVudElEIik7CmUuTWYoYSkmJihiPW5ldyBlYihiKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBmYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGdiPWMuZGp8fGdiLGhiPW5ldyBnYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55dT10aGlzLmFbMV07dGhpcy5MdT10aGlzLmFbMl07dGhpcy54bj10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLkh1PWI7Yi5wcm90b3R5cGU9e3h1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dTp0aGlzLkt1KGEpfSxLdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHU6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYj1jLkh1fHxpYixXYz1uZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1XYy54dSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuTmk9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0scXQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxTbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLk5pfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmcsZCxjKXt0aGlzLklhPWE7dGhpcy5xZj10aGlzLlVnPSExO3RoaXMuYmc9ZDt0aGlzLnlnPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLklhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnRiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLk5kKHRoaXMuSWEudXJsKSYmbS5oZCl7dmFyIGg9bmV3IHooYS51cmwpO2gucXQoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYKKGI9ITApO2J8fG0uZ2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXttLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5PaT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5xZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMueWc/dGhpcy50Yi5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCExKTp0aGlzLnRiLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITApLHRoaXMuVWd8fCh0aGlzLnRiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksInVuZGVmaW5lZCIhPXR5cGVvZiBrJiZrJiZrLnZwYWlkJiZtJiZtLlNjKHRoaXMuSWEudXJsKSx0aGlzLnRiLnNlbmQoYSl9Y2F0Y2goYyl7bSYmbS5OZCh0aGlzLklhLnVybCk/bS5oZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLk5kKHRoaXMuSWEudXJsKSx0aGlzLmJnJiZ0aGlzLmJnKCl9cmV0dXJuIHRoaXMudGJ9fX0pKGMpO3ZhciBqYj1jLk9pfHxqYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnpkPXRoaXMuYmI9bnVsbDt0aGlzLkhvPXRoaXMub2I9dGhpcy5VZj0hMTt0aGlzLnVhPSIiO3RoaXMuUGY9ITE7dGhpcy5BYT10aGlzLk9jPSIiO3RoaXMuTGY9dGhpcy5aPXRoaXMuaXNFbmFibGVkPXRoaXMuaGU9ITE7dGhpcy5PYT1bXTt0aGlzLkVmPXRoaXMuRmI9IiI7dGhpcy5FZD0hMTt0aGlzLnRlPQowO3RoaXMuR2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5FZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMua2M9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRmU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMucGI9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMudWU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5LZD0hMTt0aGlzLm1vPXRoaXMuamQ9bnVsbDt0aGlzLnVnPXRoaXMuaWM9dGhpcy5MZz10aGlzLndlPXRoaXMuaGQ9dGhpcy5BZD10aGlzLm1jPSExO3RoaXMuUWE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuUGk9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsCmFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmJiLGFkdGFncmVnZXg6dGhpcy56ZCxqc3BvcHVwczp0aGlzLlVmLHNpZGVsb2Fkczp0aGlzLm9iLGRpc2FibGV0ZXN0czp0aGlzLkhvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuUGYsZ2xvYmFsQ29uZmlnOnRoaXMuT2MsY2xpZW50Q29uZmlnOnRoaXMuQWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5aLGlzQmxvY2tlZDp0aGlzLkxmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMuRWYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5FZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy50ZSxIT01BRF9WRVJJRklFRDp0aGlzLkdlLEhPTUFEX0JMT0NLRUQ6dGhpcy5FZSxIT01BRF9OT0JMT0NLRVI6dGhpcy51YixIT01BRF9BREJMT0NLRVI6dGhpcy5rYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRmUsdGVzdEhpZGU6dGhpcy5IYiwKdGVzdFRhZ3M6dGhpcy5wYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMudWUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5LZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1vLGFkQmxvY2tlckRldGVjdGVkOnRoaXMubWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLkFkLHVzZVN0cmljdENoZWNrczp0aGlzLmhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndlLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUWEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMucGcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuaWMsc2tpcEFsbG93ZWQ6dGhpcy51Z319LG1xOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJihhPSEwKTtyZXR1cm4gYX0sbGU6ZnVuY3Rpb24oYSl7dGhpcy5RYVthXT0KITB9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0scWU6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5QbihhKX0sS2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLAplPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5TYyhhKTtlPXRoaXMuTWEoYSk7Yz8odGhpcy5iYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5qZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLk9ifHx0aGlzLmJifHx0aGlzLnpkKSYmKGs9dGhpcy5LcihrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLlNwKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7KGM9Yy5leGVjKGEpKSYmKGNbMl18fGNbNV0pP2I9ITA6dGhpcy5iYygpJiYoYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChjPWMuZXhlYyhhKSkmJmNbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZDpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7YyYmKGNbMl18fGNbNV0pP2I9ITA6Yj10aGlzLlNjKGEpO3JldHVybiBifSwKU3A6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnVhJiYwPHRoaXMudWEubGVuZ3RoKXJldHVybiB0aGlzLnVhO2ZvcihjIGluIHRoaXMudWEpaWYoYj10aGlzLnVhW2NdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSnY7cmV0dXJuIm5vbmUifSxRYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMucGddfSxqZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUWMoKSxiPXRoaXMudGcoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGM9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitjW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpjLmxlbmd0aCldKX0sS3I6ZnVuY3Rpb24oYSl7dGhpcy5PYiYmKGErPXRoaXMuT2IpO2lmKHRoaXMuYmIpZm9yKHZhciBiIGluIHRoaXMuYmIpdGhpcy5iYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsCnRoaXMuYmJbYl0pKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsYyxmLGUsaCl7bT10aGlzO3RoaXMuUGY9ITA7dGhpcy5PYz1hO3RoaXMuQWE9Yjt0aGlzLmhlPWM7dGhpcy5qZD1mO3RoaXMuRWM9ZTt0aGlzLkViPWh8fHt9O3RoaXMuenIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQWEpdGhpcy54cigpO2Vsc2UgdHJ5e3RoaXMuQWE9YigpLHRoaXMuemMoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWWE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goYyl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LHpyOmZ1bmN0aW9uKCl7dGhpcy5HYShuZXcgeih0aGlzLk9jK3RoaXMucmMoImdsb2JhbCIpKSx0aGlzLmZxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx4cjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQWErdGhpcy5yYygiY2xpZW50IikpO3RoaXMuR2EobmV3IHoodGhpcy5BYSt0aGlzLnJjKCJjbGllbnQiKSksdGhpcy56Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5sZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scmM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMua2IoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkFkKXt0aGlzLkFkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLkVjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRWM/dGhpcy5FYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5aPXRoaXMuTGY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMuRWUpKTt0aGlzLnNiKCk7ZS5UYihsLkpzKTsoYj1lLkFmKHRoaXMuUWMoKSkpfHwoYj1lLkFmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxmcTpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5aPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuQWF8fHRoaXMuRmJ8fHRoaXMudWF8fHRoaXMuemMoKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5aPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnViKSksdGhpcy5zYigpKX19LHpjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQWF9ZWxzZSBhPXRoaXMuQWE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5PYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuRWY9YS5hZHBhdGh8fCIiO3RoaXMuRWQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5wZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5PYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkZiJiZ0aGlzLnVhJiZ0aGlzLk9hLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKSwKdGhpcy5zYigpKX0sVWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5qZSgpKSxjPXRoaXMuTWEodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMucmMoImN1c3RvbWVyIikpO3RoaXMuR2EoYix0aGlzLk10LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJjdXN0b21lciIpO2E/dGhpcy54bD90aGlzLmdhKCJub1NWTUNvbmZpZyIpOih0aGlzLnhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5VYyghMCl9LmJpbmQodGhpcyksITApfX0sTXQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5oZD10aGlzLkpiKGIuc3RyaWN0KTt0aGlzLndlPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuTGc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnBiPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuYmI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuemQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVWY9Yi5qc3BvcHVwc3x8ITE7dGhpcy5vYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5pYz1iLnZwYWlkfHwhMTt0aGlzLkViLnZwYWlkPXRoaXMuaWM7dGhpcy51Zz0KYi5za2lwYWxsb3dlZHx8ITE7dGhpcy5HYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLiRwKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5FZCYmKHRoaXMuR2I9bnVsbCk7dGhpcy51ZT1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLktkJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5LZD0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmN1KCkmJih0aGlzLkhifHx0aGlzLklifHx0aGlzLnBifHx0aGlzLkdiKT90aGlzLmhlPyh0aGlzLm9hPXRoaXMuWj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy51YikpLHRoaXMuQmQoKSx0aGlzLnNiKCkpOnRoaXMuUHQoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5RdCgpKX19LFB0OmZ1bmN0aW9uKCl7dGhpcy5PdCgpfSxRdDpmdW5jdGlvbigpe3RoaXMuWj0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCl9LGdkOmZ1bmN0aW9uKGEpe3RoaXMubWM9ITA7dGhpcy5afHwodGhpcy5aPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKGEpKSx0aGlzLnNiKCksdGhpcy5CZCgpKX0sT3Q6ZnVuY3Rpb24oKXtpZih0aGlzLkhiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkhiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9Y31jYXRjaChmKXt9YT90aGlzLmdkKHRoaXMua2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLkJnKCl9ZWxzZSB0aGlzLkJnKCl9LEFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLmtiKCkpO3RoaXMuVHQoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnJlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5nZCh0aGlzLmtjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5wYj1udWxsLHRoaXMucmUoKX0sVHQ6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0aGlzLkdhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxCZzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigpKTt0aGlzLlV0KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5BZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuZ2QodGhpcy5rYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5JYiYmdGhpcy5JYi5sZW5ndGgpe3ZhciBjPXRoaXMuSWIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5BZygpfSxVdDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LHJlOmZ1bmN0aW9uKCl7dGhpcy5HYj8odGhpcy50ZSsrLHRoaXMuR2EobmV3IHoodGhpcy5HYiksdGhpcy5OdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLnpnKCl9LHNlOmZ1bmN0aW9uKGEpe3RoaXMuZ2QodGhpcy5GZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LE50OmZ1bmN0aW9uKGEpe2E9CmEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy50ZT90aGlzLnJlKCk6dGhpcy5zZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuemcoKTp0aGlzLnNlKCJBQUEiKX0semc6ZnVuY3Rpb24oKXt0aGlzLlo9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCk7dGhpcy5CZCgpfSxzYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5YYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLm1jJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy5HZSkpO3RoaXMuamQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5qZCYmdGhpcy5qZCgpfSxqbzpmdW5jdGlvbigpe2lmKHRoaXMud2UmJnRoaXMubXEoKSl7dmFyIGE9CnRoaXMuUXAoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LEVnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sR2E6ZnVuY3Rpb24oYSxiLGMsZixoLEljKXthPW5ldyBqYihhLGIsYyk7ZiYmKGEuVWc9ITApO2gmJmUuUXEoKSYmKGEucWY9ITApO0ljJiYoYS55Zz0hMCk7cmV0dXJuIGEubG9hZCgpfSxXZTpmdW5jdGlvbigpe2UuWGEoKXx8ZS5MYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fAooYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuZ2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLmJjKCl8fChhPXRoaXMuTWEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7CmguYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0saW86ZnVuY3Rpb24oKXt0aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkdhKGEsdGhpcy5QdS5iaW5kKHRoaXMpLAp0aGlzLk91LmJpbmQodGhpcykpfSxQdTpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMudHAoKX0sT3U6ZnVuY3Rpb24oKXt9LHRwOmZ1bmN0aW9uKCl7ZS5UYihsLnNwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxCZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm9iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMub2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5vYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9Cm5ldyBRO3dpbmRvd1tjLlpiKCldPXRoaXM7ZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxjdTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnVlfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sa2I6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT0KYXx8MT09YXx8IjEiPT1hfHwxPT1hfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsaz0oZiYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oZik/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpOwpyZXR1cm4gYn0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSx0ZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPQoiIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx3LHQseDtuPWEubGVuZ3RoO3ZhciB5PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHkucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PAoyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih5LnB1c2goZik7MTQhPXkubGVuZ3RoJTE2Oyl5LnB1c2goMCk7eS5wdXNoKG4+Pj4yOSk7eS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHkubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO249bDtwPW07dz1xO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfH5uJncpK3QraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj0yMDszOT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NDA7NTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8biZ3fHAmdykrdCtoW2ZdKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj02MDs3OT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cT1xK3cmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBrYj1jLlBpfHxrYixtPW5ldyBrYjt3aW5kb3cuT3Y9bTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaz10aGlzLmFbN107dGhpcy5Fbz10aGlzLmFbOV07dGhpcy52dj10aGlzLmFbNl07dGhpcy5WcT10aGlzLmFbM107dGhpcy5ZcT10aGlzLmFbOV07dGhpcy5taT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs0XX0KYy55bz1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZrOnRoaXMuRG8oYSl9LERvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbzp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnY6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlZxOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZcTp0aGlzLmxpKGEpfSxsaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubWk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBsYj1jLnlvfHxsYixYYz1uZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1YYy5Fayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmIsYyl7dGhpcy5pPWE7YS51Lkw/dGhpcy5OYT1hLnUuTCgpOnRoaXMuTmE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5pLlJhO3RoaXMucGxheWVyPXRoaXMuaS51O3RoaXMudWM9ITE7dGhpcy5Obj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmZkPXt9O3RoaXMuc2M9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5zYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmkudSkmJnRoaXMuaS51LkImJihhPXRoaXMuaS51LkIoKSksdGhpcy5zYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5YbT1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmVkPSExO3RoaXMuWGY9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOgoxNTt0aGlzLnM9e307dGhpcy5xYz0hMTt0aGlzLkhnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuJGI9ITE7dGhpcy53bz1lLnBhKDEwKTt0aGlzLlhjPWUucGEoMTApO3RoaXMuWGQ9ZS5wYSgxMCk7dGhpcy52Zz1lLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkJiPSExO3RoaXMuRmQ9bnVsbDt0aGlzLkNkPXRoaXMuRGM9dGhpcy53Zz10aGlzLmRnPXRoaXMuSGM9dGhpcy5ldT10aGlzLiRhPSExfWMuSmk9YjtiLnByb3RvdHlwZT17cWc6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5OYV0mJnRoaXMuY29uZlt0aGlzLk5hXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTmFdW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuVC5tYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6CmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGwuS20sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKX0sUmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJGE9YztpZih0aGlzLlQuWil0aGlzLlQuam8oKSx0aGlzLlQub2EmJnRoaXMuVC5pc0VuYWJsZWQ/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ULmljfSkpOmI/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuVC5pYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuQmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YuUmQoYSxiLGMpfSw1MCl9fSxjZTpmdW5jdGlvbihhKXt0aGlzLkhjPSExO3RoaXMucz1hO3RoaXMueXQodGhpcy5zKTsKdGhpcy5CZihhKX0sQmY6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuZmQ9dGhpcy5icShhKSksdGhpcy5CZihhLnBhcmVudCkpfSxicTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWSl7Yj1hLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlkuZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5ZLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYKKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVGEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLkZjJiZhLkZjLmVycm9yJiZhLkZjLmVycm9yLmNvZGUmJihiPWEuRmMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2UgeC5qYy5jb2RlOmI9PUMub2QuY29kZT9lLkQobC5ndix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpOihlLlNkKCksYj09Qy5KZS5jb2RlJiZlLkQobC5Pcix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKTtlLkQobC5ycCx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjsKYnJlYWs7Y2FzZSB4LkhlLmNvZGU6ZS5EKGwuUXUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB4LktlLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS5EKGwubXYsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2UgeC5wZC5jb2RlOmUuRChsLm52LHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2UgeC5uZC5jb2RlOmUuRChsLlByLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PQpjJiZhLmVycm9yJiZhLmVycm9yLmthJiYoYys9Il8iK2EuZXJyb3Iua2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy56YihhKTt0aGlzLkJhKCl9LHpiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS56YS5sZW5ndGg7KXRyeXt2YXIgYz1hLnphLnBvcCgpO3RoaXMuUWQoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHl0OmZ1bmN0aW9uKGEpe3RoaXMuQ2Q9ITE7dGhpcy5yYT10aGlzLmkuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuaS5DO2IuZ3c9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLlhtJiZ0aGlzLnBsYXllci5LYygpJiYKKGIudm9sdW1lPXRoaXMucGxheWVyLktjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuVG0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLkRnKGIpPyh0aGlzLlZtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5ybygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLnd0KCkpOnRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0sd3Q6ZnVuY3Rpb24oKXtlLiRlKCk7dGhpcy5zJiZ0aGlzLnMub3JpZ2luJiZ0aGlzLnMub3JpZ2luLkJlJiZlLldtKHRoaXMucy5vcmlnaW4uQmUpO2UuWmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmkuQzt0aGlzLmkuQz1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5pLkMsYSk7dGhpcy5pLmVnKCk7dGhpcy5pLmZjKCk7Zm9yKGE9dGhpcy5pLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuaS5mYygpO3RoaXMuVz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlcuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTsKdGhpcy5XLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5XLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmkuRy5hcHBlbmRDaGlsZCh0aGlzLlcpO3RoaXMuVy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnMuZXEoKSxiPXRoaXMucy5PLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sCmNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuaS5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5pLkcuc3R5bGUuaGVpZ2h0KX19fTtlLnlhKHRoaXMuVywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsCiJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuWG4oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlQpO3RoaXMuVy5zcmM9YTtlLndkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5CYSgpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuYXYoKSx0aGlzLmkuV2IoITApKSwKIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5pLldiKCEwKSx0aGlzLmJ2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuaS5XYighMCksdGhpcy5ldigpKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ2KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR2KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KCkpfS5iaW5kKHRoaXMpKTtlLndkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcykpO2Uud2QoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmkuUW0oZnVuY3Rpb24oYSl7ZS55YSh0aGlzLlcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSwKYnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0sYXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5aYSgiaW1wcmVzc2lvbiIpfSxldjpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS5aYSgic3RhcnQiKX0sUmc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5aYSgiZmlyc3RRdWFydGlsZSIpfSxmdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlphKCJ0aGlyZFF1YXJ0aWxlIil9LGR2OmZ1bmN0aW9uKCl7dGhpcy5rZCgpO2UuWmEoImNvbXBsZXRlIil9LGN2OmZ1bmN0aW9uKCl7ZS5aYSgiYWRzdG9wcGVkIik7dGhpcy5hZigpfSxUbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlQ7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmJjKCk/KGY9ZS5NYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KToKYj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5VdS5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LERnOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sVm06ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuUWcuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55ZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxhZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5RZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwKdGhpcy55ZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxRZzpmdW5jdGlvbihhKXt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZShhKX0uYmluZCh0aGlzKSx0aGlzLk5uKX0seWU6ZnVuY3Rpb24oYSl7dHJ5e2lmKCFlLlhhKCkmJnRoaXMuVC5MZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQmJ8fCh0aGlzLkJiPSEwLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMudWN8fCF0aGlzLkRnKHRoaXMudmlkZW8pfHwKdGhpcy5CYnx8KHRoaXMudWM9ITAsdGhpcy5UdSgpLHRoaXMudmlkZW8uY29udHJvbHM9ITEsdGhpcy5pLmZjKCksdGhpcy5OZygpLHRoaXMuT2coKSx0aGlzLlVlKCksdGhpcy5pLmVnKCksdGhpcy52aWRlby5wbGF5JiZ0aGlzLnBlKCkpfSxwZTpmdW5jdGlvbigpe2lmKCF0aGlzLkRjKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuRmEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuUGM9W107Zm9yKHZhciBiPXRoaXMuaS5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLlBjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIiwKYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMudGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMudGQoKX1lbHNlIHRoaXMudGQoKX0sdGQ6ZnVuY3Rpb24oKXtpZih0aGlzLlBjKWZvcih2YXIgYT0KMDthPHRoaXMuUGMubGVuZ3RoO2ErKyl0aGlzLlBjW2FdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYT10aGlzLnZpZGVvLnBsYXkoKSkmJmFbImNhdGNoIl0pYVsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuRGN8fCh0aGlzLkJhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLCIiLCEwKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5DYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkNiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkNiLmJpbmQodGhpcykpKTpIPWZ1bmN0aW9uKCl7dGhpcy5xY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGUoKSl9LmJpbmQodGhpcyk7dGhpcy56ZigpLnJnKHRoaXMpfSxrZDpmdW5jdGlvbigpe3RoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UuRChsLkZtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5hZigpfSxhZjpmdW5jdGlvbigpe3RoaXMuQ2R8fCh0aGlzLkNkPSEwLHRoaXMucy54Yj8odGhpcy51Yz0hMSx0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuZWQ9ITEsdGhpcy5pLkpnKCksdGhpcy5zLm9yaWdpbi5ZZCgpKTp0aGlzLkJhKCkpfSxVdTpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5sZChhKSl9LGxkOmZ1bmN0aW9uKGEpe2EmJgphLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5NZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SYnx8dGhpcy5ULldlKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlQuV2UoKSk7dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0semU6ZnVuY3Rpb24oKXtpZih0aGlzLmV1KXRoaXMuQmEoKTtlbHNle3RoaXMuJGI9ITA7dGhpcy5pLnUuamImJiF0aGlzLndnJiZ0aGlzLmkudS5qYigpJiZlLkQobC5CYyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tdShhKTt2YXIgYj0iIjtpZih0aGlzLnMub2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMudmcpO2MmJihiPXRoaXMucy5vZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMuZWR8fCh0aGlzLmVkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChsLkxtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5zLnhiPyh0aGlzLnVjPSExLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5jYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuY2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5lZD0hMSx0aGlzLmkuSmcoKSx0aGlzLnMub3JpZ2luLllkKCkpOnRoaXMuQmEoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuc2MucmVwbGFjZSgiW3RpbWVdIixlLnJmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMucWM9ITA7dGhpcy52aWRlby5jb250cm9scz0KITF9fSxzZzpmdW5jdGlvbigpe3RoaXMuUmI9ITA7dGhpcy5yYT10aGlzLmkuRzt0aGlzLnJhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpOwphLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuWHAoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmkuQz1hO3ZhciBiPXRoaXMuaS5DLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmkuZmMoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy5yYS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMucmEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlBnLmJpbmQodGhpcyk7dGhpcy5jYS5hcHBlbmRDaGlsZChiKTt0aGlzLk5nKCk7dGhpcy5PZygpO3RoaXMuRmQ9c2V0SW50ZXJ2YWwodGhpcy5oby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFhwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5zLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLnMuTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5UO2gub2EmJmguaXNFbmFibGVkJiYhaC5iYygpJiYoZT1oLk1hKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sCmhvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLnMuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5GZCksdGhpcy5rZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnplKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLkZkKSx0aGlzLmxkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sR2c6ZnVuY3Rpb24oKXt0aGlzLmRnfHwodGhpcy5kZz0hMCx0aGlzLkhjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sbXU6ZnVuY3Rpb24oYSl7YT09dGhpcy5IZ3x8dGhpcy5CYnx8KDA9PWEmJih0aGlzLiRhJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLiRhKSx0aGlzLiRhPQohMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuR2coKX0uYmluZCh0aGlzKSksdGhpcy5SYiYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMuQmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlhhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQobC5IbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpLGUuRChsLk1tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksdGhpcy5SYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PQpNYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuSGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLkQobC5HbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGwuSm0sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSksYT09TWF0aC5mbG9vcigzKnRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChsLk9tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpLGUuRChsLlBtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksCnRoaXMuSGc9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuQmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH1mb3IodmFyIGM9dGhpcy5jcSh0aGlzLnMuemEsYSk7Yy5sZW5ndGg7KXRyeXt2YXIgZj1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmdGhpcy5mZC5pbXByZXNzaW9ucyYmZS5PcShmLnVybCx0aGlzLmZkLmltcHJlc3Npb25zKT90aGlzLlFkKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQobC5JbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkse2FkSWQ6dGhpcy5mZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUWQoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8Cih0aGlzLnMuemE9dGhpcy5Cbyh0aGlzLnMuemEsYSkpfX0sUWQ6ZnVuY3Rpb24oYSxiLGMsZil7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGE9dGhpcy5ULkthKGEpLGMmJmEuU20oYyksZnx8KGY9dGhpcy5qZiksdGhpcy5ULkdhKGEsZix0aGlzLmpmLCExLCEwKSl9LGNxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sQm86ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sVHU6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuUGcuYmluZCh0aGlzKX0sUGc6ZnVuY3Rpb24oKXtlLkQobC5xbyx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5IYyYmZS5YYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuTHAoKSwhMCk7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5zLnljfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMucy55Yyx0aGlzLlQub2E/Il90b3AiOiJfYmxhbmsiKX19LE5nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PQoiQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLnNjLnJlcGxhY2UoIlt0aW1lXSIsZS5yZigwKSk7dGhpcy5jYXB0aW9uPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYSl9fSxPZzpmdW5jdGlvbigpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlkPXRoaXMud287dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249CiJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsdGhpcy5jZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGIuc3R5bGVbImZsb2F0Il09ImxlZnQiLGIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yi5pZD10aGlzLlhjO2IuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmd1LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLAp0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09InJpZ2h0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5YZDtjLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZ1LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxmLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZi5zdHlsZS50b3A9Ii01MHB4IixmLnN0eWxlLnJpZ2h0PSIwcHgiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLnZnO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7Zi5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMub2UmJmEuYXBwZW5kQ2hpbGQoZik7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKdGhpcy5jZC5iaW5kKHRoaXMpKTt0aGlzLmNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3RoaXMuY29udHJvbHM9dGhpcy5jYS5hcHBlbmRDaGlsZChhKTt0aGlzLmkudS5XYSYmdGhpcy5pLnUuV2EoKSYmdGhpcy5McigpO3RoaXMuVmIoKX19LFZiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sY2Q6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sZ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlhjKTt0aGlzLmkuQy5wYXVzZWQ/KHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSk6KHRoaXMuaS5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sCnRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGwuUGUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YYyk7dGhpcy5pLkMucGF1c2VkfHwodGhpcy5pLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChsLlBlLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpfSxpdDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGMpO3RoaXMuaS5DLnBhdXNlZCYmKHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YZCk7dGhpcy5pLkMubXV0ZWQ/Cih0aGlzLmkuQy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApKToodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCkpfSxMcjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGQpO3RoaXMuaS5DLm11dGVkfHwodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxDYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkNiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5DYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQ2IpO3RoaXMuRGN8fHRoaXMucWN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnBlKCkpfSxCYTpmdW5jdGlvbigpe3RoaXMuRGM9ITA7dGhpcy4kYSYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy4kYSksdGhpcy4kYT0hMSk7aWYoKCJwcmVyb2xsIj09ZS5GYSYmdGhpcy5xY3x8InBvc3Ryb2xsIj09ZS5GYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5GYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKHZhciBiPXRoaXMuaS5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmkuZmMoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuRGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5EZCgpfWVsc2UgdGhpcy5EZCgpfSxEZDpmdW5jdGlvbigpe3RoaXMud2c9ITA7dGhpcy5pLkRmKCk7CnRoaXMuaS5qdCgpO3RoaXMuJGI9ITE7ZS5EKGwudm8sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTt0aGlzLnpmKCkuZ3QoKX0semY6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuaSYmdGhpcy5pLnUmJihhPXRoaXMuaS51KTtyZXR1cm4gYX0sTWQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmKGE9ITApfXJldHVybiBhfSxVZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihlLk5mKHRoaXMudmlkZW8sYSk/dGhpcy5pdCgpOnRoaXMuYWUoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWUoKX0uYmluZCh0aGlzKSwKMTAwKSl9LFI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLnMmJihhLmNsaWNrdGhyb3VnaD10aGlzLnMueWMsYS5kdXJhdGlvbj10aGlzLnMuZHVyYXRpb24sYS5hZFBvZD10aGlzLnMueGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSkpO3JldHVybiBhfSxqZjpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIE89Yy5KaXx8TztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ubz10aGlzLmFbNl07dGhpcy5taD10aGlzLmFbNF07dGhpcy5mcz10aGlzLmFbNF07dGhpcy4kaj10aGlzLmFbOF07dGhpcy5ZdD10aGlzLmFbMV07dGhpcy5vcj10aGlzLmFbOF07dGhpcy5vcz10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLldpPWI7Yi5wcm90b3R5cGU9e1NvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuVG86dGhpcy5saChhKX0sbGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1oOnRoaXMuZXMoYSl9LGVzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5mczp0aGlzLlpqKGEpfSxaajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiRqOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZdDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm9zOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWI9Yy5XaXx8bWIsWWM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuU28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPQpkfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuSmE9bnVsbDt0aGlzLmJhPVtdO3RoaXMuWT1udWxsO3RoaXMuTWI9ITE7dGhpcy5CZT0iIjt0aGlzLkFlPSExO2QmJmQuZW1wdHk/dGhpcy5DcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmZmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkthKG0ucWUodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PQp0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJihhPWUuY2YodGhpcy51cmwpLHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5xZShhKSkrIiZ0eXBlPWpzIixiPW0uS2EobS5xZSh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpLGIuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIik7bS5HYShiLHRoaXMuQnIuYmluZCh0aGlzKSx0aGlzLnlyLmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSwKYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkZhKXRyeXt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWYuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmCiJwcmVyb2xsIj09ZS5GYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuRmEpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8Ck51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxCcjpmdW5jdGlvbihhKXt0aGlzLllzKGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5WYygpOnRoaXMuZmEodGhpcy5DYSh4LmpjLHtlcnJvcjp0aGlzLkFlP0Mub2Q6Qy5JZX0pKX0sQ3I6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/CnRoaXMuVmMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5qYyx7ZXJyb3I6dGhpcy5BZT9DLm9kOkMuSWV9KSl9LHlyOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkNhKHguSGUse2RlcHRoOmF9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5ZPXRoaXMuYmEuc2hpZnQoKTt0aGlzLlRxKCk/dGhpcy5WdCgpPyhhKyssbmV3IGIodGhpcyx0aGlzLkNmKCksZyx7QWRTeXN0ZW06dGhpcy5KcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmZhKHRoaXMuQ2EoeC5LZSkpOihhPTAsdGhpcy5NdSgpJiZ0aGlzLmNlKHRoaXMueG8oKSkpfSxZZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5ZZCgpfSxNdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlN0KCk/dGhpcy5SdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5DYSh4LkRlKSk6dGhpcy5mYSh0aGlzLkNhKHguVmgpKSwhMSk6Cih0aGlzLmZhKHRoaXMuQ2EoeC5qYyxDLkplKSksITEpfSxjZTpmdW5jdGlvbihhKXthLnphPWEuemEuY29uY2F0KHRoaXMuVWQoKSk7YS54Yj1hLnhiP2EueGI6dGhpcy5NYjt0aGlzLnBhcmVudC5jZShhKX0seG86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbmI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMueGYoKTthLnljPXRoaXMuTXAoKTthLm9yaWdpbj10aGlzO2EuTz10aGlzLklwKCk7YS5vZT10aGlzLmFxKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLlkmJihiLnphPWIuZXJyb3IuY29kZSE9eC5EZS5jb2RlP2IuemEuY29uY2F0KHRoaXMuT3AoKSk6Yi56YS5jb25jYXQodGhpcy5WcCgpKSk7dGhpcy5iYS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC56YiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnpiJiZ0aGlzLnBhcmVudC56YihiKSxhPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZhJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx6YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC56YihhKX0sa2Y6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQ2EoYSxiKSl9LENhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG9iKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sVnQ6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxTdDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMueGYoKS5sZW5ndGh9LFJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5VYigpfSxDZzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuYmEuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxZczpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuQmU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLkFlPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxUcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuQ2YoKS5sZW5ndGh9LENmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGQodGhpcy5ZLCJWQVNUQWRUYWdVUkkiKX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZCh0aGlzLlksIkFkU3lzdGVtIil9LFVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVsiSW1wcmVzc2lvbiIsIlRyYWNraW5nIiwiQ2xpY2tUcmFja2luZyIsIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBnPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZykpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGcudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5UYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LApWcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0seGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSx2YzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksCk12OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLlRhKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxiPWcuY29uY2F0KGQpfWNhdGNoKGUpe31yZXR1cm4gYn0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIiwKZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMuTmMoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2UucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuVGEodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxhcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGc9ITE7dHJ5e2M9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxnPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkZ0KGcsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZCl7Yj0hMX1yZXR1cm4gYn0sCkhkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5UYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sSWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFRhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuTmMoYSk6IiJ9LE5jOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSWQoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLmFtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkluPXRoaXMuYVs2XTt0aGlzLldrPXRoaXMuYVszXTt0aGlzLkNqPXRoaXMuYVs1XTsKdGhpcy5Vaz10aGlzLmFbN107dGhpcy5paD10aGlzLmFbN107dGhpcy5Baj10aGlzLmFbNl07dGhpcy5rcz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLnVwPWI7Yi5wcm90b3R5cGU9e0huOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbjp0aGlzLlZrKGEpfSxWazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2s6dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNqOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaWg6dGhpcy56aihhKX0semo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Bajp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmtzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy51cHx8cGIsWmM9bmV3IHBiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLkhuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuemE9W107dGhpcy5NPVtdO3RoaXMueWM9IiI7dGhpcy5PPXRoaXMueGI9ITE7dGhpcy5vcmlnaW49bnVsbH1jLlhrPWI7Yi5wcm90b3R5cGU9e3JvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGVxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgbmI9Yy5Ya3x8bmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaGs9dGhpcy5hWzldO3RoaXMucG49dGhpcy5hWzZdO3RoaXMucWg9dGhpcy5hWzFdO3RoaXMuSXE9dGhpcy5hWzhdO3RoaXMuUWs9dGhpcy5hWzVdO3RoaXMudG09dGhpcy5hWzldO3RoaXMuc2g9dGhpcy5hWzRdO3RoaXMuYm49dGhpcy5hWzRdO3RoaXMuZz0KdGhpcy5hWzVdfWMubXA9YjtiLnByb3RvdHlwZT17Z2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhrOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbjp0aGlzLnBoKGEpfSxwaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucWg6dGhpcy5IcShhKX0sSHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklxOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Razp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5yaChhKX0scmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnNoOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHFiPWMubXB8fHFiLCRjPW5ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5nayg0KTt2YXIgeD17cGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsa2E6IlhNTF9QQVJTRV9FUlJPUiJ9LFZoOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixrYToiRFVSQVRJT05fRVJST1IifSxqYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsa2E6IkVNUFRZX1ZBU1QifSxLZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKa2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGthOiJMT0FEX0VSUk9SIn0sbmQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCkJ2Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGthOiJNRURJQUZJTEVfRVJST1IifSxEZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixrYToiRFVNTVlfQUQifX0sQz17SWU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixrYToiTk9fQURTIn0sSmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGthOiJOT19NRURJQUZJTEVTIn0sRHY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxvZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuR2g9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbNl19Yy5nbD1iO2IucHJvdG90eXBlPXtGaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR2g6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciByYj1jLmdsfHxyYixhZD1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1hZC5GaCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLkZjPWI7dGhpcy56YT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuc2k9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYj1jLnNpfHxvYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Oaj10aGlzLmFbOV07dGhpcy5icj10aGlzLmFbM107CnRoaXMubHU9dGhpcy5hWzFdO3RoaXMuUnI9dGhpcy5hWzddO3RoaXMuQ3E9dGhpcy5hWzRdO3RoaXMub2g9dGhpcy5hWzRdO3RoaXMuYWk9dGhpcy5hWzJdO3RoaXMucmo9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNl19Yy5Icj1iO2IucHJvdG90eXBlPXtNajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTmo6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJyOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdTp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUnI6dGhpcy5CcShhKX0sQnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNxOnRoaXMubmgoYSl9LG5oOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vaDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmFpOnRoaXMucWooYSl9LHFqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5yajoKdGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYj1jLkhyfHxzYixiZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1iZC5Naig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLnU9YTt0aGlzLlJhPWEudGYoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUucGEoMTApO3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlNhPXt9O3RoaXMuUmY9ITE7dGhpcy5YYj1bXX1jLlpoPQpiO2IucHJvdG90eXBlPXtacDpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGY9MCxiPTAsZT17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZj1iLmxlZnQsYj1iLnRvcCk7ZT17eDpmLHk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlpwKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5NcShhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PQp3aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sTHQ6ZnVuY3Rpb24oKXt0aGlzLlJmPSEwfSxKZzpmdW5jdGlvbigpe3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sZWc6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtlLkQobC5CYyx0aGlzLnUuQigpKX0sanQ6ZnVuY3Rpb24oKXt0aGlzLlJmfHwodGhpcy51LnBsYXkoKSwKZS5EKGwuQ2MsdGhpcy51LkIoKSkpfSxmYzpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy51LnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5SYS5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuUmEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5SYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlJhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuUmEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuUmEpO3RoaXMudS5EYiYmCnRoaXMudS5EYigpP3RoaXMudS50ZigpLmFwcGVuZENoaWxkKHRoaXMuRyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkcpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2IuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy51LmV4aXRGdWxsc2NyZWVuKCl9LE1xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxOcDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LApXYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLk5wKHRoaXMuUmEpO2lmKGIueCE9dGhpcy5TYS54fHxiLnkhPXRoaXMuU2EueXx8Yi5wb3NpdGlvbiE9dGhpcy5TYS5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5TYS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuU2EuaGVpZ2h0fHxhKXtpZigwPHRoaXMuU2Eud2lkdGgmJjA8dGhpcy5TYS5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkRmKCk7cmV0dXJufXRoaXMuU2E9Yjt0aGlzLnUuRGIoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD0KYi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5YYi5sZW5ndGg7YSsrKXRoaXMuWGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9d2luZG93LnNldFRpbWVvdXQodGhpcy5XYi5iaW5kKHRoaXMpLDEwKX0sUW06ZnVuY3Rpb24oYSl7dGhpcy5YYnx8KHRoaXMuWGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlhiLnB1c2goYSl9LERmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTtmb3IodmFyIE49Yy5aaHx8TixCPVtdLHRiPTA7MTAwPnRiO3RiKyspe3ZhciBMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TC5zdHlsZS5kaXNwbGF5PSJibG9jayI7TC5pZD1lLnBhKDEwKTtMLmNvbnRyb2xzPSEwO0IucHVzaChMKX12YXIgSD0KITEsYmE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5uaz10aGlzLmFbMV07dGhpcy5BaT10aGlzLmFbMl07dGhpcy5kcj10aGlzLmFbOF07dGhpcy5rdj10aGlzLmFbMTBdO3RoaXMua2w9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzJdO3RoaXMubHI9dGhpcy5hWzhdO3RoaXMuWm09dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5wcj1iO2IucHJvdG90eXBlPXttazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubms6dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuY3IoYSl9LApjcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZHI6dGhpcy5qdihhKX0sanY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmt2OnRoaXMuamwoYSl9LGpsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbDp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU2s6dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxyOnRoaXMuWW0oYSl9LFltOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmc6YX19fSkoYyk7dmFyIHViPWMucHJ8fHViLGNkPW5ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWNkLm1rKDQpOyhmdW5jdGlvbihjKXtjLkprPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5QKGEpO3RoaXMubmUoYik7dGhpcy5nZigpfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZ2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5TKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxqYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkRhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdmI9Yy5Ka3x8dmI7KGZ1bmN0aW9uKGMpe2MuSWs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWNhKCk7dGhpcy53Yj10aGlzLndifHwhMTsKdGhpcy5PZT10aGlzLlJlPXRoaXMuSWY9dGhpcy5pYT10aGlzLnZlPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMueXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnZlPSEwO3RoaXMuSWYmJnRoaXMuWmUoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLiRiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMud2MoKTt0aGlzLklmPQohMDt0aGlzLlplKCl9LmJpbmQodGhpcykpO3RoaXMuVmUoKX0sWmU6ZnVuY3Rpb24oKXtpZighdGhpcy53Yil7dGhpcy53YygpO2lmKCF0aGlzLnZlJiYhdGhpcy53YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudmUmJnRoaXMuT2UmJiF0aGlzLlJlJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0sd2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LHlmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApWZTpmdW5jdGlvbigpe2lmKHRoaXMud2MoKSl7dmFyIGI9dGhpcy55ZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlJlPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuT2U9Yi5Jdn10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDEwMCl9LFB2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmJ3KCk6ITF9LFViOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5VYigpOi0xfSxXcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSx5cDpmdW5jdGlvbihiLGEpe3RoaXMud2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMud2J8fDMwMj09dGhpcy53Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy53Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFjKCl9LmJpbmQodGhpcyksMTAwKX0sQWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuaWE/KHRoaXMubSgpLHRoaXMubmEoKSk6Yi5SYygpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLldwKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHdiPWMuSWt8fHdiOyhmdW5jdGlvbihjKXtjLktrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sClJxOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmNsLkFtLnltP3dpbmRvdy5PTy5jbC5BbS55bS5HdihmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ScSgpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO3ZhciBiPWNhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkVhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB2YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgd2IoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHhiPWMuS2t8fHhiLHliPW5ldyB4YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuQmw9dGhpcy5hWzldO3RoaXMuWHM9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzRdO3RoaXMudGs9dGhpcy5hWzVdO3RoaXMuYnU9dGhpcy5hWzRdO3RoaXMuQm49dGhpcy5hWzhdO3RoaXMuaXY9dGhpcy5hWzhdO3RoaXMuanU9dGhpcy5hWzNdO3RoaXMuJHE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOV19Yy5RaT1iO2IucHJvdG90eXBlPXtBbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQmw6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhzOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51dTp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudGs6dGhpcy5hdShhKX0sYXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJ1OnRoaXMuQW4oYSl9LEFuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Cbjp0aGlzLmh2KGEpfSxodjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhPwp0aGlzLml2OnRoaXMuaXUoYSl9LGl1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuanU6dGhpcy5acShhKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgemI9Yy5RaXx8emIsZGQ9bmV3IHpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQuQWwoNCk7KGZ1bmN0aW9uKGMpe2MuT2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX0sRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sTDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLk9sfHxVOyhmdW5jdGlvbihjKXtjLk5sPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kudmQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnZkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLAoiYWRzTWFuYWdlckxvYWRGYWlsIik7dGhpcy53KCl9LmJpbmQodGhpcyksMUUzKX0uYmluZCh0aGlzKSk7eS52ZCgiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLiRyKGEpfS5iaW5kKHRoaXMpKTt5LmxxKCl9LCRyOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgVj1jLk5sfHxWOyhmdW5jdGlvbihjKXtjLlBsPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy5XYyYmKGI9ZS5GbyhiLHRoaXMuV2MpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5IKGQpKXt0aGlzLkooZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkEpO2YuYigpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiKwpoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5XY3x8KHRoaXMuV2M9W10pLHRoaXMuV2MucHVzaChiW2FdKSxkPW5ldyBVKGgpLHRoaXMuSChkKXx8KHRoaXMuSihkKSxmPW5ldyBWKGQsdGhpcy5BKSxmLmIoKSl9Y2F0Y2goayl7fX19dGhpcy5JKCl9LHZkOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmFhfHwodGhpcy5hYT17fSk7dGhpcy5hYVtiXXx8KHRoaXMuYWFbYl09e30pO3RoaXMuYWFbYl1bYV18fCh0aGlzLmFhW2JdW2FdPVtdKTt0aGlzLmFhW2JdW2FdLnB1c2goYyl9LFd0OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2FdKXRoaXMuY2N8fCh0aGlzLmNjPVtdKSx0aGlzLmNjLnB1c2goYiksdGhpcy5odCgpJiYodGhpcy5tZygpLHRoaXMuYigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2FdW2NdJiYKMDx0aGlzLmFhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuYWFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmFhW2FdW2NdW2RdKGIpfX0sbHE6ZnVuY3Rpb24oKXtpZih0aGlzLmNjKWZvcih2YXIgYj0wO2I8dGhpcy5jYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLmNjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmFhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5XdChiKX19KX0pKGMpO3ZhciBBYj1jLlBsfHxBYix5PW5ldyBBYihxKTsKYWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cT10aGlzLmFbN107dGhpcy5abz10aGlzLmFbNV07dGhpcy5Ybz10aGlzLmFbMl07dGhpcy5Gbj10aGlzLmFbMV07dGhpcy5JaT10aGlzLmFbN107dGhpcy5ydj10aGlzLmFbMV07dGhpcy52bT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLm5vPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cTp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWm86dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhvOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSWk6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ydjp0aGlzLnVtKGEpfSx1bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudm06dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBCYj1jLm5vfHxCYixlZD1uZXcgQmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC54cSg0KTsoZnVuY3Rpb24oYyl7Yy5CaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlMoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSwKcGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sTDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuQmh8fENiOyhmdW5jdGlvbihjKXtjLkNoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2EuaXNBZCYmYS5pc0FkKCk/dGhpcy5tKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwyNTApO3RoaXMuS3N8fCh0aGlzLktzPSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkNofHxEYjsoZnVuY3Rpb24oYyl7Yy5EaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBDYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBEYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5lYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkRofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmw9dGhpcy5hWzRdOwp0aGlzLndyPXRoaXMuYVs4XTt0aGlzLnRzPXRoaXMuYVszXTt0aGlzLllpPXRoaXMuYVs0XTt0aGlzLnRsPXRoaXMuYVsyXTt0aGlzLmRrPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzEwXX1jLnVrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybDp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMud3I6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRzOnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudGw6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmRrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy51a3x8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWZkLnFsKDQpOyhmdW5jdGlvbihjKXtjLmhtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKZWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgSGI9Yy5obXx8SGI7KGZ1bmN0aW9uKGMpe2MuZ209dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5UZXx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuRnB8fCh0aGlzLkpmKCksdGhpcy5GcD0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5UZT8odGhpcy5sKCJhZGVycm9yIiwKIm5vQ29udGFpbmVyIiksdGhpcy5vKCkpOih0aGlzLlRlPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSl9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuaW1hfSxKZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS3AoKTtiP2ImJmIuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLmlhPSEwLHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmYoKX0uYmluZCh0aGlzKSwKNTApfSwkdjpmdW5jdGlvbigpe3JldHVybiEwfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWI9Yy5nbXx8SWI7KGZ1bmN0aW9uKGMpe2MuaW09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBIYihiLml0ZW0oYSkpO3RoaXMuSChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuSihjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBKYj1jLmltfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhrPXRoaXMuYVsyXTt0aGlzLndxPXRoaXMuYVsyXTt0aGlzLlNoPXRoaXMuYVszXTt0aGlzLkxqPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzJdfWMuR3I9YjtiLnByb3RvdHlwZT17R2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhrOnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53cTp0aGlzLlJoKGEpfSxSaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNoOnRoaXMuS2ooYSl9LEtqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Majp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIExiPWMuR3J8fExiLGdkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLkdrKDQpOwooZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgTWI9Yy5uanx8TWI7KGZ1bmN0aW9uKGMpe2MubWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuU2coKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLnBmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5wZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5ObSgpfS5iaW5kKHRoaXMpKSx0aGlzLlRnPSExLHRoaXMubHY9CjFFMyx0aGlzLmdnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfSxwZjpmdW5jdGlvbigpe3RoaXMuZ2cuZG9uZXx8KHRoaXMuZ2cuZG9uZT0hMCx0aGlzLlRnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZygpfS5iaW5kKHRoaXMpLHRoaXMubHYpKX0sTm06ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVGcpO3RoaXMubSgpfSxTZzpmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMudygpKX0sdmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy52Zihtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLnZmKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBOYj1jLm1qfHxOYjsoZnVuY3Rpb24oYyl7Yy5vaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRWEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE1iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE5iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE9iPWMub2p8fE9iLFBiPW5ldyBPYihxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudmg9dGhpcy5hWzldO3RoaXMuZ2k9dGhpcy5hWzNdO3RoaXMuQnA9dGhpcy5hWzJdO3RoaXMuY289dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNl19Yy5Lbz1iO2IucHJvdG90eXBlPXt1aDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudmg6dGhpcy5maShhKX0sZmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmdpOnRoaXMuQXAoYSl9LEFwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5CcDp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBRYj1jLktvfHxRYixoZD1uZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7d2luZG93LnY9aGQudWgoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iU2ltcGxlVmlkZW9BbmRJbWEifX0pfSkoYyk7dmFyIFJiPWMuTGx8fFJiOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLApmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk7dGhpcy5QYigpfSxQYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLk9kKCkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZCgpJiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0uYmluZCh0aGlzKSw1MDApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwKX0sT2Q6ZnVuY3Rpb24oKXtyZXR1cm4haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YX0sCm86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBTYj1jLktsfHxTYjsoZnVuY3Rpb24oYyl7Yy5NbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9DT05URU5UJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1dFUkJVTkcmJjE9PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLmxlbmd0aCYmIXdpbmRvdy5fcGxheSl7dmFyIGI9bmV3IFJiKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYihiLAp0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFRiPWMuTWx8fFRiLFViPW5ldyBUYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLkduPWI7Yi5wcm90b3R5cGU9e2xuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubW46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLkdufHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5sbig0KTsoZnVuY3Rpb24oYyl7Yy52bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuZWU9ITF9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLk5zKCl9LmJpbmQodGhpcyksNTAwKX0sTnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZWUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuZWUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxJdDpmdW5jdGlvbigpe3RoaXMuZWU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sTDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLnZsfHxXYjsoZnVuY3Rpb24oYyl7Yy51bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuSnI9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5LYnx8KHRoaXMuS2I9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIik7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuSnI/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLkl0KCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgWGI9Yy51bHx8WGI7KGZ1bmN0aW9uKGMpe2Mud2w9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBZYj1jLndsfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuQXY9dGhpcy5hWzVdOwp0aGlzLmhxPXRoaXMuYVs1XTt0aGlzLiRzPXRoaXMuYVszXTt0aGlzLnBrPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuJG09YjtiLnByb3RvdHlwZT17dGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVpOnRoaXMuenYoYSl9LHp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bdjp0aGlzLmdxKGEpfSxncTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHE6dGhpcy5acyhhKX0sWnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRzOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMuJG18fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWpkLnRpKDQpOyhmdW5jdGlvbihjKXtjLm9sPQpwLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTsKcmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLm9sfHxhYzsoZnVuY3Rpb24oYyl7Yy5ubD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5EYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm5iKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuc28oKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuTWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnVyKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHNvOmZ1bmN0aW9uKCl7dGhpcy5OZSgpfHx0aGlzLm8oITApfSx1cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTWMoKTshYi5tYSYmYi5iYSYmYi5GdiYmYi5IdiYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sTWM6ZnVuY3Rpb24oKXtpZighdGhpcy5jZylmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRGEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuY2c9YltjXSk7cmV0dXJuIHRoaXMuY2d9LE9kOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG86ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5NYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYz1jLm5sfHxiYzsoZnVuY3Rpb24oYyl7Yy5wbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLnBsYXllcmFwaSl7dmFyIGI9ay5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBhYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgYmMoYyx0aGlzLkEpKS5iKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgY2M9Yy5wbHx8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52cz10aGlzLmFbOF07dGhpcy5raD10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07dGhpcy5FcT10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs1XX1jLm1yPWI7Yi5wcm90b3R5cGU9e3VzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudnM6dGhpcy5qaChhKX0samg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtoOnRoaXMuVXMoYSl9LFVzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Wczp0aGlzLkRxKGEpfSxEcTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXE6dGhpcy5zdihhKX0sc3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnR2OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGVjPWMubXJ8fGVjLGtkPW5ldyBlYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1rZC51cyg0KTsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlAoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUyhhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LERhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLlJqfHxXOyhmdW5jdGlvbihjKXtjLlFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmZlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmImJih0aGlzLmZlPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuZmUmJmIhPXRoaXMuZmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5kdyksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuUWp8fFg7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFcoYiksYi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFcoYiksYi5qYT90aGlzLm1nKCk6dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBELApmYz1jLlNqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5vYi5sZW5ndGgpe3ZhciBhPW0ub2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUudHQoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuV2YuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlrW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLldmKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzJdO3RoaXMuQ209dGhpcy5hWzhdO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuaHA9dGhpcy5hWzFdO3RoaXMuRHA9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5ybT1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWk6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNtOnRoaXMuUm4oYSl9LFJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHA6dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRwOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgaGM9Yy5ybXx8aGMsbGQ9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLmRpKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5QKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuUyhjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LApsdDpmdW5jdGlvbihiKXt0aGlzLnNkPWJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1yfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxMOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksCnRoaXMuc2QmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnNkJiYobmV3IEcodGhpcyx0aGlzLnNkKSkuYigpKX19KX0pKGMpO3ZhciBNPWMuVmx8fE07KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkdkKWlmKHRoaXMuaGJ8fCh0aGlzLmhiPTApLHRoaXMuaGIrKywxNTx0aGlzLmhiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy52dCgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubygpOnRoaXMubyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkdkPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLnZhKCl8fCh0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WYSgpfS5iaW5kKHRoaXMpLDEwKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJgotMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVT1hLGIubCgiYWRlcnJvciIsYSkpOmIubCgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlU9CnRoaXMuVXx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLlZhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgRz1jLlVsfHxHOyhmdW5jdGlvbihjKXtjLldsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKTt0aGlzLndhPS0xfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTSh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiLmx0KHRoaXMuQSksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBpYz1jLldsfHxpYyxqYz1uZXcgaWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSnU9dGhpcy5hWzZdO3RoaXMueHM9dGhpcy5hWzVdO3RoaXMuVmk9dGhpcy5hWzRdO3RoaXMuJHQ9dGhpcy5hWzZdO3RoaXMuRW09dGhpcy5hWzEwXTt0aGlzLllqPXRoaXMuYVs5XTt0aGlzLnFwPXRoaXMuYVsxXTsKdGhpcy5BaD10aGlzLmFbNF07dGhpcy5JaD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLkJrPWI7Yi5wcm90b3R5cGU9e0l1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KdTp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhzOnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5WaTp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiR0OnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5FbTp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWWo6dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuemgoYSl9LHpoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWg6dGhpcy5IaChhKX0sSGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkloOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPWMuQmt8fGtjLG1kPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW1kLkl1KDQpOyhmdW5jdGlvbihjKXtjLkVqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5kdXJhdGlvbj10aGlzLmRmPTA7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlMoYSk6dGhpcy5kYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLAo1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSx7aWQ6Yi5pZH0pfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlJFU1VNRSx7aWQ6Yi5pZH0pfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRmfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmCnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfVElNRSx7WW46ZnVuY3Rpb24oYSl7MDxhJiYodGhpcy5kZj1hKX0uYmluZCh0aGlzKSxpZDpiLmlkfSk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfREFUQSx7WW46ZnVuY3Rpb24oYSl7MDxhLmR1cmF0aW9uJiYodGhpcy5kdXJhdGlvbj1hLmR1cmF0aW9uKX0uYmluZCh0aGlzKSxpZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBsYz1jLkVqfHxsYzsoZnVuY3Rpb24oYyl7Yy5Eaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxodzpmdW5jdGlvbigpe30sYnQ6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAuQ2UobmV3IGZ1bmN0aW9uKCl7fSk7YS5Ddj0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi5idChhKTt3aW5kb3cuS3Y9Yn0sYjpmdW5jdGlvbigpe3RoaXMuYXR8fCh0aGlzLmF0PSEwKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTGR8fCh0aGlzLkxkPTEpO2lmKDIwPHRoaXMuTGQpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7ZWxzZXt2YXIgYT0hMSxjPWE9ITE7aWYoYi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmCihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy5MZCsrO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTApfX0sSGE6ZnVuY3Rpb24oYil7dmFyIGE9ImFkRXJyb3IiLGM9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmCihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMua2UoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCghMCl9LmJpbmQodGhpcykpfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJgotMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5sKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxrZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc01hbmFnZXIpO2I9ImFkRXJyb3IiO2E9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJgpnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMH0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbWM9Yy5Eanx8bWM7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXZwIiksYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKGJbYV0uaWQpe3ZhciBjPW5ldyBsYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2MuamF8fHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IG1jKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBuYz1jLkZqfHxuYyxvYz1uZXcgbmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHA9dGhpcy5hWzEwXTt0aGlzLnZuPXRoaXMuYVs0XTt0aGlzLnB2PXRoaXMuYVs0XTt0aGlzLnd1PXRoaXMuYVs3XTt0aGlzLmtuPXRoaXMuYVs3XTsKdGhpcy5nPXRoaXMuYVsxXX1jLlRpPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5IcDp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudm46dGhpcy5vdihhKX0sb3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnB2OnRoaXMudnUoYSl9LHZ1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53dTp0aGlzLmpuKGEpfSxqbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua246dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLlRpfHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5HcCg0KTsoZnVuY3Rpb24oYyl7Yy52aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKTthJiZ0aGlzLlAoYS5wYXJlbnROb2RlKX0sTDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnZqfHxZOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkZmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5PZigpfSxPZjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkhhKCksITA7dGhpcy5GZisrO2lmKDEwPHRoaXMuRmYpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmCihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsCmIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxYOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy51anx8WjsoZnVuY3Rpb24oYyl7Yy53aj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYKMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBaKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcWM9Yy53anx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVs3XTt0aGlzLnFxPXRoaXMuYVszXTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLkRsPQp0aGlzLmFbNl07dGhpcy5Wcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxMF19Yy5laj1iO2IucHJvdG90eXBlPXtnbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaG46dGhpcy5wcShhKX0scHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFxOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaWk6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhzOnRoaXMuQ2woYSl9LENsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EbDp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLmVqfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0Kb2QuZ24oNCk7KGZ1bmN0aW9uKGMpe2Mud2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiPyhiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVyUHJlZml4KSk/KHRoaXMuUChiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlMoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQ/ITE6Yi5pc1BhdXNlZD8hMTohMH0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pc0Z1bGxzY3JlZW4/Yi5pc0Z1bGxzY3JlZW46ITF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPQpjLndpfHx0YzsoZnVuY3Rpb24oYyl7Yy52aT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIiwKdGhpcy50ZXN0KTt3aW5kb3cuRkRNX1BsYXllcl92YXJzLmFkcGRldGVjdGVkJiYodGhpcy5sKCJhZGVycm9yIiwidXNpbmdBZEJsb2NraW5nU29mdHdhcmUiKSx0aGlzLm8oKSl9LHRlc3Q6ZnVuY3Rpb24oKXt9LG86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMudml8fHVjOyhmdW5jdGlvbihjKXtjLnhpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkVhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPQpiW2NdO2lmKGQudmFycy5pc1JlYWR5KWQ9bmV3IHRjKGQpLGQuamF8fHRoaXMuSChkKXx8KHRoaXMuSihkKSwobmV3IHVjKGQsdGhpcy5BKSkuYigpKTtlbHNlIGJyZWFrfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHZjPWMueGl8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5iaD10aGlzLmFbNl07dGhpcy5DdD10aGlzLmFbNV07dGhpcy5ubT10aGlzLmFbNl07dGhpcy5Ebj10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbOV07dGhpcy5laD10aGlzLmFbMTBdO3RoaXMubGs9dGhpcy5hWzFdO3RoaXMuY209dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOF19Yy5Ocj1iO2IucHJvdG90eXBlPXthaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYmg6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkN0Ogp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm06dGhpcy5DbihhKX0sQ246ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRuOnRoaXMudnAoYSl9LHZwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy53cDp0aGlzLkNrKGEpfSxDazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGs6dGhpcy5kaChhKX0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVoOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sazp0aGlzLmJtKGEpfSxibTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY206dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLk5yfHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5haCg0KTsKKGZ1bmN0aW9uKGMpe2MuQ2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlAoYiksdGhpcy5TKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5DaXx8eWM7KGZ1bmN0aW9uKGMpe2MuQmk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuWGUoKX0sWGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8CihiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZSghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgemM9Yy5CaXx8emM7KGZ1bmN0aW9uKGMpe2MuRGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHljKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5JKCk7cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLkRpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtpPXRoaXMuYVsyXTt0aGlzLm91PXRoaXMuYVs4XTt0aGlzLkFxPXRoaXMuYVs0XTt0aGlzLkhqPXRoaXMuYVsxXTt0aGlzLmxqPXRoaXMuYVs2XTt0aGlzLnJpPXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs1XTt0aGlzLmhyPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzEwXX1jLkZzPWI7Yi5wcm90b3R5cGU9e2ppOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5raTp0aGlzLm51KGEpfSxudTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm91OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5BcTp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSGo6dGhpcy5raihhKX0sa2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxqOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5yaTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLm9wOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ocjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIENjPWMuRnN8fENjLHFkPW5ldyBDYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXFkLmppKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlFmPXRoaXMuVGY9dGhpcy5TZj0hMTt0aGlzLlljPVtdO3RoaXMuaWU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PQp0eXBlb2YgQml0bW92aW5EZXRlY3Rpb24/bnVsbDpCaXRtb3ZpbkRldGVjdGlvbixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBUYT9udWxsOlRhLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgWWE/bnVsbDpZYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgZGM/bnVsbDpkYyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB1YT9udWxsOnVhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj8KbnVsbDp5YixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygd2M/bnVsbDp3YyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGNiP251bGw6Y2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIGhiP251bGw6aGIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgemE/bnVsbDp6YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBPYT9udWxsOk9hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBhP251bGw6cGF9fWMuWms9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5ZcChhKTpbXSxiO3RoaXMuVGY9ITA7aWYoYS5sZW5ndGgpe3RoaXMuU2Y9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj0KYVtjXSx0aGlzLm5nKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5pZSl7aWYodGhpcy5RZilicmVhaztiPXRoaXMuaWVbY107dGhpcy54ZShiKSYmKHRoaXMuWWMucHVzaChiKSx0aGlzLm5nKGIpKX19LHhlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2Ygcj8hMDohMX0sWXA6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWM9YVtmXSxjPXRoaXMuaWVbY10sdGhpcy54ZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxuZzpmdW5jdGlvbihhKXt0aGlzLnhlKGEpJiZhLmIoKX0sS3Q6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLlNmKWZvcih0aGlzLlFmPSEwLGE9MDthPHRoaXMuWWMubGVuZ3RoO2ErKyl0aGlzLlljW2FdLnJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuWWNbYV0ucmIpfX19KShjKTt2YXIgRGM9Yy5aa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpvPXRoaXMuYVs5XTt0aGlzLnRqPXRoaXMuYVs2XTt0aGlzLmFwPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzddfWMuRXM9YjtiLnByb3RvdHlwZT17SW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpvOnRoaXMuc2ooYSl9LHNqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50ajp0aGlzLiRvKGEpfSwkbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgRWM9Yy5Fc3x8RWMscmQ9bmV3IEVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuSW8oNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlRiKGwuTnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlRiKGwuU3IpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7CnZhciBzZD1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGVhPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBGPW5ldyBRLGs9ITE7Ri5aYigpO0YuS2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLlpiKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5LZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuWmIoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csRi5KcSgpLHtpZDp0ZH0pfSw1MDApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnI9dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzZdfWMuVGw9YjtiLnByb3RvdHlwZT17WXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5acjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMuVGx8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLllyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5pZz10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuVGM9MDt0aGlzLk5hPSIiO3RoaXMuWmM9W107dGhpcy4kYz0wO3RoaXMuamc9ITE7dGhpcy5nZT1bXX1jLlhnPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3RoaXMuaWc9YX0sYmQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLk5hPXRoaXMucGxheWVyLkwoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxudDpmdW5jdGlvbihhKXt0aGlzLlVhPWF9LG10OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj0KYX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxlYzpmdW5jdGlvbihhLGIpe2UuaWIoIndlbHQuZGUiKSYmZS5MYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5VYSk7dmFyIGM9ITEsZj0hMTtpZih0aGlzLktxKCkpdGhpcy5VYS5jKHRoaXMuVWEuT2MsdGhpcy5VYS5BYSx0aGlzLlVhLmhlLGZ1bmN0aW9uKCl7dGhpcy5lYyhhLApiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkVjKTtlbHNlIGlmKHRoaXMubnEoKSl0aGlzLmt0KGZ1bmN0aW9uKCl7dGhpcy5lYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5EKGwuQmMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuTHQoKTtrLmV4aXRGdWxsc2NyZWVuKCk7Uj1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLnFnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLklyKGEpOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5QZCYmKGM9dGhpcy5wbGF5ZXIuUGQoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2suUmQoYSwKYyxmKTt0aGlzLnBsYXllci5yZyhrKX19LEtxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuVGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5UYy5nZXRUaW1lKCksdGhpcy5UYz1hLDNFNTxiPyEwOiExO3RoaXMuVGM9YTtyZXR1cm4hMX0sRXQ6ZnVuY3Rpb24oKXtlLm1lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubGYoYSkpP3RoaXMuZWMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5EKGwuQ2MsdGhpcy5wbGF5ZXIuQigpKSl9LER0OmZ1bmN0aW9uKGEpe2UubWUoInBvc3Ryb2xsIik7aWYoIXRoaXMuaWcpe3RoaXMuc3QoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikpOwooYz10aGlzLmxmKGMpKT90aGlzLmVjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQobC5DYyx0aGlzLnBsYXllci5CKCkpKX19LGxmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxkdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnh0KHRoaXMuRHQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sZGQ6ZnVuY3Rpb24oYSl7ZS5tZSgibWlkcm9sbCIpO2lmKCF0aGlzLllmKXt0aGlzLllmPSEwO3ZhciBiPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMudGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLmVjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllmPSExfS5iaW5kKHRoaXMpLDFFMykpOgoodGhpcy5wbGF5ZXIucGxheSgpLGUuRChsLkNjLHRoaXMucGxheWVyLkIoKSkpfX0sY3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5ydCh0aGlzLmRkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlZkKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLkV0KCk7dGhpcy5wbGF5ZXIuVmQmJnRoaXMuY3QoKTt0aGlzLmR0KCl9LGV0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuWmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLnd2KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy4kYz10aGlzLlpjLmxlbmd0aH0sbnE6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLiRjJiYoYT0hMCk7cmV0dXJuIGF9LGt0OmZ1bmN0aW9uKGEpe3RoaXMuamc9YTtmb3IoYT0wO2E8dGhpcy5aYy5sZW5ndGg7YSsrKXRoaXMuWmNbYV1bImZ1bmN0aW9uIl0odGhpcy5Rcy5iaW5kKHRoaXMpKX0sUXM6ZnVuY3Rpb24oYSl7dGhpcy4kYy0tO2EmJnRoaXMuZ2UucHVzaChhKTswPj10aGlzLiRjJiZ0aGlzLmpnKCl9LElyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmdlLmxlbmd0aDtjKyspYj10aGlzLmdlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBnYT1jLlhnfHxnYSxSPSExLGxhPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVoPXRoaXMuYVs4XTt0aGlzLm9pPXRoaXMuYVsxMF07dGhpcy5icz10aGlzLmFbN107dGhpcy5PaD10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs2XX0KYy5Ucj1iO2IucHJvdG90eXBlPXtUaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVWg6dGhpcy5uaShhKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vaTp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnM6dGhpcy5OaChhKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9oOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy5Ucnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9dmQuVGgoNCl9KS5jYWxsKEVhcnVmYUpvTWFoc2hlTGksRWFydWZhSm9NYWhzaGVMaSk7Cg==
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
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838; golem_us=1a9f82ad; golem_uv=1a9f82ad; golem_uz=1a9f82ad; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CMCSYNCSOP%7C411-17803%7CvVersion%7C3.2.0; __gads=ID=7bbbfd6eee9b4781:T=1537549838:S=ALNI_MYrVc8bdjT4ZLy7j73-DhoOwd-78Q
Connection
keep-alive
Cache-Control
no-cache
Referer
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

Response headers

Date
Fri, 21 Sep 2018 17:10:39 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
/
ssl.1.damoh.golem.de/2f8e340548a291b20adebaafb56bf5bbaa50347d/
110 B
672 B
XHR
General
Full URL
https://ssl.1.damoh.golem.de/2f8e340548a291b20adebaafb56bf5bbaa50347d/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIEVhcnVmYUpvTWFoc2hlTGk9RWFydWZhSm9NYWhzaGVMaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3kuJGR8fCh5LiRkPTApO3kuJGQrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS4kZCYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihrKXtrLnBhdXNlQnV0dG9ufHwoay5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKay5wbGF5QnV0dG9ufHwoay5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay5tdXRlQnV0dG9ufHwoay5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay51bm11dGVCdXR0b258fChrLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnNraXBhYmxlQnV0dG9ufHwoay5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC42O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0pO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTsKay5za2lwQnV0dG9ufHwoay5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0iKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGsuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307ay5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLkxhKGEsYixbXSxjLGMsbSl9KX1tLmMoay5nbG9iYWxDb25maWcsay5jbGllbnRDb25maWcsay5wcmVjaGVja2VkLGsub25SZWFkeSxrLm9uRmFpbHVyZSxrKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1rLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZWEoZGEsNTApfWZ1bmN0aW9uIGZhKGMsYil7Ynx8KGI9InByZSIpO2lmKGsmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTihjKSxhPW5ldyBPKGEsbSksZz1rLmFkVGFnOyJwcmUiPT1iJiZrLnByZXJvbGxBZFRhZyYmKGc9ay5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmay5wb3N0cm9sbEFkVGFnJiYoZz1rLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5xZyhrKSxhLlJkKGcpKX1lbHNlIGVhKGZ1bmN0aW9uKCl7ZmEoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihrJiZtKXsoay5hZFRhZ3x8ay5wcmVyb2xsQWRUYWcpJiZjLnBhdXNlKCk7ZS5EKGwuQmMsYy5CKCkpO2lmKGMuZ2V0Q3VycmVudFRpbWUpe3ZhciBhPWMuZ2V0Q3VycmVudFRpbWUoKTthJiZlLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLm9hPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuYmQoYyk7YS5udChtKTthLm10KGspO2EuZXQoKTthLmIoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cShjLGIpfS5iaW5kKHRoaXMpLDUwKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kbD10aGlzLmFbNl07dGhpcy5tcz10aGlzLmFbMTBdO3RoaXMuaWw9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzhdOwp0aGlzLnJuPXRoaXMuYVsxXTt0aGlzLmNwPXRoaXMuYVs5XTt0aGlzLkhsPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzldfWMuR289YjtiLnByb3RvdHlwZT17Wmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRsOnRoaXMubHMoYSl9LGxzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5tczp0aGlzLmhsKGEpfSxobDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuaWw6dGhpcy5kbChhKX0sZGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZsOnRoaXMucW4oYSl9LHFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybjp0aGlzLmJwKGEpfSxicDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY3A6dGhpcy5HbChhKX0sR2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkhsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy5Hb3x8aGEsSGM9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUhjLlpsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZhPSJzZXR1cCI7dGhpcy5nYz1bXTt0aGlzLiRlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuUHMuYmluZCh0aGlzKSl9Yy5MaT1iO2IucHJvdG90eXBlPXskZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxXbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJgphLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0seWE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFBzOmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLk9zKGEuZGF0YSl9LE9zOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0sd2Q6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sY2Y6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5ScChhKSxkPSExO2lmKGIpcmV0dXJuIGE9YS5yZXBsYWNlKGIsIiIpKyIvZGV2L2hvbWFkX3VybC8iK2IrIi8iLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywKIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSx0aGlzLlZmKGEsIlBPU1QiLHt9LGZ1bmN0aW9uKGEpe3RyeXtkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpLnVybH1jYXRjaChiKXtjb25zb2xlLmxvZygid3RmIixiKX19LGZ1bmN0aW9uKCl7fSwhMCwhMCksZH0sUnA6ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChiPWIuZXhlYyhhKSkmJmJbNF0pcmV0dXJuIGJbNF07cmV0dXJuITF9LFVtOmZ1bmN0aW9uKGEsYil7aWYoYT09Yil7aWYoZS5FcChhKSlyZXR1cm47KGI9dGhpcy5jZihhKSl8fChiPWEpfTA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMubGEudXJsc1thXT1iO3RoaXMubGEudXJsc1tiXT1hO3RoaXMubGEuaG9tYWRVcmxzW2FdPWI7dGhpcy5sYS5vcmlnaW5hbFVybHNbYl09YX0sRXA6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5ob21hZFVybHNbYV0mJihiPXRoaXMubGEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sbmY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMubGEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWmE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxTcTpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT0KYXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sRWE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSx1ZjpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sSnQ6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sTWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPwowPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sTmY6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGY9MCxjPTAsaD0wLGU9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7Zj11LmhlaWdodDswPnUudG9wJiYoZis9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5mJiYoZj0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCpmKTtoPj1iJiYoZT0hMCk7cmV0dXJuIGV9LGtiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/CjY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIGJ9LHRnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1hPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGg9QXJyYXkoODApLGU9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEk9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKwoxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGYpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXU7bD1rO3c9STtxPW07Zm9yKGY9CjA7MTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8fm4mdykrcStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpK3EraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZj00MDs1OT49ZjtmKyspcj1kKGMsNSkrKG4mbHxuJnd8bCZ3KStxK2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NjA7Nzk+PWY7ZisrKXI9ZChjLDUpKyhuXmxedykrcStoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2U9ZStjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtrPWsrbCY0Mjk0OTY3Mjk1O0k9SSt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHUpK2IoaykrYihJKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiIiLGQsZixjLGgsZSx1LGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfGM+PjYsdT1jJjYzLGlzTmFOKGYpP2U9dT02NDppc05hTihjKSYmKHU9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sUXE6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmCi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sZmY6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZj0hMSxjPSExLGg9ITEsZT0hMSx1PSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocSl7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLlFuPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSwKaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1jO2EuaXNGaXJlZm94PWg7YS5pc1NhZmFyaT1lO2EuaXNJRT11O2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxMcDpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuZmYoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxYYTpmdW5jdGlvbigpe3ZhciBhPXt0aDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwKRWg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sc3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sTGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sbG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LE9uOmZ1bmN0aW9uKCl7cmV0dXJuIGEudGgoKXx8YS5FaCgpfHxhLnNxKCl8fGEuTGsoKXx8YS5sbSgpfX07cmV0dXJuIGEuT24oKX0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxBZjpmdW5jdGlvbihhKXthPXRoaXMuTWEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxpYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSxGbzpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8Zi5wdXNoKGFbY10pO3JldHVybiBmfSxGdDpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LHJmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy5JZyhiKSsiOiIrdGhpcy5JZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sSWc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPgphPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLkZhOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2Y9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxUYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9bC5JYyhiLGQpKTtiJiYoaD1sLkljKGEsYikpO2YmJihoPWwuSWMoaCxmKSk7YyYmKGg9bC5JYyhoLGMpKTtlLlRiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uWil3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPW0uamUoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uS2EoZiwhMCk7Zj1tLkthKGYsITApO2YuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2YuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7Zi5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uR2EoZixmdW5jdGlvbihkKXt2YXIgZj0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0KITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwoZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sU2Q6ZnVuY3Rpb24oKXttJiZtLlo/bS5pc0VuYWJsZWQmJm0uaW8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuU2QoKX0uYmluZCh0aGlzKSw1MDApfSxIZDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVGEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LElkOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxUYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLk5jKGEpOiIifSxOYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLklkKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmCihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LFhuOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuU2MoYSl8fHRoaXMuU3EoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94Lm9nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fDA8PXNhbmRib3gub2dbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpJiZ0aGlzLlphKCJlcnJfdXJsIixhKTtpZih0aGlzLm5mKGEpKXJldHVybiB0aGlzLm5mKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjtkJiYoZi5ob21hZF9pbnRyb3NwZWN0PSJpZnJhbWUiKTtmLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO2YuaG9tYWRfdnBhaWRfY3R4PSJ0cnVlIjt2YXIgYz0hMTtkPSExO2Q9dGhpcy5MYShhLGIudWEsZixmdW5jdGlvbihhKXtjPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2N8fChjPWQpLGM9SlNPTi5wYXJzZShjKX1jYXRjaChoKXtjPSExfWMudXJsJiZjLmhhc2gmJihjPWIuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGMuaGFzaCkpO3RoaXMuVW0oYyxhKTtyZXR1cm4gY30sTGE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSx1KXt2YXIgaz1ofHxtO2g9ITA7dSYmKGg9ITEpO2lmKGsmJmsuWilpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suS2EoYSxoKTtoPWsuS2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5HYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoYSxiLGQsZixjLGssZSx1KX0uYmluZCh0aGlzKSw1MDApfSxWZjpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdT0hMDtlJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sQXI6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuVmYoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuZ2MpZm9yKHZhciBjIGluIHRoaXMuZ2MpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5nY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UueWIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sV2Y6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5MYShhLGYudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkFyKGYuUWMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LHR0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdjPWF9LHd2OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5MYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxQbjpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE9xOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUD1jLkxpfHxQO25ldyBQO3ZhciBlPW5ldyBQO3dpbmRvdy5Odj1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLktpPWI7Yi5JYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuSnM9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuUHI9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmd2PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IucnA9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5udj17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk1tPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLkdtPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5KbT17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5PbT17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuRm09e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLkhtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuUXU9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk9yPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnNwPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5tdj17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5xbz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLnZvPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuQ2M9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5CYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuTG09e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLkttPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5RZT17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuUGU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuUG09e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5JbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTnU9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Tcj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBsPWMuS2l8fGw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGo9dGhpcy5hWzEwXTt0aGlzLmpwPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzRdfWMuQ289YjtiLnByb3RvdHlwZT0Ke09qOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Qajp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuanA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgaWE9Yy5Db3x8aWEsSmM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMuT2ooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5NaT1iO2IucHJvdG90eXBlPXtKZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sZWI6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KSsKbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxVcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxKYzpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMuSmMoYSsKNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuSmMoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxaYjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkpkKHRoaXMuZWIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5KYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sSnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5aYigpKyIyIn0sS2Y6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KZCh0aGlzLlVwKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuSmMoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBRPQpjLk1pfHxRO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdoPXRoaXMuYVs2XTt0aGlzLkdxPXRoaXMuYVsxMF07dGhpcy50bj10aGlzLmFbM107dGhpcy5jaT10aGlzLmFbOF07dGhpcy5Vbj10aGlzLmFbNF07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLldqPWI7Yi5wcm90b3R5cGU9e2ZoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5naDp0aGlzLkZxKGEpfSxGcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkdxOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50bjp0aGlzLmJpKGEpfSxiaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNpOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vbjp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sCmY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGphPWMuV2p8fGphLEtjPW5ldyBqYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLmZoKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmo7dGhpcy5qPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWc7cmV0dXJuIGZ9fShjLApnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmM/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5DZT1ifSkoYyk7dmFyIEo9Yy5DZXx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5HdT10aGlzLmFbOV07dGhpcy50cj10aGlzLmFbMl07dGhpcy5yaz10aGlzLmFbMTBdO3RoaXMucnM9dGhpcy5hWzldO3RoaXMuamo9dGhpcy5hWzFdO3RoaXMuams9dGhpcy5hWzRdO3RoaXMuS2g9dGhpcy5hWzNdO3RoaXMucG89dGhpcy5hWzRdO3RoaXMuemw9dGhpcy5hWzldO3RoaXMuSHQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuUm89YjtiLnByb3RvdHlwZT17RnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5HdTp0aGlzLnNyKGEpfSxzcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudHI6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLnFzKGEpfSxxczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucnM6dGhpcy5paihhKX0saWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qajp0aGlzLmlrKGEpfSxpazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuams6dGhpcy5KaChhKX0sSmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5LaDp0aGlzLm9vKGEpfSxvbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucG86dGhpcy55bChhKX0seWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpsOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5IdDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIGthPWMuUm98fGthLExjPW5ldyBrYSgxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1MYy5GdSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLllrPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9e307dGhpcy5BPW51bGw7dGhpcy5kYz0xMDA7dGhpcy5sYj0wO3RoaXMud2E9MTUwO3RoaXMucmI9MDt0aGlzLm90KGIpfSxiOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YT8odGhpcy5sYisrLHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpOjA+dGhpcy53YSYmKHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5kYykpfSxodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiPnRoaXMud2E/ITA6ITF9LG1nOmZ1bmN0aW9uKCl7dGhpcy5sYj0wfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sCm90OmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxUcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEo6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmViKCldPWI7SyYmSy5UZiYmSy5LdChiKX0sVnY6ZnVuY3Rpb24oKXtyZXR1cm4gZS5FYSh0aGlzLnhhKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy54YSlpZihhPT10aGlzLnhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLnhhW2IuZWIoKV0/ITA6ITF9LFBxOmZ1bmN0aW9uKGIpe2I9Yi5EYSgpO2Zvcih2YXIgYSBpbiB0aGlzLnhhKWlmKGIuaWQ9PXRoaXMueGFbYV0uRGEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXc6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5Za3x8cjsoZnVuY3Rpb24oYyl7Yy4kaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLmRjPTEwO3RoaXMubGI9CjA7dGhpcy53YT01MDt0aGlzLks9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLmhmPSExO3RoaXMuTigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuRGEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30sZWE6ZnVuY3Rpb24oKXt9LHh0OmZ1bmN0aW9uKGIpe3RoaXMuSz1ifSxXdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LHJ0OmZ1bmN0aW9uKGIpe3RoaXMuV2Q9Yn0sVXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XZH0sVmQ6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLmxiPD10aGlzLndhJiYodGhpcy5sYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLAp0aGlzLmRjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSx0ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxlYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LGt3OmZ1bmN0aW9uKCl7fSxTOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLm9xKCl8fHRoaXMuUm0oKTt0aGlzLm5lKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWHY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sUm06ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUucGEoMTApKX0sb3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/CiEwOiExfSxQOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LERhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFJjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxqYjpmdW5jdGlvbigpe3JldHVybiExfSxjdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxkYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LERiOmZ1bmN0aW9uKCl7dmFyIGI9aztyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFBkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHJnOmZ1bmN0aW9uKGIpe3RoaXMuZ2I9CmJ9LFR2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LGd0OmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxadjpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuZ2ImJihiPSEwKTtyZXR1cm4gYn0sZXc6ZnVuY3Rpb24oKXt0aGlzLmhmfHwodGhpcy5oZj0hMCl9LEtjOmZ1bmN0aW9uKCl7cmV0dXJuITF9LFF2OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYj1hLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcD1jLiRrfHxwOyhmdW5jdGlvbihjKXtjLllnPUouZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuTGU9IjEiO3RoaXMuTWU9IjIiO3RoaXMuem09IjMiO3RoaXMubGM9MDt0aGlzLlpmPTMwO3RoaXMudmI9W107dGhpcy5QYT1bXTt0aGlzLkxiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsCnVua25vd246Nn07dGhpcy5TZT10aGlzLk1nPSExO3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pZD1lLnBhKDEwKTt0aGlzLmJkKGIpO3RoaXMucHQoYSl9LGI6ZnVuY3Rpb24oKXt9LG5hOmZ1bmN0aW9uKCl7dGhpcy5NZ3x8KHRoaXMuTWc9ITAsZS5TZCgpKX0sWmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkwoKTtSJiZSLiRiJiYhbGEmJihsYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwiMTA0XyIrYikpfSx3OmZ1bmN0aW9uKGIsYSl7dmFyIGc9ITA7YiYmKGc9ITEpO3JldHVybiB0aGlzLmhhKCk/ITE6KHRoaXMudXQoKSx0aGlzLkEodGhpcy5nZXRQbGF5ZXIoKSxnKSx0aGlzLkVnKCksdGhpcy5TZT0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaGEoKXx8KHRoaXMudmIucHVzaChiKSx0aGlzLlBhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxFZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIiwKYT1bXTt0aGlzLnZiJiYwPHRoaXMudmIubGVuZ3RoJiYodGhpcy52Yj1lLnVuaXF1ZSh0aGlzLnZiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy52Yi5qb2luKCIsIikpKTtpZih0aGlzLlBhKXtmb3IodmFyIGc9MDtnPHRoaXMuUGEubGVuZ3RoO2crKyl0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXT09dGhpcy5MYltiXSYmYS5wdXNoKHRoaXMuUGFbZ10uZGV0YWlsKSx0aGlzLkxiW3RoaXMuUGFbZ10ucmVhc29uXTx0aGlzLkxiW2JdJiYoYT1bXSxhLnB1c2godGhpcy5QYVtnXS5kZXRhaWwpLGI9dGhpcy5QYVtnXS5yZWFzb24pO3RoaXMuTGJbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxZdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNlfSxtOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5MZX0sdXQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz0KdGhpcy5NZX0sdnQ6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnptfSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGN9LE5lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxlfSxFdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5NZX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMubGN9LGJkOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0scHQ6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sRHI6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLllnfHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZyPXRoaXMuYVs2XTt0aGlzLkZsPXRoaXMuYVs5XTt0aGlzLlduPXRoaXMuYVszXTsKdGhpcy4kZz10aGlzLmFbM107dGhpcy5Rbz10aGlzLmFbNV07dGhpcy5ZbD10aGlzLmFbM107dGhpcy5Ucz10aGlzLmFbOV07dGhpcy5ocz10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs3XX1jLmh1PWI7Yi5wcm90b3R5cGU9e2VyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5mcjp0aGlzLkVsKGEpfSxFbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRmw6dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlduOnRoaXMuWmcoYSl9LFpnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGc6dGhpcy5QbyhhKX0sUG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlFvOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ZbDp0aGlzLlNzKGEpfSxTczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVHM6dGhpcy5ncyhhKX0sZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmc6YX19fSkoYyk7dmFyIG1hPWMuaHV8fG1hLE1jPW5ldyBtYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU1jLmVyKDQpOyhmdW5jdGlvbihjKXtjLlhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGVudEVsKCk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLksmJnRoaXMuSygpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkRlbW9WaWRlb0pTIn19KX0pKGMpO3ZhciBTPWMuWGh8fFM7KGZ1bmN0aW9uKGMpe2MuV2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKTt0aGlzLm1kPW51bGw7dGhpcy5WdT0xRTM7dGhpcy5mZz1udWxsO3RoaXMuZHU9MkUzfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZih3aW5kb3cuZGVtb1BsYXllciYmd2luZG93LlFuKWIub24oInBsYXkiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Iub24oImRpc2FibGUiLHRoaXMuenAuYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0Iix0aGlzLmtxLmJpbmQodGhpcykpO2Iub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuanEoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLll1KGIpfS5iaW5kKHRoaXMpKSwKYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IixmdW5jdGlvbigpe3RoaXMuWnUoYil9LmJpbmQodGhpcykpKTtiLm9uKCJhZGVuZCIsZnVuY3Rpb24oYSl7dGhpcy5pcShhLGIpfS5iaW5kKHRoaXMpKTtiLm9uKCJjb250ZW50cGxheWJhY2siLGZ1bmN0aW9uKGEpe3RoaXMudG8oYSl9LmJpbmQodGhpcykpfSx0bzpmdW5jdGlvbihiKXsiYWRzZXJyb3IiPT1iLnRyaWdnZXJldmVudCYmdGhpcy53KCl9LFl1OmZ1bmN0aW9uKGIpe3RoaXMubWR8fCh0aGlzLm1kPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kdShiKX0uYmluZCh0aGlzKSx0aGlzLlZ1KSl9LCR1OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLm1kKTt0aGlzLncoKX0sWnU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMubWQpfSxpcTpmdW5jdGlvbihiKXt0aGlzLkx2KGIpO3RoaXMuZmc9bmV3IERhdGU7dGhpcy5mZy10aGlzLkxzPHRoaXMuZHU/CnRoaXMudygpOnRoaXMubSgpfSxrcTpmdW5jdGlvbihiLGEpeyFhJiZiLnRhcmdldC5wbGF5ZXImJihhPWIudGFyZ2V0LnBsYXllcix0aGlzLmJkKG5ldyBTKGEpKSk7dGhpcy53KCl9LHpwOmZ1bmN0aW9uKCl7fSxqcTpmdW5jdGlvbigpe3RoaXMuTHM9bmV3IERhdGV9fSl9KShjKTt2YXIgbmE9Yy5XaHx8bmE7KGZ1bmN0aW9uKGMpe2MuWWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmRlbW9QbGF5ZXIpe2lmKHdpbmRvdy52aWRlb2pzJiZ2aWRlb2pzLnBsYXllcnMmJjA8ZS5FYSh2aWRlb2pzLnBsYXllcnMpKXt2YXIgYj12aWRlb2pzLnBsYXllcnMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPW5ldyBTKGJbYV0pO3RoaXMuSChnKXx8KHRoaXMuSihnKSwobmV3IG5hKGcsdGhpcy5BKSkuYigpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIG9hPWMuWWh8fG9hLHBhPW5ldyBvYShxKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHM9dGhpcy5hWzVdO3RoaXMuZnA9dGhpcy5hWzVdO3RoaXMuRnI9dGhpcy5hWzhdO3RoaXMud2s9dGhpcy5hWzNdO3RoaXMua209dGhpcy5hWzddO3RoaXMudXE9dGhpcy5hWzRdO3RoaXMuZm49dGhpcy5hWzddO3RoaXMueWs9dGhpcy5hWzEwXTt0aGlzLnhtPXRoaXMuYVsxMF07dGhpcy5maz10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVsyXX1jLlpuPWI7Yi5wcm90b3R5cGU9e0NzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Eczp0aGlzLmVwKGEpfSxlcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnA6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Gcjp0aGlzLnZrKGEpfSx2azpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMud2s6dGhpcy5qbShhKX0sam06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMua206dGhpcy50cShhKX0sdHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51cTp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZm46dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnlrOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy54bTp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZms6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBxYT1jLlpufHxxYSxOYz1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1OYy5Dcyg0KTsoZnVuY3Rpb24oYyl7Yy5naj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmFjPSExO3RoaXMubWYoKTsKdGhpcy5vZigpO3RoaXMudW89ITF9LG1mOmZ1bmN0aW9uKCl7dGhpcy5hYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYWM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuUChiKX0sb2Y6ZnVuY3Rpb24oKXtpZighdGhpcy5hYyl7dmFyIGI9dGhpcy5EYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYWM9ITApO3RoaXMuUyhhKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpKX0sVmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5kZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuZGQoYSl9LmJpbmQodGhpcykpfSwKZGQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLldkJiYoMCx0aGlzLldkKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6CiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJmIuZ2V0RnVsbHNjcmVlbigpJiZiLnNldEZ1bGxzY3JlZW4oKX0sV2E6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyO2EuZ2V0TXV0ZSYmYS5nZXRNdXRlKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciByYT1jLmdqfHxyYTsoZnVuY3Rpb24oYyl7Yy5maj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxOOmZ1bmN0aW9uKCl7fSxuYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMubGM7dGhpcy5pc1BsYXlpbmc9dGhpcy5uYz0hMTt0aGlzLnVkPTE7dGhpcy5wYz1bXTt0aGlzLmFiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9CnRoaXMubmM9ITE7dGhpcy51ZD0xO3RoaXMucGM9W107dGhpcy5hYj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT17fTtiLmdldENvbmZpZyYmKGE9Yi5nZXRDb25maWcoKSxhLmFkdmVydGlzaW5nPyhhLmFkdmVydGlzaW5nLnNjaGVkdWxlJiYoYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHM/YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy51ZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuYWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmFiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmFiPSEwKSkpLAphLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuYWI9ITApKTp0aGlzLm0oIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiZiLl9ldmVudHMuYWRDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ29tcGxldGUiKTt0aGlzLm5jPSEwfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRNZXRhIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFNraXBwZWQmJmIuX2V2ZW50cy5hZFNraXBwZWQucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZFNraXBwZWQiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuWmYmJiF0aGlzLmhhKCkmJih0aGlzLmFiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLm8oKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubyghMCkpKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5uYigpLHRoaXMuZ2V0UGxheWVyKCkudW89ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdiO2EmJihhLmFlKCksYS5CYSgpKX19LmJpbmQodGhpcyl9KTsKaWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRDb21wbGV0ZSIpO3RoaXMubmM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMubSgib25BZEltcHJlc3Npb24iKTt0aGlzLlpkKCl9LmJpbmQodGhpcykpO2lmKGIub25BZFBsYXkpYi5vbkFkUGxheShmdW5jdGlvbigpe3RoaXMubSgib25BZFBsYXkiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlpmJiYhdGhpcy5oYSgpJiYodGhpcy5hYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLnBjLmluZGV4T2YoYSkmJnRoaXMucGMucHVzaChhKTsiMTAxIj09Yi5jb2RlfHwiMTAwMSI9PWIuY29kZT8odGhpcy5tKCksdGhpcy5uYSgpKTo5MDA9PWIuY29kZSYmMDxiLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMubSgiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLm0oImVtcHR5Iik6KHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLnBjLmxlbmd0aD49dGhpcy51ZCYmdGhpcy5vKCkpfSxEcjpmdW5jdGlvbihiKXt0aGlzLmooIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCk7ZS5KdChhLnZpZGVvVGFnKT9hLmFjP3RoaXMubSgicGxheWVyIGlzIGludmFsZCIpOnRoaXMubmN8fHRoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSw1MCk6KGEubWYoKSxhLm9mKCkpfX0pfSkoYyk7dmFyIHNhPWMuZmp8fHNhOyhmdW5jdGlvbihjKXtjLmhqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuUHAoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT0KYi5hdXRob3JpdHkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0pLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5QcShnKXx8KHRoaXMuSihnKSwKZz1uZXcgc2EoZyx0aGlzLkEpLGcuTigpLGcuYigpKX1lbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0sU3Y6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sUHA6ZnVuY3Rpb24oKXt2YXIgYj1lLk1hKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnliKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB0YT1jLmhqfHx0YSx1YT1uZXcgdGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZHM9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOV19Yy55aT1iO2IucHJvdG90eXBlPXtjczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZHM6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB2YT1jLnlpfHx2YSxPYz1uZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9T2MuY3MoNCk7KGZ1bmN0aW9uKGMpe2MucG09cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb19pZCk7dGhpcy5QKGIpO3ZhciBiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0sYT10aGlzLmdldFJhd1BsYXllcigpO2ImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlMoYik6dGhpcy5JKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSwKTDpmdW5jdGlvbigpe3JldHVybiJYT1pDT00ifX0pfSkoYyk7dmFyIHdhPWMucG18fHdhOyhmdW5jdGlvbihjKXtjLm9tPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IudHJhY2tlci52YXN0X3ByZXJvbGx8fGIudHJhY2tlci52YXN0X3Bvc3Ryb2xsP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LG86ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHhhPWMub218fHhhOyhmdW5jdGlvbihjKXtjLnFtPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmCndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyYmMDxlLkVhKHdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcykpe3ZhciBiPXdpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YlthXTtpZihnLmNvbnRyb2xzJiZnLmNvbnRyb2xzLnBsYXllcilnPW5ldyB3YShnKSx0aGlzLkgoZyl8fCh0aGlzLkooZyksKG5ldyB4YShnLHRoaXMuQSkpLmIoKSk7ZWxzZXt0aGlzLkkoKTtyZXR1cm59fX10aGlzLkkoKX19KX0pKGMpO3ZhciB5YT1jLnFtfHx5YSx6YT1uZXcgeWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubHA9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMTBdfWMuYWo9YjtiLnByb3RvdHlwZT17a3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmxwOgp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEFhPWMuYWp8fEFhLFBjPW5ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLmtwKDQpOyhmdW5jdGlvbihjKXtjLmVtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlAoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUyhiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sTDpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIiwKZnVuY3Rpb24oYil7dGhpcy5xYihiKX0uYmluZCh0aGlzKSl9LHFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLksmJnRoaXMuSygpfSxSYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0sCmlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciBCYT1jLmVtfHxCYTsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5LZz0hMDt0aGlzLnlkPXRoaXMuSGY9ITE7dGhpcy5hZygpO3RoaXMuZW8oKTt0aGlzLkhhKCl9LGZ3OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKY29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuZWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuYmEsIjsiLHR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwKIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLnFkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5yZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnJkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYucmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnhkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi54ZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnhkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMua2cpfSxmYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmCih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LExjOmZ1bmN0aW9uKCl7aWYoIXRoaXMubWEpe3ZhciBiPXRoaXMuZmIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSx3ZjpmdW5jdGlvbigpe2lmKCF0aGlzLlliKXt2YXIgYj10aGlzLmZiKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWWI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlliPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWWJ9LApOcTpmdW5jdGlvbigpe2lmKCF0aGlzLkdmKXt2YXIgYj10aGlzLmZiKCksYT10aGlzLkxxKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5HZj0hMCl9cmV0dXJuIHRoaXMuR2Z9LExxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy50YyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMudGM9ITApO3JldHVybiB0aGlzLnRjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTGMoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksCmIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxrZTpmdW5jdGlvbigpe3RoaXMueWQ9ITA7dmFyIGI9dGhpcy53ZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmCmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuWCghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtlLmliKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLk5ifHwodGhpcy5sKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5YKCksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sUnY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmJmJiZiLmFkcyYmKHRoaXMuYmY9Yi5hZHMpO3JldHVybiB0aGlzLmJmfSxlbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlgoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7CmIub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5aZCgpfS5iaW5kKHRoaXMpKX0sZWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLndmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZigpfS5iaW5kKHRoaXMpLDUwKX0sYWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTnEoKSl7dmFyIGE9dGhpcy5mYigpLGc9dGhpcy5MYygpO2EmJmcmJih0aGlzLmZiKCksdGhpcy5MYygpLAp0aGlzLnlkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWQ/dGhpcy5tKCk6KHRoaXMuWCghMCksdGhpcy5sKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuZmIoKX1lbHNlIHRoaXMuSGY/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmZiKCksYj10aGlzLkxjKCk7YSYmIWI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5YKCkpOih0aGlzLlgoITApLHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLkhmPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWcoKX0uYmluZCh0aGlzKSw1MCl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9CiEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5VPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMucWEoKTticmVha319LGZvOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLlFiIT1iLmFkcy5zdGF0ZSYmKHRoaXMuUWI9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuUWIpe3RoaXMubSgiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5RYj0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZm8oKX0uYmluZCh0aGlzKSwxMCl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMDt0aGlzLm0oImVtcHR5IHZhc3QiKX0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLmhhKCl8fChifHwKKHRoaXMuS2c9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuS2csZnVuY3Rpb24oKXt0aGlzLmVmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LGxvOmZ1bmN0aW9uKCl7dGhpcy5hd3x8KDEwPHRoaXMuV3U/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLld1KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuZnQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubG8oKX0uYmluZCh0aGlzKSw1MCkpKX0sZnQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIudnBFdmVudCYmIXRoaXMuWHUpe3RoaXMuWHU9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIisKYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWC5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5YLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiKwphLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBDYT1jLmRtfHxDYTsoZnVuY3Rpb24oYyl7Yy5mbT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy54Zyh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMueGcoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0seGc6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5FYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBCYShiW2ddKSxhLmphfHx0aGlzLkgoYSl8fAohMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkooYSksKG5ldyBDYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy5yYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmRjKX19KX0pKGMpO3ZhciBEYT1jLmZtfHxEYSxFYT1uZXcgRGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuenM9dGhpcy5hWzJdO3RoaXMuc3U9dGhpcy5hWzhdO3RoaXMuSmo9dGhpcy5hWzJdO3RoaXMuJGk9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5Scz1iO2IucHJvdG90eXBlPXt5czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenM6dGhpcy5ydShhKX0scnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnN1OnRoaXMuSWooYSl9LElqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5KajoKdGhpcy5aaShhKX0sWmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgRmE9Yy5Sc3x8RmEsUWM9bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMueXMoNCk7KGZ1bmN0aW9uKGMpe2MuUmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5QKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlMoYSl9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7CmEuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sS2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEdhPWMuUmx8fEdhOyhmdW5jdGlvbihjKXtjLlFsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkFiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmhjPSExO3RoaXMubGcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubSgpOwplbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuaGM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy54YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlllKCk6dGhpcy5tKCl9LHhjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5tKCk7ZWxzZXtpZigxMDA5PT0KZ3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5oYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuaGM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy54Yy5iaW5kKHRoaXMpLDEwMCl9fSxZZTpmdW5jdGlvbigpe2lmKCF0aGlzLmhhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09CmIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQWImJih0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWWUuYmluZCh0aGlzKSwKNTApfX0sbGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5oYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubSgpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSGE9Yy5RbHx8CkhhOyhmdW5jdGlvbihjKXtjLlNsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBHYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSGEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIElhPWMuU2x8fElhLEphPW5ldyBJYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5DdT10aGlzLmFbNV07dGhpcy5Bbz10aGlzLmFbNl07dGhpcy5Nbz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLldxPWI7Yi5wcm90b3R5cGU9e0J1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5DdTp0aGlzLnpvKGEpfSwKem86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkFvOnRoaXMuTG8oYSl9LExvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Nbzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEthPWMuV3F8fEthLFJjPW5ldyBLYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLkJ1KDQpOyhmdW5jdGlvbihjKXtjLnhoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMuJGY9YX0sTjpmdW5jdGlvbigpe30sVGQ6ZnVuY3Rpb24oYil7dGhpcy4kZj1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy4kZikucGFyZW50Tm9kZTt0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIExhPWMueGh8fExhOyhmdW5jdGlvbihjKXtjLndoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmooYixhKX0sVGQ6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBNYT1jLndofHxNYTsoZnVuY3Rpb24oYyl7Yy55aD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBMYShkLAphKSx0aGlzLkgoZCl8fChkLlRkKGEpLHRoaXMuSihkKSxkPW5ldyBNYShkLHRoaXMuQSxnKSxkLlRkKGcpLGQuYigpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE5hPWMueWh8fE5hLE9hPW5ldyBOYShmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubWw9dGhpcy5hWzhdO3RoaXMuYmw9dGhpcy5hWzhdO3RoaXMuU3U9dGhpcy5hWzldO3RoaXMuSmw9dGhpcy5hWzJdO3RoaXMuQWs9dGhpcy5hWzddO3RoaXMuRXU9dGhpcy5hWzFdO3RoaXMuZG49dGhpcy5hWzFdO3RoaXMucXU9dGhpcy5hWzJdO3RoaXMuT289dGhpcy5hWzFdO3RoaXMueXY9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5Jcz1iO2IucHJvdG90eXBlPXtsbDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubWw6dGhpcy5hbChhKX0sYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ibDp0aGlzLlJ1KGEpfSxSdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuU3U6dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpsOnRoaXMuemsoYSl9LHprOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Bazp0aGlzLkR1KGEpfSxEdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkV1OnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5kbjp0aGlzLnB1KGEpfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucXU6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9vOnRoaXMueHYoYSl9LHh2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueXY6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBQYT1jLklzfHxQYSxTYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwKImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MubGwoNCk7KGZ1bmN0aW9uKGMpe2MuVWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nYW1lQ29udGFpbmVyWzBdO3RoaXMuUChiKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMudmlkZW9UYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpLGE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxYYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmCihiPSEwKTtyZXR1cm4gYn0sTDpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgUWE9Yy5Vanx8UWE7KGZ1bmN0aW9uKGMpe2MuVGo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuWGEoKT8oJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0YXAiLGZ1bmN0aW9uKCl7dGhpcy5vYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMub2MoKX0uYmluZCh0aGlzKSkpOnRoaXMub2MoKX0sb2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/CnRoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpO3ZhciBSYT1jLlRqfHxSYTsoZnVuY3Rpb24oYyl7Yy5Waj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuTklDSyYmTklDSy5HYW1lTG9hZGVyJiZOSUNLLkdhbWVMb2FkZXIuZ2FtZUNvbnRhaW5lcil7dmFyIGI9bmV3IFFhKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgUmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFNhPWMuVmp8fFNhLFRhPW5ldyBTYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbj10aGlzLmFbMTBdO3RoaXMuYms9dGhpcy5hWzEwXTt0aGlzLk1oPXRoaXMuYVs4XTsKdGhpcy5ycj10aGlzLmFbNF07dGhpcy5hbz10aGlzLmFbOF07dGhpcy5BdD10aGlzLmFbN107dGhpcy5Ccz10aGlzLmFbNF07dGhpcy5RaD10aGlzLmFbOV07dGhpcy5qcj10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLnBzPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmFrKGEpfSxhazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuYms6dGhpcy5MaChhKX0sTGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk1oOnRoaXMucXIoYSl9LHFyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucnI6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFvOnRoaXMuenQoYSl9LHp0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5BdDp0aGlzLkFzKGEpfSxBczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQnM6dGhpcy5QaChhKX0sUGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlFoOgp0aGlzLmlyKGEpfSxpcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuanI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBVYT1jLnBzfHxVYSxUYz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5Mbig0KTsoZnVuY3Rpb24oYyl7Yy5Oaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLmJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLlAoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fAooYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlMoYik6dGhpcy5kYSgpfSxNczpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5lYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS4kYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5hZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuYmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuYmUrKztpZigxMDx0aGlzLmJlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxxYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfX0pfSkoYyk7dmFyIFZhPWMuTmt8fFZhOyhmdW5jdGlvbihjKXtjLk1rPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuR2QpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuR2Q9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnhwPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLnhwPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuTXMoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFdhPWMuTWt8fFdhOyhmdW5jdGlvbihjKXtjLk9rPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVmEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBXYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWGE9Yy5Pa3x8WGEsWWE9bmV3IFhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF1PXRoaXMuYVsxXTt0aGlzLldnPXRoaXMuYVs3XTt0aGlzLnlqPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMucGo9YjtiLnByb3RvdHlwZT17enU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkF1OnRoaXMuVmcoYSl9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV2c6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnlqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIFphPWMucGp8fFphLFVjPW5ldyBaYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1VYy56dSg0KTsoZnVuY3Rpb24oYyl7Yy5GaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUChiLmVsZW1lbnQpO3RoaXMuUyhiLmVsZW1lbnQpfSxEYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZmluaXNoKCl9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSGl0Ym94In19KX0pKGMpO3ZhciAkYT1jLkZpfHwkYTsoZnVuY3Rpb24oYyl7Yy5FaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudygpfX0pfSkoYyk7dmFyIGFiPWMuRWl8fGFiOyhmdW5jdGlvbihjKXtjLkdpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoaXRib3guYWRibG9ja2VyIixmdW5jdGlvbihiKXtiPW5ldyAkYShiLmRldGFpbCk7Yi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgYWIoYix0aGlzLkEpKS5iKCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBiYj1jLkdpfHxiYixjYj1uZXcgYmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLnpuPXRoaXMuYVs1XTt0aGlzLlZvPXRoaXMuYVszXTt0aGlzLlhyPXRoaXMuYVs1XTt0aGlzLlNpPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzRdfWMucnE9YjtiLnByb3RvdHlwZT17eW46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnpuOnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Wbzp0aGlzLldyKGEpfSxXcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhyOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5TaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBkYj1jLnJxfHxkYixWYz1uZXcgZGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1WYy55big0KTsoZnVuY3Rpb24oYyl7Yy5jaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUudWYoYiwiZWxlbWVudElEIik7dGhpcy5oZz1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuaGc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlAoZyk7dGhpcy5TKGcpO3RoaXMuR2M9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5HYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuR2MpfSxXYTpmdW5jdGlvbigpe3JldHVybiEwfSxrbzpmdW5jdGlvbigpe2UuTWYodGhpcy5HYyk7ZS5OZih0aGlzLkdjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua28oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sUGQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBlYj1jLmNqfHxlYjsoZnVuY3Rpb24oYyl7Yy5iaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudyghMCl9fSl9KShjKTt2YXIgZmI9Yy5ianx8ZmI7KGZ1bmN0aW9uKGMpe2MuZGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy53YT0xNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsuaW5yZWFkKXt2YXIgYj1rLmlucmVhZCxhPWUudWYoYiwiZWxlbWVudElEIik7CmUuTWYoYSkmJihiPW5ldyBlYihiKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBmYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMucmI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMucmI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGdiPWMuZGp8fGdiLGhiPW5ldyBnYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55dT10aGlzLmFbMV07dGhpcy5MdT10aGlzLmFbMl07dGhpcy54bj10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLkh1PWI7Yi5wcm90b3R5cGU9e3h1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dTp0aGlzLkt1KGEpfSxLdTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTHU6dGhpcy53bihhKX0sd246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYj1jLkh1fHxpYixXYz1uZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1XYy54dSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuTmk9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0scXQ6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxTbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLk5pfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmcsZCxjKXt0aGlzLklhPWE7dGhpcy5xZj10aGlzLlVnPSExO3RoaXMuYmc9ZDt0aGlzLnlnPSExOyJzdHJpbmciPT09dHlwZW9mIGEmJih0aGlzLklhPW5ldyB6KGEpKTt2YXIgZT10aGlzLnRiPW5ldyBYTUxIdHRwUmVxdWVzdDtlLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFnfHw0IT1lLnJlYWR5U3RhdGV8fDIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLk5kKHRoaXMuSWEudXJsKSYmbS5oZCl7dmFyIGg9bmV3IHooYS51cmwpO2gucXQoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYKKGI9ITApO2J8fG0uZ2EoInJlcXVlc3RfZmFpbGVkX25vcG9uZyAiKX0sZnVuY3Rpb24oKXttLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpfSkpLmxvYWQoKX1jJiY0IT1lLnJlYWR5U3RhdGUmJmMoZSl9LmJpbmQodGhpcyl9Yy5PaT1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5xZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMueWc/dGhpcy50Yi5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCExKTp0aGlzLnRiLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITApLHRoaXMuVWd8fCh0aGlzLnRiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy50Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksInVuZGVmaW5lZCIhPXR5cGVvZiBrJiZrJiZrLnZwYWlkJiZtJiZtLlNjKHRoaXMuSWEudXJsKSx0aGlzLnRiLnNlbmQoYSl9Y2F0Y2goYyl7bSYmbS5OZCh0aGlzLklhLnVybCk/bS5oZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLk5kKHRoaXMuSWEudXJsKSx0aGlzLmJnJiZ0aGlzLmJnKCl9cmV0dXJuIHRoaXMudGJ9fX0pKGMpO3ZhciBqYj1jLk9pfHxqYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnpkPXRoaXMuYmI9bnVsbDt0aGlzLkhvPXRoaXMub2I9dGhpcy5VZj0hMTt0aGlzLnVhPSIiO3RoaXMuUGY9ITE7dGhpcy5BYT10aGlzLk9jPSIiO3RoaXMuTGY9dGhpcy5aPXRoaXMuaXNFbmFibGVkPXRoaXMuaGU9ITE7dGhpcy5PYT1bXTt0aGlzLkVmPXRoaXMuRmI9IiI7dGhpcy5FZD0hMTt0aGlzLnRlPQowO3RoaXMuR2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5FZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudWI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMua2M9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRmU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMucGI9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMudWU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5LZD0hMTt0aGlzLm1vPXRoaXMuamQ9bnVsbDt0aGlzLnVnPXRoaXMuaWM9dGhpcy5MZz10aGlzLndlPXRoaXMuaGQ9dGhpcy5BZD10aGlzLm1jPSExO3RoaXMuUWE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuUGk9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsCmFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmJiLGFkdGFncmVnZXg6dGhpcy56ZCxqc3BvcHVwczp0aGlzLlVmLHNpZGVsb2Fkczp0aGlzLm9iLGRpc2FibGV0ZXN0czp0aGlzLkhvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuUGYsZ2xvYmFsQ29uZmlnOnRoaXMuT2MsY2xpZW50Q29uZmlnOnRoaXMuQWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5aLGlzQmxvY2tlZDp0aGlzLkxmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMuRWYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5FZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy50ZSxIT01BRF9WRVJJRklFRDp0aGlzLkdlLEhPTUFEX0JMT0NLRUQ6dGhpcy5FZSxIT01BRF9OT0JMT0NLRVI6dGhpcy51YixIT01BRF9BREJMT0NLRVI6dGhpcy5rYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRmUsdGVzdEhpZGU6dGhpcy5IYiwKdGVzdFRhZ3M6dGhpcy5wYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMudWUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5LZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLm1vLGFkQmxvY2tlckRldGVjdGVkOnRoaXMubWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLkFkLHVzZVN0cmljdENoZWNrczp0aGlzLmhkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLndlLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUWEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMucGcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuaWMsc2tpcEFsbG93ZWQ6dGhpcy51Z319LG1xOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJihhPSEwKTtyZXR1cm4gYX0sbGU6ZnVuY3Rpb24oYSl7dGhpcy5RYVthXT0KITB9LFFwOmZ1bmN0aW9uKCl7dmFyIGE9W10sYjtmb3IoYiBpbiB0aGlzLlFhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUWFbYl0mJjE9PXRoaXMuUWFbYl0mJmEucHVzaChiKTtyZXR1cm4gYX0scWU6ZnVuY3Rpb24oYSl7YT1hfHwiIjtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5QbihhKX0sS2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLAplPSIiLGg9IiIsaz0iIjtpZighdGhpcy5vYSYmIWIpcmV0dXJuIG5ldyB6KGEpO2M9dGhpcy5TYyhhKTtlPXRoaXMuTWEoYSk7Yz8odGhpcy5iYygpP2g9YTpoPWUucHJvdG9jb2wrIjovLyIrZS5hdXRob3JpdHkrIi8iLGs9ZS5wYXRoLnN1YnN0cigxKSk6KGg9dGhpcy5qZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLk9ifHx0aGlzLmJifHx0aGlzLnpkKSYmKGs9dGhpcy5LcihrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLlNwKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sU2M6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIik7KGM9Yy5leGVjKGEpKSYmKGNbMl18fGNbNV0pP2I9ITA6dGhpcy5iYygpJiYoYz1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChjPWMuZXhlYyhhKSkmJmNbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LGJjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZDpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7YyYmKGNbMl18fGNbNV0pP2I9ITA6Yj10aGlzLlNjKGEpO3JldHVybiBifSwKU3A6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYz0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLnVhJiYwPHRoaXMudWEubGVuZ3RoKXJldHVybiB0aGlzLnVhO2ZvcihjIGluIHRoaXMudWEpaWYoYj10aGlzLnVhW2NdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSnY7cmV0dXJuIm5vbmUifSxRYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMucGddfSxqZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUWMoKSxiPXRoaXMudGcoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGM9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitjW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpjLmxlbmd0aCldKX0sS3I6ZnVuY3Rpb24oYSl7dGhpcy5PYiYmKGErPXRoaXMuT2IpO2lmKHRoaXMuYmIpZm9yKHZhciBiIGluIHRoaXMuYmIpdGhpcy5iYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsCnRoaXMuYmJbYl0pKTtyZXR1cm4gYX0sYzpmdW5jdGlvbihhLGIsYyxmLGUsaCl7bT10aGlzO3RoaXMuUGY9ITA7dGhpcy5PYz1hO3RoaXMuQWE9Yjt0aGlzLmhlPWM7dGhpcy5qZD1mO3RoaXMuRWM9ZTt0aGlzLkViPWh8fHt9O3RoaXMuenIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQWEpdGhpcy54cigpO2Vsc2UgdHJ5e3RoaXMuQWE9YigpLHRoaXMuemMoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWWE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goYyl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LHpyOmZ1bmN0aW9uKCl7dGhpcy5HYShuZXcgeih0aGlzLk9jK3RoaXMucmMoImdsb2JhbCIpKSx0aGlzLmZxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx4cjpmdW5jdGlvbigpe25ldyB6KHRoaXMuQWErdGhpcy5yYygiY2xpZW50IikpO3RoaXMuR2EobmV3IHoodGhpcy5BYSt0aGlzLnJjKCJjbGllbnQiKSksdGhpcy56Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5sZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scmM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMua2IoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLkFkKXt0aGlzLkFkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLkVjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRWM/dGhpcy5FYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5aPXRoaXMuTGY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMuRWUpKTt0aGlzLnNiKCk7ZS5UYihsLkpzKTsoYj1lLkFmKHRoaXMuUWMoKSkpfHwoYj1lLkFmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxmcTpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5aPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuQWF8fHRoaXMuRmJ8fHRoaXMudWF8fHRoaXMuemMoKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5aPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnViKSksdGhpcy5zYigpKX19LHpjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQWF9ZWxzZSBhPXRoaXMuQWE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5PYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMuRWY9YS5hZHBhdGh8fCIiO3RoaXMuRWQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5wZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5PYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkZiJiZ0aGlzLnVhJiZ0aGlzLk9hLmxlbmd0aD90aGlzLlVjKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKSwKdGhpcy5zYigpKX0sVWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5qZSgpKSxjPXRoaXMuTWEodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMucmMoImN1c3RvbWVyIikpO3RoaXMuR2EoYix0aGlzLk10LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxlKCJjdXN0b21lciIpO2E/dGhpcy54bD90aGlzLmdhKCJub1NWTUNvbmZpZyIpOih0aGlzLnhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5VYyghMCl9LmJpbmQodGhpcyksITApfX0sTXQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7YT0KYS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5oZD10aGlzLkpiKGIuc3RyaWN0KTt0aGlzLndlPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuTGc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnBiPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuYmI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuemQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVWY9Yi5qc3BvcHVwc3x8ITE7dGhpcy5vYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5pYz1iLnZwYWlkfHwhMTt0aGlzLkViLnZwYWlkPXRoaXMuaWM7dGhpcy51Zz0KYi5za2lwYWxsb3dlZHx8ITE7dGhpcy5HYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLiRwKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5FZCYmKHRoaXMuR2I9bnVsbCk7dGhpcy51ZT1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLktkJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5LZD0hMCx0aGlzLlVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmN1KCkmJih0aGlzLkhifHx0aGlzLklifHx0aGlzLnBifHx0aGlzLkdiKT90aGlzLmhlPyh0aGlzLm9hPXRoaXMuWj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy51YikpLHRoaXMuQmQoKSx0aGlzLnNiKCkpOnRoaXMuUHQoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5RdCgpKX19LFB0OmZ1bmN0aW9uKCl7dGhpcy5PdCgpfSxRdDpmdW5jdGlvbigpe3RoaXMuWj0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCl9LGdkOmZ1bmN0aW9uKGEpe3RoaXMubWM9ITA7dGhpcy5afHwodGhpcy5aPXRoaXMub2E9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKGEpKSx0aGlzLnNiKCksdGhpcy5CZCgpKX0sT3Q6ZnVuY3Rpb24oKXtpZih0aGlzLkhiKXt2YXIgYT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLkhiKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgYz0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9Y31jYXRjaChmKXt9YT90aGlzLmdkKHRoaXMua2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLkJnKCl9ZWxzZSB0aGlzLkJnKCl9LEFnOmZ1bmN0aW9uKCl7dmFyIGY7dmFyIGM7ZnVuY3Rpb24gYSgpe2Y9Yy5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLmtiKCkpO3RoaXMuVHQoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnJlLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5nZCh0aGlzLmtjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9dGhpcy5wYj1udWxsLHRoaXMucmUoKX0sVHQ6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0aGlzLkdhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtlKCkmJmMoKX0pfSxCZzpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigpKTt0aGlzLlV0KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5BZy5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuZ2QodGhpcy5rYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIitmKyInIHdhcyBibG9ja2VkIil9aWYodGhpcy5JYiYmdGhpcy5JYi5sZW5ndGgpe3ZhciBjPXRoaXMuSWIuc2xpY2UoKSxmO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5BZygpfSxVdDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2goKSYmYigpfWZ1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBoKCl7cmV0dXJuIGs/KHdpbmRvdy5jbGVhclRpbWVvdXQoayksITApOiExfXZhciBrPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwKM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixjKXtjPT1hJiZoKCkmJmUoKX07dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsKTtsLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2wuc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7bC5vbmxvYWQ9ZjtsLm9uZXJyb3I9ZTtsLnNyYz1hO2wuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGUpfWNhdGNoKG0pe2YoKX19LHJlOmZ1bmN0aW9uKCl7dGhpcy5HYj8odGhpcy50ZSsrLHRoaXMuR2EobmV3IHoodGhpcy5HYiksdGhpcy5OdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zZSgiQ0NDIil9LmJpbmQodGhpcykpKTp0aGlzLnpnKCl9LHNlOmZ1bmN0aW9uKGEpe3RoaXMuZ2QodGhpcy5GZSwibiBIb21hZFV0aWwudGVzdDNyZFBhcnR5Q29va2llKCkgY2Fubm90IHNldCAzcmQgcGFydHkgY29va2llICIrYSl9LE50OmZ1bmN0aW9uKGEpe2E9CmEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy50ZT90aGlzLnJlKCk6dGhpcy5zZSgiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuemcoKTp0aGlzLnNlKCJBQUEiKX0semc6ZnVuY3Rpb24oKXt0aGlzLlo9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMudWIpKTt0aGlzLnNiKCk7dGhpcy5CZCgpfSxzYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5YYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLm1jJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWWEodGhpcy5HZSkpO3RoaXMuamQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5qZCYmdGhpcy5qZCgpfSxqbzpmdW5jdGlvbigpe2lmKHRoaXMud2UmJnRoaXMubXEoKSl7dmFyIGE9CnRoaXMuUXAoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LEVnOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sR2E6ZnVuY3Rpb24oYSxiLGMsZixoLEljKXthPW5ldyBqYihhLGIsYyk7ZiYmKGEuVWc9ITApO2gmJmUuUXEoKSYmKGEucWY9ITApO0ljJiYoYS55Zz0hMCk7cmV0dXJuIGEubG9hZCgpfSxXZTpmdW5jdGlvbigpe2UuWGEoKXx8ZS5MYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fAooYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuZ2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLmJjKCl8fChhPXRoaXMuTWEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7CmguYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0saW86ZnVuY3Rpb24oKXt0aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLkthKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkdhKGEsdGhpcy5QdS5iaW5kKHRoaXMpLAp0aGlzLk91LmJpbmQodGhpcykpfSxQdTpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMudHAoKX0sT3U6ZnVuY3Rpb24oKXt9LHRwOmZ1bmN0aW9uKCl7ZS5UYihsLnNwKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxCZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm9iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMub2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5vYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGM9Cm5ldyBRO3dpbmRvd1tjLlpiKCldPXRoaXM7ZS5MYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxjdTpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnVlfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sa2I6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT0KYXx8MT09YXx8IjEiPT1hfHwxPT1hfSx5YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsaz0oZiYxNSk8PDJ8ZT4+NixsPWUmNjMsaXNOYU4oZik/az1sPTY0OmlzTmFOKGUpJiYobD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpOwpyZXR1cm4gYn0sTWE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSx0ZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPQoiIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx3LHQseDtuPWEubGVuZ3RoO3ZhciB5PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHkucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PAoyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih5LnB1c2goZik7MTQhPXkubGVuZ3RoJTE2Oyl5LnB1c2goMCk7eS5wdXNoKG4+Pj4yOSk7eS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHkubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO249bDtwPW07dz1xO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfH5uJncpK3QraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj0yMDszOT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NDA7NTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8biZ3fHAmdykrdCtoW2ZdKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj02MDs3OT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt0K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cT1xK3cmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBrYj1jLlBpfHxrYixtPW5ldyBrYjt3aW5kb3cuT3Y9bTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaz10aGlzLmFbN107dGhpcy5Fbz10aGlzLmFbOV07dGhpcy52dj10aGlzLmFbNl07dGhpcy5WcT10aGlzLmFbM107dGhpcy5ZcT10aGlzLmFbOV07dGhpcy5taT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs0XX0KYy55bz1iO2IucHJvdG90eXBlPXtFazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZrOnRoaXMuRG8oYSl9LERvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbzp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudnY6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlZxOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZcTp0aGlzLmxpKGEpfSxsaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubWk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBsYj1jLnlvfHxsYixYYz1uZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1YYy5Fayg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsCmIsYyl7dGhpcy5pPWE7YS51Lkw/dGhpcy5OYT1hLnUuTCgpOnRoaXMuTmE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5pLlJhO3RoaXMucGxheWVyPXRoaXMuaS51O3RoaXMudWM9ITE7dGhpcy5Obj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmZkPXt9O3RoaXMuc2M9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5zYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmkudSkmJnRoaXMuaS51LkImJihhPXRoaXMuaS51LkIoKSksdGhpcy5zYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5YbT1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmVkPSExO3RoaXMuWGY9YyYmYy5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoYy5tYXhXcmFwcGVyRGVwdGgpOgoxNTt0aGlzLnM9e307dGhpcy5xYz0hMTt0aGlzLkhnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuJGI9ITE7dGhpcy53bz1lLnBhKDEwKTt0aGlzLlhjPWUucGEoMTApO3RoaXMuWGQ9ZS5wYSgxMCk7dGhpcy52Zz1lLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkJiPSExO3RoaXMuRmQ9bnVsbDt0aGlzLkNkPXRoaXMuRGM9dGhpcy53Zz10aGlzLmRnPXRoaXMuSGM9dGhpcy5ldT10aGlzLiRhPSExfWMuSmk9YjtiLnByb3RvdHlwZT17cWc6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5OYV0mJnRoaXMuY29uZlt0aGlzLk5hXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTmFdW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuRmEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuVC5tYz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6CmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS5EKGwuS20sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKX0sUmQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuJGE9YztpZih0aGlzLlQuWil0aGlzLlQuam8oKSx0aGlzLlQub2EmJnRoaXMuVC5pc0VuYWJsZWQ/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5ULmljfSkpOmI/KHRoaXMuRmcoKSxuZXcgVCh0aGlzLGEsdGhpcy5YZix7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuVC5pYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuQmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YuUmQoYSxiLGMpfSw1MCl9fSxjZTpmdW5jdGlvbihhKXt0aGlzLkhjPSExO3RoaXMucz1hO3RoaXMueXQodGhpcy5zKTsKdGhpcy5CZihhKX0sQmY6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuZmQ9dGhpcy5icShhKSksdGhpcy5CZihhLnBhcmVudCkpfSxicTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWSl7Yj1hLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlkuZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5ZLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlkuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYKKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVGEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sZmE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLkZjJiZhLkZjLmVycm9yJiZhLkZjLmVycm9yLmNvZGUmJihiPWEuRmMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2UgeC5qYy5jb2RlOmI9PUMub2QuY29kZT9lLkQobC5ndix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpOihlLlNkKCksYj09Qy5KZS5jb2RlJiZlLkQobC5Pcix0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKTtlLkQobC5ycCx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjsKYnJlYWs7Y2FzZSB4LkhlLmNvZGU6ZS5EKGwuUXUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB4LktlLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS5EKGwubXYsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2UgeC5wZC5jb2RlOmUuRChsLm52LHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2UgeC5uZC5jb2RlOmUuRChsLlByLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChlLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PQpjJiZhLmVycm9yJiZhLmVycm9yLmthJiYoYys9Il8iK2EuZXJyb3Iua2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy56YihhKTt0aGlzLkJhKCl9LHpiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS56YS5sZW5ndGg7KXRyeXt2YXIgYz1hLnphLnBvcCgpO3RoaXMuUWQoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHl0OmZ1bmN0aW9uKGEpe3RoaXMuQ2Q9ITE7dGhpcy5yYT10aGlzLmkuRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuaS5DO2IuZ3c9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLlhtJiZ0aGlzLnBsYXllci5LYygpJiYKKGIudm9sdW1lPXRoaXMucGxheWVyLktjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuVG0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLkRnKGIpPyh0aGlzLlZtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5ybygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLnd0KCkpOnRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0sd3Q6ZnVuY3Rpb24oKXtlLiRlKCk7dGhpcy5zJiZ0aGlzLnMub3JpZ2luJiZ0aGlzLnMub3JpZ2luLkJlJiZlLldtKHRoaXMucy5vcmlnaW4uQmUpO2UuWmEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmkuQzt0aGlzLmkuQz1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5pLkMsYSk7dGhpcy5pLmVnKCk7dGhpcy5pLmZjKCk7Zm9yKGE9dGhpcy5pLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuaS5mYygpO3RoaXMuVz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlcuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTsKdGhpcy5XLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5XLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmkuRy5hcHBlbmRDaGlsZCh0aGlzLlcpO3RoaXMuVy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnMuZXEoKSxiPXRoaXMucy5PLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sCmNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuaS5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5pLkcuc3R5bGUuaGVpZ2h0KX19fTtlLnlhKHRoaXMuVywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UueWEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsCiJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnlhKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS55YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuWG4oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlQpO3RoaXMuVy5zcmM9YTtlLndkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5CYSgpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMuYXYoKSx0aGlzLmkuV2IoITApKSwKIkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5pLldiKCEwKSx0aGlzLmJ2KCkpLCJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuaS5XYighMCksdGhpcy5ldigpKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5SZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ2KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmR2KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLmN2KCkpfS5iaW5kKHRoaXMpKTtlLndkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcykpO2Uud2QoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmkuUW0oZnVuY3Rpb24oYSl7ZS55YSh0aGlzLlcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSwKYnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0sYXY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS5aYSgiaW1wcmVzc2lvbiIpfSxldjpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS5aYSgic3RhcnQiKX0sUmc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS5aYSgiZmlyc3RRdWFydGlsZSIpfSxmdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlphKCJ0aGlyZFF1YXJ0aWxlIil9LGR2OmZ1bmN0aW9uKCl7dGhpcy5rZCgpO2UuWmEoImNvbXBsZXRlIil9LGN2OmZ1bmN0aW9uKCl7ZS5aYSgiYWRzdG9wcGVkIik7dGhpcy5hZigpfSxUbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBmPWIsZT10aGlzLlQ7ZS5vYSYmZS5pc0VuYWJsZWQmJiFlLmJjKCk/KGY9ZS5NYShmKSxiPWYucHJvdG9jb2wrIjovLyIrZi5ob3N0KToKYj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5VdS5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LERnOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sVm06ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuUWcuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy55ZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxhZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5RZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIiwKdGhpcy55ZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuemUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5rZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmxkLmJpbmQodGhpcykpfSxRZzpmdW5jdGlvbihhKXt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZShhKX0uYmluZCh0aGlzKSx0aGlzLk5uKX0seWU6ZnVuY3Rpb24oYSl7dHJ5e2lmKCFlLlhhKCkmJnRoaXMuVC5MZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQmJ8fCh0aGlzLkJiPSEwLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMudWN8fCF0aGlzLkRnKHRoaXMudmlkZW8pfHwKdGhpcy5CYnx8KHRoaXMudWM9ITAsdGhpcy5UdSgpLHRoaXMudmlkZW8uY29udHJvbHM9ITEsdGhpcy5pLmZjKCksdGhpcy5OZygpLHRoaXMuT2coKSx0aGlzLlVlKCksdGhpcy5pLmVnKCksdGhpcy52aWRlby5wbGF5JiZ0aGlzLnBlKCkpfSxwZTpmdW5jdGlvbigpe2lmKCF0aGlzLkRjKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuRmEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuUGM9W107Zm9yKHZhciBiPXRoaXMuaS5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLlBjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIiwKYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMudGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMudGQoKX1lbHNlIHRoaXMudGQoKX0sdGQ6ZnVuY3Rpb24oKXtpZih0aGlzLlBjKWZvcih2YXIgYT0KMDthPHRoaXMuUGMubGVuZ3RoO2ErKyl0aGlzLlBjW2FdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYT10aGlzLnZpZGVvLnBsYXkoKSkmJmFbImNhdGNoIl0pYVsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuRGN8fCh0aGlzLkJhKCksZS50cmFjaygic3RhdHNfaGRfcGxheVByb21pc2VGYWlsZWQiLCIiLCEwKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5DYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkNiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkNiLmJpbmQodGhpcykpKTpIPWZ1bmN0aW9uKCl7dGhpcy5xY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMucGUoKSl9LmJpbmQodGhpcyk7dGhpcy56ZigpLnJnKHRoaXMpfSxrZDpmdW5jdGlvbigpe3RoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsCiEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UuRChsLkZtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5hZigpfSxhZjpmdW5jdGlvbigpe3RoaXMuQ2R8fCh0aGlzLkNkPSEwLHRoaXMucy54Yj8odGhpcy51Yz0hMSx0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuZWQ9ITEsdGhpcy5pLkpnKCksdGhpcy5zLm9yaWdpbi5ZZCgpKTp0aGlzLkJhKCkpfSxVdTpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLmFkKHRoaXMudmlkZW8pLHRoaXMuTWQoKT90aGlzLnNnKCk6dGhpcy5sZChhKSl9LGxkOmZ1bmN0aW9uKGEpe2EmJgphLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5NZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5SYnx8dGhpcy5ULldlKCl9LmJpbmQodGhpcyksMUUzKTp0aGlzLlQuV2UoKSk7dGhpcy5zLm9yaWdpbi5rZih4Lm5kKX0semU6ZnVuY3Rpb24oKXtpZih0aGlzLmV1KXRoaXMuQmEoKTtlbHNle3RoaXMuJGI9ITA7dGhpcy5pLnUuamImJiF0aGlzLndnJiZ0aGlzLmkudS5qYigpJiZlLkQobC5CYyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5tdShhKTt2YXIgYj0iIjtpZih0aGlzLnMub2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMudmcpO2MmJihiPXRoaXMucy5vZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLApiKTooYj10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpLHRoaXMuZWR8fCh0aGlzLmVkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UuRChsLkxtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSk7dGhpcy5zLnhiPyh0aGlzLnVjPSExLHRoaXMuYWQodGhpcy52aWRlbyksdGhpcy5jYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMuY2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5lZD0hMSx0aGlzLmkuSmcoKSx0aGlzLnMub3JpZ2luLllkKCkpOnRoaXMuQmEoKX0uYmluZCh0aGlzKSkpKSxjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuc2MucmVwbGFjZSgiW3RpbWVdIixlLnJmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMucWM9ITA7dGhpcy52aWRlby5jb250cm9scz0KITF9fSxzZzpmdW5jdGlvbigpe3RoaXMuUmI9ITA7dGhpcy5yYT10aGlzLmkuRzt0aGlzLnJhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgidHlwZSIsImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpOwphLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuWHAoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmkuQz1hO3ZhciBiPXRoaXMuaS5DLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06Yy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmkuZmMoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy5yYS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMucmEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLlBnLmJpbmQodGhpcyk7dGhpcy5jYS5hcHBlbmRDaGlsZChiKTt0aGlzLk5nKCk7dGhpcy5PZygpO3RoaXMuRmQ9c2V0SW50ZXJ2YWwodGhpcy5oby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFhwOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5zLk0ubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLnMuTVtjXSxlO2U9Yi51cmw7dmFyIGg9dGhpcy5UO2gub2EmJmguaXNFbmFibGVkJiYhaC5iYygpJiYoZT1oLk1hKGUpLGU9ZS5wcm90b2NvbCsiOi8vIitlLmhvc3QpO2YudXJsPWU7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sCmhvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLnMuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5GZCksdGhpcy5rZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLnplKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLkZkKSx0aGlzLmxkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sR2c6ZnVuY3Rpb24oKXt0aGlzLmRnfHwodGhpcy5kZz0hMCx0aGlzLkhjfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sbXU6ZnVuY3Rpb24oYSl7YT09dGhpcy5IZ3x8dGhpcy5CYnx8KDA9PWEmJih0aGlzLiRhJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLiRhKSx0aGlzLiRhPQohMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5HZygpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuR2coKX0uYmluZCh0aGlzKSksdGhpcy5SYiYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMuQmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLCIiLCEwKSxlLlhhKCkmJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fbW9iaWxlIiwiIiwhMCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxlLkQobC5IbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpLGUuRChsLk1tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksdGhpcy5SYiYmZS50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PQpNYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuSGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLkQobC5HbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMucy5kdXJhdGlvbi8yKSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5EKGwuSm0sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSksYT09TWF0aC5mbG9vcigzKnRoaXMucy5kdXJhdGlvbi80KSYmKHRoaXMuVC5TYiYmZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUuRChsLk9tLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpLGUuRChsLlBtLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSksCnRoaXMuSGc9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuQmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH1mb3IodmFyIGM9dGhpcy5jcSh0aGlzLnMuemEsYSk7Yy5sZW5ndGg7KXRyeXt2YXIgZj1jLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmdGhpcy5mZC5pbXByZXNzaW9ucyYmZS5PcShmLnVybCx0aGlzLmZkLmltcHJlc3Npb25zKT90aGlzLlFkKGYudXJsLGYudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLkQobC5JbSx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkse2FkSWQ6dGhpcy5mZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUWQoZi51cmwsZi50eXBlKX1jYXRjaChoKXt9Ynx8Cih0aGlzLnMuemE9dGhpcy5Cbyh0aGlzLnMuemEsYSkpfX0sUWQ6ZnVuY3Rpb24oYSxiLGMsZil7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGE9dGhpcy5ULkthKGEpLGMmJmEuU20oYyksZnx8KGY9dGhpcy5qZiksdGhpcy5ULkdhKGEsZix0aGlzLmpmLCExLCEwKSl9LGNxOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWJ9KX0sQm86ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWJ9KX0sVHU6ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7dGhpcy52aWRlby5vbmNsaWNrPXRoaXMuUGcuYmluZCh0aGlzKX0sUGc6ZnVuY3Rpb24oKXtlLkQobC5xbyx0aGlzLnMuTyx0aGlzLmkudS5CKCksdGhpcy5SKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5IYyYmZS5YYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsCmUuTHAoKSwhMCk7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5zLnljfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMucy55Yyx0aGlzLlQub2E/Il90b3AiOiJfYmxhbmsiKX19LE5nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PQoiQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLnNjLnJlcGxhY2UoIlt0aW1lXSIsZS5yZigwKSk7dGhpcy5jYXB0aW9uPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYSl9fSxPZzpmdW5jdGlvbigpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlkPXRoaXMud287dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249CiJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsdGhpcy5jZC5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGIuc3R5bGVbImZsb2F0Il09ImxlZnQiLGIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yi5pZD10aGlzLlhjO2IuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmd1LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLAp0aGlzLlZiLmJpbmQodGhpcykpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09InJpZ2h0IixjLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2MuaWQ9dGhpcy5YZDtjLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZ1LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmNkLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxmLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZi5zdHlsZS50b3A9Ii01MHB4IixmLnN0eWxlLnJpZ2h0PSIwcHgiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLnZnO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7Zi5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMub2UmJmEuYXBwZW5kQ2hpbGQoZik7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKdGhpcy5jZC5iaW5kKHRoaXMpKTt0aGlzLmNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0Iix0aGlzLlZiLmJpbmQodGhpcykpO3RoaXMuY29udHJvbHM9dGhpcy5jYS5hcHBlbmRDaGlsZChhKTt0aGlzLmkudS5XYSYmdGhpcy5pLnUuV2EoKSYmdGhpcy5McigpO3RoaXMuVmIoKX19LFZiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sY2Q6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sZ3U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlhjKTt0aGlzLmkuQy5wYXVzZWQ/KHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSk6KHRoaXMuaS5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sCnRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGwuUGUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGFlOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YYyk7dGhpcy5pLkMucGF1c2VkfHwodGhpcy5pLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChsLlBlLHRoaXMucy5PLHRoaXMuaS51LkIoKSx0aGlzLlIoKSkpfSxpdDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGMpO3RoaXMuaS5DLnBhdXNlZCYmKHRoaXMuaS5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGwuUWUsdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKSl9LGZ1OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5YZCk7dGhpcy5pLkMubXV0ZWQ/Cih0aGlzLmkuQy5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApKToodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCkpfSxMcjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuWGQpO3RoaXMuaS5DLm11dGVkfHwodGhpcy5pLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxDYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkNiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5DYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQ2IpO3RoaXMuRGN8fHRoaXMucWN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnBlKCkpfSxCYTpmdW5jdGlvbigpe3RoaXMuRGM9ITA7dGhpcy4kYSYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy4kYSksdGhpcy4kYT0hMSk7aWYoKCJwcmVyb2xsIj09ZS5GYSYmdGhpcy5xY3x8InBvc3Ryb2xsIj09ZS5GYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5GYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKHZhciBiPXRoaXMuaS5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmkuZmMoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuRGQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5EZCgpfWVsc2UgdGhpcy5EZCgpfSxEZDpmdW5jdGlvbigpe3RoaXMud2c9ITA7dGhpcy5pLkRmKCk7CnRoaXMuaS5qdCgpO3RoaXMuJGI9ITE7ZS5EKGwudm8sdGhpcy5zLk8sdGhpcy5pLnUuQigpLHRoaXMuUigpKTt0aGlzLnpmKCkuZ3QoKX0semY6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuaSYmdGhpcy5pLnUmJihhPXRoaXMuaS51KTtyZXR1cm4gYX0sTWQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmKGE9ITApfXJldHVybiBhfSxVZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihlLk5mKHRoaXMudmlkZW8sYSk/dGhpcy5pdCgpOnRoaXMuYWUoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWUoKX0uYmluZCh0aGlzKSwKMTAwKSl9LFI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLnMmJihhLmNsaWNrdGhyb3VnaD10aGlzLnMueWMsYS5kdXJhdGlvbj10aGlzLnMuZHVyYXRpb24sYS5hZFBvZD10aGlzLnMueGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSkpO3JldHVybiBhfSxqZjpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIE89Yy5KaXx8TztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Ubz10aGlzLmFbNl07dGhpcy5taD10aGlzLmFbNF07dGhpcy5mcz10aGlzLmFbNF07dGhpcy4kaj10aGlzLmFbOF07dGhpcy5ZdD10aGlzLmFbMV07dGhpcy5vcj10aGlzLmFbOF07dGhpcy5vcz10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs3XX1jLldpPWI7Yi5wcm90b3R5cGU9e1NvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/CnRoaXMuVG86dGhpcy5saChhKX0sbGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm1oOnRoaXMuZXMoYSl9LGVzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5mczp0aGlzLlpqKGEpfSxaajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiRqOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZdDp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm9zOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWI9Yy5XaXx8bWIsWWM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuU28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPQpkfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuSmE9bnVsbDt0aGlzLmJhPVtdO3RoaXMuWT1udWxsO3RoaXMuTWI9ITE7dGhpcy5CZT0iIjt0aGlzLkFlPSExO2QmJmQuZW1wdHk/dGhpcy5DcignPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmFtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmZmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkthKG0ucWUodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PQp0aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJihhPWUuY2YodGhpcy51cmwpLHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5xZShhKSkrIiZ0eXBlPWpzIixiPW0uS2EobS5xZSh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIpLGIuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIik7bS5HYShiLHRoaXMuQnIuYmluZCh0aGlzKSx0aGlzLnlyLmJpbmQodGhpcykpfSxzZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSwKYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkZhKXRyeXt2YXIgZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWYuZmlyc3RDaGlsZH1jYXRjaChnKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmCiJwcmVyb2xsIj09ZS5GYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuRmEpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGc9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZlswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8Ck51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxCcjpmdW5jdGlvbihhKXt0aGlzLllzKGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5WYygpOnRoaXMuZmEodGhpcy5DYSh4LmpjLHtlcnJvcjp0aGlzLkFlP0Mub2Q6Qy5JZX0pKX0sQ3I6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4LnBkKSl9dGhpcy5iYT10aGlzLnNmKCk7dGhpcy5NYj10aGlzLkNnKCk7dGhpcy5iYS5sZW5ndGg/CnRoaXMuVmMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5qYyx7ZXJyb3I6dGhpcy5BZT9DLm9kOkMuSWV9KSl9LHlyOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkNhKHguSGUse2RlcHRoOmF9KSl9LFZjOmZ1bmN0aW9uKCl7dGhpcy5ZPXRoaXMuYmEuc2hpZnQoKTt0aGlzLlRxKCk/dGhpcy5WdCgpPyhhKyssbmV3IGIodGhpcyx0aGlzLkNmKCksZyx7QWRTeXN0ZW06dGhpcy5KcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmZhKHRoaXMuQ2EoeC5LZSkpOihhPTAsdGhpcy5NdSgpJiZ0aGlzLmNlKHRoaXMueG8oKSkpfSxZZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5WYygpKTp0aGlzLnBhcmVudC5ZZCgpfSxNdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlN0KCk/dGhpcy5SdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5DYSh4LkRlKSk6dGhpcy5mYSh0aGlzLkNhKHguVmgpKSwhMSk6Cih0aGlzLmZhKHRoaXMuQ2EoeC5qYyxDLkplKSksITEpfSxjZTpmdW5jdGlvbihhKXthLnphPWEuemEuY29uY2F0KHRoaXMuVWQoKSk7YS54Yj1hLnhiP2EueGI6dGhpcy5NYjt0aGlzLnBhcmVudC5jZShhKX0seG86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbmI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMueGYoKTthLnljPXRoaXMuTXAoKTthLm9yaWdpbj10aGlzO2EuTz10aGlzLklwKCk7YS5vZT10aGlzLmFxKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLlkmJihiLnphPWIuZXJyb3IuY29kZSE9eC5EZS5jb2RlP2IuemEuY29uY2F0KHRoaXMuT3AoKSk6Yi56YS5jb25jYXQodGhpcy5WcCgpKSk7dGhpcy5iYS5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC56YiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnpiJiZ0aGlzLnBhcmVudC56YihiKSxhPTAsdGhpcy5WYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmZhJiYKImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx6YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC56YihhKX0sa2Y6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQ2EoYSxiKSl9LENhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG9iKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sVnQ6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxTdDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMueGYoKS5sZW5ndGh9LFJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5VYigpfSxDZzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuYmEuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxZczpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuQmU9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLkFlPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxUcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuQ2YoKS5sZW5ndGh9LENmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSGQodGhpcy5ZLCJWQVNUQWRUYWdVUkkiKX0sSnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZCh0aGlzLlksIkFkU3lzdGVtIil9LFVkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVsiSW1wcmVzc2lvbiIsIlRyYWNraW5nIiwiQ2xpY2tUcmFja2luZyIsIkVycm9yIl0sYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBnPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZykpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGcudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5UYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LApWcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxPcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuVWQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sTXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0seGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSx2YzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksCk12OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLlRhKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnZjKS1NYXRoLmFicyg3MDAtYi52Yyl9KSxiPWcuY29uY2F0KGQpfWNhdGNoKGUpe31yZXR1cm4gYn0sSXA6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIiwKZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMuTmMoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2UucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuVGEodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxhcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGc9ITE7dHJ5e2M9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxnPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkZ0KGcsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZCl7Yj0hMX1yZXR1cm4gYn0sCkhkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5UYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sSWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFRhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuTmMoYSk6IiJ9LE5jOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuSWQoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLmFtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkluPXRoaXMuYVs2XTt0aGlzLldrPXRoaXMuYVszXTt0aGlzLkNqPXRoaXMuYVs1XTsKdGhpcy5Vaz10aGlzLmFbN107dGhpcy5paD10aGlzLmFbN107dGhpcy5Baj10aGlzLmFbNl07dGhpcy5rcz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLnVwPWI7Yi5wcm90b3R5cGU9e0huOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbjp0aGlzLlZrKGEpfSxWazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2s6dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNqOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Vazp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaWg6dGhpcy56aihhKX0semo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Bajp0aGlzLmpzKGEpfSxqczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmtzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy51cHx8cGIsWmM9bmV3IHBiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLkhuKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuemE9W107dGhpcy5NPVtdO3RoaXMueWM9IiI7dGhpcy5PPXRoaXMueGI9ITE7dGhpcy5vcmlnaW49bnVsbH1jLlhrPWI7Yi5wcm90b3R5cGU9e3JvOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9ITA7cmV0dXJuIGF9LGVxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTS5sZW5ndGg7YisrKWlmKDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2JdO3JldHVybiBhfX19KShjKTt2YXIgbmI9Yy5Ya3x8bmI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaGs9dGhpcy5hWzldO3RoaXMucG49dGhpcy5hWzZdO3RoaXMucWg9dGhpcy5hWzFdO3RoaXMuSXE9dGhpcy5hWzhdO3RoaXMuUWs9dGhpcy5hWzVdO3RoaXMudG09dGhpcy5hWzldO3RoaXMuc2g9dGhpcy5hWzRdO3RoaXMuYm49dGhpcy5hWzRdO3RoaXMuZz0KdGhpcy5hWzVdfWMubXA9YjtiLnByb3RvdHlwZT17Z2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmhrOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5wbjp0aGlzLnBoKGEpfSxwaDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucWg6dGhpcy5IcShhKX0sSHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLklxOnRoaXMuUGsoYSl9LFBrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Razp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5yaChhKX0scmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnNoOnRoaXMuYW4oYSl9LGFuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHFiPWMubXB8fHFiLCRjPW5ldyBxYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5nayg0KTt2YXIgeD17cGQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsa2E6IlhNTF9QQVJTRV9FUlJPUiJ9LFZoOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixrYToiRFVSQVRJT05fRVJST1IifSxqYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsa2E6IkVNUFRZX1ZBU1QifSxLZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKa2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LEhlOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGthOiJMT0FEX0VSUk9SIn0sbmQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCkJ2Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGthOiJNRURJQUZJTEVfRVJST1IifSxEZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixrYToiRFVNTVlfQUQifX0sQz17SWU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixrYToiTk9fQURTIn0sSmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGthOiJOT19NRURJQUZJTEVTIn0sRHY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxvZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuR2g9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbNl19Yy5nbD1iO2IucHJvdG90eXBlPXtGaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuR2g6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciByYj1jLmdsfHxyYixhZD1uZXcgcmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1hZC5GaCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLkZjPWI7dGhpcy56YT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuc2k9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYj1jLnNpfHxvYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Oaj10aGlzLmFbOV07dGhpcy5icj10aGlzLmFbM107CnRoaXMubHU9dGhpcy5hWzFdO3RoaXMuUnI9dGhpcy5hWzddO3RoaXMuQ3E9dGhpcy5hWzRdO3RoaXMub2g9dGhpcy5hWzRdO3RoaXMuYWk9dGhpcy5hWzJdO3RoaXMucmo9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNl19Yy5Icj1iO2IucHJvdG90eXBlPXtNajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTmo6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJyOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdTp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuUnI6dGhpcy5CcShhKX0sQnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkNxOnRoaXMubmgoYSl9LG5oOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5vaDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmFpOnRoaXMucWooYSl9LHFqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5yajoKdGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYj1jLkhyfHxzYixiZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1iZC5Naig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLnU9YTt0aGlzLlJhPWEudGYoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUucGEoMTApO3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlNhPXt9O3RoaXMuUmY9ITE7dGhpcy5YYj1bXX1jLlpoPQpiO2IucHJvdG90eXBlPXtacDpmdW5jdGlvbihhKXt2YXIgYj17fSxjPSExLGY9MCxiPTAsZT17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZj1iLmxlZnQsYj1iLnRvcCk7ZT17eDpmLHk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLlpwKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5NcShhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PQp3aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sTHQ6ZnVuY3Rpb24oKXt0aGlzLlJmPSEwfSxKZzpmdW5jdGlvbigpe3RoaXMuQz1CLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sZWc6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtlLkQobC5CYyx0aGlzLnUuQigpKX0sanQ6ZnVuY3Rpb24oKXt0aGlzLlJmfHwodGhpcy51LnBsYXkoKSwKZS5EKGwuQ2MsdGhpcy51LkIoKSkpfSxmYzpmdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy51LnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5SYS5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuUmEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5SYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlJhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuUmEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuUmEpO3RoaXMudS5EYiYmCnRoaXMudS5EYigpP3RoaXMudS50ZigpLmFwcGVuZENoaWxkKHRoaXMuRyk6ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLkcpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuV2IuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy51LmV4aXRGdWxsc2NyZWVuKCl9LE1xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSxOcDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LApXYjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLk5wKHRoaXMuUmEpO2lmKGIueCE9dGhpcy5TYS54fHxiLnkhPXRoaXMuU2EueXx8Yi5wb3NpdGlvbiE9dGhpcy5TYS5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5TYS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuU2EuaGVpZ2h0fHxhKXtpZigwPHRoaXMuU2Eud2lkdGgmJjA8dGhpcy5TYS5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLkRmKCk7cmV0dXJufXRoaXMuU2E9Yjt0aGlzLnUuRGIoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD0KYi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5YYi5sZW5ndGg7YSsrKXRoaXMuWGJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9d2luZG93LnNldFRpbWVvdXQodGhpcy5XYi5iaW5kKHRoaXMpLDEwKX0sUW06ZnVuY3Rpb24oYSl7dGhpcy5YYnx8KHRoaXMuWGI9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLlhiLnB1c2goYSl9LERmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTtmb3IodmFyIE49Yy5aaHx8TixCPVtdLHRiPTA7MTAwPnRiO3RiKyspe3ZhciBMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TC5zdHlsZS5kaXNwbGF5PSJibG9jayI7TC5pZD1lLnBhKDEwKTtMLmNvbnRyb2xzPSEwO0IucHVzaChMKX12YXIgSD0KITEsYmE9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5uaz10aGlzLmFbMV07dGhpcy5BaT10aGlzLmFbMl07dGhpcy5kcj10aGlzLmFbOF07dGhpcy5rdj10aGlzLmFbMTBdO3RoaXMua2w9dGhpcy5hWzRdO3RoaXMuU2s9dGhpcy5hWzJdO3RoaXMubHI9dGhpcy5hWzhdO3RoaXMuWm09dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbN119Yy5wcj1iO2IucHJvdG90eXBlPXttazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubms6dGhpcy56aShhKX0semk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkFpOnRoaXMuY3IoYSl9LApjcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZHI6dGhpcy5qdihhKX0sanY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmt2OnRoaXMuamwoYSl9LGpsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5rbDp0aGlzLlJrKGEpfSxSazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU2s6dGhpcy5rcihhKX0sa3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxyOnRoaXMuWW0oYSl9LFltOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5abTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmc6YX19fSkoYyk7dmFyIHViPWMucHJ8fHViLGNkPW5ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWNkLm1rKDQpOyhmdW5jdGlvbihjKXtjLkprPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5QKGEpO3RoaXMubmUoYik7dGhpcy5nZigpfSxuZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZ2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5TKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxqYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkRhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdmI9Yy5Ka3x8dmI7KGZ1bmN0aW9uKGMpe2MuSWs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWNhKCk7dGhpcy53Yj10aGlzLndifHwhMTsKdGhpcy5PZT10aGlzLlJlPXRoaXMuSWY9dGhpcy5pYT10aGlzLnZlPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMueXAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnZlPSEwO3RoaXMuSWYmJnRoaXMuWmUoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLiRiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMud2MoKTt0aGlzLklmPQohMDt0aGlzLlplKCl9LmJpbmQodGhpcykpO3RoaXMuVmUoKX0sWmU6ZnVuY3Rpb24oKXtpZighdGhpcy53Yil7dGhpcy53YygpO2lmKCF0aGlzLnZlJiYhdGhpcy53YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudmUmJnRoaXMuT2UmJiF0aGlzLlJlJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0sd2M6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LHlmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApWZTpmdW5jdGlvbigpe2lmKHRoaXMud2MoKSl7dmFyIGI9dGhpcy55ZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlJlPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuT2U9Yi5Jdn10aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDEwMCl9LFB2OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmJ3KCk6ITF9LFViOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5VYigpOi0xfSxXcDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSx5cDpmdW5jdGlvbihiLGEpe3RoaXMud2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMud2J8fDMwMj09dGhpcy53Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy53Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFjKCl9LmJpbmQodGhpcyksMTAwKX0sQWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuaWE/KHRoaXMubSgpLHRoaXMubmEoKSk6Yi5SYygpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLldwKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmIoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHdiPWMuSWt8fHdiOyhmdW5jdGlvbihjKXtjLktrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sClJxOmZ1bmN0aW9uKCl7d2luZG93Lk9PLmNsLkFtLnltP3dpbmRvdy5PTy5jbC5BbS55bS5HdihmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ScSgpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO3ZhciBiPWNhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkVhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB2YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgd2IoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHhiPWMuS2t8fHhiLHliPW5ldyB4YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuQmw9dGhpcy5hWzldO3RoaXMuWHM9dGhpcy5hWzddO3RoaXMudXU9dGhpcy5hWzRdO3RoaXMudGs9dGhpcy5hWzVdO3RoaXMuYnU9dGhpcy5hWzRdO3RoaXMuQm49dGhpcy5hWzhdO3RoaXMuaXY9dGhpcy5hWzhdO3RoaXMuanU9dGhpcy5hWzNdO3RoaXMuJHE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOV19Yy5RaT1iO2IucHJvdG90eXBlPXtBbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuQmw6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlhzOnRoaXMudHUoYSl9LHR1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51dTp0aGlzLnNrKGEpfSxzazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudGs6dGhpcy5hdShhKX0sYXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJ1OnRoaXMuQW4oYSl9LEFuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Cbjp0aGlzLmh2KGEpfSxodjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhPwp0aGlzLml2OnRoaXMuaXUoYSl9LGl1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuanU6dGhpcy5acShhKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgemI9Yy5RaXx8emIsZGQ9bmV3IHpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQuQWwoNCk7KGZ1bmN0aW9uKGMpe2MuT2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX0sRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sTDpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgVT1jLk9sfHxVOyhmdW5jdGlvbihjKXtjLk5sPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kudmQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnZkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLAoiYWRzTWFuYWdlckxvYWRGYWlsIik7dGhpcy53KCl9LmJpbmQodGhpcyksMUUzKX0uYmluZCh0aGlzKSk7eS52ZCgiIyIrYiwib2JqZWN0IixmdW5jdGlvbihhKXt0aGlzLiRyKGEpfS5iaW5kKHRoaXMpKTt5LmxxKCl9LCRyOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGM7Zm9yKGMgaW4gYilpZihiLmhhc093blByb3BlcnR5KGMpKXthPWlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgVj1jLk5sfHxWOyhmdW5jdGlvbihjKXtjLlBsPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy5XYyYmKGI9ZS5GbyhiLHRoaXMuV2MpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5IKGQpKXt0aGlzLkooZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkEpO2YuYigpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiKwpoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5XY3x8KHRoaXMuV2M9W10pLHRoaXMuV2MucHVzaChiW2FdKSxkPW5ldyBVKGgpLHRoaXMuSChkKXx8KHRoaXMuSihkKSxmPW5ldyBWKGQsdGhpcy5BKSxmLmIoKSl9Y2F0Y2goayl7fX19dGhpcy5JKCl9LHZkOmZ1bmN0aW9uKGIsYSxjKXt0aGlzLmFhfHwodGhpcy5hYT17fSk7dGhpcy5hYVtiXXx8KHRoaXMuYWFbYl09e30pO3RoaXMuYWFbYl1bYV18fCh0aGlzLmFhW2JdW2FdPVtdKTt0aGlzLmFhW2JdW2FdLnB1c2goYyl9LFd0OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuYWF8fHRoaXMuYWEmJiF0aGlzLmFhW2FdKXRoaXMuY2N8fCh0aGlzLmNjPVtdKSx0aGlzLmNjLnB1c2goYiksdGhpcy5odCgpJiYodGhpcy5tZygpLHRoaXMuYigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2FdW2NdJiYKMDx0aGlzLmFhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9MDtkPHRoaXMuYWFbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLmFhW2FdW2NdW2RdKGIpfX0sbHE6ZnVuY3Rpb24oKXtpZih0aGlzLmNjKWZvcih2YXIgYj0wO2I8dGhpcy5jYy5sZW5ndGg7YisrKXt2YXIgYT10aGlzLmNjW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5hYVtjXVtkXSYmMDx0aGlzLmFhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuYWFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmFhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5XdChiKX19KX0pKGMpO3ZhciBBYj1jLlBsfHxBYix5PW5ldyBBYihxKTsKYWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy55cT10aGlzLmFbN107dGhpcy5abz10aGlzLmFbNV07dGhpcy5Ybz10aGlzLmFbMl07dGhpcy5Gbj10aGlzLmFbMV07dGhpcy5JaT10aGlzLmFbN107dGhpcy5ydj10aGlzLmFbMV07dGhpcy52bT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLm5vPWI7Yi5wcm90b3R5cGU9e3hxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy55cTp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWm86dGhpcy5XbyhhKX0sV286ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhvOnRoaXMuRW4oYSl9LEVuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbjp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSWk6dGhpcy5xdihhKX0scXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ydjp0aGlzLnVtKGEpfSx1bTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudm06dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBCYj1jLm5vfHxCYixlZD1uZXcgQmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC54cSg0KTsoZnVuY3Rpb24oYyl7Yy5CaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUChiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlMoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSwKcGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sTDpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuQmh8fENiOyhmdW5jdGlvbihjKXtjLkNoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2EuaXNBZCYmYS5pc0FkKCk/dGhpcy5tKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwyNTApO3RoaXMuS3N8fCh0aGlzLktzPSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLApmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkNofHxEYjsoZnVuY3Rpb24oYyl7Yy5EaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiYKYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBDYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBEYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5lYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkRofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucmw9dGhpcy5hWzRdOwp0aGlzLndyPXRoaXMuYVs4XTt0aGlzLnRzPXRoaXMuYVszXTt0aGlzLllpPXRoaXMuYVs0XTt0aGlzLnRsPXRoaXMuYVsyXTt0aGlzLmRrPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzEwXX1jLnVrPWI7Yi5wcm90b3R5cGU9e3FsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ybDp0aGlzLnZyKGEpfSx2cjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMud3I6dGhpcy5zcyhhKX0sc3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRzOnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5ZaTp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudGw6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmRrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy51a3x8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWZkLnFsKDQpOyhmdW5jdGlvbihjKXtjLmhtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSwKZWE6ZnVuY3Rpb24oKXswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjEuNT50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgSGI9Yy5obXx8SGI7KGZ1bmN0aW9uKGMpe2MuZ209dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWcubmV4dFNpYmxpbmc7dGhpcy5UZXx8d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKX0uYmluZCh0aGlzKSwxMDApO3RoaXMuRnB8fCh0aGlzLkpmKCksdGhpcy5GcD0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5UZT8odGhpcy5sKCJhZGVycm9yIiwKIm5vQ29udGFpbmVyIiksdGhpcy5vKCkpOih0aGlzLlRlPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSl9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuaW1hfSxKZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuS3AoKTtiP2ImJmIuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpPyh0aGlzLmlhPSEwLHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmYoKX0uYmluZCh0aGlzKSwKNTApfSwkdjpmdW5jdGlvbigpe3JldHVybiEwfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWI9Yy5nbXx8SWI7KGZ1bmN0aW9uKGMpe2MuaW09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyBIYihiLml0ZW0oYSkpO3RoaXMuSChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuSihjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBKYj1jLmltfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhrPXRoaXMuYVsyXTt0aGlzLndxPXRoaXMuYVsyXTt0aGlzLlNoPXRoaXMuYVszXTt0aGlzLkxqPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzJdfWMuR3I9YjtiLnByb3RvdHlwZT17R2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhrOnRoaXMudnEoYSl9LHZxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53cTp0aGlzLlJoKGEpfSxSaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNoOnRoaXMuS2ooYSl9LEtqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Majp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIExiPWMuR3J8fExiLGdkPW5ldyBMYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWdkLkdrKDQpOwooZnVuY3Rpb24oYyl7Yy5uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoITApfS5iaW5kKHRoaXMpKX0sTDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgTWI9Yy5uanx8TWI7KGZ1bmN0aW9uKGMpe2MubWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuU2coKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLnBmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5wZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5ObSgpfS5iaW5kKHRoaXMpKSx0aGlzLlRnPSExLHRoaXMubHY9CjFFMyx0aGlzLmdnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfSxwZjpmdW5jdGlvbigpe3RoaXMuZ2cuZG9uZXx8KHRoaXMuZ2cuZG9uZT0hMCx0aGlzLlRnPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZygpfS5iaW5kKHRoaXMpLHRoaXMubHYpKX0sTm06ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVGcpO3RoaXMubSgpfSxTZzpmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMudygpKX0sdmY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGY9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy52Zihtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLnZmKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBOYj1jLm1qfHxOYjsoZnVuY3Rpb24oYyl7Yy5vaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkVhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRWEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE1iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE5iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIE9iPWMub2p8fE9iLFBiPW5ldyBPYihxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudmg9dGhpcy5hWzldO3RoaXMuZ2k9dGhpcy5hWzNdO3RoaXMuQnA9dGhpcy5hWzJdO3RoaXMuY289dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNl19Yy5Lbz1iO2IucHJvdG90eXBlPXt1aDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudmg6dGhpcy5maShhKX0sZmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmdpOnRoaXMuQXAoYSl9LEFwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5CcDp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBRYj1jLktvfHxRYixoZD1uZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLAoiWihUVERaVFJSIik7d2luZG93LnY9aGQudWgoNCk7KGZ1bmN0aW9uKGMpe2MuTGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuUChiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iU2ltcGxlVmlkZW9BbmRJbWEifX0pfSkoYyk7dmFyIFJiPWMuTGx8fFJiOyhmdW5jdGlvbihjKXtjLktsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLApmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk7dGhpcy5QYigpfSxQYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLk9kKCkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZCgpJiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0uYmluZCh0aGlzKSw1MDApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwKX0sT2Q6ZnVuY3Rpb24oKXtyZXR1cm4haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YX0sCm86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBTYj1jLktsfHxTYjsoZnVuY3Rpb24oYyl7Yy5NbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9DT05URU5UJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1dFUkJVTkcmJjE9PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLmxlbmd0aCYmIXdpbmRvdy5fcGxheSl7dmFyIGI9bmV3IFJiKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBTYihiLAp0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFRiPWMuTWx8fFRiLFViPW5ldyBUYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tbj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLkduPWI7Yi5wcm90b3R5cGU9e2xuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubW46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLkdufHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5sbig0KTsoZnVuY3Rpb24oYyl7Yy52bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlAoYik7dGhpcy5TKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuZWU9ITF9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLk5zKCl9LmJpbmQodGhpcyksNTAwKX0sTnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZWUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuZWUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxJdDpmdW5jdGlvbigpe3RoaXMuZWU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sTDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLnZsfHxXYjsoZnVuY3Rpb24oYyl7Yy51bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuSnI9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5LYnx8KHRoaXMuS2I9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIik7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuSnI/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLkl0KCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgWGI9Yy51bHx8WGI7KGZ1bmN0aW9uKGMpe2Mud2w9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBZYj1jLndsfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudWk9dGhpcy5hWzZdO3RoaXMuQXY9dGhpcy5hWzVdOwp0aGlzLmhxPXRoaXMuYVs1XTt0aGlzLiRzPXRoaXMuYVszXTt0aGlzLnBrPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuJG09YjtiLnByb3RvdHlwZT17dGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnVpOnRoaXMuenYoYSl9LHp2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bdjp0aGlzLmdxKGEpfSxncTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHE6dGhpcy5acyhhKX0sWnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLiRzOnRoaXMub2soYSl9LG9rOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5wazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMuJG18fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWpkLnRpKDQpOyhmdW5jdGlvbihjKXtjLm9sPQpwLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTsKcmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLm9sfHxhYzsoZnVuY3Rpb24oYyl7Yy5ubD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5EYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLm5iKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuc28oKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuTWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLnVyKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LHNvOmZ1bmN0aW9uKCl7dGhpcy5OZSgpfHx0aGlzLm8oITApfSx1cjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuTWMoKTshYi5tYSYmYi5iYSYmYi5GdiYmYi5IdiYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5NYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sTWM6ZnVuY3Rpb24oKXtpZighdGhpcy5jZylmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuRGEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuY2c9YltjXSk7cmV0dXJuIHRoaXMuY2d9LE9kOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LG86ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmI/dGhpcy5NYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYz1jLm5sfHxiYzsoZnVuY3Rpb24oYyl7Yy5wbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLnBsYXllcmFwaSl7dmFyIGI9ay5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBhYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgYmMoYyx0aGlzLkEpKS5iKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgY2M9Yy5wbHx8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52cz10aGlzLmFbOF07dGhpcy5raD10aGlzLmFbMV07dGhpcy5Wcz10aGlzLmFbNV07dGhpcy5FcT10aGlzLmFbNl07dGhpcy50dj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs1XX1jLm1yPWI7Yi5wcm90b3R5cGU9e3VzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudnM6dGhpcy5qaChhKX0samg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmtoOnRoaXMuVXMoYSl9LFVzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Wczp0aGlzLkRxKGEpfSxEcTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXE6dGhpcy5zdihhKX0sc3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnR2OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGVjPWMubXJ8fGVjLGtkPW5ldyBlYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cudj1rZC51cyg0KTsoZnVuY3Rpb24oYyl7Yy5Saj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlAoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUyhhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LERhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLlJqfHxXOyhmdW5jdGlvbihjKXtjLlFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmZlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmImJih0aGlzLmZlPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuZmUmJmIhPXRoaXMuZmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5kdyksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5iKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuUWp8fFg7KGZ1bmN0aW9uKGMpe2MuU2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFcoYiksYi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFcoYiksYi5qYT90aGlzLm1nKCk6dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBELApmYz1jLlNqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5vYi5sZW5ndGgpe3ZhciBhPW0ub2Iuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUudHQoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuV2YuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlrW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLldmKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZWk9dGhpcy5hWzJdO3RoaXMuQ209dGhpcy5hWzhdO3RoaXMuU249dGhpcy5hWzNdO3RoaXMuaHA9dGhpcy5hWzFdO3RoaXMuRHA9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNV19Yy5ybT1iO2IucHJvdG90eXBlPXtkaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWk6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNtOnRoaXMuUm4oYSl9LFJuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Tbjp0aGlzLmdwKGEpfSxncDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHA6dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRwOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgaGM9Yy5ybXx8aGMsbGQ9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLmRpKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb01vZGVsKXt2YXIgYT1iLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYSl7dGhpcy5QKGEpO3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuUyhjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTXI9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LApsdDpmdW5jdGlvbihiKXt0aGlzLnNkPWJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1yfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxMOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLnFiKGIpfS5iaW5kKHRoaXMpKX0scWI6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmKHRoaXMuSyYmdGhpcy5LKCksCnRoaXMuc2QmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnNkJiYobmV3IEcodGhpcyx0aGlzLnNkKSkuYigpKX19KX0pKGMpO3ZhciBNPWMuVmx8fE07KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sVmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkdkKWlmKHRoaXMuaGJ8fCh0aGlzLmhiPTApLHRoaXMuaGIrKywxNTx0aGlzLmhiKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gdGhpcy52dCgpLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMubygpOnRoaXMubyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkdkPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLnZhKCl8fCh0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WYSgpfS5iaW5kKHRoaXMpLDEwKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJgotMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVT1hLGIubCgiYWRlcnJvciIsYSkpOmIubCgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlU9CnRoaXMuVXx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLlZhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgRz1jLlVsfHxHOyhmdW5jdGlvbihjKXtjLldsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKTt0aGlzLndhPS0xfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTSh3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2IuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5IKGIpfHwKKHRoaXMuSihiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSxiLmx0KHRoaXMuQSksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBpYz1jLldsfHxpYyxqYz1uZXcgaWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSnU9dGhpcy5hWzZdO3RoaXMueHM9dGhpcy5hWzVdO3RoaXMuVmk9dGhpcy5hWzRdO3RoaXMuJHQ9dGhpcy5hWzZdO3RoaXMuRW09dGhpcy5hWzEwXTt0aGlzLllqPXRoaXMuYVs5XTt0aGlzLnFwPXRoaXMuYVsxXTsKdGhpcy5BaD10aGlzLmFbNF07dGhpcy5JaD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLkJrPWI7Yi5wcm90b3R5cGU9e0l1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KdTp0aGlzLndzKGEpfSx3czpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnhzOnRoaXMuVWkoYSl9LFVpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5WaTp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiR0OnRoaXMuRG0oYSl9LERtOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5FbTp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWWo6dGhpcy5wcChhKX0scHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFwOnRoaXMuemgoYSl9LHpoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQWg6dGhpcy5IaChhKX0sSGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkloOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPWMuQmt8fGtjLG1kPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW1kLkl1KDQpOyhmdW5jdGlvbihjKXtjLkVqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5kdXJhdGlvbj10aGlzLmRmPTA7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSk7YT90aGlzLlMoYSk6dGhpcy5kYSgpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZGF0YSgpfS5iaW5kKHRoaXMpLAo1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSx7aWQ6Yi5pZH0pfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLlJFU1VNRSx7aWQ6Yi5pZH0pfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRmfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTswPHRoaXMuZ2V0RHVyYXRpb24oKSYmMDx0aGlzLmdldEN1cnJlbnRUaW1lKCkmJjI+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmCnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfVElNRSx7WW46ZnVuY3Rpb24oYSl7MDxhJiYodGhpcy5kZj1hKX0uYmluZCh0aGlzKSxpZDpiLmlkfSk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5HRVRfREFUQSx7WW46ZnVuY3Rpb24oYSl7MDxhLmR1cmF0aW9uJiYodGhpcy5kdXJhdGlvbj1hLmR1cmF0aW9uKX0uYmluZCh0aGlzKSxpZDpiLmlkfSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibXZwIn19KX0pKGMpO3ZhciBsYz1jLkVqfHxsYzsoZnVuY3Rpb24oYyl7Yy5Eaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxodzpmdW5jdGlvbigpe30sYnQ6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAuQ2UobmV3IGZ1bmN0aW9uKCl7fSk7YS5Ddj0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi5idChhKTt3aW5kb3cuS3Y9Yn0sYjpmdW5jdGlvbigpe3RoaXMuYXR8fCh0aGlzLmF0PSEwKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuTGR8fCh0aGlzLkxkPTEpO2lmKDIwPHRoaXMuTGQpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7ZWxzZXt2YXIgYT0hMSxjPWE9ITE7aWYoYi5mYWNhZGUmJmIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3ImJihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmCihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy5MZCsrO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTApfX0sSGE6ZnVuY3Rpb24oYil7dmFyIGE9ImFkRXJyb3IiLGM9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmCihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMua2UoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCghMCl9LmJpbmQodGhpcykpfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJgotMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5sKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxrZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc01hbmFnZXIpO2I9ImFkRXJyb3IiO2E9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJgpnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LHFhOmZ1bmN0aW9uKCl7dGhpcy5pYT0hMH0sWDpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmEoKT8odGhpcy5tKCksdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgbWM9Yy5Eanx8bWM7KGZ1bmN0aW9uKGMpe2MuRmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSwKYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXZwIiksYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKGJbYV0uaWQpe3ZhciBjPW5ldyBsYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2MuamF8fHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IG1jKGMsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBuYz1jLkZqfHxuYyxvYz1uZXcgbmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHA9dGhpcy5hWzEwXTt0aGlzLnZuPXRoaXMuYVs0XTt0aGlzLnB2PXRoaXMuYVs0XTt0aGlzLnd1PXRoaXMuYVs3XTt0aGlzLmtuPXRoaXMuYVs3XTsKdGhpcy5nPXRoaXMuYVsxXX1jLlRpPWI7Yi5wcm90b3R5cGU9e0dwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5IcDp0aGlzLnVuKGEpfSx1bjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMudm46dGhpcy5vdihhKX0sb3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnB2OnRoaXMudnUoYSl9LHZ1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy53dTp0aGlzLmpuKGEpfSxqbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMua246dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLlRpfHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5HcCg0KTsoZnVuY3Rpb24oYyl7Yy52aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKTthJiZ0aGlzLlAoYS5wYXJlbnROb2RlKX0sTDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnZqfHxZOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkZmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWWI9dGhpcy5WYT10aGlzLnRjPSExO3RoaXMua2c9ZS5rYigxMCk7dGhpcy5PZigpfSxPZjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkhhKCksITA7dGhpcy5GZisrO2lmKDEwPHRoaXMuRmYpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5PZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmCihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsCmIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgphKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxYOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy51anx8WjsoZnVuY3Rpb24oYyl7Yy53aj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYKMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBaKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcWM9Yy53anx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVs3XTt0aGlzLnFxPXRoaXMuYVszXTt0aGlzLmlpPXRoaXMuYVs3XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLkRsPQp0aGlzLmFbNl07dGhpcy5Wcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxMF19Yy5laj1iO2IucHJvdG90eXBlPXtnbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaG46dGhpcy5wcShhKX0scHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFxOnRoaXMuaGkoYSl9LGhpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaWk6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhzOnRoaXMuQ2woYSl9LENsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EbDp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLmVqfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0Kb2QuZ24oNCk7KGZ1bmN0aW9uKGMpe2Mud2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiPyhiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVyUHJlZml4KSk/KHRoaXMuUChiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlMoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sUmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQ/ITE6Yi5pc1BhdXNlZD8hMTohMH0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pc0Z1bGxzY3JlZW4/Yi5pc0Z1bGxzY3JlZW46ITF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sTDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPQpjLndpfHx0YzsoZnVuY3Rpb24oYyl7Yy52aT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIiwKdGhpcy50ZXN0KTt3aW5kb3cuRkRNX1BsYXllcl92YXJzLmFkcGRldGVjdGVkJiYodGhpcy5sKCJhZGVycm9yIiwidXNpbmdBZEJsb2NraW5nU29mdHdhcmUiKSx0aGlzLm8oKSl9LHRlc3Q6ZnVuY3Rpb24oKXt9LG86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMudml8fHVjOyhmdW5jdGlvbihjKXtjLnhpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxlLkVhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPQpiW2NdO2lmKGQudmFycy5pc1JlYWR5KWQ9bmV3IHRjKGQpLGQuamF8fHRoaXMuSChkKXx8KHRoaXMuSihkKSwobmV3IHVjKGQsdGhpcy5BKSkuYigpKTtlbHNlIGJyZWFrfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHZjPWMueGl8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5iaD10aGlzLmFbNl07dGhpcy5DdD10aGlzLmFbNV07dGhpcy5ubT10aGlzLmFbNl07dGhpcy5Ebj10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbN107dGhpcy5Eaz10aGlzLmFbOV07dGhpcy5laD10aGlzLmFbMTBdO3RoaXMubGs9dGhpcy5hWzFdO3RoaXMuY209dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbOF19Yy5Ocj1iO2IucHJvdG90eXBlPXthaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYmg6dGhpcy5CdChhKX0sQnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkN0Ogp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubm06dGhpcy5DbihhKX0sQ246ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRuOnRoaXMudnAoYSl9LHZwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy53cDp0aGlzLkNrKGEpfSxDazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGs6dGhpcy5kaChhKX0sZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVoOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sazp0aGlzLmJtKGEpfSxibTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY206dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLk5yfHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5haCg0KTsKKGZ1bmN0aW9uKGMpe2MuQ2k9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlAoYiksdGhpcy5TKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sTDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5DaXx8eWM7KGZ1bmN0aW9uKGMpe2MuQmk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuWGUoKX0sWGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8CihiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZSghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgemM9Yy5CaXx8emM7KGZ1bmN0aW9uKGMpe2MuRGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHljKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLmphKXt0aGlzLkkoKTtyZXR1cm59aWYoIXRoaXMuSChiKSl7dGhpcy5KKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5JKCk7cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBBYz1jLkRpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmtpPXRoaXMuYVsyXTt0aGlzLm91PXRoaXMuYVs4XTt0aGlzLkFxPXRoaXMuYVs0XTt0aGlzLkhqPXRoaXMuYVsxXTt0aGlzLmxqPXRoaXMuYVs2XTt0aGlzLnJpPXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs1XTt0aGlzLmhyPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzEwXX1jLkZzPWI7Yi5wcm90b3R5cGU9e2ppOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5raTp0aGlzLm51KGEpfSxudTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm91OnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5BcTp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuSGo6dGhpcy5raihhKX0sa2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmxqOnRoaXMucGkoYSl9LHBpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5yaTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLm9wOnRoaXMuZ3IoYSl9LGdyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ocjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIENjPWMuRnN8fENjLHFkPW5ldyBDYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXFkLmppKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlFmPXRoaXMuVGY9dGhpcy5TZj0hMTt0aGlzLlljPVtdO3RoaXMuaWU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PQp0eXBlb2YgQml0bW92aW5EZXRlY3Rpb24/bnVsbDpCaXRtb3ZpbkRldGVjdGlvbixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBUYT9udWxsOlRhLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgWWE/bnVsbDpZYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgZGM/bnVsbDpkYyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB1YT9udWxsOnVhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj8KbnVsbDp5YixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygd2M/bnVsbDp3YyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIFpiP251bGw6WmIsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGNiP251bGw6Y2IsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIGhiP251bGw6aGIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2I/bnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgemE/bnVsbDp6YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBPYT9udWxsOk9hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHBhP251bGw6cGF9fWMuWms9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5ZcChhKTpbXSxiO3RoaXMuVGY9ITA7aWYoYS5sZW5ndGgpe3RoaXMuU2Y9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj0KYVtjXSx0aGlzLm5nKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5pZSl7aWYodGhpcy5RZilicmVhaztiPXRoaXMuaWVbY107dGhpcy54ZShiKSYmKHRoaXMuWWMucHVzaChiKSx0aGlzLm5nKGIpKX19LHhlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2Ygcj8hMDohMX0sWXA6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWM9YVtmXSxjPXRoaXMuaWVbY10sdGhpcy54ZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxuZzpmdW5jdGlvbihhKXt0aGlzLnhlKGEpJiZhLmIoKX0sS3Q6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLlNmKWZvcih0aGlzLlFmPSEwLGE9MDthPHRoaXMuWWMubGVuZ3RoO2ErKyl0aGlzLlljW2FdLnJiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuWWNbYV0ucmIpfX19KShjKTt2YXIgRGM9Yy5aa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkpvPXRoaXMuYVs5XTt0aGlzLnRqPXRoaXMuYVs2XTt0aGlzLmFwPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzddfWMuRXM9YjtiLnByb3RvdHlwZT17SW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpvOnRoaXMuc2ooYSl9LHNqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy50ajp0aGlzLiRvKGEpfSwkbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYXA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgRWM9Yy5Fc3x8RWMscmQ9bmV3IEVjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cmQuSW8oNCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlRiKGwuTnUpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLlRiKGwuU3IpLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtFLndpZHRoPTE7RS5oZWlnaHQ9MTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7CnZhciBzZD1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGVhPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBGPW5ldyBRLGs9ITE7Ri5aYigpO0YuS2YoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLlpiKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5LZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuWmIoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csRi5KcSgpLHtpZDp0ZH0pfSw1MDApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWnI9dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzZdfWMuVGw9YjtiLnByb3RvdHlwZT17WXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5acjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMuVGx8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLllyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5pZz10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuVGM9MDt0aGlzLk5hPSIiO3RoaXMuWmM9W107dGhpcy4kYz0wO3RoaXMuamc9ITE7dGhpcy5nZT1bXX1jLlhnPWI7Yi5wcm90b3R5cGU9e3N0OmZ1bmN0aW9uKGEpe3RoaXMuaWc9YX0sYmQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLk5hPXRoaXMucGxheWVyLkwoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxudDpmdW5jdGlvbihhKXt0aGlzLlVhPWF9LG10OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj0KYX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxlYzpmdW5jdGlvbihhLGIpe2UuaWIoIndlbHQuZGUiKSYmZS5MYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5VYSk7dmFyIGM9ITEsZj0hMTtpZih0aGlzLktxKCkpdGhpcy5VYS5jKHRoaXMuVWEuT2MsdGhpcy5VYS5BYSx0aGlzLlVhLmhlLGZ1bmN0aW9uKCl7dGhpcy5lYyhhLApiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkVjKTtlbHNlIGlmKHRoaXMubnEoKSl0aGlzLmt0KGZ1bmN0aW9uKCl7dGhpcy5lYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5EKGwuQmMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuTHQoKTtrLmV4aXRGdWxsc2NyZWVuKCk7Uj1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLnFnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLklyKGEpOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5QZCYmKGM9dGhpcy5wbGF5ZXIuUGQoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2suUmQoYSwKYyxmKTt0aGlzLnBsYXllci5yZyhrKX19LEtxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuVGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5UYy5nZXRUaW1lKCksdGhpcy5UYz1hLDNFNTxiPyEwOiExO3RoaXMuVGM9YTtyZXR1cm4hMX0sRXQ6ZnVuY3Rpb24oKXtlLm1lKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubGYoYSkpP3RoaXMuZWMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5EKGwuQ2MsdGhpcy5wbGF5ZXIuQigpKSl9LER0OmZ1bmN0aW9uKGEpe2UubWUoInBvc3Ryb2xsIik7aWYoIXRoaXMuaWcpe3RoaXMuc3QoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikpOwooYz10aGlzLmxmKGMpKT90aGlzLmVjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQobC5DYyx0aGlzLnBsYXllci5CKCkpKX19LGxmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxkdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnh0KHRoaXMuRHQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sZGQ6ZnVuY3Rpb24oYSl7ZS5tZSgibWlkcm9sbCIpO2lmKCF0aGlzLllmKXt0aGlzLllmPSEwO3ZhciBiPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMudGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLmVjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllmPSExfS5iaW5kKHRoaXMpLDFFMykpOgoodGhpcy5wbGF5ZXIucGxheSgpLGUuRChsLkNjLHRoaXMucGxheWVyLkIoKSkpfX0sY3Q6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5ydCh0aGlzLmRkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlZkKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLkV0KCk7dGhpcy5wbGF5ZXIuVmQmJnRoaXMuY3QoKTt0aGlzLmR0KCl9LGV0OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuWmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLnd2KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy4kYz10aGlzLlpjLmxlbmd0aH0sbnE6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLiRjJiYoYT0hMCk7cmV0dXJuIGF9LGt0OmZ1bmN0aW9uKGEpe3RoaXMuamc9YTtmb3IoYT0wO2E8dGhpcy5aYy5sZW5ndGg7YSsrKXRoaXMuWmNbYV1bImZ1bmN0aW9uIl0odGhpcy5Rcy5iaW5kKHRoaXMpKX0sUXM6ZnVuY3Rpb24oYSl7dGhpcy4kYy0tO2EmJnRoaXMuZ2UucHVzaChhKTswPj10aGlzLiRjJiZ0aGlzLmpnKCl9LElyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLmdlLmxlbmd0aDtjKyspYj10aGlzLmdlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBnYT1jLlhnfHxnYSxSPSExLGxhPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVoPXRoaXMuYVs4XTt0aGlzLm9pPXRoaXMuYVsxMF07dGhpcy5icz10aGlzLmFbN107dGhpcy5PaD10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs2XX0KYy5Ucj1iO2IucHJvdG90eXBlPXtUaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVWg6dGhpcy5uaShhKX0sbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5vaTp0aGlzLmFzKGEpfSxhczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYnM6dGhpcy5OaChhKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLk9oOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy5Ucnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9dmQuVGgoNCl9KS5jYWxsKEVhcnVmYUpvTWFoc2hlTGksRWFydWZhSm9NYWhzaGVMaSk7Cg==
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
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/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; __utmc=21769261; __utmz=21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.964551683.1537549838.1537549838.1537549838.1; __utmb=21769261.1.10.1537549838; golem_us=1a9f82ad; golem_uv=1a9f82ad; golem_uz=1a9f82ad; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CMCSYNCSOP%7C411-17803%7CvVersion%7C3.2.0; __gads=ID=7bbbfd6eee9b4781:T=1537549838:S=ALNI_MYrVc8bdjT4ZLy7j73-DhoOwd-78Q
Connection
keep-alive
Content-Length
371
Referer
https://www.golem.de/
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
Fri, 21 Sep 2018 17:10:39 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

Verdicts & Comments Add Verdict or Comment

199 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| Golem object| _gcpx string| gafc_rubrik string| gafc_zone number| ord boolean| _golem_html5ads_enable string| IVW string| n_pbt boolean| gzipEnabled object| _gafccsi string| iqd_mode object| IQD object| AdController undefined| _ object| AdControllerContainer string| _ADC_VERSION object| regexMatcher object| googletag boolean| isConsent function| setConsentBehaviour function| setMoatPrebidData object| pbjs string| amzAllocations object| apstag function| iqDefineHeaderBids boolean| deliveringAds string| adblocktest string| iqcpurl string| src_xplosion string| src_contentplatform string| src_iqhbprebid string| src_iqhbamazon string| src_yield string| gs_channels object| gsurl string| src_grapeshot string| level2 string| handle object| inViewConfInfos object| toRenderAds object| isRenderAds string| adTile function| createIQLabel function| setIQCreativeSpace function| removeIQLabelAndSpace object| IQD_varPack function| limitHeaderBids function| setIQTile string| iqVisClass string| iqdCI string| iqdCIs undefined| iqLoggerSrc object| IQDAO string| iqYlSite boolean| iqYlNew object| adaYlFormatId object| tmYlFormatId object| iqYlCs object| iqYlObj string| src_yieldlab string| src_yieldlabTM undefined| ct undefined| et undefined| hourElapsed undefined| msg undefined| pixelDomain undefined| pxSrc undefined| px object| Moat#G26 object| MoatSuperV26 object| MoatNadoAllJsonpRequest_37456155 boolean| Moat#EVA object| moatPrebidApi object| googleToken object| googleIMState object| google_js_reporting_queue function| processGoogleToken object| yl function| pbjsChunk object| __core-js_shared__ object| Criteo function| _h object| _adexc object| adex object| _satellite boolean| __satelliteLoaded function| Visitor object| s_c_il number| s_c_in function| DIL object| extData function| $ function| jQuery object| iAbo function| golemAcceptCookies object| IQDComplete string| delayedData object| GPT_jstiming object| closure_memoize_cache_ boolean| google_measure_js_timing boolean| subDomainCheckVar function| UABPdd object| uabpFlags string| uabpRnd string| szmvars object| OEWA object| iom object| iam_data object| _io_config string| disableStr object| _gaq string| cat undefined| subcat string| adc_cat string| adc_cat2 boolean| uabpsdl boolean| uabpsdln string| uabpdgenat string| uabpdsthash boolean| uabpforceimp boolean| uabpnewinject string| arg object| iqd_gpt_slots boolean| google_noFetch boolean| google_DisableInitialLoad number| __google_ad_urls_id number| google_unique_id object| gaGlobal object| _EQLService object| _EQPScript object| adsbygoogle object| _gat boolean| uabBody boolean| uabpDetect object| uabpd1 object| uabpd2 number| uabpd3 object| uabpd4 object| uabpd5 boolean| uabpij object| __io object| google_ad_modifications object| google_reactive_ads_global_state function| google_spfd object| google_sv_map object| google_t12n_vars object| google_jobrunner object| google_iframe_oncopy function| Swiper function| Goog_AdSense_getAdAdapterInstance function| Goog_AdSense_OsdAdapter object| __google_ad_urls object| t4ftPlacement boolean| google_osd_loaded boolean| google_onload_fired object| rmp3pi function| SwfVideo object| exportz object| f string| _io_uniques_holing_params object| uabpMobile object| ampInaboxIframes object| ampInaboxPendingMessages object| iqMoatIdCollector object| _EQPService object| _emqYL string| ada_publisher object| _adrtx object| _emqAdexGif object| _emqConImpact function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb object| _emtriqIDImg object| google_persistent_state_async object| google_pub_config number| google_global_correlator object| google_prev_clients object| IQCreatives object| core object| rmpGlobals function| RadiantMP function| FuckAdBlock object| fuckAdBlock object| EarufaJoMahsheLi boolean| v object| Nv object| Ov function| videopkgInterface object| criteo_pubtag 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_644784 object| closure_lm_441761 string| hic_qos

27 Cookies

Domain/Path Name / Value
golem.whitepaperdb.de/ Name: _pk_ses.3.c779
Value: *
golem.whitepaperdb.de/ Name: _pk_id.3.c779
Value: 748208c25a3a6056.1537549839.1.1537549839.1537549839.
golem.whitepaperdb.de/ Name: WIDS
Value: 3739
.doubleclick.net/ Name: IDE
Value: AHWqTUnVb40D8zs_ktydJ1ewDFIw9CaN5dvDmOj-1ZnpyJe2xTVLdzBdJYk-DxTe
.golem.de/ Name: golem_uz
Value: 1a9f82ad
.golem.de/ Name: golem_us
Value: 1a9f82ad
golem.whitepaperdb.de/ Name: _pk_ref.3.c779
Value: %5B%22%22%2C%22%22%2C1537549839%2C%22https%3A%2F%2Fwww.golem.de%2F%22%5D
.golem.de/ Name: __utmt
Value: 1
www.golem.de/ Name: __io_visit_43098
Value: 1
.golem.de/ Name: AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg
Value: 1
.www.golem.de/ Name: AAMC_iqdigital_0
Value: REGION%7C6
.golem.de/ Name: __utma
Value: 21769261.964551683.1537549838.1537549838.1537549838.1
www.golem.de/ Name: __io_uh
Value: 1
.golem.de/ Name: AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg
Value: -306458230%7CMCIDTS%7C17796%7CMCMID%7C55411337015853046443055977486743530757%7CMCAAMLH-1538154637%7C6%7CMCAAMB-1538154637%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1537557037s%7CNONE%7CMCSYNCSOP%7C411-17803%7CvVersion%7C3.2.0
.golem.de/ Name: golem_uv
Value: 1a9f82ad
.golem.de/ Name: __utmz
Value: 21769261.1537549838.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
www.golem.de/ Name: __io_unique_43098
Value: 21
www.golem.de/ Name: __io_d
Value: 1_705468254
.golem.de/ Name: __utmb
Value: 21769261.1.10.1537549838
www.golem.de/ Name: __io_lv
Value: 1537549837948
.demdex.net/ Name: demdex
Value: 54935172527602593263077058325949373375
www.golem.de/ Name: adp_segs
Value: e0
.demdex.net/ Name: dextp
Value: 269-1-1537549838214|358-1-1537549838323|771-1-1537549838424|903-1-1537549838526
www.golem.de/ Name: __io
Value: 7381ac56e.ef59e7f2f_1537549837948
.golem.de/ Name: __gads
Value: ID=7bbbfd6eee9b4781:T=1537549838:S=ALNI_MYrVc8bdjT4ZLy7j73-DhoOwd-78Q
.golem.de/ Name: golem_viewauto
Value: desktop%3Agoogle_chrome_67
.golem.de/ Name: __utmc
Value: 21769261

12 Console Messages

Source Level URL
Text
console-api log (Line 20)
Message:
gdpr - query_string
console-api log (Line 2)
Message:
gdpr_header-bidding.js
console-api log (Line 1)
Message:
gdpr_global.js
console-api log (Line 1)
Message:
gdpr_yieldlab.js
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 (Line 34)
Message:
gdpr_examine_consent.js
console-api log (Line 20)
Message:
Ausbuchung 1x1 Reichweite :: LineItem-ID-4775329615, Creative-ID-138242228674, tile = 1
console-api log (Line 129)
Message:
IQDAIF ready
console-api log (Line 20)
Message:
Ausbuchung 1x1 Reichweite :: LineItem-ID-4686089258, Creative-ID-138235188578, tile = 3
console-api log (Line 322)
Message:
Standard Banner :: (3rdPARTY Tag) :: LineItem-ID-4643517062, Creative-ID-138234541632, tile = 16
console-api log (Line 99)
Message:
3rd-Party Redirect :: LineItem-ID-4550223002, Creative-ID-85376452645, tile = 8
console-api log (Line 20)
Message:
Ausbuchung 1x1 Reichweite :: LineItem-ID-4686089258, Creative-ID-138235188476, tile = 4

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.

aax.amazon-adsystem.com
ad.yieldlab.net
ads.golem.de
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
assets.adobedtm.com
bidder.criteo.com
c.amazon-adsystem.com
cdn.adrtx.net
cdn.emetriq.de
cdn.onthe.io
cdn.radiantmediatechs.com
cm.everesttech.net
cpx.golem.de
cpxl.golem.de
csi.gstatic.com
d.df-srv.de
d1pywvbolq0b04.cloudfront.net
de.ioam.de
dmp.theadex.com
dpm.demdex.net
dsp.adfarm1.adition.com
dx6ctphzljkf1.cloudfront.net
dyn.emetriq.de
golem.de
golem.whitepaperdb.de
googleads.g.doubleclick.net
hgc-cf-cache-1.svonm.com
ib.adnxs.com
imasdk.googleapis.com
iqdigital.demdex.net
iqdtms.golem.de
mb.moatads.com
p.yieldlab.net
pagead2.googlesyndication.com
px.moatads.com
s0.2mdn.net
s3.amazonaws.com
script.ioam.de
securepubads.g.doubleclick.net
ssl.1.damoh.golem.de
ssl.google-analytics.com
static.criteo.net
stats.g.doubleclick.net
tpc.googlesyndication.com
tt.onthe.io
ups.xplosion.de
video.golem.de
www.golem.de
www.google-analytics.com
www.googletagservices.com
xpl.theadex.com
z.moatads.com
136.243.65.40
143.204.101.112
143.204.101.118
143.204.96.211
148.251.0.183
165.227.149.77
172.217.22.98
178.250.0.130
178.250.2.89
18.130.208.27
185.33.223.204
2.18.232.23
2.18.232.233
2.18.235.40
2001:16e0:10a:1::c1:1
2001:16e0:10a:1::c2:1
216.58.205.230
2400:cb00:2048:1::6818:6624
2600:9000:200c:1000:1c:8c89:a300:93a1
2600:9000:200c:4a00:1:9777:c740:21
2600:9000:200c:6800:1c:9fd1:6d00:21
2607:f8b0:400d:c01::5e
2a00:13c8:f5::f:4b3d:175
2a00:13c8:f5::f:4b3d:17a
2a00:13c8:f5::f:4b3d:181
2a00:13c8:f5::f:4b3d:182
2a00:1450:4001:812::2002
2a00:1450:4001:81b::2002
2a00:1450:4001:81f::2001
2a00:1450:4001:81f::200a
2a00:1450:4001:820::200e
2a00:1450:4001:824::2002
2a00:1450:4001:824::2008
2a00:1450:400c:c00::9a
34.249.64.202
34.251.222.238
52.208.127.173
52.216.169.93
52.94.216.48
54.194.25.183
54.72.140.158
62.138.242.228
66.117.28.86
77.247.84.128
77.247.84.129
85.114.144.195
85.114.159.118
88.99.5.37
89.163.159.101
91.215.100.39
91.215.100.40
95.216.24.149
03f56c523e42f36e912b7109c0a97e43703d78c0884f59c07ff115e590e9fd7f
046a037b70269d7d556fcf44f52bae9aeb1f1e0b19d99db8092234582caf5944
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
05d54031e10a55e5d508d2ca8d24becb16634bbc1edae0f00a6a3111acd6c5e6
060aab0c3898c5312ac10d4ba85cc2b6b9509aa776d58ea1c19bd05710efba1a
08b757c7ef1eaebe9fb2331abd30ecc0a470c2166994c1cfa941c126a698679c
0a54a80e336bf4ca48d6cc954d0a12acd09a155ea3967ffb87fe9e89b27c1709
0bdda96858933db76979b062926fc3adcf1108a88fdec7602567b0b412740bd8
0ea9d02fca10e9109db9cfefcf93b58c35e3df75b2cbe24b6cac836e456098f6
0ed3fafbbcb2cb5244edfa69bf0ab308b452fd9e898c9b01906117d11c7f2a13
1252394c4f5b1453fea443eaa34f3636d64d4a88fd66fc8e95185bf8b3a6b277
1259ea99bd76596239bfd3102c679eb0a5052578dc526b0452f4d42f8bcdd45f
1266568f932e7920c7b97bd0e015c494d04ac0e1f151484f977a296079135c7c
13a1b58170d2bb727a0f68a64971213928d2e3cdea1efa56b42635bc7247aa26
159c31e0fbdc1b07174c375509e096accc513b7de233c12745f7d2eb199d873f
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8
1e1f9be6d4eb0d4609d2dc4bb89999b61eca710323718f4c5e821ef2aa16a491
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9
20e2057fefe01c400caa7e2d55543e5edb23bc8e2448f6065042efb427ab4cf4
233a362ae694dacf11bdd89616f44b27602feb790d74b578a814e5e13e549240
2343e09eb2e4a940546c7b87f6ef2d8a69e530c2a62cfb5ea58c33375ef1b8e1
2576501f0d463e493c4a8e47904cbfc9ebbc404405d2c008ca3988bfd7a146cf
25f44c8d49eedb2fd437fa1ad513f031ec1fb19d192552ab87fcccf79c427aaa
26d2153749f3d072d437546ea05021707542178f8ae368c7fa16fd7f207d5e1b
2bdb9058c86c9b82b28d52d721fb75df307033cac39891be256b4f74bbb1b083
2cb2cfdf905acc2902bec7ea0579bd0f178bdd5990749547b1298b529e983d8a
2fb187e8f47fb77123e5e541c8671d60215d35b6f108207066571a96ae4767c7
303546286367930885b0635816c3a1d7176bb1e4cea1a516c3daca746ce05f02
308b88046da3cb8c99042d803173dee196d6501925fd3c86ccf8f9e2d7f7d04a
32f5f2cfa397535f89f47b3b3db8eea2594564e25d16962edca687076113d218
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1
34815dfa238f8c0e9c2f0c533e27feb0c872d20ee404deb6feb781175c033f31
352c699a724df4758e0005476752014202d4156ce13cbf91f9f948f676488088
38ee16973ee8b9d225edb3cf6d8210f23c551b20a7503b7535a8562236b70bbe
3b1c3e0f78e681a76bd994299d1906453f6a497c5498d1f947d4e7853488d2ac
3ce108a8c100c4154ec5c91ac1ed7c3be6ae8ffe02c3142503bf5048bd1fdd4e
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d
3f377efe9a5303e68f051dfb0bb7c248fb65d8b2815c7f04c98794fd0b9be4ea
40f5cd72e661262384b23446c0d2bb80173bc39def7ce59a7aa55ec8293941df
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5
431ced6916a2a21a156e38701afe55bbd7f88969fbbfc56d7fe099d47f265460
45661a3e6863d0c77529828a7bd5bc802d65fb7dbce6d7fde4df6d05f3394954
46e104c8cda8ec4dee994fed43b7522c38895e572f97f1715dd46f282b7a3681
475acadecd11dd2dfa21856a8055405a94ea41f28e09d5c6689efec2d36b5e32
4ca761566d6efd4d84cc704d3c6e61132e2163d17707ec72415c82ab22d2fe87
4d131d092f6a1d44397026f1bf84f5d43382aaa32db44deb0d9226ed826f27b2
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff
4f5dcb45b41f95cffaaa6bcf6c71fe8acbf1bc165b6d9ece1db7362f7cdb7e2e
4fdd042e1fa7f26b0e22df0c8836b4b121f96997e2d5769e1e896b0e697d5957
5325befafccde61035d405be5f2d3f4be3a4fe32a03583f52c9ecc9dffdb47ee
54a5c9011a4eec01cb0af8620d0ce3dd3bba04b167b7f674b074428eeb06e020
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd
5b54ebb2ed254f7922b3af74610d4487b245899ac8e4178f4c6553b6781da60a
5b550e95dda77ddb20905d582d604d967928b01f60a7aa2716daf4af6303ec9b
5c4bdb91d18bbb0dc7875f55a468cdb5dea73b931e316c14bc04f907ab000d6b
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
63af2e1b149907aedaedaaffbb54d95d3bb52468673502953a6dd9c87a4cb78c
664942fd51beb9edaaad165a23716c9258884fd9d895c527b67b7e421f97c096
6d6f482982f8f1a1814e279ff50df4ccc301533ca9655e4d080d6b90ec69d69e
6e02736a6f9e93cdfe22ded97de7a301f4633fad2372bfaa40c825ed2500c4a5
6f1820fb18fd530846406f6f01440f4124b5ebb231a5bdb9f6b60ddf5737c42a
7087c8a16fc5d289bf4189af186fcfb7190d5e5cd5f0683cbeebce27d1fe3707
718c0f396b60c5a2ed980b3f064c693cc97b9eb9460276dccc3638734b511828
72c2dd734f2818014582b8a8d635b662b84e27336341daf79c22d7761716be47
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
79b48588330a331f56fd0e28382880988bfbff7bca8e5ea8aef823bc310cb1e7
7b3320fc6cbf3bfb724b947adb56c9c246cd205de6ca409308003a7b899ceb94
7e7fa886d5d75c745d95be4fc3c5bfb4c988019b3f643c669734612345e1b8c8
8160e624fe5607dce796c1cccc2c8a089f3a19044888f976f46ea4b70a343d58
8315fa072c715bd5db90717d2062d12f9102aa9bdac64b273fd15147231ed67a
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
83c3baeb96c9e8de784e725a4fb9fba02c6b597ef9421512cb9fb653d563e4ea
8511e2adf4f17819f7be222a81c3170c0547d909e5edc2bc2dd651e689c39020
8a5ebf17c751099d2f751d23dd57cd262691ccc803fc6f8fa1712922a86a8a8d
8b1f2043b94ba519266137d51e5885116e863cd75d5194e9f66f731160760651
8ba131a677ea1357ae7fdc95d6a5c67c3b02d171bb286f6c9ec6bce3cef5c211
8dec6deeef48efdcd9cf789b59759802d4f50069f2c8d78664e9f036f1362b26
9104ec08581380e5ac07c82308c6fd2db616494b51e2e2e5198443d31279b496
9326b813f05efe1ac285085eef770b1036f77bdbbedf69f79eb83b35a121040c
933e944e49c9a8efbc6220988536de84bdec3e2f63e3e17f4bfff78db3f1ff9f
939afa865a77f028eab9017820c823d2b8c103c67ac3634d52d98d7a07f8a12a
960d1b72fb1bd87c274bad6b1bc6d80ece2b140cc59a1c4ab1bf79439090c6f9
964b9e4e7dce6754b83d57f47f61776751ba4f8fe9b95074f6b48d6b7e4bfec4
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a
9a60281cb9d42e781eb9518ca4b1b3abc82a475f7f41d7656e2b3411af137c3d
9ba5f5bef8bcf5990566c187803dc1658fb65413aa39ecd6dec62f7fd9e85522
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627
9fc61d7a3ad131cddc20b53ca3a6344ca4b2d37fe60ca2177383e551cf9b0e80
a1779f221b4f117cec29024ab805135454dd55605ab34a4fbd2b38b21fc36a6f
a406feda7a5253763f49f67316145642dc72e745dcd6deed12fa16e3e3fd416f
a673803ad405beddba94cec2b3939859c11132ae9f201735086f2c555cbc4c96
a6ed9bef023b95bc4817198bf4e64f0fe1df29ad8e26b34d6fcf5ae224e4ad16
a840992524864bb0dd0fcc8659036dba39905a988b34e39d9fc9c7c0cd7b32f0
a884b3ab10b9fb03fb7e6ced1b446a0c1339d0995bd854f0b887aaf62a83efee
aaaabde3f68c325033b37bb3ebff887e3b589b7137e717e96648a52221881429
ac07abc3fc5a450ec41a5a82ffdd347c94ea88ceeb8f3d5ab322601375b9ff07
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277
afe275fe749ceb1206c11b0e60b2d336f83a0a5c9759f3f1ea44501ca45ce7fc
b027fc110a1c4310d433d4be3ffa26b70886ed33a1ec1a2b8270588519507f00
b0f9a9ed908d0b83d12c403aef23ae40e66d2096861df79a7de4bb289eacd9b7
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d
b526b37334371d31e1d10fbf239d21e98de6d2de57d12f654550ac0a0158c04f
b70c29fb442ecbfaf97100b7875a539d88a9f34b2955554ae10eb89334ffb945
b7ed32512f2efde476f642799e4e41420548b56eb3d1268bd8bb94f26763e669
c60fc8ba69fdc00da1d3287682209b488699b1129989fdfd5c9079c15a879af4
ca75fea43fc41e52e229e3765eb71e1e1fa2d68ee71d2959f8726852d006d319
cf0d957e43d18015ad871f5f33666723e4dd636d2cd7ea6c81ab33956113284a
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
cfe3414c2956e87e23eada50b7a85319c3fb46bd4810440aa0492213a8873095
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13
d77b6c18c0744a7ad3e394c6de665cfec35053d2ccc2e3d31aaece762cf6bbfd
d7922cb1ba572bd14e4dc0f423018e4f35267bda9e20a872dc850e242060087e
d7eed0b77cc69ab1a1c257b93201ef4590e8e4bde79ab53c02d9460edc7bacff
dff33a67b61fc44fb90cd3d8dcede66b087afeb992b3338e8ffecaac478f246e
e1347bd7b9e2213ea4071ff786c58976b6a62328dafa9442ce78be5d696b1e9b
e14377a831754e15200b35a69d272a62ee592dd4130fad098e31e204276bc1d1
e192dd8b901bad10acc59606190d742e67dc587f9d3334c609ab030fe12ed52e
e36de79c3f6dc58fa93bc282253a75bc302b395651d0a534b8a64363c410a6f7
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e3e6c93defad2cf35199cb4a925b7ddd47efa939786ca22038d4d3b5ef4ea14c
e72acd75e28308144c191955763a907264b850d4e8e2960d724f273e4934e34d
e91698c8353f34207930466bfb14e60ceedd775c2f368aa9822a671540ba471a
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c
ea8af7f609f871c9bdcda24ffc2763fe0ad8c25dcc9b2374b42abb1e1d8d00c6
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546
ec734c8897764322b10b819d78cc8933f050ba27cc3f971ee23ea91b9fdc958e
eebd6f2e5a80bb5d11966fd2446842888fcefdc5b18a36a619aa6fa0756e9376
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
ef96621d218bcc99c0f3ba686cf5fae0cf7e770ce52226f0c3d5f90e936f39be
f070a404ffa3b35fb0636c3172879da6e87e3703bdb7b225c1872aec5a201c5e
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f24798946695694a0b0aff1a66dcd3f942f31671907369e17cb1b47ddb1dc0f3
f2b273d59737ef0f4b09d2f7a77489950f680ef326c48c40fd79c0de2b55d5c5
f4055bd0cdf467ff6940a20d9284a60987a85578033114820b1dc605dbb70991
f7eeefc1dd6f250f4c4b89a1fef2d0fb85b280042059f1f2ee0d11de20c34e98
fccafa91724213b8e0af8640d56eb94574f8e9a3f099ddee81319486f36a3e65
fe7a549a41ab7e79dea6ca3b628fa375219e4d353758f30f5bcea96b36970d9d
fec4969577c947a272b6be6924b17ca584660dccaa35d17dd05471b0f0b3e548
ff4b8e8962f23810dfba6084bd82cc367d9aa3b49bfe0612bb2a98bc592eb1fe