Submitted URL: http://tvtoday.de/
Effective URL: https://www.tvtoday.de/
Submission: On December 16 via api from GB

Summary

This website contacted 33 IPs in 7 countries across 27 domains to perform 89 HTTP transactions. The main IP is 151.106.72.75, located in Germany and belongs to PLUSSERVER-ASN1, DE. The main domain is www.tvtoday.de.
TLS certificate: Issued by AlphaSSL CA - SHA256 - G2 on April 16th 2019. Valid for: 2 years.
This is the only time www.tvtoday.de was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
1 45 151.106.72.75 61157 (PLUSSERVE...)
1 192.229.233.4 15133 (EDGECAST)
1 23.45.108.65 20940 (AKAMAI-ASN1)
5 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 91.215.100.39 43407 (INFONLINE-AS)
1 2 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 2 91.215.103.65 43407 (INFONLINE-AS)
1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 23.210.249.83 16625 (AKAMAI-AS)
2 172.217.16.130 15169 (GOOGLE)
2 13.225.86.250 16509 (AMAZON-02)
3 34.252.231.90 16509 (AMAZON-02)
1 178.250.2.130 44788 (ASN-CRITE...)
1 2606:4700:30:... 13335 (CLOUDFLAR...)
1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 2600:9000:215... 16509 (AMAZON-02)
1 172.217.23.166 15169 (GOOGLE)
1 136.243.25.87 24940 (HETZNER-AS)
1 108.128.219.65 16509 (AMAZON-02)
1 85.114.136.51 24961 (MYLOC-AS)
1 93.190.69.242 47215 (FILOO-ASN...)
1 1 89.163.159.104 24961 (MYLOC-AS)
2 52.217.46.214 16509 (AMAZON-02)
2 143.204.101.112 16509 (AMAZON-02)
2 144.76.165.195 24940 (HETZNER-AS)
1 108.128.71.27 16509 (AMAZON-02)
2 35.157.148.50 16509 (AMAZON-02)
1 52.28.51.75 16509 (AMAZON-02)
2 35.156.112.30 16509 (AMAZON-02)
2 148.251.89.206 24940 (HETZNER-AS)
89 33
Domain Requested by
23 images.tvtoday.de www.tvtoday.de
21 www.tvtoday.de www.tvtoday.de
3 a.bf-ad.net www.tvtoday.de
a.bf-ad.net
2 ssl.3.damoh.tvtoday.de www.tvtoday.de
2 sourcepoint.mgr.consensu.org www.tvtoday.de
2 mms.tvtoday.de www.tvtoday.de
2 ssl.1.damoh.tvtoday.de www.tvtoday.de
text
2 hgc-cf-cache-1.svonm.com www.tvtoday.de
2 s3.amazonaws.com www.tvtoday.de
2 ups.xplosion.de a.bf-ad.net
cdn.emetriq.de
2 c.amazon-adsystem.com a.bf-ad.net
www.tvtoday.de
2 securepubads.g.doubleclick.net a.bf-ad.net
www.tvtoday.de
2 de.ioam.de 1 redirects www.tvtoday.de
2 www.google-analytics.com 1 redirects www.tvtoday.de
1 www.summerhamster.com
1 adstax-match.adrtx.net www.tvtoday.de
1 uss.xplosion.de www.tvtoday.de
1 xpl.theadex.com 1 redirects
1 d.df-srv.de www.tvtoday.de
1 p.yieldlab.net www.tvtoday.de
1 cdn.adrtx.net www.tvtoday.de
1 uobsoe.com www.tvtoday.de
1 ad.doubleclick.net www.tvtoday.de
1 cdn.emetriq.de ups.xplosion.de
1 adservice.google.com www.tvtoday.de
1 adservice.google.de www.tvtoday.de
1 static.cleverpush.com www.tvtoday.de
1 emq.bf-tools.net www.tvtoday.de
1 static.criteo.net a.bf-ad.net
1 acdn.adnxs.com a.bf-ad.net
1 stats.g.doubleclick.net www.tvtoday.de
1 s0.2mdn.net www.tvtoday.de
1 www.googletagmanager.com www.tvtoday.de
1 a.bf-tools.net www.tvtoday.de
1 script.ioam.de www.tvtoday.de
1 a2.tvspielfilm.de www.tvtoday.de
1 eacgkwdpqg.kameleoon.eu www.tvtoday.de
1 tvtoday.de 1 redirects
89 38
Subject Issuer Validity Valid
*.tvtoday.de
AlphaSSL CA - SHA256 - G2
2019-04-16 -
2021-05-04
2 years crt.sh
*.storage.kameleoon.com
DigiCert SHA2 Secure Server CA
2017-10-24 -
2020-09-01
3 years crt.sh
a2.tvspielfilm.de
DigiCert SHA2 Secure Server CA
2019-03-08 -
2020-06-06
a year crt.sh
bf-tools.net
Let's Encrypt Authority X3
2019-12-09 -
2020-03-08
3 months crt.sh
*.ioam.de
COMODO RSA Organization Validation Secure Server CA
2017-12-22 -
2020-12-21
3 years crt.sh
*.google-analytics.com
GTS CA 1O1
2019-11-13 -
2020-02-05
3 months crt.sh
*.doubleclick.net
GTS CA 1O1
2019-11-13 -
2020-02-05
3 months crt.sh
*.g.doubleclick.net
GTS CA 1O1
2019-11-13 -
2020-02-05
3 months crt.sh
cdn.adnxs.com
GeoTrust RSA CA 2018
2019-04-23 -
2020-02-19
10 months crt.sh
c.amazon-adsystem.com
Amazon
2019-10-07 -
2020-09-29
a year crt.sh
*.xplosion.de
Thawte RSA CA 2018
2018-12-10 -
2020-02-08
a year crt.sh
*.criteo.net
DigiCert ECC Secure Server CA
2019-12-03 -
2021-04-06
a year crt.sh
sni43691.cloudflaressl.com
COMODO ECC Domain Validation Secure Server CA 2
2019-12-04 -
2020-06-11
6 months crt.sh
*.google.com
GTS CA 1O1
2019-11-13 -
2020-02-05
3 months crt.sh
*.emetriq.de
RapidSSL TLS RSA CA G1
2018-01-08 -
2020-03-08
2 years crt.sh
uobsoe.com
Let's Encrypt Authority X3
2019-11-04 -
2020-02-02
3 months crt.sh
*.adrtx.net
GeoTrust TLS RSA CA G1
2018-09-05 -
2020-11-03
2 years crt.sh
*.yieldlab.net
AlphaSSL CA - SHA256 - G2
2019-01-31 -
2021-04-20
2 years crt.sh
*.df-srv.de
Thawte TLS RSA CA G1
2019-12-12 -
2021-12-11
2 years crt.sh
s3.amazonaws.com
DigiCert Baltimore CA-2 G2
2019-11-09 -
2020-12-02
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2019-08-19 -
2020-09-19
a year crt.sh
ssl.1.damoh.tvtoday.de
Let's Encrypt Authority X3
2019-12-02 -
2020-03-01
3 months crt.sh
mms.chip.de
Let's Encrypt Authority X3
2019-11-16 -
2020-02-14
3 months crt.sh
*.summerhamster.com
Let's Encrypt Authority X3
2019-12-07 -
2020-03-06
3 months crt.sh
sourcepoint.mgr.consensu.org
DigiCert SHA2 Secure Server CA
2019-04-22 -
2020-04-29
a year crt.sh

This page contains 3 frames:

Primary Page: https://www.tvtoday.de/
Frame ID: 5499F2295CA0D86E417D2F39A800FF01
Requests: 101 HTTP requests in this frame

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

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

Screenshot


Page URL History Show full URLs

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

Page Statistics

89
Requests

100 %
HTTPS

27 %
IPv6

27
Domains

38
Subdomains

33
IPs

7
Countries

1476 kB
Transfer

4843 kB
Size

6
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://tvtoday.de/ HTTP 301
    https://www.tvtoday.de/ Page URL

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 18
  • https://de.ioam.de/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0010&i2=0010c551d432ed8b95df752a5&ep=1600760855&vr=415&id=sxnjyl&i3=0010c551d432ed8b95df752a5%3A1607939237464%3A1576489637464%3A.tvtoday.de%3A1%3Atvspielf%3AD%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday%3Anoevent%3A1576489637464&n1=1&dntt=0&lt=1576489637465&ev=&cs=m6w4ut&mo=1 HTTP 302
  • https://de.ioam.de/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0010&i2=0010c551d432ed8b95df752a5&ep=1600760855&vr=415&id=sxnjyl&i3=0010c551d432ed8b95df752a5%3A1607939237464%3A1576489637464%3A.tvtoday.de%3A1%3Atvspielf%3AD%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday%3Anoevent%3A1576489637464&n1=1&dntt=0&lt=1576489637465&ev=&cs=m6w4ut&mo=1&sr=71
Request Chain 33
  • https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=649777265&t=pageview&_s=1&dl=https%3A%2F%2Fwww.tvtoday.de%2F&ul=en-us&de=UTF-8&dt=Das%20aktuelle%20Fernsehprogramm%20im%20%C3%9Cberblick%20von%20TV%20TODAY&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=YEBAAEAB~&jid=2060850165&gjid=1312349476&cid=927227706.1576489638&tid=UA-1909021-1&_gid=690815348.1576489638&_r=1&z=1796570164 HTTP 302
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1909021-1&cid=927227706.1576489638&jid=2060850165&_gid=690815348.1576489638&gjid=1312349476&_v=j79&z=1796570164
Request Chain 62
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFWD_3ESwsEifAWSUkWsfABifABSfABSfABiBABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D HTTP 307
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4212491829807157065

89 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request /
www.tvtoday.de/
Redirect Chain
  • http://tvtoday.de/
  • https://www.tvtoday.de/
991 KB
104 KB
Document
General
Full URL
https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
c1d083bf2ae4deb1081b1951cc5ed004cd0b65d939f0ad342ed0926380ca9ebd
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

:method
GET
:authority
www.tvtoday.de
:scheme
https
:path
/
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
sec-fetch-site
none
sec-fetch-mode
navigate
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Mon, 16 Dec 2019 09:46:38 GMT
strict-transport-security
max-age=15768000
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
content-type
text/html; charset=UTF-8
last-modified
Mon, 16 Dec 2019 09:46:38 GMT
cache-control
max-age=901, public
content-encoding
gzip
x-varnish
240791084 241273923
age
38
accept-ranges
bytes

Redirect headers

Date
Mon, 16 Dec 2019 09:09:09 GMT
Location
https://www.tvtoday.de/
Content-Length
231
Content-Type
text/html; charset=iso-8859-1
Last-Modified
Mon, 16 Dec 2019 09:09:09 GMT
Cache-Control
public, max-age=7200
X-Varnish
154950767 232253035
Age
2287
Connection
keep-alive
dfdd70c.css
www.tvtoday.de/css/
292 KB
58 KB
Stylesheet
General
Full URL
https://www.tvtoday.de/css/dfdd70c.css?10.003
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
04ddaf434e3bf0c61fc756f30da65a7af9567b9341c0c1e303d2d45fa85b80cc
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:25:10 GMT
content-encoding
gzip
last-modified
Mon, 16 Dec 2019 09:23:35 GMT
age
1326
etag
"490d3-599cec414f60e-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
content-type
text/css
status
200
cache-control
public, max-age=1209600
x-varnish
139881835 240719454
strict-transport-security
max-age=15768000
accept-ranges
bytes
kameleoon.js
eacgkwdpqg.kameleoon.eu/
187 KB
44 KB
Script
General
Full URL
https://eacgkwdpqg.kameleoon.eu/kameleoon.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
192.229.233.4 Los Angeles, United States, ASN15133 (EDGECAST - MCI Communications Services, Inc. d/b/a Verizon Business, US),
Reverse DNS
Software
ECS (fcn/418A) /
Resource Hash
297b51cc3bbf20d153ebfdc821489f7868ee4b2805dd02baa1e75a9f9df5acb9

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:47:17 GMT
content-encoding
br
last-modified
Fri, 13 Dec 2019 00:23:05 GMT
server
ECS (fcn/418A)
etag
"5df2d9e9-2eaa5"
vary
Accept-Encoding
x-cache
HIT
content-type
application/javascript; charset=utf-8
status
200
cache-control
max-age=5400
accept-ranges
bytes
content-length
45051
expires
Mon, 16 Dec 2019 11:17:17 GMT
channel_webp_optimized.css
a2.tvspielfilm.de/images/tv/sender/mini/
20 KB
3 KB
Stylesheet
General
Full URL
https://a2.tvspielfilm.de/images/tv/sender/mini/channel_webp_optimized.css
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
23.45.108.65 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-45-108-65.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
f00a7c5b31e91ca786e1f4640ef94f625a53bc242da3af1f9b465bdad1fc38ac
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

strict-transport-security
max-age=15768000
content-encoding
gzip
last-modified
Thu, 12 Dec 2019 15:02:37 GMT
server
Apache
etag
"516b-599830929fd18-gzip"
vary
Accept-Encoding
content-type
text/css
status
200
cache-control
max-age=2265702
date
Mon, 16 Dec 2019 09:47:17 GMT
accept-ranges
bytes
content-length
2847
expires
Sat, 11 Jan 2020 15:08:59 GMT
46cfa08.js
www.tvtoday.de/js/
16 KB
5 KB
Script
General
Full URL
https://www.tvtoday.de/js/46cfa08.js?10.003
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
2fcbe9ed682b16557f66e6fd4e7fa33b647eb54f921f4a3c37c526fb30ba45ab
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:25:07 GMT
content-encoding
gzip
last-modified
Thu, 15 Nov 2018 08:42:47 GMT
age
1329
etag
"402e-57ab008ffeede-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
content-type
application/javascript
status
200
cache-control
public, max-age=1209600
x-varnish
240265362 232667666
strict-transport-security
max-age=15768000
accept-ranges
bytes
autooptin.js
www.tvtoday.de/bundles/frontend/js/sourcepoint/
41 KB
13 KB
Script
General
Full URL
https://www.tvtoday.de/bundles/frontend/js/sourcepoint/autooptin.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
ff2923d417cb27beee17edf6dfbf7a272f854cbde0d3200c87040392159c6d82
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:02:58 GMT
content-encoding
gzip
last-modified
Wed, 07 Aug 2019 09:38:40 GMT
age
2658
etag
"a4dd-58f83b4d2932f-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
content-type
application/javascript
status
200
cache-control
max-age=1209600, public
x-varnish
241188243 239057987
strict-transport-security
max-age=15768000
accept-ranges
bytes
spmsg_addetection.js
www.tvtoday.de/bundles/frontend/js/sourcepoint/
325 KB
70 KB
Script
General
Full URL
https://www.tvtoday.de/bundles/frontend/js/sourcepoint/spmsg_addetection.js?1.2122
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
4941783359a81dff9812879352d96a5fa591ea43b7885bda4d7dfafb6eeae167
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:03:09 GMT
content-encoding
gzip
last-modified
Wed, 04 Sep 2019 07:27:40 GMT
age
2647
etag
"512cf-591b523db30dd-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
content-type
application/javascript
status
200
cache-control
public, max-age=1209600
x-varnish
139881836 237924292
strict-transport-security
max-age=15768000
accept-ranges
bytes
adengine.js
a.bf-ad.net/adengine/tvtoday/
334 KB
97 KB
Script
General
Full URL
https://a.bf-ad.net/adengine/tvtoday/adengine.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:6c00:29d::6828 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
642bc872e7ce1cec0d3f50c189637bdb0fa4ed98c29efbc10552401466f3e6c0

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:47:17 GMT
content-encoding
gzip
last-modified
Tue, 10 Dec 2019 12:20:00 GMT
server
Apache
etag
"b225182d20849b11003eb23dc936ed60:1575980577"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=900
accept-ranges
bytes
expires
Mon, 16 Dec 2019 10:02:17 GMT
tfm.videopkg.min.js
www.tvtoday.de/js/
156 KB
49 KB
Script
General
Full URL
https://www.tvtoday.de/js/tfm.videopkg.min.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
269c041346b314dac39976bad59326c89eb4775525dcf31322cb23cf3e20eaad
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 08:58:17 GMT
content-encoding
gzip
last-modified
Mon, 16 Dec 2019 08:45:01 GMT
age
2939
etag
"271e3-599ce3a2b5c81-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
content-type
application/javascript
status
200
cache-control
public, max-age=1209600
x-varnish
139881837 241114399
strict-transport-security
max-age=15768000
accept-ranges
bytes
iam.js
script.ioam.de/
24 KB
9 KB
Script
General
Full URL
https://script.ioam.de/iam.js?m=1
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.100.39 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script4.ioam.de
Software
nginx / BLACKBIRD-SRC v0.10 0010
Resource Hash
1b9ada5417311d6a13b2b908e50f27901317485e5872055bc00b0a113b376741

Request headers

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

Response headers

Date
Mon, 16 Dec 2019 09:47:17 GMT
Content-Encoding
gzip
Last-Modified
Mon, 16 Dec 2019 09:47:17 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.10 0010
Vary
Accept-Encoding
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Cache-Control
private, max-age=7200, pre-check=7200
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
application/javascript
Expires
Mon, 16 Dec 2019 11:47:17 GMT
tvt_logo_500x100.png
www.tvtoday.de/bundles/frontend/images/logos/
37 KB
38 KB
Image
General
Full URL
https://www.tvtoday.de/bundles/frontend/images/logos/tvt_logo_500x100.png?10.003
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
62214dab0c26ba36487bfa2d0498b0931ca9c8e20a2864b55ff509e3876d8692
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:25:11 GMT
last-modified
Fri, 02 Nov 2018 07:42:43 GMT
age
1326
etag
"9557-579a9ae471290"
vary
X-Forwarded-Proto,x-requested-with
content-type
image/png
status
200
cache-control
public, max-age=1209600
x-varnish
139881838 241021351
strict-transport-security
max-age=15768000
accept-ranges
bytes
ravensburger-teaser-227x158,224252_navigation_100.jpg
images.tvtoday.de/files/images/201912/1/
17 KB
17 KB
Image
General
Full URL
https://images.tvtoday.de/files/images/201912/1/ravensburger-teaser-227x158,224252_navigation_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
9009cb93d1afd929fd7733d19b1687bcabf10d0ab66857c05b97c9d284f94594
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:15:52 GMT
last-modified
Wed, 11 Dec 2019 08:01:12 GMT
age
1884
etag
"431e-59969083cb129"
vary
X-Forwarded-Proto,x-requested-with
content-type
image/jpeg
status
200
cache-control
public, max-age=1209600
x-varnish
239774921 241107637
strict-transport-security
max-age=15768000
accept-ranges
bytes
vikings,201441_navigation_100.jpg
images.tvtoday.de/files/images/201807/3/
7 KB
7 KB
Image
General
Full URL
https://images.tvtoday.de/files/images/201807/3/vikings,201441_navigation_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
b099ee6a5d30b54ef508de7ddfb2a78cd440ba624d27ed7d8b3f9a855f7d3de7
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:30:02 GMT
last-modified
Fri, 27 Jul 2018 13:22:05 GMT
age
1034
etag
"1ac3-571faff7af5a0"
vary
X-Forwarded-Proto,x-requested-with
content-type
image/jpeg
status
200
cache-control
max-age=1209600, public
x-varnish
238556229 237006451
strict-transport-security
max-age=15768000
accept-ranges
bytes
tvs_partner_logo.png
www.tvtoday.de/bundles/frontend/images/logos/
4 KB
5 KB
Image
General
Full URL
https://www.tvtoday.de/bundles/frontend/images/logos/tvs_partner_logo.png?10.003
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
be726dcabb9c264b1d1816ec0da60cb11fbb9b76afee12a82683d808a62a810c
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:25:11 GMT
last-modified
Wed, 18 Jul 2018 10:43:07 GMT
age
1326
etag
"1148-57143ba5eda4c"
vary
X-Forwarded-Proto,x-requested-with
content-type
image/png
status
200
cache-control
public, max-age=1209600
x-varnish
139881839 241021356
strict-transport-security
max-age=15768000
accept-ranges
bytes
54c6bdece4b08bb8dcaea327_780.jpg
images.tvtoday.de/itv/2019-12-16/
51 KB
51 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-12-16/54c6bdece4b08bb8dcaea327_780.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
7b84ad05a1cd574cb60a714339871a417b170364ba05111fa04a17388fbc9687
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:27:11 GMT
last-modified
Mon, 02 Dec 2019 10:27:54 GMT
age
1206
etag
"cac9-598b6085748ec"
vary
X-Forwarded-Proto,x-requested-with
content-type
image/jpeg
status
200
cache-control
public, max-age=1209600
x-varnish
233855187 237498535
strict-transport-security
max-age=15768000
accept-ranges
bytes
de.js
a.bf-tools.net/de/
9 KB
3 KB
Script
General
Full URL
https://a.bf-tools.net/de/de.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:6c00:29d::6828 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
7a5372b92f6883db660dbf263da349934097ea31feadb4815f1d2e614fa8049b

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:47:17 GMT
content-encoding
gzip
last-modified
Mon, 09 Dec 2019 13:57:11 GMT
server
Apache
etag
"f676100cedac1128e1e29c35ac292145:1575899833"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=900
accept-ranges
bytes
content-length
3174
expires
Mon, 16 Dec 2019 10:02:17 GMT
analytics.js
www.google-analytics.com/
43 KB
17 KB
Script
General
Full URL
https://www.google-analytics.com/analytics.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:808::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

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

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 19 Aug 2019 17:22:41 GMT
server
Golfe2
age
4420
date
Mon, 16 Dec 2019 08:33:37 GMT
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=7200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
17803
expires
Mon, 16 Dec 2019 10:33:37 GMT
roboto-v18-latin-regular.woff2
www.tvtoday.de/bundles/frontend/fonts/
15 KB
15 KB
Font
General
Full URL
https://www.tvtoday.de/bundles/frontend/fonts/roboto-v18-latin-regular.woff2
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 08:50:37 GMT
content-encoding
gzip
last-modified
Wed, 30 Jan 2019 08:45:19 GMT
age
3399
etag
"3bf0-580a8ee00d4d3-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
x-varnish
139881840 240820305
status
200
cache-control
public, max-age=3600
strict-transport-security
max-age=15768000
accept-ranges
bytes
access-control-allow-origin
*
gtm.js
www.googletagmanager.com/
76 KB
26 KB
Script
General
Full URL
https://www.googletagmanager.com/gtm.js?id=GTM-M7SCL5
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:808::2008 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
ac698a5d5dba594941637805012e41cb13ad4b44dbf30f1a74bc13e6731933e3
Security Headers
Name Value
X-Xss-Protection 0

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:47:17 GMT
content-encoding
br
last-modified
Mon, 16 Dec 2019 09:00:00 GMT
server
Google Tag Manager
access-control-allow-origin
http://www.googletagmanager.com
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
private, max-age=900
access-control-allow-credentials
true
access-control-allow-headers
Cache-Control
content-length
26963
x-xss-protection
0
expires
Mon, 16 Dec 2019 09:47:17 GMT
tx.io
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0010&i2=00...
  • https://de.ioam.de/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0010&i2=00...
0
694 B
Script
General
Full URL
https://de.ioam.de/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0010&i2=0010c551d432ed8b95df752a5&ep=1600760855&vr=415&id=sxnjyl&i3=0010c551d432ed8b95df752a5%3A1607939237464%3A1576489637464%3A.tvtoday.de%3A1%3Atvspielf%3AD%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday%3Anoevent%3A1576489637464&n1=1&dntt=0&lt=1576489637465&ev=&cs=m6w4ut&mo=1&sr=71
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.103.65 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de3.ioam.de
Software
nginx / BLACKBIRD-RCV v1.05.0 0029
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Date
Mon, 16 Dec 2019 09:47:17 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.05.0 0029
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
Mon, 16 Dec 2019 09:47:17 GMT
X-Powered-By
BLACKBIRD-RCV v1.05.0 0029
Transfer-Encoding
chunked
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Connection
keep-alive
Pragma
no-cache
Last-Modified
Mon, 16 Dec 2019 09:47:17 GMT
Server
nginx
Location
/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0010&i2=0010c551d432ed8b95df752a5&ep=1600760855&vr=415&id=sxnjyl&i3=0010c551d432ed8b95df752a5%3A1607939237464%3A1576489637464%3A.tvtoday.de%3A1%3Atvspielf%3AD%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday%3Anoevent%3A1576489637464&n1=1&dntt=0&lt=1576489637465&ev=&cs=m6w4ut&mo=1&sr=71
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, must-revalidate
Access-Control-Allow-Credentials
true
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Expires
Sun, 16 Dec 2018 09:47:17 GMT
truncated
/
43 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277

Request headers

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

Response headers

Content-Type
image/gif
roboto-v18-latin-700.woff2
www.tvtoday.de/bundles/frontend/fonts/
15 KB
15 KB
Font
General
Full URL
https://www.tvtoday.de/bundles/frontend/fonts/roboto-v18-latin-700.woff2
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/js/46cfa08.js?10.003
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
1d5b7c64458f4af91dcfee0354be47adde1f739b5aded03a7ab6068a1bb6ca97
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:33:12 GMT
content-encoding
gzip
last-modified
Wed, 30 Jan 2019 08:45:19 GMT
age
845
etag
"3c4c-580a8ee00bd67-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
x-varnish
139881841 240603801
status
200
cache-control
public, max-age=31536000
strict-transport-security
max-age=15768000
accept-ranges
bytes
access-control-allow-origin
*
ima3.js
s0.2mdn.net/instream/html5/
267 KB
91 KB
Script
General
Full URL
https://s0.2mdn.net/instream/html5/ima3.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/js/tfm.videopkg.min.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::2006 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
8269a7587721b8aae1e6c9eed81cfdfbf197c1cea2038b3016b2ebd0fff7a742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:47:17 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
92688
x-xss-protection
0
expires
Mon, 16 Dec 2019 09:47:17 GMT
live-tv-small.png
www.tvtoday.de/bundles/frontend/images/
17 KB
17 KB
Image
General
Full URL
https://www.tvtoday.de/bundles/frontend/images/live-tv-small.png
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/js/tfm.videopkg.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
7d2f2875cdf32b9c50856aba00226b12b9b0c6a6af0862d734636b53a622375d
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:36:14 GMT
last-modified
Thu, 18 Jul 2019 12:45:49 GMT
age
662
etag
"42fc-58df3fd40da22"
vary
X-Forwarded-Proto,x-requested-with
content-type
image/png
status
200
cache-control
public, max-age=1209600
x-varnish
239774922 241338437
strict-transport-security
max-age=15768000
accept-ranges
bytes
truncated
/
698 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
d7414b3a412e2829b3c6a846fbf3038ee39bb472d77fba00a79632d41c2fea88

Request headers

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

Response headers

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

Request headers

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

Response headers

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

Request headers

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

Response headers

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

Request headers

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

Response headers

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

Request headers

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

Response headers

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

Request headers

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

Response headers

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

Request headers

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

Response headers

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

Request headers

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

Response headers

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

Request headers

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

Response headers

Content-Type
image/svg+xml
roboto-condensed-v16-latin-700.woff2
www.tvtoday.de/bundles/frontend/fonts/
15 KB
15 KB
Font
General
Full URL
https://www.tvtoday.de/bundles/frontend/fonts/roboto-condensed-v16-latin-700.woff2
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
30da2bff9b5cb0f94b04c9c21ec607dfb1b46cf706802a093185036b333f89e6
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:43:47 GMT
content-encoding
gzip
last-modified
Wed, 30 Jan 2019 08:45:19 GMT
age
210
etag
"3b94-580a8ee00a5f0-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
x-varnish
239774923 238386434
status
200
cache-control
max-age=31536000, public
strict-transport-security
max-age=15768000
accept-ranges
bytes
access-control-allow-origin
*
collect
stats.g.doubleclick.net/r/
Redirect Chain
  • https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=649777265&t=pageview&_s=1&dl=https%3A%2F%2Fwww.tvtoday.de%2F&ul=en-us&de=UTF-8&dt=Das%20aktuelle%20Fernsehprogramm%20im%20%C3%9Cberblic...
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1909021-1&cid=927227706.1576489638&jid=2060850165&_gid=690815348.1576489638&gjid=1312349476&_v=j79&z=1796570164
35 B
102 B
Image
General
Full URL
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1909021-1&cid=927227706.1576489638&jid=2060850165&_gid=690815348.1576489638&gjid=1312349476&_v=j79&z=1796570164
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:400c:c00::9c Brussels, Belgium, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

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

Response headers

pragma
no-cache
strict-transport-security
max-age=10886400; includeSubDomains; preload
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
access-control-allow-origin
*
date
Mon, 16 Dec 2019 09:47:17 GMT
content-type
image/gif
status
200
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT

Redirect headers

pragma
no-cache
date
Mon, 16 Dec 2019 09:47:17 GMT
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
access-control-allow-origin
*
location
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1909021-1&cid=927227706.1576489638&jid=2060850165&_gid=690815348.1576489638&gjid=1312349476&_v=j79&z=1796570164
content-type
text/html; charset=UTF-8
status
302
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
417
expires
Fri, 01 Jan 1990 00:00:00 GMT
truncated
/
1 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
9ce49a6036072f670176d60dfcd39ccfb8458af1f72af91cf028ef7d8c81570a

Request headers

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

Response headers

Content-Type
image/svg+xml
ast.js
acdn.adnxs.com/ast/
92 KB
32 KB
Script
General
Full URL
https://acdn.adnxs.com/ast/ast.js
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.210.249.83 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-210-249-83.deploy.static.akamaitechnologies.com
Software
nginx/1.13.10 /
Resource Hash
be69d76ceaa48339ebdbe0cca8b8d4c79bd4fde5dd10010f757726cfe01426b9

Request headers

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

Response headers

Date
Mon, 16 Dec 2019 09:47:17 GMT
Content-Encoding
gzip
Last-Modified
Tue, 10 Dec 2019 14:55:52 GMT
Server
nginx/1.13.10
ETag
"5defb1f8-171b7"
Vary
Accept-Encoding
Content-Type
application/javascript
Access-Control-Allow-Origin
*
Cache-Control
max-age=86402
Connection
keep-alive
Content-Length
31880
Expires
Tue, 17 Dec 2019 09:47:19 GMT
gpt.js
securepubads.g.doubleclick.net/tag/js/
51 KB
16 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/tag/js/gpt.js
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.130 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s46-in-f2.1e100.net
Software
sffe /
Resource Hash
a82712e7f23f58c7f3c38944001a3fd5f077e89de326b729da4c145ff033b232
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:47:17 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"368 / 650 of 1000 / last-modified: 1576171782"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
15846
x-xss-protection
0
expires
Mon, 16 Dec 2019 09:47:17 GMT
apstag.js
c.amazon-adsystem.com/aax2/
87 KB
25 KB
Script
General
Full URL
https://c.amazon-adsystem.com/aax2/apstag.js
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.225.86.250 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-225-86-250.fra2.r.cloudfront.net
Software
Server /
Resource Hash
0f144f16507d02eabc67a131e4d54ac36266dcfe3dac263a6971265371eff7b9

Request headers

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

Response headers

date
Sun, 15 Dec 2019 16:30:19 GMT
content-encoding
gzip
server
Server
age
62218
etag
6bed68e25cc35021d570267b56047ef8
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
public, max-age=86400
x-amz-cf-pop
FRA2-C2
accept-ranges
bytes
x-amz-cf-id
sVC9ZoZWRU3AUmpwvDri84Tlkdfjcs420KGpd1M-3I8zA8VkshTz1g==
via
1.1 e56e6732f380db727425bac2d6158761.cloudfront.net (CloudFront)
bfa_infolayer_styles.css
a.bf-ad.net/packages/info-layer/tvtoday/
2 KB
717 B
Stylesheet
General
Full URL
https://a.bf-ad.net/packages/info-layer/tvtoday/bfa_infolayer_styles.css
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:6c00:29d::6828 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
1556e80f2449b238ae34da15f72fb533d48e51c91463d21e0f8ac92d1687dff6

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:47:17 GMT
content-encoding
gzip
last-modified
Wed, 05 Sep 2018 14:03:35 GMT
server
Apache
etag
"eb9353742de2bca13880fbf7eb188773:1536156216"
vary
Accept-Encoding
content-type
text/css
status
200
cache-control
max-age=900
accept-ranges
bytes
content-length
513
expires
Mon, 16 Dec 2019 10:02:17 GMT
bfa_infolayer.js
a.bf-ad.net/packages/info-layer/tvtoday/
8 KB
2 KB
Script
General
Full URL
https://a.bf-ad.net/packages/info-layer/tvtoday/bfa_infolayer.js
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:6c00:29d::6828 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
55939c2de2394be59e2e002dabd0d212b5d90e4603db6806bffb9c7a0ea3aef8

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:47:17 GMT
content-encoding
gzip
last-modified
Thu, 10 Oct 2019 10:03:43 GMT
server
Apache
etag
"8a25dde424a99a2f5103048a5f1906c9:1570701825"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=900
accept-ranges
bytes
content-length
2231
expires
Mon, 16 Dec 2019 10:02:17 GMT
default.js
ups.xplosion.de/loader/91628/
2 KB
2 KB
Script
General
Full URL
https://ups.xplosion.de/loader/91628/default.js?xplrdir=1
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.252.231.90 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-252-231-90.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
7b41fff425469bb0aeb49e3d3121869a67d0abc5a4066ffc15b13496337d34e8

Request headers

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

Response headers

status
200
date
Mon, 16 Dec 2019 09:47:17 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
1687
content-type
text/javascript
publishertag.js
static.criteo.net/js/ld/
87 KB
27 KB
Script
General
Full URL
https://static.criteo.net/js/ld/publishertag.js
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
178.250.2.130 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
nginx /
Resource Hash
30524ff4955653cc592d92ff6faff230d201fe166242858d5aa5027e9f1fe429

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:47:17 GMT
content-encoding
gzip
last-modified
Tue, 05 Nov 2019 14:27:47 GMT
server
nginx
access-control-allow-origin
*
etag
W/"5dc186e3-15c08"
content-type
text/javascript
status
200
cache-control
max-age=86400, public
timing-allow-origin
*
expires
Tue, 17 Dec 2019 09:47:17 GMT
neu-tvt-titel-neutral-11-2017,188926_issuemainimage_20.jpg
www.tvtoday.de/files/images/201711/2/
15 KB
15 KB
Image
General
Full URL
https://www.tvtoday.de/files/images/201711/2/neu-tvt-titel-neutral-11-2017,188926_issuemainimage_20.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
a1d3db8192b827a383ef379c9098656bc3c1d8fc7f7a4f92dbfd6d53ccc98378
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:40:10 GMT
last-modified
Fri, 24 Nov 2017 21:12:05 GMT
age
427
etag
"3a72-55ec101392411"
vary
X-Forwarded-Proto,x-requested-with
content-type
image/jpeg
status
200
cache-control
public, max-age=1209600
x-varnish
239774926 237025555
strict-transport-security
max-age=15768000
accept-ranges
bytes
tv-today-scheine-75euro-mit-stoerer,206997_issueproductimage_100.jpg
www.tvtoday.de/files/images/201901/2/
4 KB
4 KB
Image
General
Full URL
https://www.tvtoday.de/files/images/201901/2/tv-today-scheine-75euro-mit-stoerer,206997_issueproductimage_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
331b05ab63a9fc51ff711345c41007cd9e450ab4ba93d623d2455df04878e5b9
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:43:16 GMT
last-modified
Tue, 29 Jan 2019 11:05:01 GMT
age
241
etag
"1013-58096c3c68a2d"
vary
X-Forwarded-Proto,x-requested-with
content-type
image/jpeg
status
200
cache-control
public, max-age=1209600
x-varnish
231957161 241963215
strict-transport-security
max-age=15768000
accept-ranges
bytes
data
emq.bf-tools.net/
103 B
299 B
XHR
General
Full URL
https://emq.bf-tools.net/data?url=https://www.tvtoday.de/&referrer=&ua_lang=en-US&user_agent=Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36&sid=91628
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:6c00:29d::6828 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx/1.12.1 /
Resource Hash
86e336d7c11289fcf362377a925930189115a6548830833846316370bdbb36de

Request headers

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

Response headers

Access-Control-Allow-Origin
*
Date
Mon, 16 Dec 2019 09:47:18 GMT
Server
nginx/1.12.1
Connection
keep-alive
Content-Length
103
Content-Type
text/plain; charset=utf-8
truncated
/
298 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7a2e7a80d7542d5e8ae0beeb3abd52a5f0346c99cca5ffa4c0f222699abfe64d

Request headers

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

Response headers

Content-Type
image/svg+xml
2b652e5.js
www.tvtoday.de/js/
25 KB
8 KB
Script
General
Full URL
https://www.tvtoday.de/js/2b652e5.js?10.003
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
22f138e2189f2659b3f920aaf4cb81963493984091199acf38dbb3db7be3235d
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:25:08 GMT
content-encoding
gzip
last-modified
Thu, 15 Nov 2018 08:42:47 GMT
age
1328
etag
"6449-57ab008ffd773-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
content-type
application/javascript
status
200
cache-control
public, max-age=1209600
x-varnish
239774927 232667678
strict-transport-security
max-age=15768000
accept-ranges
bytes
sCG6u65ZJ8xPxpTPi.js
static.cleverpush.com/channel/loader/
354 KB
72 KB
Script
General
Full URL
https://static.cleverpush.com/channel/loader/sCG6u65ZJ8xPxpTPi.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:30::681b:a280 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
5b67c887d3a441917d165b32455563748c8297b897a39c2ccc7ea473000972e2

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:47:17 GMT
content-encoding
br
cf-cache-status
HIT
age
12737
cf-polished
origSize=362411
status
200
alt-svc
h3-24=":443"; ma=86400, h3-23=":443"; ma=86400
x-amz-request-id
A462193D75C86511
x-amz-id-2
XMLTOH0gHB6EI4G5eDmJSDWr7j/sDs3nso4gSsATSahOUzdGtzQBy/uqSmgLBcvch1LCV+k9uGU=
last-modified
Mon, 16 Dec 2019 00:05:46 GMT
server
cloudflare
etag
W/"73e9d5ff233cca234022ab7df1753092"
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
application/javascript
cache-control
public, max-age=21600
cf-ray
545fbc2d0a4859c4-VIE
cf-bgj
minify
aps_csm.js
c.amazon-adsystem.com/bao-csm/aps-comm/
6 KB
3 KB
XHR
General
Full URL
https://c.amazon-adsystem.com/bao-csm/aps-comm/aps_csm.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.225.86.250 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-225-86-250.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844

Request headers

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

Response headers

date
Sun, 15 Dec 2019 13:54:28 GMT
content-encoding
gzip
vary
Origin
age
71570
x-cache
Hit from cloudfront
status
200
access-control-allow-origin
*
last-modified
Fri, 01 Nov 2019 13:46:13 GMT
server
AmazonS3
access-control-max-age
3000
access-control-allow-methods
GET
content-type
application/javascript
via
1.1 216b2e0a8a27f8fca1b540a1c4ea6922.cloudfront.net (CloudFront)
cache-control
public, max-age=86400
x-amz-cf-pop
FRA2-C2
x-amz-cf-id
LhyNFWnv3YCjwuM_Dj5D-0HpV8vuZhH1j-IshiZRbR_AIEHLq_rkaw==
integrator.js
adservice.google.de/adsid/
109 B
171 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.tvtoday.de
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:820::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:47:17 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
104
x-xss-protection
0
integrator.js
adservice.google.com/adsid/
109 B
171 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.tvtoday.de
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:808::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:47:17 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
104
x-xss-protection
0
pubads_impl_2019121002.js
securepubads.g.doubleclick.net/gpt/
163 KB
60 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019121002.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.130 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s46-in-f2.1e100.net
Software
sffe /
Resource Hash
216fd62bccc74ef4e4d35292cd4874e7072a4fb30685afb6235d894a3ec1a2df
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:47:17 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Tue, 10 Dec 2019 17:29:18 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
60922
x-xss-protection
0
expires
Mon, 16 Dec 2019 09:47:17 GMT
p.min.js
cdn.emetriq.de/adp/profiling/0.2.18/
5 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.2.18/p.min.js
Requested by
Host: ups.xplosion.de
URL: https://ups.xplosion.de/loader/91628/default.js?xplrdir=1
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2156:4600:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec

Request headers

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

Response headers

date
Wed, 25 Sep 2019 11:24:11 GMT
content-encoding
gzip
last-modified
Wed, 25 Sep 2019 11:08:07 GMT
server
AmazonS3
age
7078987
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
fTNde0ZXM.BzDu33z6pL5eJgKGxahMla
status
200
cache-control
max-age=31536000, no-transform, public
x-amz-cf-pop
FRA50-C1
content-type
application/javascript; charset=utf-8
x-amz-cf-id
sAIObPGmUgogZ7BQ6-0opIfu0vE0xj8a7GvIOF1NziCwOBHr2utt7g==
via
1.1 baaf38f0a0d54e4834bf934fa5189ceb.cloudfront.net (CloudFront)
;ord=1576489637960
ad.doubleclick.net/ddm/ad/daaw/liykarg/nzna/ybpclr/gsvixjkhvsm/
43 B
205 B
Image
General
Full URL
https://ad.doubleclick.net/ddm/ad/daaw/liykarg/nzna/ybpclr/gsvixjkhvsm/;ord=1576489637960?
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.23.166 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f166.1e100.net
Software
cafe /
Resource Hash
9c41ba408efaf3a7a36099370bc814e38b0afd42229fa9e0e6040740620c85c0
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

pragma
no-cache
date
Mon, 16 Dec 2019 09:47:17 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
43
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
config.js
www.tvtoday.de/app/js/
735 B
546 B
Script
General
Full URL
https://www.tvtoday.de/app/js/config.js?10.003
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
3ee079327ca98fa867616dbc2388dda9b94848b8fe7c945ff97374f29c3a219d
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:25:37 GMT
content-encoding
gzip
last-modified
Wed, 30 Jan 2019 08:45:24 GMT
age
1300
etag
"2df-580a8ee544fb4-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
content-type
application/javascript
status
200
cache-control
public, max-age=1209600
x-varnish
240657690 237368015
strict-transport-security
max-age=15768000
accept-ranges
bytes
jkfUdgNJpkD2dCB-packen-there-86,173486_artikel_100.jpg
images.tvtoday.de/files/images/213001/4/
68 B
278 B
Image
General
Full URL
https://images.tvtoday.de/files/images/213001/4/jkfUdgNJpkD2dCB-packen-there-86,173486_artikel_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

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

Response headers

pragma
no-cache
date
Mon, 16 Dec 2019 09:47:17 GMT
last-modified
Mon, 16 Dec 2019 09:47:17 GMT
age
0
content-type
image/png
status
200
cache-control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private
x-varnish
237599727
accept-ranges
bytes
expires
0
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=Das%20aktuelle%20Fernsehprogramm%20im%20%C3%9Cberblick%20von%20TV%20TODAY&hostSiteUrl=https%3A%2F%2Fwww.tvtoday.de%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-1&screen=1200x1600&event_id=page_view&_sid=91628&_ver=0.2.18&_seg=jsonp&_=620079053225
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.18/p.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.252.231.90 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-252-231-90.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
b3c189aaaed7f2c4888bc904fc4e3f3283644917bb521666856002dd296ccc6b

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:47:18 GMT
content-encoding
gzip
access-control-allow-origin
*
vary
accept-encoding
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
status
200
cache-control
must-revalidate,no-cache,no-store
content-type
text/javascript
main.js
www.tvtoday.de/app/js/
314 KB
98 KB
Script
General
Full URL
https://www.tvtoday.de/app/js/main.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
f1fa81246afeff0e57b9fa2088638468c7a630ff6e7b48a87bde96098afcf100
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:07:58 GMT
content-encoding
gzip
last-modified
Mon, 09 Dec 2019 07:27:56 GMT
age
2359
etag
"4e685-59940559805d6-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
content-type
application/javascript
status
200
cache-control
public, max-age=1209600
x-varnish
237599729 236561626
strict-transport-security
max-age=15768000
accept-ranges
bytes
jkfUdgNJpkD2dCBrqXdJ78TNR97ZWfqdCi01VuvT1TXZrFK5hUH6d3wMFfNuFPPLun2.png
uobsoe.com/img/ad-time/
68 B
245 B
Image
General
Full URL
https://uobsoe.com/img/ad-time/jkfUdgNJpkD2dCBrqXdJ78TNR97ZWfqdCi01VuvT1TXZrFK5hUH6d3wMFfNuFPPLun2.png
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.25.87 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
api.addefend.com
Software
/ HHVM/3.23.2
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

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

Response headers

Date
Mon, 16 Dec 2019 09:47:18 GMT
Cache-Control
no-cache
Connection
keep-alive
X-Powered-By
HHVM/3.23.2
Content-Length
68
Content-Type
image/png
adrtxtag.min.js
cdn.adrtx.net/
840 B
849 B
Script
General
Full URL
https://cdn.adrtx.net/adrtxtag.min.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
108.128.219.65 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-108-128-219-65.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.11 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

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

Response headers

Date
Sun, 15 Dec 2019 08:11:54 GMT
Content-Encoding
gzip
Last-Modified
Sat, 14 Dec 2019 08:13:36 GMT
Server
akka-http/10.1.11
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
471 B
Image
General
Full URL
https://p.yieldlab.net/m?dm_id=23666&ext_id=BSaFWD_3ESwsEifAWSUkWsfABifABSfABSfABiBABifABfrr&ddata_seg=e0
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
85.114.136.51 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
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.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Mon, 16 Dec 2019 09:47:18 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
Sun, 15 Dec 2019 09:47:18 GMT
a.js
d.df-srv.de/match/
0
58 B
Image
General
Full URL
https://d.df-srv.de/match/a.js?pid=42
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
93.190.69.242 , Germany, ASN47215 (FILOO-ASN Rhedaer Straße 25, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

status
200
date
Mon, 16 Dec 2019 09:47:18 GMT
x-powered-by
Express
content-length
0
usersync
uss.xplosion.de/
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFWD_3ESwsEifAWSUkWsfABifABSfABSfABiBABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4212491829807157065
42 B
661 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=4212491829807157065
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.252.231.90 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-252-231-90.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

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

Response headers

status
200
date
Mon, 16 Dec 2019 09:47:18 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
42
content-type
image/gif

Redirect headers

pragma
no-cache
date
Mon, 16 Dec 2019 09:47:18 GMT
server
nginx
location
https://uss.xplosion.de/usersync?sid=65966&fpid=4212491829807157065
p3p
CP="CAO PSAa PSDa IVAa IVDa OUR UNI COM NAV"
status
307
cache-control
no-store, no-cache, must-revalidate
access-control-allow-credentials
true
content-type
text/html; charset=utf-8
content-length
107
expires
0
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
703 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.217.46.214 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_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.tvtoday.de/
Origin
https://www.tvtoday.de

Response headers

Date
Mon, 16 Dec 2019 09:47:19 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
75EAA377A995C582
Content-Length
53
x-amz-id-2
nHTIsp7a7AIqaQySjwtwcIqDkkC9v56I1tVAWfmolrkA8FGnahl9O4OqCbPcbtEfhC0Q/bcAWKE=
Last-Modified
Mon, 16 Dec 2019 05:12:07 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://www.tvtoday.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Accept-Ranges
bytes
Expires
0
homad_clienConfig.json
www.tvtoday.de/js/
291 B
413 B
XHR
General
Full URL
https://www.tvtoday.de/js/homad_clienConfig.json
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
471b15c341415f023cd5387eb0bd4626883d010312f7b2a12f184613bda3f7df
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 07:52:48 GMT
content-encoding
gzip
last-modified
Mon, 01 Apr 2019 12:21:25 GMT
age
6869
etag
"123-585770f266684-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
content-type
application/json
status
200
cache-control
public, max-age=7200
x-varnish
237599730 223967553
strict-transport-security
max-age=15768000
accept-ranges
bytes
5de7da6c8189654e205c5f74_780.jpg
images.tvtoday.de/itv/2019-12-16/
38 KB
39 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-12-16/5de7da6c8189654e205c5f74_780.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
b8243d311999104b3e32ed10aa49a352cb1fb0582b52a5bbcb403e24dcba7b97
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:15:44 GMT
last-modified
Fri, 13 Dec 2019 03:08:59 GMT
age
1893
etag
"99cc-5998d2ee40a25"
vary
X-Forwarded-Proto,x-requested-with
content-type
image/jpeg
status
200
cache-control
public, max-age=1209600
x-varnish
237599731 240137236
strict-transport-security
max-age=15768000
accept-ranges
bytes
5ddba67981896505dcb8dc8b_159.webp
images.tvtoday.de/itv/2019-12-16/
5 KB
5 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-12-16/5ddba67981896505dcb8dc8b_159.webp
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
cb1fc22564d89d69f593dd78451b9a636b56bed60cdebd96a217383af1c359cd
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 08:25:30 GMT
content-encoding
gzip
last-modified
Mon, 02 Dec 2019 10:34:52 GMT
age
4907
etag
"14c6-598b621358f58-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
x-varnish
240657691 231962469
status
200
cache-control
public, max-age=7200
strict-transport-security
max-age=15768000
accept-ranges
bytes
54aeb8f1e4b0c0147075927b_159.webp
images.tvtoday.de/itv/2019-12-16/
6 KB
6 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-12-16/54aeb8f1e4b0c0147075927b_159.webp
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
a04d89285d02f2ee80ff43dd68bf87758e896cb3cd6765bfd7402cef3c29863a
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:21:12 GMT
content-encoding
gzip
last-modified
Mon, 02 Dec 2019 10:34:28 GMT
age
1565
etag
"1800-598b61fc783a4-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
x-varnish
239328566 241339925
status
200
cache-control
public, max-age=7200
strict-transport-security
max-age=15768000
accept-ranges
bytes
news,224391_tl_100.jpg
images.tvtoday.de/files/images/201912/1/
37 KB
38 KB
Image
General
Full URL
https://images.tvtoday.de/files/images/201912/1/news,224391_tl_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
61707b28661f63dcf759e2a0f72e47463b99a8512410f8b79b7e1d23d4a4384c
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:30:19 GMT
last-modified
Fri, 06 Dec 2019 12:28:16 GMT
age
1018
etag
"9495-599082e2c326f"
vary
X-Forwarded-Proto,x-requested-with
content-type
image/jpeg
status
200
cache-control
public, max-age=1209600
x-varnish
241569640 237260508
strict-transport-security
max-age=15768000
accept-ranges
bytes
config.json
hgc-cf-cache-1.svonm.com/www.tvtoday.de/
457 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.tvtoday.de/config.json
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.101.112 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-101-112.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
e036552afb7291b3ae838e7b683bb4c71a06f893cff2b02cb293e2615a55444e

Request headers

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

Response headers

Date
Mon, 16 Dec 2019 09:46:52 GMT
Via
1.1 1d87c34bb2f20fda8e0841bc33179769.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
27
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
457
Last-Modified
Fri, 13 Sep 2019 08:35:06 GMT
Server
AmazonS3
ETag
"df5f3d3f0e167e55a1dc15a4d87983e4"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
X-Amz-Cf-Pop
FRA50-C1
Accept-Ranges
bytes
X-Amz-Cf-Id
QMIMN4XDIQRmPMh5E98NIWEZMIHZkwSZrOs10PwY8FvqbC777qQFZg==
Expires
0
StickySearchController.js
www.tvtoday.de/app/js/components/header/
404 B
523 B
Script
General
Full URL
https://www.tvtoday.de/app/js/components/header/StickySearchController.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
ddfa922e4f9fcd81cf6ab8c51707fe681cf1001ad918e793eabeea5d8b2c6967
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:04:42 GMT
content-encoding
gzip
last-modified
Thu, 20 Dec 2018 07:17:40 GMT
age
2555
etag
"194-57d6eed0ecd72-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
content-type
application/javascript
status
200
cache-control
public, max-age=1209600
x-varnish
241569641 112175080
strict-transport-security
max-age=15768000
accept-ranges
bytes
/
ssl.1.damoh.tvtoday.de/1230a7b3bc053e6d83ec58d2cb43129e8e1f6f51/
195 KB
58 KB
XHR
General
Full URL
https://ssl.1.damoh.tvtoday.de/1230a7b3bc053e6d83ec58d2cb43129e8e1f6f51/
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
144.76.165.195 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.195.165.76.144.clients.your-server.de
Software
AmazonS3 /
Resource Hash
e7d741d34398d228b877596588051702f9779ce5c65c98f8abc01e82975a012a

Request headers

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

Response headers

Date
Mon, 16 Dec 2019 09:47:18 GMT
Content-Encoding
gzip
Connection
keep-alive
Content-Length
58537
Last-Modified
Tue, 10 Dec 2019 10:44:16 GMT
Server
AmazonS3
Vary
Accept-Encoding, Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/javascript; charset=UTF-8
Access-Control-Allow-Origin
https://www.tvtoday.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
Access-Control-Allow-Credentials
true
X-Homad-Instance
de19-homad-4
X-Homad-Url
https://hgc-cf-cache-1.svonm.com/hd-main.js
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
activation
adstax-match.adrtx.net/ Frame D0E8
0
0
Document
General
Full URL
https://adstax-match.adrtx.net/activation?receiverId=adaud
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
108.128.71.27 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-108-128-71-27.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.11 /
Resource Hash

Request headers

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

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Mon, 16 Dec 2019 09:47:18 GMT
P3P
CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
Server
akka-http/10.1.11
X-Error-Reason
Missing UserId
Content-Length
39
Connection
keep-alive
5de119438189654243dde09d_159.webp
images.tvtoday.de/itv/2019-12-16/
2 KB
2 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-12-16/5de119438189654243dde09d_159.webp
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
1edf1b134be52f97bb2e7113a2ff33835364239a8722bcd274312d3337364312
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:22:53 GMT
content-encoding
gzip
last-modified
Mon, 02 Dec 2019 11:32:32 GMT
age
1464
etag
"7f2-598b6ef77060b-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
x-varnish
240657699 238657312
status
200
cache-control
public, max-age=7200
strict-transport-security
max-age=15768000
accept-ranges
bytes
u.webp
www.tvtoday.de/bundles/frontend/images/default-images/
23 KB
23 KB
Image
General
Full URL
https://www.tvtoday.de/bundles/frontend/images/default-images/u.webp?10.003
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
846a580f99df0ce08977e665d4288d32c1ab4d6c6e0e0ce62ace41996b9457bb
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:25:40 GMT
content-encoding
gzip
last-modified
Wed, 23 Oct 2019 06:19:01 GMT
age
1297
etag
"5b7c-5958de499a1f4-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
x-varnish
218537226 238501547
status
200
cache-control
public, max-age=7200
strict-transport-security
max-age=15768000
accept-ranges
bytes
574835e2f033af3e8fa8b17e_159.webp
images.tvtoday.de/itv/2019-12-16/
6 KB
6 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-12-16/574835e2f033af3e8fa8b17e_159.webp
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
8039ea769adb8aa78916156b4270035b4b24c079f2312c302c83d6c4bc18a521
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 08:22:25 GMT
content-encoding
gzip
last-modified
Mon, 02 Dec 2019 11:32:34 GMT
age
5093
etag
"16ae-598b6ef962e89-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
x-varnish
237599737 241181188
status
200
cache-control
public, max-age=7200
strict-transport-security
max-age=15768000
accept-ranges
bytes
5b83c32a8189652d08e8b4b2_159.webp
images.tvtoday.de/itv/2019-12-16/
4 KB
4 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-12-16/5b83c32a8189652d08e8b4b2_159.webp
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
b7ead0edd75a003c2025421abe7409a0c6f3d28b155142e73179233a6c39c9d7
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 08:17:26 GMT
content-encoding
gzip
last-modified
Mon, 02 Dec 2019 10:28:56 GMT
age
5391
etag
"f6c-598b60bffd3af-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
x-varnish
229669270 239870399
status
200
cache-control
public, max-age=7200
strict-transport-security
max-age=15768000
accept-ranges
bytes
54c656c4e4b08bb8dcadd052_159.webp
images.tvtoday.de/itv/2019-12-16/
3 KB
3 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-12-16/54c656c4e4b08bb8dcadd052_159.webp
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
efaaf412e172f2c502b7570e7cb0cca95f05218dc58d3834ef517218224fa7eb
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:45:56 GMT
content-encoding
gzip
last-modified
Mon, 02 Dec 2019 11:32:20 GMT
age
81
etag
"c86-598b6eec4d81b-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
x-varnish
241405538 241404482
status
200
cache-control
public, max-age=7200
strict-transport-security
max-age=15768000
accept-ranges
bytes
truncated
/
195 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
e7d741d34398d228b877596588051702f9779ce5c65c98f8abc01e82975a012a

Request headers

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

Response headers

Content-Type
text/javascript
abbKH0qVSQiMXowJjEieicwWjNYTEF8fn4sMisxeiYhWE1MUkF8fS1YI3wpMCJBLyIjIi8vIi9YQTAiMDAmLCt6LyIjIi8vIi9YQTAiMDAmLCt6KiIwMHwkInp-LDIrMVhLQSczWE1JS0lMTFBQQX4hflg0JishLDRJejAtekkqMCRJeiYrMSIvK3wpSX4hfkxBJS...
mms.tvtoday.de/
16 KB
17 KB
Script
General
Full URL
https://mms.tvtoday.de/abbKH0qVSQiMXowJjEieicwWjNYTEF8fn4sMisxeiYhWE1MUkF8fS1YI3wpMCJBLyIjIi8vIi9YQTAiMDAmLCt6LyIjIi8vIi9YQTAiMDAmLCt6KiIwMHwkInp-LDIrMVhLQSczWE1JS0lMTFBQQX4hflg0JishLDRJejAtekkqMCRJeiYrMSIvK3wpSX4hfkxBJS8iI1glMTEtMEBOXEBNYUBNYTQ0NEkxMzEsIXw2SSEiQE1hQX4sKzAiKzFwcGRfWDIrISIjJisiIUExQFBdKCI2QFBfWDN8KTIi
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.157.148.50 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-157-148-50.eu-central-1.compute.amazonaws.com
Software
Jetty(9.4.2.v20170220) /
Resource Hash
690d7246feaf6fe5da94c9567722d1bcad401dc61d96dad7e5d74a974345ca43

Request headers

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

Response headers

pragma
no-cache
date
Mon, 16 Dec 2019 09:47:18 GMT
x-sp-mms-node
mms-anz.node.fra.consul
server
Jetty(9.4.2.v20170220)
access-control-allow-methods
GET
content-type
application/javascript
status
200
cache-control
no-store, no-cache, private
access-control-allow-credentials
true
x-sp-mms-env
1
expires
Sat, 15 Nov 2008 16:00:00 GMT
bcn
www.summerhamster.com/
43 B
181 B
Image
General
Full URL
https://www.summerhamster.com/bcn?fe=1576489638708&y=2.0.1155&elg=547190152&flg=217&x=zzz.wywrgdb.gh%2F&vqwo=1&deo=0&g0=vg%3A%3Aer%2Cxd%3A%3Aqexd%3A%3Aqsu%7Cvg%3A%3Ask%3A%3Aqsk%3A%3Aqsu%7Cgisl%3A%3Alp%2Clqi%2Cqh%3A%3Aqoe%3A%3Aqsu%3A%3Axuo%3D%2F%2Fdg.grxeohfolfn.qhw%2Fggp%2Fdg%2Fgddz%2Folbnduj%2Fqcqd%2Fbesfou%2Fjvylamnkyvp%2F%3Brug%3D1576489637960%3F%7Cjdg%3A%3Aho%2Ckl%2Cklg%2Clqi%3A%3Aqhk%3A%3Aqsu%3A%3Avho%3D.jrrjohDg%7Cjdg%3A%3Aho%2Ckl%2Cklg%2Clqi%3A%3Aqhk%3A%3Aqsu%3A%3Avho%3D.jrrjohDg%7Cddg%2Cjdg%3A%3Aho%2Ckl%2Cklg%2Clqi%3A%3Aqhk%3A%3Aqsu%3A%3Avho%3D.des_re_halvw%7Cdg%3A%3Adu%2Cklg%2Cvv%3A%3Aqvvs%3A%3Aqsu%7Cdg%3A%3Adu%2Cklg%2Cvv%3A%3Aqvvs%3A%3Aqsu%7Cdg%3A%3Adu%2Cklg%2Cvv%3A%3Aqvvs%3A%3Aqsu%7Cdg%3A%3Adu%2Cklg%2Cvv%3A%3Aqvvs%3A%3Aqsu%7Cdg%3A%3Adu%2Cklg%2Cvv%3A%3Aqvvs%3A%3Aqsu%7Csu%3A%3Aid%3A%3Aquiv%3A%3Aqsu&hu=0&g2=0%3A%3A0%3A%3A0%3A%3A0%3A%3A0
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.28.51.75 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-28-51-75.eu-central-1.compute.amazonaws.com
Software
Jetty(9.2.10.v20150310) /
Resource Hash
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7

Request headers

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

Response headers

status
200
date
Mon, 16 Dec 2019 09:47:18 GMT
server
Jetty(9.2.10.v20150310)
access-control-allow-origin
*
content-length
43
access-control-allow-methods
*
content-type
image/gif
get_site_data
mms.tvtoday.de/
19 B
251 B
XHR
General
Full URL
https://mms.tvtoday.de/get_site_data?account_id=217&href=https%3A%2F%2Fwww.tvtoday.de
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.157.148.50 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-157-148-50.eu-central-1.compute.amazonaws.com
Software
Jetty(9.4.2.v20170220) /
Resource Hash
ef9b43f42c2651dd324d95c7f388e060986793507748e775dd19a3b96c3a40fc

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:47:18 GMT
x-sp-mms-node
mms-aqs.node.fra.consul
server
Jetty(9.4.2.v20170220)
status
200
access-control-allow-methods
GET
content-type
text/plain
access-control-allow-origin
https://www.tvtoday.de
cache-control
max-age=2592000
access-control-allow-credentials
true
4176
sourcepoint.mgr.consensu.org/consent/v2/
24 B
300 B
XHR
General
Full URL
https://sourcepoint.mgr.consensu.org/consent/v2/4176
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.156.112.30 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-156-112-30.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
982d1a4e04c43018897e9d17e02a3c0cc34554e85bfd21712bd7758811731495

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:47:18 GMT
status
200
access-control-allow-methods
GET, PUT, POST, DELETE
content-type
application/json; charset=utf-8
access-control-allow-origin
https://www.tvtoday.de
cache-control
no-cache
access-control-allow-credentials
true
access-control-allow-headers
Origin, X-Requested-With, Content-Type, Accept, Authorization
content-length
24
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
703 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=2100667491
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.217.46.214 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_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.tvtoday.de/
Origin
https://www.tvtoday.de

Response headers

Date
Mon, 16 Dec 2019 09:47:19 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
8AAF68D67870D7FC
Content-Length
53
x-amz-id-2
U6MdsD8bRE/JS9BQ86ynuq6OSZCUmbcsJNDkYOXFbGw15UtnxyQGqW7I9nf5ShcYrOSvPr0dYbM=
Last-Modified
Mon, 16 Dec 2019 05:12:07 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://www.tvtoday.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Accept-Ranges
bytes
Expires
0
homad_clienConfig.json
www.tvtoday.de/js/
291 B
404 B
XHR
General
Full URL
https://www.tvtoday.de/js/homad_clienConfig.json?cache=6284018215
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
471b15c341415f023cd5387eb0bd4626883d010312f7b2a12f184613bda3f7df
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:47:18 GMT
content-encoding
gzip
last-modified
Mon, 01 Apr 2019 12:21:25 GMT
age
0
etag
"123-585770f266684-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
content-type
application/json
status
200
cache-control
public, max-age=7200
x-varnish
241513304
strict-transport-security
max-age=15768000
accept-ranges
bytes
consent-all
sourcepoint.mgr.consensu.org/consent/v2/4176/
7 KB
7 KB
XHR
General
Full URL
https://sourcepoint.mgr.consensu.org/consent/v2/4176/consent-all?withSiteActions=true
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.156.112.30 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-156-112-30.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
c1d8d0e208043b079796d6587de0a29649b78e3f106197885de7d7821f73a1d6

Request headers

Referer
https://www.tvtoday.de/
Origin
https://www.tvtoday.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Content-Type
text/plain;charset=UTF-8

Response headers

date
Mon, 16 Dec 2019 09:47:18 GMT
status
200
access-control-allow-methods
GET, PUT, POST, DELETE
content-type
application/json; charset=utf-8
access-control-allow-origin
https://www.tvtoday.de
cache-control
no-cache
access-control-allow-credentials
true
access-control-allow-headers
Origin, X-Requested-With, Content-Type, Accept, Authorization
content-length
6848
config.json
hgc-cf-cache-1.svonm.com/www.tvtoday.de/
457 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.tvtoday.de/config.json?cache=6855908045
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.101.112 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-101-112.fra50.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
e036552afb7291b3ae838e7b683bb4c71a06f893cff2b02cb293e2615a55444e

Request headers

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

Response headers

Date
Mon, 16 Dec 2019 09:47:18 GMT
Via
1.1 1d87c34bb2f20fda8e0841bc33179769.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA50-C1
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
457
Last-Modified
Fri, 13 Sep 2019 08:35:06 GMT
Server
AmazonS3
ETag
"df5f3d3f0e167e55a1dc15a4d87983e4"
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
cwahTtC9nl53qslBgymsvySlfeo4dMxQfW1HweYi0YcKHylFodK1PA==
Expires
0
/
ssl.3.damoh.tvtoday.de/5611a10e6bd3f44b02b3fe732f0c8702de80c08f/
457 B
1 KB
XHR
General
Full URL
https://ssl.3.damoh.tvtoday.de/5611a10e6bd3f44b02b3fe732f0c8702de80c08f/
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.89.206 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.206.89.251.148.clients.your-server.de
Software
AmazonS3 /
Resource Hash
e036552afb7291b3ae838e7b683bb4c71a06f893cff2b02cb293e2615a55444e

Request headers

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

Response headers

Date
Mon, 16 Dec 2019 09:47:19 GMT
Connection
keep-alive
Content-Length
457
Last-Modified
Fri, 13 Sep 2019 08:35:26 GMT
Server
AmazonS3
Etag
"df5f3d3f0e167e55a1dc15a4d87983e4"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json
Access-Control-Allow-Origin
https://www.tvtoday.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
de21-homad-4
X-Homad-Url
http://homad-global-configs-eu-fra.schneevonmorgen.com.s3.amazonaws.com/www.tvtoday.de/config.json
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Expires
0
hic_qos
ssl.1.damoh.tvtoday.de/
24 B
356 B
Script
General
Full URL
https://ssl.1.damoh.tvtoday.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIERhaEJlaURpb2NhZVBvb3M9RGFoQmVpRGlvY2FlUG9vc3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guaGZ8fCh4LmhmPTApO3guaGYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5oZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBhPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZighbSlwYyhkYSw1MCk7ZWxzZSBpZighZS5VbSl7bS5wYXVzZUJ1dHRvbnx8KG0ucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwptLnBsYXlCdXR0b258fChtLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLm11dGVCdXR0b258fChtLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnVubXV0ZUJ1dHRvbnx8KG0udW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbS5za2lwYWJsZUJ1dHRvbnx8KG0uc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTttLnNraXBCdXR0b258fChtLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobS5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTttLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYWIoYixhLFtdLGMsYyxsKX0pfWwuaShtLmdsb2JhbENvbmZpZyxtLmNsaWVudENvbmZpZyxtLnByZWNoZWNrZWQsbS5vblJlYWR5LG0ub25GYWlsdXJlLG0pO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPW0uc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHIoYyxhKXtpZihlLkxrKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobSYmbCl7KG0uYWRUYWd8fG0ucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkJjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP2wuR2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZWE7Yi54ZihjKTtiLkNuKGwpO2IuQm4obSk7Yi5xbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyKGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGZhKGMsYSl7Yy5wYXVzZSgpO2lmKGwudWIubGVuZ3RoKXt2YXIgYj1sLnViLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGc7Zz1lLktuKHsiW0xPQURTQ1JJUFRdIjplLlgoMTApLCJbVVRJTFNdIjplLlgoMTApLCJbQ0FMTEJBQ0tdIjplLlgoMTApfSk7d2luZG93W2dbIltMT0FEU0NSSVBUXSJdXT1lLnloLmJpbmQoZSk7d2luZG93W2dbIltVVElMU10iXV09bDtmb3Iod2luZG93W2dbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBnIGluIGIpbVtnXT1iW2ddO3IoYyxhKX07Zz1iLnNjcmlwdHMuc2hpZnQoKTspZS55aChnLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxsKX1lbHNlIHIoYyxhKX1lbHNlIHIoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMua2w9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBnYT1jLmtsfHxnYTtuZXcgZ2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5Maz0hMTt0aGlzLkhiPSJzZXR1cCI7dGhpcy5UYz1bXTt0aGlzLnZlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuYm4uYmluZCh0aGlzKSk7dGhpcy5vYj17fTt0aGlzLmtoPXt9O3RoaXMudWY9ITF9Yy5jaj1hO2EucHJvdG90eXBlPXtlbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy5vYil0aGlzLm9iLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy5vYlthXSsiXyIpO3JldHVybiBifSxoYzpmdW5jdGlvbigpe3RoaXMudWZ8fCh0aGlzLnVmPWUuWCgxMCkpO3JldHVybiB0aGlzLnVmfSxwYjpmdW5jdGlvbihiKXt0aGlzLm9iW2JdfHwodGhpcy5vYltiXT0wKTt0aGlzLm9iW2JdKz0xOzU8dGhpcy5vYltiXSYmIXRoaXMua2hbYl0mJih0aGlzLmtoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuZW8oKSwhMCkpfSx2ZTpmdW5jdGlvbigpe3RoaXMuWT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LEJrOmZ1bmN0aW9uKGIpe3RoaXMuWS5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGphOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxibjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5hbihiLmRhdGEpfSxhbjpmdW5jdGlvbihiKXtpZih0aGlzLlkmJnRoaXMuWS5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlkuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lciYmdGhpcy5ZLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSxxZTpmdW5jdGlvbihiLGEpe3RoaXMuWS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LEdnOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLlpnKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5BZChiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LFpnOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LHprOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuaWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGUudWwoYikpcmV0dXJuOyhhPXRoaXMuR2coYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLlkudXJsc1tiXT1hO3RoaXMuWS51cmxzW2FdPWI7dGhpcy5ZLmhvbWFkVXJsc1tiXT1hO3RoaXMuWS5vcmlnaW5hbFVybHNbYV09Yn19LHVsOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWS5ob21hZFVybHNbYl0mJihhPXRoaXMuWS5ob21hZFVybHNbYl0pO3JldHVybiBhfSxRZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkub3JpZ2luYWxVcmxzJiZ0aGlzLlkub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLlkub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0scW06ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sSGU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sWWc6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LE1uOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0semY6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy5mbChhKSxmPTA7ZjxkLmxlbmd0aDtmKyspdGhpcy5NbihiLGRbZl0ua2V5LGRbZl0udmFsdWUpfSxOazpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sZmw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZj1kPSIiLHA9MDtwPGIubGVuZ3RoO3ArKyl7dmFyIGM9YltwXS5zcGxpdCgiOiIpLApkPWNbMF0udHJpbSgpO2NbMV0mJmNbMV0udHJpbT9mPWNbMV0udHJpbSgpOmY9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGM9ZC5zcGxpdCgiLSIpLGQ9Y1swXSt0aGlzLk5rKGNbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpmfTthLnB1c2goZCl9cmV0dXJuIGF9LEdmOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LHRoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LFFlOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxmPTAscD0wLGM9MCxlPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtwPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2Y9aC5oZWlnaHQ7MD5oLnRvcCYmKGYrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHAmJihjPTEwMC9wKmQqZik7Yz49YSYmKGU9ITApO3JldHVybiBlfSxSZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlFlKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJlKGIpfS5iaW5kKHRoaXMpLDEwMCl9LE1iOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFg6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxKZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZjtpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylmPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2YsYXw9MDtyZXR1cm4gYX0sQWY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWI+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBmLHAsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbD0zMjg1Mzc3NTIwLG4sbSx1LHIsdDtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcT1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpcD1iLmNoYXJDb2RlQXQoZik8PDI0fGIuY2hhckNvZGVBdChmKzEpPDwxNnxiLmNoYXJDb2RlQXQoZisyKTw8OHxiLmNoYXJDb2RlQXQoZiszKSxxLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihxLnB1c2goZik7MTQhPXEubGVuZ3RoJTE2OylxLnB1c2goMCk7cS5wdXNoKG4+Pj4yOSk7cS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHEubGVuZ3RoO2IrPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWNbZl09cVtiKwpmXTtmb3IoZj0xNjs3OT49ZjtmKyspY1tmXT1kKGNbZi0zXV5jW2YtOF1eY1tmLTE0XV5jW2YtMTZdLDEpO3A9ZTtuPWg7bT16O3U9aztyPWw7Zm9yKGY9MDsxOT49ZjtmKyspdD1kKHAsNSkrKG4mbXx+biZ1KStyK2NbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHI9dSx1PW0sbT1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9MjA7Mzk+PWY7ZisrKXQ9ZChwLDUpKyhuXm1edSkrcitjW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxyPXUsdT1tLG09ZChuLDMwKSxuPXAscD10O2ZvcihmPTQwOzU5Pj1mO2YrKyl0PWQocCw1KSsobiZtfG4mdXxtJnUpK3IrY1tmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscj11LHU9bSxtPWQobiwzMCksbj1wLHA9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKHAsNSkrKG5ebV51KStyK2NbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHI9dSx1PW0sbT1kKG4sMzApLG49cCxwPXQ7ZT1lK3AmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eittJjQyOTQ5NjcyOTU7Cms9ayt1JjQyOTQ5NjcyOTU7bD1sK3ImNDI5NDk2NzI5NX1yZXR1cm4oYShlKSthKGgpK2EoeikrYShrKSthKGwpKS50b0xvd2VyQ2FzZSgpfSxBYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxmLHAsYyxlLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZj1iLmNoYXJDb2RlQXQoeisrKSxwPWIuY2hhckNvZGVBdCh6KyspLGM9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8cD4+NixoPXAmNjMsaXNOYU4oZik/ZT1oPTY0OmlzTmFOKHApJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sbG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxyZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxmPSExLHA9ITEsYz0hMSxlPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChtKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChyKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuYmM/ITA6ITF9Y2F0Y2godSl7fXRyeXtwPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksaz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSx6PSFoJiYhIXdpbmRvdy5TdHlsZU1lZGlhfHwtMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJFZGdlIiksbD0oa3x8cCkmJiEhd2luZG93LkNTU31jYXRjaCh0KXt9Yi5pc1BoYW50b21KUz1hO2IuaXNDaHJvbWVIZWFkbGVzcz1kO2IuaXNGaXJlZm94SGVhZGxlc3M9ZjtiLmlzT3BlcmE9cDtiLmlzRmlyZWZveD1jO2IuaXNTYWZhcmk9ZTtiLmlzSUU9aDtiLmlzRWRnZT16O2IuaXNDaHJvbWU9aztiLmlzQmxpbms9bDtyZXR1cm4gYn0sU2E6ZnVuY3Rpb24oKXt2YXIgYj17RGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sS2k6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sCmFtOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LENqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LGlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxyajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Nb2JpbGUvaSl9LFNqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhbXN1bmcvaSl8fG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NNLS9pKX0sSWs6ZnVuY3Rpb24oKXtyZXR1cm4gYi5EaSgpfHxiLktpKCl8fGIuYW0oKXx8Yi5DaigpfHxiLmlrKCl8fGIucmooKXx8Yi5TaigpfX07cmV0dXJuIG51bGwhPWIuSWsoKX0semw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGY9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fApbXTtpZigvdHJpZGVudC9pLnRlc3QoZlsxXSkpcmV0dXJuIGQ9L1xicnZbIDpdKyhcZCspL2cuZXhlYyhhKXx8W10sIklFICIrKGRbMV18fCIiKTtpZigiQ2hyb21lIj09PWZbMV0mJihkPWEubWF0Y2goL1xiKE9QUnxFZGdlKVwvKFxkKykvKSxudWxsIT1kKSlyZXR1cm4gZC5zbGljZSgxKS5qb2luKCIgIikucmVwbGFjZSgiT1BSIiwiT3BlcmEiKTtpZighYilyZXR1cm4gZlsxXTtmPWZbMl0/W2ZbMV0sZlsyXV06W25hdmlnYXRvci5hcHBOYW1lLG5hdmlnYXRvci5hcHBWZXJzaW9uLCItPyJdO251bGwhPShkPWEubWF0Y2goL3ZlcnNpb25cLyhcZCspL2kpKSYmZi5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBmLmpvaW4oIiIpfSxpYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFthW2ZdXT1iW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYVsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGIsYSxnKXthJiYoZC5xdWVyeUtleVthXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZj0wLHA9Yi5sZW5ndGg7ZjxwOysrZilhLmhhc093blByb3BlcnR5KGJbZl0pfHwoZC5wdXNoKGJbZl0pLGFbYltmXV09MSk7cmV0dXJuIGR9LERiOmZ1bmN0aW9uKGIpe2I9dGhpcy5pYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEY6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwphJiYtMTxhLmluZGV4T2YoYikmJihkPSEwKTtyZXR1cm4gZH0sTmw6ZnVuY3Rpb24oKXt2YXIgYj0iIixhPSIiLGQ9IiI7dHJ5e2I9d2luZG93LmxvY2F0aW9uLmhvc3QsYT13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChmKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5pYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LGlsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGY9W10scD0wO3A8YS5sZW5ndGg7cCsrKWRbYVtwXV09ITA7Zm9yKHA9MDtwPGIubGVuZ3RoO3ArKylkW2JbcF1dfHxmLnB1c2goYltwXSk7cmV0dXJuIGZ9LFZuOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZj0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhmPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmYpOihkPWIuc3BsaXQoIjoiKSwKZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKHApe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LFVnOmZ1bmN0aW9uKGIpe2I9TWF0aC5yb3VuZChiKTt2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy5uaShhKSsiOiIrdGhpcy5uaShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sbmk6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LHdmOmZ1bmN0aW9uKGIpe3RoaXMuSGI9Yn0sUmc6ZnVuY3Rpb24oYixhLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5IYjt0aGlzLm5lKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsCmQpKSxiLmRpc3BhdGNoRXZlbnQoZil9Y2F0Y2gocCl7dGhpcy5VbT0hMCxkb2N1bWVudC5ib2R5PyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGIud2lkdGg9MSxiLmhlaWdodD0xLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5SZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlFhKGEsZCkpO2EmJih5PWsuUWEoYixhKSk7ZiYmKHk9ay5RYSh5LGYpKTtwJiYoeT1rLlFhKHkscCkpO2MmJih5PWsuUWEoeSxjKSk7aCYmKHk9ay5RYSh5LGMpKTtlLkZjKHkpfSxkbjpmdW5jdGlvbihiKXt2YXIgYT17fTsKaWYoIWIuY29kZSlyZXR1cm4hMTtpZihiLnNwZWNpYWxfdHJhY2spYT1iO2Vsc2UgaWYoIShiLmNvZGUmJjEwMDU8PWIuY29kZSYmMTAyOT49Yi5jb2RlKXx8MTAyMz09Yi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtoYSYmKGEuc2Vzc2lvbl9pZD1oYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLk5sKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sClhuOmZ1bmN0aW9uKGIpe2Iuc3BlY2lhbF90cmFjaz0hMDtiLnNlc3Npb25faWQ9dGhpcy5oYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMubmUoYil9LG5lOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZG4oYik7aWYoYSlpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPWwuUGMoKTtsLnZhKGIsITApO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTtsLkhhKGIsZnVuY3Rpb24oKXt9KX19LAp0cmFjazpmdW5jdGlvbihiLGEsZCl7aWYoZClpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYixhLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihsLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGY9bC5QYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bC52YShmLCEwKTtmPWwudmEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bC5IYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSwKZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZj0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZj0hMSl9Y2F0Y2goYyl7fWZ8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxTZDpmdW5jdGlvbihiKXtpZighbHx8IWwuUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soa2V5LGEsZm9yY2VUcmFjayl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPWwuUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bC52YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTtsLkhhKGIpfX0sWmU6ZnVuY3Rpb24oKXtsJiZsLlM/bC5pc0VuYWJsZWQmJmwuU2soKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWmUoKX0uYmluZCh0aGlzKSwKNTAwKX0sRmU6ZnVuY3Rpb24oYixhKXtyZXR1cm4gYiYmIm9iamVjdCI9PXR5cGVvZiBiJiZiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpLmxlbmd0aD90aGlzLmxiKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSlbMF0pOiIifSxJZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbGI6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy53ZChiKToiIn0sd2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5JZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHJnOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5TZShiKXx8dGhpcy5xbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnNmJiZ3aW5kb3cuc2FuZGJveC5zZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJgooMDw9c2FuZGJveC5zZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiZXJyb3IiKXx8c2FuZGJveC5zZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0uYmluZChiKSgiRXJyb3IiKSk7aWYodGhpcy5RZyhiKSlyZXR1cm4gdGhpcy5RZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQWIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPQohMTtkPSExO2Q9dGhpcy5hYihiLGEuQWEsYyxmdW5jdGlvbihiKXtlPWIucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYSwhMCk7dHJ5e2V8fChlPWQpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChoKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWEueWQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuemsoZSxiKTtyZXR1cm4gZX0sYWI6ZnVuY3Rpb24oYixhLGQsZixjLGUsaCx5KXt2YXIgaz1lfHxsO2U9ITA7eSYmKGU9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKG0pe2MobSl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixlKTtlPWsudmEoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLkhhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTsKZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWIoYixhLGQsZixjLGssaCx5KX0uYmluZCh0aGlzKSw1MDApfSxBZDpmdW5jdGlvbihiLGEsZCxmLGMsZSxoKXt2YXIgeT0hMDtoJiYoeT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHkpLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwKbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sQW06ZnVuY3Rpb24oYixhLGQpe3RoaXMuQWQoYiwiR0VUIiwiIixmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O2lmKHRoaXMuVGMpZm9yKHZhciBjIGluIHRoaXMuVGMpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5UY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuQWIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx5aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9CmI7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkFiKGIpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5hYihiLGYuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLkFtKGYueWQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEtuOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGdwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLAphPWEucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGE9YS5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGE9YS5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGE9YS5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxKazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIisKZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGJ9LGptOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9ITE7aWYoYSlmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylpZihhW2ZdPT1iKXtkPSEwO2JyZWFrfXJldHVybiBkfSxmYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLmNqfHxQO25ldyBQO3ZhciBlPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLmJqPWE7YS5RYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuV209e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuYnA9e2NvZGU6IjEwMDIiLAp0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2Eubmw9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5mcD17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmxnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLmRnPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5pZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5tZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2Eucms9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9OwphLmdnPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2EuSG89e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkxtPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLm9sPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5lcD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5DZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLmNsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07CmEubmQ9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07YS5CYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2Eua2c9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLnRrPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5jZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2Eua2U9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubWU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnNrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsCm5hbWU6ImFkTWV0YSJ9O2EudWk9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07YS5PbT17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkJkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLk1mPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5EZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuYXA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuRG89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkVvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsCm1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuQ289e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07YS5ObT17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5ianx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLkVrfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e0plOmZ1bmN0aW9uKGIpe3ZhciBhPQowLGQsZixjO2lmKDA9PWIubGVuZ3RoKXJldHVybiBhO2Q9MDtmb3IoYz1iLmxlbmd0aDtkPGM7ZCsrKWY9Yi5jaGFyQ29kZUF0KGQpLGE9KGE8PDUpLWErZixhfD0wO3JldHVybiBNYXRoLmFicyhhKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk1hfHwieCIpfSxKbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTWF8fCJ4IikrCihuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LHVkOmZ1bmN0aW9uKGIpe2I9cGFyc2VJbnQoYik7aWYoNjU8PWImJjkwPj1ifHw5Nzw9YiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy51ZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLnVkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5KZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudWQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LHJoOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPQp0aGlzLkplKHRoaXMuSmwoKSsiIiksYj0oYisiIit0aGlzLnJldmVyc2UoYisiIikpLm1hdGNoKC8uezEsMn0vZyksYT0iIixkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy51ZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5kanx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2o9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLkdqfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmIudGVzdChnW2NdKT9mdW5jdGlvbihiLGEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZj1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5pP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuTGk9YX0pKGMpO3ZhciBLPWMuTGl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Vbnx8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuSWo9Sy5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5JYT17fTt0aGlzLkc9bnVsbDt0aGlzLlFjPTEwMDt0aGlzLk5iPTA7dGhpcy5UYT0xNTA7dGhpcy5UYj0wO3RoaXMuRG4oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLk5iPD10aGlzLlRhPyh0aGlzLk5iKyssdGhpcy5UYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5UYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHZuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmI+dGhpcy5UYT8hMDohMX0scmY6ZnVuY3Rpb24oKXt0aGlzLk5iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxEbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sSGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSWFbYS5oYSgpXT0KYTtMJiZMLnhoJiZMLmNvKGEpfSxRcDpmdW5jdGlvbigpe3JldHVybiBlLkhlKHRoaXMuSWEpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEudmlkZW9UYWcsZztmb3IoZyBpbiB0aGlzLklhKWlmKGI9PXRoaXMuSWFbZ10udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuSWFbYS5oYSgpXT8hMDohMX0sa206ZnVuY3Rpb24oYSl7YT1hLlJhKCk7Zm9yKHZhciBiIGluIHRoaXMuSWEpaWYoYS5pZD09dGhpcy5JYVtiXS5SYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxpcTpmdW5jdGlvbihhKXt0aGlzLklhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLklqfHx0OyhmdW5jdGlvbihjKXtjLktqPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5OYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5rYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuR2I9IiI7dGhpcy5JZz0hMTt0aGlzLksoKX0sClI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGc9dGhpcy5SYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZylhLmNvbnRhaW5lcklkPWcuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxLOmZ1bmN0aW9uKCl7fSxKYTpmdW5jdGlvbigpe30sUG46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LFJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sR246ZnVuY3Rpb24oYSl7dGhpcy5iZj1hfSxQcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJmfSxhZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTmI8PXRoaXMuVGEmJih0aGlzLk5iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sWGc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sSWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxrcTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5YbCgpfHx0aGlzLnZrKCk7dGhpcy5JZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApTcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSx2azpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5YKDEwKSl9LFhsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFJhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sJHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYX0sWjpmdW5jdGlvbigpe3RoaXMua2E9ITB9LFJjOmZ1bmN0aW9uKCl7dmFyIGE9bTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxXZTpmdW5jdGlvbigpe3JldHVybiExfSxZaDpmdW5jdGlvbihhKXt0aGlzLkdiPWF9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR2J9LFRoOmZ1bmN0aW9uKCl7dGhpcy5HYj1udWxsfSxVcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuR2ImJihhPSEwKTtyZXR1cm4gYX0sZnE6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5JZz0hMCl9LEVlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LExwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHE9Yy5Lanx8cTsoZnVuY3Rpb24oYyl7Yy5DaT1LLmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmFnPSIxIjt0aGlzLmJnPSIyIjt0aGlzLm5rPSIzIjt0aGlzLiRjPTA7dGhpcy5HbT0zMDt0aGlzLlliPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5uZz10aGlzLnBpPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMueGYoYSk7dGhpcy5FbihiKX0sZjpmdW5jdGlvbigpe30scGE6ZnVuY3Rpb24oKXt0aGlzLnBpfHwodGhpcy5waT0hMCxlLlplKCkpfSxFaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEua2MmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSxkbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5mYSgpXXx8KHdpbmRvd1tiLmZhKCldPXt9KTt3aW5kb3dbYi5mYSgpXVthLmhhKCldfHwod2luZG93W2IuZmEoKV1bYS5oYSgpXT17fSx3aW5kb3dbYi5mYSgpXVthLmhhKCldLmluaXRpYXRvcj1lLmhjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5oYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuaGMoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuaGMoKV09MX0saG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSTt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuaGMoKSYmKHRoaXMueWYoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmRtKCk7CmlmKCF0aGlzLmhtKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLnlmKCk7cmV0dXJufXRoaXMueWYoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxnKTt0aGlzLmppKCk7dGhpcy5uZz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5ZYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGppOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5ZYiYmMDx0aGlzLlliLmxlbmd0aCYmKHRoaXMuWWI9ZS51bmlxdWUodGhpcy5ZYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWWIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08CnRoaXMucmNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksYT10aGlzLmliW2ddLnJlYXNvbik7dGhpcy5yY1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihnPWUudW5pcXVlKGIpLGE9YSsiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LFRwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmFnfSx5ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuYmd9LExuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ua30sbGE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxmZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5hZ30sQnA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuYmd9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx4ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sSGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxEbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB2PWMuQ2l8fHY7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLllrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Za3x8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG5hPWMuUml8fG5hOyhmdW5jdGlvbihjKXtjLlNpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5DcDtiP2Iub2E/Yi5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpOwpmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9Zi5pbmRleE9mKCIzMDMiKXx8MDw9Zi5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMucGEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlNpfHxvYTsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG5hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgb2EoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHBhPWMuVGl8fHBhOyhuZXcgcGEocikpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLkRrfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmhoPXRoaXMucWI9ITE7dmFyIGE9ZS5pYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMuaGg9ITApO3RoaXMuSGg9ITE7dGhpcy5QZygpO3RoaXMuQ2UoKTt0aGlzLmJsPSExfSxQZzpmdW5jdGlvbigpe3RoaXMucWI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnFiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLkhoPWE7aWYodGhpcy5oaCl7dGhpcy5DZSgpO2lmKHRoaXMucWIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxDZTpmdW5jdGlvbigpe2lmKCF0aGlzLnFiKXt2YXIgYT10aGlzLkhoLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMucWI9ITApO3RoaXMuVyhiKX19LEphOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sYWY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuS2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLktkKGIpfS5iaW5kKHRoaXMpKX0sS2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLmJmJiYoMCx0aGlzLmJmKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHdhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5tanx8cmE7KGZ1bmN0aW9uKGMpe2MubGo9CnYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEs6ZnVuY3Rpb24oKXt9LGxhOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy4kYzt0aGlzLmlzUGxheWluZz10aGlzLmplPSExO3RoaXMubGU9MTt0aGlzLmFkPVtdO3RoaXMuemI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLmplPSExO3RoaXMubGU9MTt0aGlzLmFkPVtdO3RoaXMuemI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5sZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLnpiPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGc9MDtnPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2crKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2ddLnRhZyl7dGhpcy56Yj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLnpiPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLnpiPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuemI9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPApkLmxlbmd0aDtnKyspYS5vbihkW2ddLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZ10mJih0aGlzLmplPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZ10mJnRoaXMuRWgoKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5HbSYmIXRoaXMuemEoKSYmKHRoaXMuemI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuZygpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuZyghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubGEoKSx0aGlzLmdldFBsYXllcigpLmJsPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuR2I7YiYmKGIuRGQoKSxiLnhlKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5hZC5pbmRleE9mKGIpJiZ0aGlzLmFkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMucGEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5hZC5sZW5ndGg+PXRoaXMubGUmJnRoaXMuZygpKX0sRG06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5CZT90aGlzLkJlKys6dGhpcy5CZT0xOnRoaXMuQWU/CnRoaXMuQWUrKzp0aGlzLkFlPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtlLkdmKGIudmlkZW9UYWcpP2IucWI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5qZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuQWU+dGhpcy5CZSYmKGE9ITEpLHRoaXMuRChhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksNTApOihiLlBnKCksYi5DZSgpLGIucWJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgc2E9Yy5sanx8c2E7KGZ1bmN0aW9uKGMpe2Mubmo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5pYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5EbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGc9MDtnPGIubGVuZ3RoO2crKylhLnB1c2goYltnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpnLnFifHx0aGlzLkwoZyl8fHRoaXMua20oZyl8fCh0aGlzLk4oZyksZz1uZXcgc2EoZyx0aGlzLkcpLGcuSygpLGcuZigpKX19dGhpcy5QKCl9fSxOcDpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxEbDpmdW5jdGlvbigpe3ZhciBhPWUuaWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUuQWIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHRhPWMubmp8fHRhLHVhPW5ldyB0YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY3A9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB2YT1jLmNwfHx2YTtuZXcgdmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5jaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuUmQoYSl9LmJpbmQodGhpcykpfSxSZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5VJiZ0aGlzLlUoKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sdGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHdhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGcpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB3YT1jLmNrfHx3YTsoZnVuY3Rpb24oYyl7Yy5iaz12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuS2M9dGhpcy5CYT10aGlzLmZkPSExO3RoaXMuT2g9ZS5NYigxMCk7dGhpcy5OZj0hMDt0aGlzLnhjPXRoaXMub2g9ITE7dGhpcy5LbShhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuRGgoKSx0aGlzLk9rKCksdGhpcy50YigpKX0sS206ZnVuY3Rpb24oYSl7cmV0dXJuIGUuRigidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSxncTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuaGEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlYsIjsiLHR5cGVvZiBhLlYsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuVj9hLlYuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlY/dHlwZW9mIGEuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5IP2EuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLkVhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLkVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5FYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILkVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5FYT9hLmltYS5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLkVhP3R5cGVvZiBhLmltYS5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkgmJmEuSC5FYT9hLkguRWEoKToidW5kZWZpbmVkWCIsIjsiLGEuSCYmYS5ILkVhP3R5cGVvZiBhLkguRWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEuaGU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuaGU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5oZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmhlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuaWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5pZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILmllOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkg/YS5ILm9hOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS5yZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5yZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgucmU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5yZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLk9oKX0sSGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApJYzpmdW5jdGlvbigpe2lmKCF0aGlzLm9hKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5vYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sYWg6ZnVuY3Rpb24oKXtpZighdGhpcy5LYyl7dmFyIGE9dGhpcy5IYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLktjPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5LYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLktjfSxpbTpmdW5jdGlvbigpe2lmKCF0aGlzLm5oKXt2YXIgYT10aGlzLkhjKCksYj10aGlzLmdtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMubmg9ITApfXJldHVybiB0aGlzLm5ofSxnbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuZmQmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLmZkPSEwKTtyZXR1cm4gdGhpcy5mZH0sdGI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkljKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihnPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMubW4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5jYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50YigpfS5iaW5kKHRoaXMpLDIwKX0sbW46ZnVuY3Rpb24oKXt0aGlzLnhjPSEwO3ZhciBhPXRoaXMuYWgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlNhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMueWM9ITA7aWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuYmEoKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApfSxNcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuRmcmJmEuYWRzJiYodGhpcy5GZz1hLmFkcyk7cmV0dXJuIHRoaXMuRmd9LE9rOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuYmEoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTsKdGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYik7dGhpcy5iYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5FaCgpfS5iaW5kKHRoaXMpKX0scGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuR2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmFoKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBkKCl9LmJpbmQodGhpcyksNTApKX0sRGg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuaW0oKSl7dmFyIGI9dGhpcy5IYygpLGc9dGhpcy5JYygpO2ImJmcmJih0aGlzLnhjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGM/dGhpcy53KCk6KHRoaXMuYmEoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMub2g/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhjKCksYT10aGlzLkljKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5iYSgpKToodGhpcy5iYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLm9oPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSw1MCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZz0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilnPSEwO2d8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmCmIoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFBrOmZ1bmN0aW9uKCl7dGhpcy5DY3x8KHRoaXMuQ2M9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkNjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuQ2M9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQ2Mpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGsoKX0uYmluZCh0aGlzKSwxMCl9LApyYjpmdW5jdGlvbigpe3JldHVybiBlLnllPyExOnRoaXMudWF9LENhOmZ1bmN0aW9uKCl7aWYodGhpcy5ZbCgpKXt0aGlzLnVhPSEwO2lmKGUuRigiZ2lnYS5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKSl0aGlzLk5mPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmcoITApfWVsc2UgdGhpcy51YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0sWWw6ZnVuY3Rpb24oKXtpZigwPD1lLkRiKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLk8pcmV0dXJuITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLkFkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmZiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuemwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLnllPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLk5mPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRCh0aGlzLk5mLGZ1bmN0aW9uKCl7dGhpcy5wZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxYazpmdW5jdGlvbigpe3RoaXMuVnB8fCgxMDx0aGlzLk9vPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLk9vKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMudW4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGsoKX0uYmluZCh0aGlzKSw1MCkpKX0sdW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuUG8pe3RoaXMuUG89ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeGE9Yy5ia3x8eGE7KGZ1bmN0aW9uKGMpe2MuZGs9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmJpKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxhLmxlbmd0aDtnKyspdHJ5e2I9Ynx8dGhpcy5iaShhW2ddKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxiaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkhlKGIpKXthPWI7Zm9yKHZhciBnIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShnKSYmKGI9bmV3IHdhKGFbZ10pLGIua2F8fHRoaXMuTChiKXx8ITE9PT1iLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5OKGIpLChuZXcgeGEoYix0aGlzLkcpKS5mKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sUDpmdW5jdGlvbigpe3RoaXMuVGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5RYyl9fSl9KShjKTsKdmFyIHlhPWMuZGt8fHlhLHphPW5ldyB5YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBBYT1jLmhqfHxBYTtuZXcgQWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Faj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmpmPTA7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEucGxheWVyQ29udGFpbmVyO2lmKCFiJiYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5pZCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYj1hLnBhcmVudE5vZGUpLCFiKSl7dGhpcy5aKCk7cmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8CihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthP3RoaXMuVyhhKTp0aGlzLlooKX0sWW06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5HYixnPXRoaXMuaGEoKSxkPSIiO2EubWVtbyYmKGQ9YS5tZW1vLnZpZGVvaWQpO2QmJmImJmIua2MmJigwPD1nLmluZGV4T2YoZCl8fGIuRGQoKSl9LHBhdXNlOmZ1bmN0aW9uKGEpe2F8fCh0aGlzLmpmPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sd2E6ZnVuY3Rpb24oKXt0aGlzLmpmKys7aWYoMTA8dGhpcy5qZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmEuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LEphOmZ1bmN0aW9uKCl7fSxSZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlUmJnRoaXMuVSgpfX0pfSkoYyk7CnZhciBCYT1jLkVqfHxCYTsoZnVuY3Rpb24oYyl7Yy5Eaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxCYTpmdW5jdGlvbigpe2lmKCF0aGlzLkRlKWlmKHRoaXMuSWJ8fCh0aGlzLkliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuSWIrKywxNTx0aGlzLkliKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoITApO2Vsc2V7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkdmVydGlzaW5nKWlmKGE9YS5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuRGU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYiwKZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLnJiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX19LHJiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZz0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilnPSEwO2d8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGc9YS5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmIoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuTz10aGlzLk98fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnFsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELApmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT25fUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuUExBWUVSX0RFU1RST1lFRCxmdW5jdGlvbigpe3RoaXMubGEoKX0uYmluZCh0aGlzKSksYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5nKCl9LmJpbmQodGhpcykpLHRoaXMucWw9ITAsYi5yZWdpc3RlckV2ZW50KGIuT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYil7YS5ZbShiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sZzpmdW5jdGlvbihhKXt0aGlzLkQoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Eanx8Q2E7KGZ1bmN0aW9uKGMpe2MuRmo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5UYT0KMTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8CmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZz1uZXcgQmEoYVtiXSk7Zy5rYXx8dGhpcy5MKGcpfHwodGhpcy5OKGcpLChuZXcgQ2EoZyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuRmp8fERhLEVhPW5ldyBEYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLnRvfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ZS5ZZyhhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLiRtPQphLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9YS53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWEud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuJG0pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGcpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGIpfXRoaXMuVChnKTt0aGlzLlcoZyk7dGhpcy5zZD1nfSxwYXVzZTpmdW5jdGlvbigpe30sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnNkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zZCl9LHRhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFdrOmZ1bmN0aW9uKCl7ZS50aCh0aGlzLnNkKTtlLlFlKHRoaXMuc2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5XaygpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxXZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMuamp8fEdhOyhmdW5jdGlvbihjKXtjLmlqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5EKCEwKX19KX0pKGMpO3ZhciBIYT1jLmlqfHxIYTsoZnVuY3Rpb24oYyl7Yy5raj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLlRhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBhPW0uaW5yZWFkLGI9ZS5ZZyhhLCJlbGVtZW50SUQiKTsKaWYoZS50aChiKSYmKGE9bmV3IEdhKGEpLCF0aGlzLkwoYSkpKXt0aGlzLk4oYSk7KG5ldyBIYShhLHRoaXMuRykpLmYoKTtyZXR1cm59dGhpcy5UYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5UYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSWE9Yy5ranx8SWEsSmE9bmV3IElhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEthPWMucGt8fEthO25ldyBLYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5laj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT0KYn0sRm46ZnVuY3Rpb24oYil7dGhpcy5tZXRob2Q9Yn0sYXBwZW5kRGF0YTpmdW5jdGlvbihiLGEpe3RoaXMuZGF0YVtiXT1hfSx3azpmdW5jdGlvbihiKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQj1jLmVqfHxCOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsZyxkLGYpe3RoaXMuWGE9Yjt0aGlzLlRnPXRoaXMueGk9ITE7dGhpcy5GaD1kO3RoaXMuY2k9ITE7InN0cmluZyI9PT10eXBlb2YgYiYmKHRoaXMuWGE9bmV3IEIoYikpO3ZhciBjPXRoaXMuaGI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8ZyhjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmCjA9PWMuc3RhdHVzJiZsJiZsLlRlKHRoaXMuWGEudXJsKSYmbC5WYyl7dmFyIGU9bmV3IEIoYi51cmwpO2UuRm4oIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBhKGUsZnVuY3Rpb24oYil7dmFyIGE9ITE7dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7YT0hMX1hJiZhLnBpbmcmJiJwb25nIj09YS5waW5nJiYoYT0hMCk7YXx8bC5kYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuZGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLmZqPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBiKXt2YXIgYT1iLGI9IiIsZDtmb3IoZCBpbiBhKWIrPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLlRnJiYoYis9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTsKdGhpcy5oYi51cmxDYWxsZWQ9dGhpcy5YYS51cmw7dHJ5e3RoaXMuY2k/dGhpcy5oYi5vcGVuKHRoaXMuWGEubWV0aG9kLHRoaXMuWGEudXJsLCExKTp0aGlzLmhiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITApLHRoaXMueGl8fCh0aGlzLmhiLndpdGhDcmVkZW50aWFscz0hMCksMDxiLmxlbmd0aCYmdGhpcy5oYi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxiWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5oYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5oYi5zZW5kKGIpfWNhdGNoKGYpe2wmJmwuVGUodGhpcy5YYS51cmwpP2wuVmM/bC5kYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5UZSh0aGlzLlhhLnVybCksdGhpcy5GaCYmdGhpcy5GaCgpfXJldHVybiB0aGlzLmhifX19KShjKTt2YXIgTGE9CmMuZmp8fExhOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5EYT10aGlzLmVlPSExfWMuTWk9YTthLnByb3RvdHlwZT17Sm46ZnVuY3Rpb24oYil7dGhpcy5lZT1ifSxJbjpmdW5jdGlvbihiKXt0aGlzLkRhPWJ9LHNuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihiLGEpe2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKCl7fSl9dmFyIGE9e2xwOiJBZENsaWNrVGhydSIsbnA6IkFkRXJyb3IiLG9wOiJBZFN0b3BwZWQiLHJwOiJBZExpbmVhckNoYW5nZSIsc3A6IkFkVGFnUGFyc2VkIix2cDoiQWRWaWRlb0NvbXBsZXRlIix5cDoiQWRMb2FkZWQiLHpwOiJBZFNraXBwZWQiLEFwOiJBZFN0YXJ0ZWQiLHBwOiJBZFZpZGVvRmlyc3RRdWFydGlsZSIscXA6IkFkSW1wcmVzc2lvbiIsbXA6IkFkQ3JlYXRpdmVWaWV3Iix0cDoiQWRWaWRlb01pZHBvaW50Iix1cDoiQWRQYXVzZWQiLHdwOiJBZFZpZGVvU3RhcnQiLHhwOiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiYKd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGE9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYih0aGlzLmVlLGFbZF0pfSxybjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfWlmKHRoaXMuRGEmJnRoaXMuRGEuY2UpZm9yKHZhciBhIGluIHRoaXMuRGEuY2UpdGhpcy5EYS5jZS5oYXNPd25Qcm9wZXJ0eShhKSYmYih0aGlzLkRhLHRoaXMuRGEuY2VbYV0pO3RoaXMuRGEmJnRoaXMuRGEuZ2V0RXJyb3ImJndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuRGEuZ2V0RXJyb3IoKX0uYmluZCh0aGlzKSwxMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLmVlJiZ0aGlzLnNuKCk7dGhpcy5EYSYmdGhpcy5ybigpfX19KShjKTt2YXIgTWE9Yy5NaXx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkdhPSExO3RoaXMuYWM9IiI7dGhpcy5nZD0KdGhpcy4kYj10aGlzLmpiPW51bGw7dGhpcy5MZz10aGlzLnViPXRoaXMuVmU9ITE7dGhpcy5BYT0iIjt0aGlzLlVlPSExO3RoaXMucWE9dGhpcy5KYz0iIjt0aGlzLlBlPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLnBmPSExO3RoaXMuZ2E9W107dGhpcy5MZT10aGlzLlBiPSIiO3RoaXMuYWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy4kZD0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMud2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMuWGI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuUWI9IiI7dGhpcy5SYj1bXTt0aGlzLlNiPVtdO3RoaXMuVWM9W107dGhpcy5vYz0iIjt0aGlzLkJiPSExO3RoaXMuUWQ9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5qYz0hMTt0aGlzLkFnPXRoaXMuV2Q9bnVsbDt0aGlzLkNmPXRoaXMuV2I9dGhpcy5LZz10aGlzLlVkPQp0aGlzLlZjPXRoaXMuamQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnhkPTA7dGhpcy5qaD0hMTt0aGlzLmloPTFFMzt0aGlzLnpjPSExO3RoaXMuTmE9MUUzO3RoaXMuYmQ9IiJ9Yy5naj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5HYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLmFjLGFkdGFnbW9kaWZpZXI6dGhpcy5qYixhZHRhZ21vZGlmaWVyQWR2OnRoaXMuJGIsYWR0YWdyZWdleDp0aGlzLmdkLGJpdHJhdGU6dGhpcy5OYSxqc3BvcHVwczp0aGlzLlZlLHNpZGVsb2Fkczp0aGlzLnViLGRpc2FibGV0ZXN0czp0aGlzLkxnLGhvbWFkQWxpYXM6dGhpcy5BYSxpc0luaXRpYWxpemVkOnRoaXMuVWUsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMucWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5TLGlzQmxvY2tlZDp0aGlzLlBlLApzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5QYixob21hZEFkcGF0aDp0aGlzLkxlLEhPTUFEX1ZFUklGSUVEOnRoaXMuYWUsSE9NQURfQkxPQ0tFRDp0aGlzLiRkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLndiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLlhiLHRlc3RIaWRlOnRoaXMuUWIsdGVzdFRhZ3M6dGhpcy5SYix0ZXN0VGFnc0pTOnRoaXMuU2IsdGVzdFRhZ3NYSFI6dGhpcy5VYyx0ZXN0M1BDb29raWU6dGhpcy5vYyx0aHJvdHRsZTp0aGlzLlFkLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuamMsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5BZyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLnNjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5qZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5WYyx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5VZCxjb25maWdGYWlsdXJlczp0aGlzLlphLHNpdGVDb25maWc6dGhpcy55YSxzZXJ2ZXJJZDp0aGlzLnRmLAplbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5XYixza2lwQWxsb3dlZDp0aGlzLkNmLHZtYXBzOnRoaXMuU2YsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5iZH19LEFuOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkdhPWIuaXNBY3RpdmUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdwYXJhbWV0ZXImJih0aGlzLmFjPWIuYWR0YWdwYXJhbWV0ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllciYmKHRoaXMuamI9Yi5hZHRhZ21vZGlmaWVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXJfYWR2JiYodGhpcy4kYj1iLmFkdGFnbW9kaWZpZXJfYWR2KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncmVnZXgmJih0aGlzLmdkPWIuYWR0YWdyZWdleCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5qc3BvcHVwcyYmKHRoaXMuVmU9CmIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy51Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkxnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0luaXRpYWxpemVkJiYodGhpcy5VZT1iLmlzSW5pdGlhbGl6ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZ2xvYmFsQ29uZmlnJiYodGhpcy5KYz1iLmdsb2JhbENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jbGllbnRDb25maWcmJih0aGlzLnFhPWIuY2xpZW50Q29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzRW5hYmxlZCYmKHRoaXMuaXNFbmFibGVkPWIuaXNFbmFibGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzVmVyaWZpZWQmJih0aGlzLlM9Yi5pc1ZlcmlmaWVkKTsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLlBlPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5QYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuTGU9Yi5ob21hZEFkcGF0aCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9WRVJJRklFRCYmKHRoaXMuYWU9Yi5IT01BRF9WRVJJRklFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9CTE9DS0VEJiYodGhpcy4kZD1iLkhPTUFEX0JMT0NLRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfTk9CTE9DS0VSJiYodGhpcy53Yj1iLkhPTUFEX05PQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9BREJMT0NLRVImJih0aGlzLlhiPWIuSE9NQURfQURCTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RIaWRlJiYKKHRoaXMuUWI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUmI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5TYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdDNQQ29va2llJiYodGhpcy5vYz1iLnRlc3QzUENvb2tpZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50aHJvdHRsZSYmKHRoaXMuUWQ9Yi50aHJvdHRsZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52aWRlb3BsYXphJiYodGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZFRlc3RlZCYmKHRoaXMuamM9Yi5ob21hZFRlc3RlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayYmKHRoaXMuQWc9Yi5jaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjayk7CiJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuamQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmKHRoaXMuVmM9Yi51c2VTdHJpY3RDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzJiYodGhpcy5VZD1iLnVzZVN0cmljdENvbmZpZ0NoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5jb25maWdGYWlsdXJlcyYmKHRoaXMuWmE9Yi5jb25maWdGYWlsdXJlcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zaXRlQ29uZmlnJiYodGhpcy55YT1iLnNpdGVDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2VydmVySWQmJih0aGlzLnRmPWIuc2VydmVySWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyYmCih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuV2I9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuQ2Y9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmKHRoaXMuU2Y9Yi52bWFwcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoJiYodGhpcy56Yz1iLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja1VSTCYmKHRoaXMuYmQ9Yi5hZEZhbGxiYWNrVVJMKX0sVmw6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmKGI9ITApO3JldHVybiBifSx2ZjpmdW5jdGlvbihiKXt0aGlzLlphW2JdPSEwfSxFbDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy5aYSkiYm9vbGVhbiI9PQp0eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxPZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5NYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLkprKGIpfSx2YTpmdW5jdGlvbihiLGEsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGg9IiI7aWYoIXRoaXMuR2EmJiFhKXJldHVybiBuZXcgQihiKTtmPXRoaXMuU2UoYik7CmM9dGhpcy5pYShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuYWN8fHRoaXMuamJ8fHRoaXMuJGJ8fHRoaXMuZ2QpJiYoaD10aGlzLkltKGgpKTtiPW5ldyBCKGUpO2IudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuR2woYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuQWIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSxTZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxMYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5nYSYmdGhpcy5nYS5sZW5ndGgmJjA8dGhpcy5nYS5sZW5ndGgmJihhPXRoaXMuZ2FbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sVGU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy5TZShiKTtyZXR1cm4gYX0sCkdsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkhwO3JldHVybiJub25lIn0seWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYVt0aGlzLnRmXX0sUGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnlkKCksYT10aGlzLkFmKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEJoOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxIbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUuaWEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEc9MDtHPGgubGVuZ3RoO0crKyl7dmFyIGs9aFtHXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLkJoKGZbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBmKWgucHVzaChsKyI9IitmW2xdKTtmPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGY9dGhpcy5CaChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1mfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEltOmZ1bmN0aW9uKGIpe3RoaXMuYWMmJgooYis9dGhpcy5hYyk7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy4kYiYmKGI9dGhpcy5IbShiLHRoaXMuJGIpKTtyZXR1cm4gYn0sVms6ZnVuY3Rpb24oKXt0aGlzLnlhJiZ0aGlzLnlhLmNsaWVudEFQSXMmJnRoaXMuUWsodGhpcy55YS5jbGllbnRBUElzKX0sUWs6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE1hO2IucHVibGlzaGVyQVBJJiZhLkpuKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5JbihiLnBsYXllcik7YS5mKCl9fSxpOmZ1bmN0aW9uKGIsYSxkLGYsYyxlKXtsPXRoaXM7dGhpcy5VZT0hMDt0aGlzLkpjPWI7dGhpcy5xYT1hO3RoaXMucGY9ZDt0aGlzLldkPWY7dGhpcy5EYz1jO3RoaXMueWE9ZXx8e307dGhpcy5WaygpO3RoaXMuem0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucWEpdGhpcy54bSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSxzYjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sem06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBCKHRoaXMuSmMrdGhpcy5wZSgiZ2xvYmFsIikpLHRoaXMuVGwuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5BYygpfS5iaW5kKHRoaXMpLCEwKX0seG06ZnVuY3Rpb24oKXt0aGlzLkhhKG5ldyBCKHRoaXMucWErdGhpcy5wZSgiY2xpZW50IiwKLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy52ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scGU6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLk1iKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sZGE6ZnVuY3Rpb24oYil7aWYoIXRoaXMuamQpe3RoaXMuamQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGcpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5EYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuRGM9CiExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuUGU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMuJGQpKTt0aGlzLlViKCk7ZS5GYyhrLldtKTsoYT1lLkRiKHRoaXMueWQoKSkpfHwoYT1lLkRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTtifHwoYj0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYiwhMCl9fSxUbDpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChkKXthLmVuYWJsZWQ9ImZhbHNlIn1pZighYS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfHwhYS5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goZil7fXRoaXMuaXNFbmFibGVkPQp0aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucWF8fHRoaXMuUGJ8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5HYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnNiKHRoaXMud2IpKSx0aGlzLlViKCkpfX0sQWM6ZnVuY3Rpb24oYil7dmFyIGE9ITE7YiYmKGE9Yi5yZXNwb25zZVRleHQpO3ZhciBkPXt9O2lmKGEpdHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtkPXRoaXMucWF9ZWxzZSBkPXRoaXMucWE7YT1mdW5jdGlvbigpe2Zvcih2YXIgYj0wO2I8ZC5zZXJ2ZXIubGVuZ3RoO2IrKyl7dmFyIGE9ZC5zZXJ2ZXJbYl07dHJ5e3ZhciBnOyhnPXZvaWQgMD09PWEpfHwoZz0hYS5yZXBsYWNlKCJbaGFzaF0iLHRoaXMuQWYoKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkpLm1hdGNoKFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSkpO2lmKGcpcmV0dXJuITF9Y2F0Y2goZil7cmV0dXJuITF9fXJldHVybiEwfS5iaW5kKHRoaXMpO2lmKCEoZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZkLmhhc093blByb3BlcnR5KCJzZXJ2ZXIiKSYmYSgpJiZkLmhhc093blByb3BlcnR5KCJhbGlhcyIpJiZkLmhhc093blByb3BlcnR5KCJjb25maWciKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGQuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmdhPWQuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGUuRigid2ViLmRlIil8fGUuRigiZ214Lm5ldCIpfHxlLkYoImdteC5hdCIpfHxlLkYoImdteC5jaCIpfHwKZS5GKCIxdW5kMS5kZSIpKSYmIXRoaXMuTGMoKSlmb3IoYj0wO2I8dGhpcy5nYS5sZW5ndGg7YisrKXRoaXMuZ2FbYl09dGhpcy5nYVtiXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLlhoKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5QYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuTGU9ZC5hZHBhdGh8fCIiO3RoaXMudGY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuZ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5QYiYmdGhpcy5BYSYmdGhpcy5nYS5sZW5ndGg/dGhpcy5NYyghMSk6KHRoaXMuR2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLndiKSksdGhpcy5VYigpKX0sWGg6ZnVuY3Rpb24oYil7dGhpcy5iZHx8KHRoaXMuYmQ9Ynx8IiIpfSxNYzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT17fTtpZihiKXt2YXIgYT0KbmV3IEIodGhpcy5QYygpKSxkPXRoaXMuaWEodGhpcy5QYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7YS5tZXRob2Q9IlBPU1QifWVsc2UgYT1uZXcgQih0aGlzLlBiK3RoaXMucGUoImN1c3RvbWVyIikpO3RoaXMuSGEoYSx0aGlzLmhvLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnZmKCJjdXN0b21lciIpO2I/dGhpcy5Saj90aGlzLmRhKCJub1NWTUNvbmZpZyIpOih0aGlzLlJqPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5NYyghMCl9LmJpbmQodGhpcyksITApfX0saG86ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9Yi5yZXNwb25zZVRleHQsZD17fTt0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGYpe2lmKCF0aGlzLmpjJiYKdGhpcy5pc0VuYWJsZWQpe3RoaXMuamM9ITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfHwhKGQuaGFzT3duUHJvcGVydHkoInRlc3RoaWRlIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3MiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc2pzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3N4aHIiKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGMpe310aGlzLlZjPXRoaXMuZmIoZC5zdHJpY3QpO3RoaXMuVWQ9dGhpcy5mYihkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5LZz1kLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMuJGE9dGhpcy5mYihkLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoZC5lbmFibGVkKTt0aGlzLlFiPWQudGVzdGhpZGV8fCIiOwp0aGlzLlNiPWQudGVzdGFkdGFnc2pzfHxkLnRlc3RhZHRhZ3N8fFtdO3RoaXMuVWM9ZC50ZXN0YWR0YWdzeGhyfHxbXTt0aGlzLm9jPWQudGVzdDNwY29va2llfHwiIjt0aGlzLmFjPWQuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuamI9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuJGI9ZC5hZHRhZ21vZGlmaWVyX2Fkdnx8bnVsbDt0aGlzLmdkPWQuYWR0YWdyZWdleHx8bnVsbDt0aGlzLlZlPWQuanNwb3B1cHN8fCExO3RoaXMudWI9ZC5zaWRlbG9hZHN8fCExO3RoaXMuV2I9ZC52cGFpZHx8ITE7dGhpcy55YS52cGFpZD10aGlzLldiO3RoaXMuQ2Y9ZC5za2lwYWxsb3dlZHx8ITE7dGhpcy5rZD1kLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMuU2Y9ZC52bWFwc3x8IiI7dGhpcy56Yz1kLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuTmE9ZC5iaXRyYXRlfHwxRTM7dGhpcy5YaChkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuUWQ9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9CmQudmlkZW9wbGF6YXx8e307IXRoaXMuamMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmpjPSEwLHRoaXMuTWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuc28oKSYmKHRoaXMuUWJ8fHRoaXMuU2J8fHRoaXMuUmJ8fHRoaXMuVWMpP3RoaXMucGY/KHRoaXMuR2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLndiKSksdGhpcy51ZSgpLHRoaXMuVWIoKSk6dGhpcy5rbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLktmKCkpfX0sa286ZnVuY3Rpb24oKXt0aGlzLmpvKCk7dGhpcy5sbygpfSxsbzpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7cmV0dXJuInZhciBldnQgPSB7fTtpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge2V2dCA9IG5ldyBDdXN0b21FdmVudCgnIitiKyInKTt9IGVsc2Uge2V2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO2V2dC5pbml0Q3VzdG9tRXZlbnQoJyIrYisiJywgZmFsc2UsIGZhbHNlLCB7fSk7fXdpbmRvdy5wYXJlbnQuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldnQpOyJ9CnZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksRz1lLlgoMTApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZGF0YSIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJldmFsIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEcsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImlubGluZSIsIiIpfSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmKTtmLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoYXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrCmIoRykrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpK2UuQWIoYihjKSkrYXRvYigiSWo0OEwzTmpjbWx3ZEQ0OEwyaGxZV1ErUEdKdlpIaytQQzlpYjJSNVBqd3ZhSFJ0YkQ0PSIpKX1jYXRjaChrKXt9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChmKX1jYXRjaChiKXt9aWYoMyE9ZCl7dmFyIGM9ZS5yZCgpO2lmKChjLmlzQ2hyb21lfHxjLmlzRmlyZWZveCkmJiFjLmlzRWRnZSYmIWUuU2EoKSl7aWYodGhpcy55YSYmdGhpcy55YS5wbGF5ZXImJnRoaXMueWEucGxheWVyLmxlbmd0aCl7ZS50cmFjaygic3RhdHNfaGRfY3NwX2hkcCIsYSwhMCk7CnJldHVybn10aGlzLmRhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxLZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy53YikpO3RoaXMuVWIoKX0sUGQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9dGhpcy5HYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IoYikpLHRoaXMuVWIoKSx0aGlzLnVlKCkpfSxqbzpmdW5jdGlvbigpe2lmKHRoaXMuUWIpe3ZhciBiPWUucmQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLm5tKCkpdGhpcy5QZCh0aGlzLlhiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2I9ITE7dHJ5e3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Euc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5RYik7YS5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLlFiKTsKYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChmKXt9Yj90aGlzLlBkKHRoaXMuWGIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmZpKCl9fWVsc2UgdGhpcy5maSgpfSxJZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTWIoKSksdGhpcy5vbyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuSGYuYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWNhdGNoKGMpe3RoaXMuSGYoKX19ZnVuY3Rpb24gYSgpe3RoaXMuUGQodGhpcy5YYiwKIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5SYj10aGlzLlVjKSYmdGhpcy5SYi5sZW5ndGgpe3ZhciBkPXRoaXMuUmIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5IZigpfSxvbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5IYShuZXcgQihiKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sZmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dHJ5e2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLk1iKCkpLHRoaXMucG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLklmLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLklmKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLlBkKHRoaXMuWGIsCiJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlNiJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGQ9dGhpcy5TYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLklmKCl9LHBvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGEsZCl7ZD09YiYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPQpjO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sSGY6ZnVuY3Rpb24oKXtpZih0aGlzLm9jKXRyeXtlLkFkKHRoaXMub2MsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuQmI9IXRoaXMuZmIoYi5jYyk7dGhpcy5LZigpfS5iaW5kKHRoaXMpLHRoaXMuZGkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy5kaSgpfWVsc2UgdGhpcy5LZigpfSxkaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuc2IodGhpcy53YikpO3RoaXMuVWIoKTt0aGlzLnVlKCl9LG5tOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGIpe3JldHVybiJmYWlsIn19LFViOmZ1bmN0aW9uKCl7dmFyIGI9IjAiLGE9IjAiO3RyeXtlLlNhKCkmJgooYj0iMSIpfWNhdGNoKGQpe2I9Mn10aGlzLnNjJiYoYT0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYisiIithLCEwKTt0aGlzLm9jJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQmIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5zYih0aGlzLmFlKSk7dGhpcy5XZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLldkJiZ0aGlzLldkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkJifSl9LFVrOmZ1bmN0aW9uKCl7aWYodGhpcy5VZCYmdGhpcy5WbCgpKXt2YXIgYj10aGlzLkVsKCk7YiYmYi5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixiLmpvaW4oIl8iKSwhMCl9fSxqaTpmdW5jdGlvbihiKXtifHwoYj0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYil0cnl7Yj1iLnRvU3RyaW5nKCl9Y2F0Y2goYSl7Yj0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1iPWIudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsCmIsITApfSxIYTpmdW5jdGlvbihiLGEsZCxmLGMsaCl7dGhpcy54ZHx8KHRoaXMueGQ9MCk7dGhpcy54ZCsrO3RoaXMueGQ+dGhpcy5paCYmIXRoaXMuamgmJih0aGlzLmpoPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5paCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi54aT0hMCk7YyYmZS5sbSgpJiYoYi5UZz0hMCk7aCYmKGIuY2k9ITApO3JldHVybiBiLmxvYWQoKX0sUms6ZnVuY3Rpb24oKXtlLlNhKCl8fGUuYWIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGIpe3ZhciBhPW51bGwsZD1udWxsLGY9IiI7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuZGEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoZClpZihiPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGJbMF0mJihiPWJbMF0pLGIpe2Y9YiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkxjKCl8fChiPXRoaXMuaWEoZiksZj1iLnByb3RvY29sKyI6Ly8iK2IuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2UubmV0d29ya1N0YXRlPT1lLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmRhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7ZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7ZS5zZXRBdHRyaWJ1dGUoInNyYyIsZil9ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5kYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0saW86ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuU2Z9LFNrOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGI9dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7Yi5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5IYShiLHRoaXMuR28uYmluZCh0aGlzKSx0aGlzLkZvLmJpbmQodGhpcykpfSxHbzpmdW5jdGlvbihiKXt2YXIgYT1udWxsLGQ9bnVsbDt0cnl7KGE9Yi5yZXNwb25zZVhNTCl8fChhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGIucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLnBsKCl9LEZvOmZ1bmN0aW9uKCl7fSxwbDpmdW5jdGlvbigpe2UuRmMoay5vbCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5kYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sdWU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy51Yi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLnViLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMudWJbYl07InJlcXVlc3QiPT1hLnR5cGUmJmUuYWIoYS51cmwsYS5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1hLnR5cGUpe3ZhciBkPW5ldyBJO3dpbmRvd1tkLmZhKCldPXRoaXM7ZS5hYihhLnVybCxhLmFsaWFzLG51bGwsZnVuY3Rpb24oYil7aWYoYi5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYi5yZXNwb25zZVRleHQpfWNhdGNoKGEpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0sc286ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5RZH0sTWI6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYnx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWJ8fDEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sZmI6ZnVuY3Rpb24oYil7cmV0dXJuIlRydWUiPT1ifHwidHJ1ZSI9PWJ8fDE9PWJ8fCIxIj09Ynx8MT09Yn0sQWI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixjLGUsaCxrLGw9MDtsPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChsKyspLGY9Yi5jaGFyQ29kZUF0KGwrKyksYz1iLmNoYXJDb2RlQXQobCsrKSxlPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGg9KGYmMTUpPDwyfGM+PjYsaz1jJjYzLAppc05hTihmKT9oPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGF9LGlhOmZ1bmN0aW9uKGEpe3ZhciBnPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGM9MTQ7Yy0tOylkW2dbY11dPWFbY118fCIiO2QucXVlcnlLZXk9e307ZFtnWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LEFmOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGcoYSl7dmFyIGI9IiIsZCxnO2ZvcihkPTc7MDw9ZDtkLS0pZz1hPj4+NCpkJjE1LGIrPWcudG9TdHJpbmcoMTYpO3JldHVybiBifWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgYyxlLGg9QXJyYXkoODApLGs9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHI9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHEsdSx2LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoYz0wO2M8bi0zO2MrPTQpZT1hLmNoYXJDb2RlQXQoYyk8PDI0fGEuY2hhckNvZGVBdChjKzEpPDwxNnxhLmNoYXJDb2RlQXQoYysyKTw8OHxhLmNoYXJDb2RlQXQoYyszKSx4LnB1c2goZSk7CnN3aXRjaChuJTQpe2Nhc2UgMDpjPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmM9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmM9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Yz1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeC5wdXNoKGMpOzE0IT14Lmxlbmd0aCUxNjspeC5wdXNoKDApO3gucHVzaChuPj4+MjkpO3gucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGM9MDsxNj5jO2MrKyloW2NdPXhbYStjXTtmb3IoYz0xNjs3OT49YztjKyspaFtjXT1kKGhbYy0zXV5oW2MtOF1eaFtjLTE0XV5oW2MtMTZdLDEpO2U9aztuPWw7cT1tO3U9cjt2PXQ7Zm9yKGM9MDsxOT49YztjKyspdz1kKGUsNSkrKG4mcXx+biZ1KSt2K2hbY10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LAp2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTIwOzM5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YraFtjXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz00MDs1OT49YztjKyspdz1kKGUsNSkrKG4mcXxuJnV8cSZ1KSt2K2hbY10rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NjA7Nzk+PWM7YysrKXc9ZChlLDUpKyhuXnFedSkrditoW2NdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1O3I9cit1JjQyOTQ5NjcyOTU7dD10K3YmNDI5NDk2NzI5NX1yZXR1cm4oZyhrKStnKGwpK2cobSkrZyhyKStnKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgTmE9Yy5nanx8TmEsbD1uZXcgTmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe30KYy52bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIE9hPWMudm18fE9hO25ldyBPYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxnLGQpe3RoaXMuYT1hO2EuYy5SP3RoaXMuYmI9YS5jLlIoKTp0aGlzLmJiPSIiO2EuYy5xaCYmYS5jLnFoKHtwYXVzZTp0aGlzLkRkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuVmguYmluZCh0aGlzKSxtdXRlOnRoaXMuY2YuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Bby5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLmtiO3RoaXMucGxheWVyPXRoaXMuYS5jO3RoaXMuZmM9dGhpcy5oZD0hMTt0aGlzLkhrPTFFMzt0aGlzLnNhPW51bGw7dGhpcy5CPWc7dGhpcy5nYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTWQ9e307ZS5wYigibmV3QmlnQWRJZCIpO3RoaXMuS2s9ZS5YKDEwKTsKdGhpcy5FZj0wO3RoaXMuZWQ9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5lZD1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmEuYykmJnRoaXMuYS5jLmwmJihhPXRoaXMuYS5jLmwoKSksdGhpcy5lZD1kLmFkbWVzc2FnZShhKSkpO2QmJiJ0cnVlIj09U3RyaW5nKGQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5Daz1kLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTt0aGlzLmdmPXRoaXMuTGQ9ITE7dGhpcy56aD1kJiZkLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChkLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5iPXt9O3RoaXMub2U9ITE7dGhpcy5taT0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLmtjPSExO3RoaXMuZGw9ZS5YKDEwKTt0aGlzLkxiPWUuWCgxMCk7dGhpcy5KYj1lLlgoMTApO3RoaXMuWmg9ZS5YKDEwKTt0aGlzLmNvbmY9e307dGhpcy5YZD0KdGhpcy5WYj10aGlzLndlPXRoaXMub2Q9dGhpcy5OZD10aGlzLnZiPXRoaXMucWM9dGhpcy5JaD10aGlzLnRkPXRoaXMudW89dGhpcy55Yj10aGlzLktiPSExO3RoaXMudmM9W107dGhpcy5sYz17fTt0aGlzLlNtPTIwMDt0aGlzLlZmPXRoaXMuV2M9dGhpcy5zZT10aGlzLlVmPXRoaXMub2Y9ITE7dGhpcy5lZj17fX1jLmFqPWE7YS5wcm90b3R5cGU9e3puOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxGYTpmdW5jdGlvbihhKXt2YXIgZz10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuYmJdJiZ0aGlzLmNvbmZbdGhpcy5iYl1bYV0mJihnPXRoaXMuY29uZlt0aGlzLmJiXVthXSk7cmV0dXJuIGd9LGtpOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLkhiJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLHRoaXMuV2EoKSwhMCk7dGhpcy5abigpO2UubyhrLnRrLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFllOmZ1bmN0aW9uKGEsZyxkLGMpe3RoaXMueWI9CmQ7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuQi5TKXRoaXMuRWYrKyxlLnBiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkIuVWsoKSxjPWwuZ2V0Q29uZmlnKCksZS55ZSYmKHRoaXMuQi5Bbih7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImNhbGwiLCEwKSksdGhpcy5CLkdhJiZ0aGlzLkIuaXNFbmFibGVkPyh0aGlzLmtpKCksbmV3IFIodGhpcyxhLHRoaXMuemgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmcsYml0cmF0ZTpjLk5hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5CLldiLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOmc/KHRoaXMua2koKSwKbmV3IFIodGhpcyxhLHRoaXMuemgse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkIuV2IsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLk5hLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5hLmMuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5PYSgpO2Vsc2V7dmFyIHFjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3FjLlllKGEsZyxkKX0sNTApfX0sa2Y6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlhkPXRoaXMuVmI9dGhpcy50ZD0hMTt0aGlzLmI9YTt0aGlzLlFuKHRoaXMuYik7dGhpcy5laChhKTt0aGlzLnZjPXRoaXMuVmcoYSk7dGhpcy5aaygpfSxlaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZgphJiYodGhpcy5NZD10aGlzLlBsKGIpKSx0aGlzLmVoKGIucGFyZW50KSl9LFZnOmZ1bmN0aW9uKGIpe3ZhciBjPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGM9dGhpcy5WZyhiLnBhcmVudCkpLGMucHVzaCh0aGlzLnlsKGIpKSk7cmV0dXJuIGN9LHlsOmZ1bmN0aW9uKGEpe3ZhciBjPSIiLGQ9W107aWYoYSYmYS5KJiZhLkouZ2V0QXR0cmlidXRlKXtjPWEuSi5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspZC5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1kLmxlbmd0aCYmKGQ9ZFswXSl9cmV0dXJue2FkSUQ6YyxjcmVhdGl2ZUlEOmR9fSxQbDpmdW5jdGlvbihhKXt2YXIgYz1bXSxkPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuSil7Yz1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTsKZj1hLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuSi5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxjLmxlbmd0aDtrKyspZC5wdXNoKGEubGIoY1trXSkpfXJldHVybntpbXByZXNzaW9uczpkLGFkSWRzOmUsYWRJZDpofX0scmE6ZnVuY3Rpb24oYSl7YS5ZYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwibm9hZCIsITApO3ZhciBjPTA7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYKKGM9YS5lcnJvci5kZXRhaWwuY29kZSksYS5xZCYmYS5xZC5lcnJvciYmYS5xZC5lcnJvci5jb2RlJiYoYz1hLnFkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHcuWWMuY29kZTpjPT1FLmZlLmNvZGU/ZS5vKGsuYnAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTooZS5aZSgpLGM9PUUuWmYuY29kZSYmZS5vKGsuTG0sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSk7ZS5vKGsubmwsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLiRuKCk7dGhpcy5VYSgiZW1wdHkiKTt0aGlzLkIuQmImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19lbXB0eSIsdGhpcy5CYiwhMCk7YnJlYWs7Y2FzZSB3LlhmLmNvZGU6ZS5vKGsuSG8sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy4kZi5jb2RlOmUubyhrLmVwLAp0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdy5nZS5jb2RlOmUubyhrLmZwLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuYmUuY29kZTplLm8oay5NbSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWmQuY29kZTplLm8oay5Ebyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuV2YuY29kZTplLm8oay5Fbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5nYyhhKTt0aGlzLk9hKCl9LGdjOmZ1bmN0aW9uKGEpe3ZhciBjPQo5MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoYz1hLmVycm9yLmNvZGUsOTAxPGMmJihjPTkwMCkpO2ZvcihjPXsiW0VSUk9SQ09ERV0iOmN9O2EuTGEubGVuZ3RoOyl0cnl7dmFyIGQ9YS5MYS5wb3AoKTt0aGlzLlhlKGQudXJsLGQudHlwZSxjKX1jYXRjaChmKXt9fSxRbjpmdW5jdGlvbihhKXt0aGlzLndlPSExO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS56Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3ZhciBjPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGM9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLmdiLnpJbmRleD1jO2M9dGhpcy5hLkE7dHJ5e3ZhciBkPXRoaXMuYS5jLmdldFJhd1BsYXllcigpLGY9IiI7ZCYmZC5lbnZ2YXJzJiYoZj1kLmVudnZhcnMoKSk7Zi52aWRlb1Nsb3R8fChkPXRoaXMuYS5jKSYmZC52ZCYmKGY9ZC52ZCgpKTtmLnZpZGVvU2xvdCYmKGM9Zi52aWRlb1Nsb3QsdGhpcy5vZj0KITApfWNhdGNoKGgpe31jLmhxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihjLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoYy5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pO2lmKHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKWZvcih2YXIgayBpbiB0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSl0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXS5oYXNPd25Qcm9wZXJ0eShrKSYmYy5zZXRBdHRyaWJ1dGUoayx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtrXSk7dGhpcy5DayYmdGhpcy5wbGF5ZXIuRWUoKSYmKGMudm9sdW1lPXRoaXMucGxheWVyLkVlKCkvMTAwKTtmb3IoO2MuZmlyc3RDaGlsZDspYy5yZW1vdmVDaGlsZChjLmZpcnN0Q2hpbGQpO2ZvcihkPTA7ZDxhLk0ubGVuZ3RoO2QrKyljLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmCnRoaXMueGsoYyxhLk1bZF0udXJsKyIiLGEuTVtkXS50eXBlKTt0aGlzLm9mJiZjLmxvYWQoKTtpZih0aGlzLmdpKGMpKXt0aGlzLiRoKCJzZXR1cCIsdGhpcy5XYSgpKTt0aGlzLkFrKGMpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmhlaWdodD0iMTAwJSIpO3RoaXMuc2E9dGhpcy5nYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5vZj90aGlzLnZpZGVvPWM6dGhpcy52aWRlbz10aGlzLnNhLmFwcGVuZENoaWxkKGMpfWNhdGNoKGwpe3RoaXMudmlkZW89Y319ZWxzZSB0aGlzLmIuJGsoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXToKYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuc2E9dGhpcy5nYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuc2EuYXBwZW5kQ2hpbGQoYyksdGhpcy5ObigpKTp0aGlzLmIub3JpZ2luLk1nKHcuYmUpfSxObjpmdW5jdGlvbigpe3RoaXMuVWY9ITA7dGhpcy52Yj10aGlzLnFjPSExO3RoaXMuYS5jLnRhJiZ0aGlzLmEuYy50YSgpJiYoZS5vKGsuRGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnZiPSEwKTtlLnZlKCk7dGhpcy5iJiZ0aGlzLmIub3JpZ2luJiZ0aGlzLmIub3JpZ2luLm5hJiZlLkJrKHRoaXMuYi5vcmlnaW4ubmEpO3RoaXMuJGgoInNldHVwIix0aGlzLldhKCkpO3ZhciBhPXRoaXMuYS5BO3RoaXMuYS5BPUMucG9wKCk7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmEuQSxhKTt0aGlzLmEuSmgoKTt0aGlzLmEuQmYoKTtmb3IoYT10aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTsKYS5wYXJlbnR8fHRoaXMuYS5CZigpO3RoaXMuZ2I9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS56Zih0aGlzLmdiLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMuc2E9dGhpcy5hLkk7dGhpcy5yaSgidnBhaWQiKTtpZih0aGlzLnZiKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpKWEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b247dGhpcy50cmFjaygibXV0ZSIsITApO3RoaXMuT2IoIm11dGVkIiwiY29udGVudCIpO2UubyhrLkJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9dGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImFsbG93IiwKImF1dG9wbGF5Iik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuQyk7dGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdJiZlLnpmKHRoaXMuQyx0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0pO3RoaXMuQy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuYi5TbCgpLGM9dGhpcy5iLnUuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YywKY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Y30sY29udGVudHBsYXllcjp7d2lkdGg6cGFyc2VJbnQodGhpcy5hLkkuc3R5bGUud2lkdGgpLGhlaWdodDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UuamEodGhpcy5DLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLApoKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5qYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuamEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmphKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5yZygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuQik7dGhpcy5DLnNyYz1hO2UucWUoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYS5jLndhJiYhdGhpcy5OZCYmdGhpcy5hLmMud2EoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx0aGlzLnMoKSk7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5hLmljKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnZjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuUW8oYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5SbygpLHRoaXMuYS5pYyghMCksIXRoaXMuVmIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVmI9e2VsOnRoaXMuQyxjYjpmdW5jdGlvbigpe3RoaXMuWGQ9CiEwO2UubyhrLnVpLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLlJlKHRoaXMuVmIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5pYyghMCksdGhpcy5WbygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmEuaWMoITApLHRoaXMuWm8oKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuWG8oKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuWW8oKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy4kbygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5XbygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy52aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgaD1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpofHwoaD10aGlzLmIuZWMpO2lmKCFoKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS5vKGsuQ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1ofWNhdGNoKGQpe3dpbmRvdy5vcGVuKGgsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlVvKCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLm8oay5tZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlNvKCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYKKHRoaXMuV2MmJih0aGlzLlZmPSExLHRoaXMubmMoKSksdGhpcy5UbygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnZiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5PYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuQmQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSk6KHRoaXMudmI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLk9iKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLk1mLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLGUubyhrLm1lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfX0uYmluZCh0aGlzKSk7CmUucWUoInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuT2EoKX0uYmluZCh0aGlzKSk7ZS5xZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLk9hKCl9LmJpbmQodGhpcykpO3RoaXMuYS5vZyhmdW5jdGlvbihhKXtlLmphKHRoaXMuQywicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LFNvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy50cmFjaygicGF1c2UiKTtlLm8oay5rZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5xYz0hMH0sVG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLm8oay5jZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksCnRoaXMucygpKTt0aGlzLnFjPSExfSxWbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpO2UubyhrLmxnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFVvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmtnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFJvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO3RoaXMuYWkoKTtlLm8oay5nZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxabzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLm8oay5jZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxYbzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLnRkPSEwO3RoaXMuVmEoImZpcnN0UXVhcnRpbGUiKTtlLm8oay5kZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksCnRoaXMudigpLHRoaXMucygpKX0sWW86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS5vKGsuaWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sJG86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7dGhpcy5WYSgidGhpcmRRdWFydGlsZSIpO2UubyhrLm1nLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy5QZigpO3RoaXMuVmEoImNvbXBsZXRlIil9LHZpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuQyYmdGhpcy5DLnBhcmVudE5vZGUmJnRoaXMuQy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBjPXRoaXMuQy5wYXJlbnROb2RlO3RoaXMuQy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuQyk7Yy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpO2UudmUoKTt0aGlzLkM9ITE7dGhpcy5PYShhKX19LApRbzpmdW5jdGlvbihhKXt2YXIgYz1hLm1lc3NhZ2V8fCIiLGQ9L1xkKy9nOyFjJiZhLmRhdGEmJmEuZGF0YS5vcmlnaW5hbGV2ZW50JiZhLmRhdGEub3JpZ2luYWxldmVudC5tc2cmJihjPWEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyxjLm1hdGNoKGQpKTt0aGlzLlVhKCJ2cGFpZGVycm9yIik7ZS5vKGsuYXAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnZpKCEwKX0seGs6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGEsYil7aWYoYi5HYSYmYi5pc0VuYWJsZWQmJiFiLkxjKCkpe3ZhciBjPWIuaWEoYSk7cmV0dXJuIGMucHJvdG9jb2wrIjovLyIrYy5ob3N0fXJldHVybiBhfWlmKGEuYXBwZW5kQ2hpbGQpe3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO2Yuc3JjPWQoYyx0aGlzLkIpO2Yub25lcnJvcj10aGlzLk5vLmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChmKX1lbHNlIGEuc2V0QXR0cmlidXRlKCJzcmMiLGQoYyx0aGlzLkIpKX0sCmdpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPzA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RoOiEwfSxBazpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5zaS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLlJmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy50aS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LEhkOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLnNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuUmYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIiwKdGhpcy50aS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLlBmLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuUWYuYmluZCh0aGlzKSl9LHNpOmZ1bmN0aW9uKGEpe3RoaXMuZmN8fCh0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mY3x8dGhpcy5SZihhKX0uYmluZCh0aGlzKSx0aGlzLkhrKSl9LFJmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmhkJiZ0aGlzLmdpKHRoaXMudmlkZW8pJiYhdGhpcy5LYiYmIXRoaXMuZmMpe3RoaXMuaGQ9ITA7dHJ5e2lmKCFlLlNhKCkmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLmIuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLktifHwodGhpcy5LYj0hMCx0aGlzLkhkKHRoaXMudmlkZW8pLGUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsdGhpcy5XYSgpLCEwKSx0aGlzLkIuS2d8fAp0aGlzLkIuZGEoInZpZGVvLW5vb3AiKSk7dGhpcy5PYSgpO3JldHVybn19Y2F0Y2goYyl7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLHRoaXMuV2EoKSwhMCl9dGhpcy5LbygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5hLkJmKCk7dGhpcy5KbygpO3RoaXMucmkoKTt0aGlzLnNnKCk7dGhpcy5hLkpoKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkZmKCl9fSxGZjpmdW5jdGlvbigpe3RoaXMub2R8fHRoaXMuZWcoKX0sZWc6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy52aWRlby5wbGF5KCk7aWYoYyYmY1siY2F0Y2giXSljWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5vZHx8KGE/dGhpcy5PYSgpOih0aGlzLmNmKCEwKSx0aGlzLmVnKCEwKSkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSwKd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMuYmluZCh0aGlzKSkpOko9ZnVuY3Rpb24oKXt0aGlzLm9lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5GZigpKX0uYmluZCh0aGlzKTt0aGlzLkdlKCkuWWgodGhpcyl9LFBmOmZ1bmN0aW9uKCl7dGhpcy5CLiRhJiYhdGhpcy5LYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UubyhrLnJrLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5PYSgpfSx1azpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZD0hMSxmPTA7ZjxhLmxlbmd0aDtmKyspZD1lLlpnKGFbZl0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT1rLlFhKGEsdGhpcy5zKCkpO2UuWG4oYSl9LE9hOmZ1bmN0aW9uKGEpe3RoaXMuYiYmdGhpcy5iLllkJiZ0aGlzLnVrKHRoaXMuYi5ZZCk7aWYoIXRoaXMud2UpaWYodGhpcy53ZT0KITAsdGhpcy5YZHx8KGUubyhrLk9tLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5iLnhifHx0aGlzLmIudGMpe2UucGIoIm5ld1NtYWxsQWRJZCIpO3RoaXMuRWYrKzt0aGlzLmZjPXRoaXMuaGQ9ITE7dHJ5e3RoaXMuSGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGQpe310cnl7dGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnNhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLkxkPSExO3RyeXt0aGlzLmEub2koKX1jYXRjaChoKXt9dGhpcy5OZD0hMDt0aGlzLmEuS2UoKTt0aGlzLmtjPSExO3RoaXMuR2UoKS5UaCgpO3RoaXMuYi54YiYmdGhpcy5iLm9yaWdpbi5kZigpO3RoaXMuYi50YyYmKGE/dGhpcy5iLm9yaWdpbi5DaCgpOnRoaXMueGUoKSl9ZWxzZSB0aGlzLnhlKCl9LE5vOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkhkKHRoaXMudmlkZW8pLHRoaXMuUWYoYSkpfSxRZjpmdW5jdGlvbihhKXt0aGlzLmZjPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuQi5SaygpO3RoaXMuYi5vcmlnaW4uTWcody5iZSl9LHRpOmZ1bmN0aW9uKCl7aWYodGhpcy51byl0aGlzLk9hKCk7ZWxzZXt0aGlzLmtjPSEwO3RoaXMuYS5jLndhJiYhdGhpcy5OZCYmdGhpcy5hLmMud2EoKSYmZS5vKGsuQmMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt2YXIgYT1NYXRoLmZsb29yKHRoaXMudmlkZW8uY3VycmVudFRpbWUpO3RoaXMueW8oYSk7aWYoIXRoaXMuVmIpe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJgoodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoZD10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuVmI9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlhkPSEwO2UubyhrLnVpLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YyxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtlLlJlKHRoaXMuVmIpfWQ9IiI7dGhpcy5iLkRmJiYoYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlpoKSkmJihkPXRoaXMuYi5EZi1hLDA8ZD9kPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksCnRoaXMuTGR8fCh0aGlzLkxkPSEwLGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UubyhrLmtnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5iLnhiPyh0aGlzLmZjPXRoaXMuaGQ9ITEsdGhpcy5IZCh0aGlzLnZpZGVvKSx0aGlzLnNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuZ2IucmVtb3ZlQ2hpbGQodGhpcy5zYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLkxkPSExLHRoaXMuYS5vaSgpLHRoaXMuYi5vcmlnaW4uZGYoKSk6dGhpcy5PYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWQpO3RoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5lZC5yZXBsYWNlKCJbdGltZV0iLGUuVWcodGhpcy5iLmR1cmF0aW9uLWEpKSk7dGhpcy5vZT0hMDt0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0sbGk6ZnVuY3Rpb24oKXt0aGlzLklofHwKKHRoaXMuSWg9ITAsdGhpcy50ZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHlvOmZ1bmN0aW9uKGEpe2UubyhrLm1lLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YT09dGhpcy5taXx8dGhpcy5LYnx8KDA9PWEmJih0aGlzLnliJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnliKSx0aGlzLnliPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy5CLkJiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfaW1wcmVzc2lvbiIsdGhpcy5CYiwhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmxpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5saSgpfS5iaW5kKHRoaXMpKSx0aGlzLktifHx0aGlzLmFpKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSwKdGhpcy5CLiRhJiZ0aGlzLlZhKCJzdGFydCIpLGUubyhrLmdnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksZS5vKGsubGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy50ZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUubyhrLmRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzIpJiYodGhpcy5CLiRhJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsITApLHRoaXMuVmEoIm1pZHBvaW50IikpLHRoaXMudHJhY2soIm1pZHBvaW50IiksZS5vKGsuaWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksCmE9PU1hdGguZmxvb3IoMyp0aGlzLmIuZHVyYXRpb24vNCkmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLm8oay5tZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSx0aGlzLm1pPWEpfSwkaDpmdW5jdGlvbihhLGMpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxjLCEwKX0sWm46ZnVuY3Rpb24oKXtlLlNkKFsic3RhdHNfaGRfYWRfY2FsbDoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfY2FsbF9zdW0iXSl9LGFpOmZ1bmN0aW9uKCl7ZS5TZChbInN0YXRzX2hkX2FkX2ltcHJlc3Npb246Iit0aGlzLldhKCksInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fc3VtIl0pfSwkbjpmdW5jdGlvbigpe2UuU2QoWyJzdGF0c19oZF9hZF9lbXB0eToiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlNkKFsic3RhdHNfaGRfYWRfZXJyb3I6IisKYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfSxWYTpmdW5jdGlvbihhKXsodGhpcy5VZnx8dGhpcy5CLiRhKSYmZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuV2EoKSwhMCl9LE9iOmZ1bmN0aW9uKGEsYyl7dGhpcy5CLiRhJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYywhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYyl7aWYoIXRoaXMuS2Ipe3RoaXMuZWYmJnRoaXMuZWYudHJhY2smJnRoaXMuZWYudHJhY2soYSk7ImltcHJlc3Npb24iPT1hJiZlLnllJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVtb2RlIiwiaW1wcmVzc2lvbiIsITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgZD1bXTt0cnl7ZD10aGlzLlFsKHRoaXMuYi5MYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgaD0KZC5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLnNlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuTWQuaW1wcmVzc2lvbnMmJmUuam0oaC51cmwsdGhpcy5NZC5pbXByZXNzaW9ucyk/dGhpcy5YZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5vKGsuc2ssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHthZElkOnRoaXMuTWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMucygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLlhlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFjKXRyeXt0aGlzLmIuTGE9dGhpcy5obCh0aGlzLmIuTGEsYSl9Y2F0Y2gobSl7fX19LFdhOmZ1bmN0aW9uKCl7dmFyIGE9ZS5TYSgpPyJtb2JpbGUiOiJkZWZhdWx0IixjPSIiO3RoaXMuVWYmJihjPSJfdnBhaWQiKTt0aGlzLldjJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFhlOmZ1bmN0aW9uKGEsCmMsZCxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihjPXRoaXMuQi52YShhKSxkJiZjLndrKGQpLGZ8fChmPXRoaXMuSmcpLGV8fChlPXRoaXMuSmcpLHRoaXMueWsoYSksdGhpcy5CLkhhKGMsZnVuY3Rpb24oKXt0aGlzLlNoKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuU2goYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LHlrOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09Im9wZW4ifSxTaDpmdW5jdGlvbihhKXt0aGlzLmxjW2FdPSJjbG9zZWQifSxaazpmdW5jdGlvbigpe3RoaXMubGM9e319LGJvOmZ1bmN0aW9uKCl7dmFyIGE9MCxjO2ZvcihjIGluIHRoaXMubGMpdGhpcy5sYy5oYXNPd25Qcm9wZXJ0eShjKSYmIm9wZW4iPT10aGlzLmxjW2NdJiZhKys7cmV0dXJuIGF9LFFsOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWN9KX0saGw6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PQpjfSl9LEtvOmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Mby5iaW5kKHRoaXMpKX0sTG86ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLm5jKCk6dGhpcy5iLmVjJiYoZS5vKGsuQ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0iX3RvcCI7aWYodGhpcy5CLnpjfHx0aGlzLldjKWE9Il9ibGFuayI7dHJ5e3ZhciBjPXdpbmRvdy5vcGVuKCIiLGEpO2MuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtjLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLmVjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5lYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LApKbzpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmVkLnJlcGxhY2UoIlt0aW1lXSIsZS5VZygwKSk7CnZhciBjPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQi5rZCYmKGM9dGhpcy5CLmtkKTtjJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkViLmJpbmQodGhpcyksMUUzKmMpO3RoaXMuY2FwdGlvbj10aGlzLnNhLmFwcGVuZENoaWxkKGEpfX0sRWI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sSmQ6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQi5rZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LHJpOmZ1bmN0aW9uKGEpe2lmKCFlLkdmKHRoaXMuY29udHJvbHMpKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpkLmlkPXRoaXMuZGw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSmQoKX0uYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkZiKCk7dGhpcy5FYigpfS5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXToKKGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuTGI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaWkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5paS5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaGkuYmluZCh0aGlzKSksYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5oaS5iaW5kKHRoaXMpKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSmQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkZiKCk7dGhpcy5FYigpfS5iaW5kKHRoaXMpKTsKdmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLkpiO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy53by5iaW5kKHRoaXMpKTpoLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnZvLmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkpkKCl9LmJpbmQodGhpcykpO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5GYigpO3RoaXMuRWIoKX0uYmluZCh0aGlzKSk7CnZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLlpoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtsLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7CmQuYXBwZW5kQ2hpbGQoZik7dGhpcy5iLkRmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5KZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRmIoKTt0aGlzLkViKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuc2EuYXBwZW5kQ2hpbGQoZCk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLApjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiLGMuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYy5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnNhLmFwcGVuZENoaWxkKGMpO3RoaXMuYS5vZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy50YSYmdGhpcy5hLmMudGEoKSYmKGUubyhrLkRnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy5jZigpKTt0aGlzLkZiKCl9fSxGYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LG5jOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLlZmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxoaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMuYS5BLnBhdXNlZD8KKHRoaXMuYS5BLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5vKGsuY2QsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsua2UsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5GYigpLHRoaXMuRWIoKSkpfSxpaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMucWM/KGUuamEodGhpcy5DLCJjb250cm9sIiwicGxheSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbiksdGhpcy5xYz0hMSk6KGUuamEodGhpcy5DLCJjb250cm9sIiwicGF1c2UiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5GYigpLHRoaXMuRWIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnFjPSEwKX0sRGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmEuQS5wYXVzZWR8fCh0aGlzLmEuQS5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsua2UsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LFZoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5hLkEucGF1c2VkJiYodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLAohMCksZS5vKGsuY2QsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHZvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5KYik7dGhpcy5hLkEubXV0ZWQ/KHRoaXMuYS5BLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuT2IoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuTWYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSk6KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwidXNlciIpLGUubyhrLkJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSx3bzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMudmI/KGUuamEodGhpcy5DLAoiY29udHJvbCIsInVubXV0ZSIpLHRoaXMudmI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUuamEodGhpcy5DLCJjb250cm9sIiwibXV0ZSIpLHRoaXMudmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sY2Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkpiKTt0aGlzLmEuQS5tdXRlZHx8KHRoaXMuYS5BLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuT2IoIm11dGVkIiwiY29udGVudCIpLGUubyhrLkJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpfSxBbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSmIpO3RoaXMuYS5BLm11dGVkJiYodGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwKITApLHRoaXMuT2IoInVubXV0ZWQiLCJjb250ZW50IiksZS5vKGsuTWYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LG1jOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMubWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLm1jKTt0aGlzLm9kfHx0aGlzLm9lfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5GZigpKX0seGU6ZnVuY3Rpb24oKXt0aGlzLnNtKCkmJnRoaXMucm0oKSYmKHRoaXMuQi5zY3x8InNwaWVnZWwuZGUiPT1lLkRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKSYmInByZXJvbGwiPT1lLkhiJiZ0aGlzLnpvKCl8fCh0aGlzLm9kPSEwLHRoaXMueWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueWIpLHRoaXMueWI9ITEpLHRoaXMuRWcoKSl9LHNtOmZ1bmN0aW9uKCl7dmFyIGE9CmUucmQoKTtyZXR1cm4gdGhpcy5CLldiJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LHJtOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYz1sLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5pYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuZ2Z8fChhPSEwLGMuYWRGYWxsYmFja1VSTHx8KGMuYWRGYWxsYmFja1VSTD0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpKTtyZXR1cm4oYXx8IXRoaXMuc2UmJmMuYWRGYWxsYmFja1VSTCkmJiF0aGlzLmdmfSxGbDpmdW5jdGlvbigpe3ZhciBhPWwuZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxjPWUuaWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1jLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sem86ZnVuY3Rpb24oKXtsLmdldENvbmZpZygpOwp0aGlzLmdmPXRoaXMuV2M9dGhpcy5WZj0hMDtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5XYSgpLCEwKTt0aGlzLnNlPSEwO3ZhciBhPXRoaXMuRmwoKSxhPWUucmcoYSx0aGlzLkIsITEse29ubHlVUkw6ITB9KTtpZighYSlyZXR1cm4hMTt0aGlzLlllKGEsITAsITEse2hvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOiEwfSk7cmV0dXJuITB9LEVnOmZ1bmN0aW9uKGEpe3RoaXMuYm8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSx0aGlzLlNtKToodGhpcy5OZD0hMCx0aGlzLmEuS2UoKSx0aGlzLmEud24oKSx0aGlzLmtjPSExLGUubyhrLmNsLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSksdGhpcy5HZSgpLlRoKCkpfSxHZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxzZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpOwphJiYoZS5RZSh0aGlzLnZpZGVvLGEpP3RoaXMuVmgoKTp0aGlzLkRkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHY6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmImJihhLmNsaWNrdGhyb3VnaD10aGlzLmIuZWMsYS5kdXJhdGlvbj10aGlzLmIuZHVyYXRpb24sYS5hZFBvZD10aGlzLmIueGIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy52YyYmMDx0aGlzLnZjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy52YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSxzOmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5LaysiLSIrdGhpcy5FZjt0aGlzLmImJnRoaXMuYi4kZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD0KdGhpcy5iLiRnKCkpO3JldHVybiBhfSxKZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFBhPWMuYWp8fFBhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Gaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFFhPWMuRmt8fFFhO25ldyBRYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubWE9bnVsbDt0aGlzLlY9W107dGhpcy5KPW51bGw7dGhpcy51Yz10aGlzLndjPSExO3RoaXMubmE9IiI7dGhpcy5UZj0hMTt0aGlzLmxoPSIiO2QmJmQuZW1wdHk/dGhpcy5DbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX0KdmFyIGI9MCxnLGQ9W107Yy5haz1hO2EucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9ZS5yZCgpLGI7Yj1lLmlhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3ZhciBjPSIiO2IucXVlcnlLZXkmJihjPWIucXVlcnlLZXkuaHZwKTtjJiYodGhpcy5vcHRpb25zLnZwYWlkPSEwKTtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyBCKHRoaXMudXJsKTpsLnZhKGwuT2QodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5TYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiBlLkYoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRigiZmFuZG9tLmNvbSIpfHxlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIil9LmJpbmQodGhpcyk7CmlmKGQoKXx8ZygpKXt2YXIgaD1lLkdnKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksZz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGguaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfS5iaW5kKHRoaXMpLGs9ZnVuY3Rpb24oKXtyZXR1cm4oZS5GKCJnaWdhLmRlIil8fGUuRigia2luby5kZSIpfHxlLkYoInNwaWVsZXRpcHBzLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKSYmMD09PWguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfS5iaW5kKHRoaXMpLG09ZnVuY3Rpb24oKXtyZXR1cm4gMD09PQpoLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZCgpfHxnKCl8fGsoKXx8ImFwcHNwb3QiPT1jKW0oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk9kKGgpKSsiJnR5cGU9anMiLGI9bC52YShsLk9kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIixlLnRyYWNrKCJzdGF0c19oZF9hZHgiLCIiLCEwKSk6Yj1sLnZhKGwuT2QoaCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYKKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bC5IYShiLHRoaXMuQm0uYmluZCh0aGlzKSx0aGlzLnltLmJpbmQodGhpcykpfSxXZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5tYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuSGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChmKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5tYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLkhifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5IYnx8dGhpcy5wbShhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5pbygpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpOwp2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWcuZmlyc3RDaGlsZDtjLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxwbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLApjPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGQ9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LEJtOmZ1bmN0aW9uKGEpe3RoaXMuZW4oYSk7dHJ5e3RoaXMubWE9YS5yZXNwb25zZVhNTCx0aGlzLm1hfHwodGhpcy5tYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlBhKHcuZ2UpKX10aGlzLlY9CnRoaXMuV2coKTt0aGlzLndjPXRoaXMuSmYoKTt0aGlzLnVjPXRoaXMuZWkoKTt0aGlzLmxoPWEudXJsQ2FsbGVkO2lmKHRoaXMuVi5sZW5ndGgpdGhpcy5PYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlBhKHcuWWMse2Vycm9yOnRoaXMuVGY/RS5mZTpFLllmfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuRGIodGhpcy5uYSksITApfWNhdGNoKGMpe319fSxDbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5tYXx8KHRoaXMubWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5yYSh0aGlzLlBhKHcuZ2UpKX10aGlzLlY9dGhpcy5XZygpO3RoaXMud2M9dGhpcy5KZigpO3RoaXMudWM9dGhpcy5laSgpO3RoaXMuVi5sZW5ndGg/dGhpcy5PYygpOnRoaXMucmEodGhpcy5QYSh3LlljLHtlcnJvcjp0aGlzLlRmP0UuZmU6RS5ZZn0pKX0seW06ZnVuY3Rpb24oKXt0aGlzLnJhKHRoaXMuUGEody5YZix7ZGVwdGg6Yn0pKX0sCk9jOmZ1bmN0aW9uKCl7dGhpcy5KPXRoaXMuVi5zaGlmdCgpO3RoaXMudG0oKT90aGlzLnFvKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMuZmgoKSxnLHtBZFN5c3RlbTp0aGlzLnhsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5QYSh3LiRmKSk6KGI9MCx0aGlzLkJvKCkmJnRoaXMua2YodGhpcy5nbCgpKSl9LGRmOmZ1bmN0aW9uKCl7dGhpcy53Yz8odGhpcy53Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC5kZigpfSxDaDpmdW5jdGlvbigpe3RoaXMudWM/KHRoaXMudWM9MTx0aGlzLlYubGVuZ3RoLHRoaXMuVi5sZW5ndGgmJnRoaXMuT2MoKSk6dGhpcy5wYXJlbnQuQ2goKX0sQm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ubygpP3RoaXMubW8oKT8hMDooLTEhPXRoaXMuR2MoKT90aGlzLnJhKHRoaXMuUGEody5aZCkpOnRoaXMucmEodGhpcy5QYSh3LldmKSksITEpOih0aGlzLnJhKHRoaXMuUGEody5ZYywKRS5aZikpLCExKX0sa2Y6ZnVuY3Rpb24oYSl7dGhpcy5uYXx8KHRoaXMubmE9IiIpO2EuWWR8fChhLllkPVtdKTthLllkLnB1c2godGhpcy5saCk7YS5MYT1hLkxhLmNvbmNhdCh0aGlzLiRlKCkpO2EueGI9YS54Yj9hLnhiOnRoaXMud2M7YS50Yz1hLnRjP2EudGM6dGhpcy51YzthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7dGhpcy5wYXJlbnQua2YoYSl9LGdsOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFJhO3RoaXMubmF8fCh0aGlzLm5hPSIiKTthLmR1cmF0aW9uPXRoaXMuR2MoKTthLk09dGhpcy5iaCgpO2EuZWM9dGhpcy5BbCgpO2Eub3E9W107YS5vcmlnaW49dGhpczthLnU9dGhpcy53bCgpO2EuRGY9dGhpcy5PbChhLmR1cmF0aW9uKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5uYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuU2c7cmV0dXJuIGF9LHJhOmZ1bmN0aW9uKGEpe3RoaXMubmF8fAoodGhpcy5uYT0iIik7YS5ZYT1hLllhP2EuWWE6LTEhPXRoaXMubmEuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlNnO2lmKCF0aGlzLkomJnRoaXMubWEmJnRoaXMubWEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLko9dGhpcy5tYTt0cnl7aWYodGhpcy5KJiZ0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBjPSExOyhjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJmMubGVuZ3RoJiZlLnRyYWNrKCJzdGF0c19oZF9lbXB0eUFkRXJyb3JTd2l0Y2giLCIiLCEwKX19Y2F0Y2goZCl7fX10aGlzLkomJihhLkxhPWEuZXJyb3IuY29kZSE9dy5aZC5jb2RlP2EuTGEuY29uY2F0KHRoaXMuQmwoKSk6YS5MYS5jb25jYXQodGhpcy5LbCgpKSk7dGhpcy5WLmxlbmd0aD8odGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LmdjJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQuZ2MmJnRoaXMucGFyZW50LmdjKGEpLGI9MCx0aGlzLk9jKCkpOgoodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGdjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmdjKGEpfSxNZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5QYShhLGIpKX0sUGE6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgU2EoYSxiKTtjLm9yaWdpbj10aGlzO3JldHVybiBjfSxxbzpmdW5jdGlvbigpe3JldHVybiBiPGd9LG5vOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sbW86ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLkdjKCl9LEpmOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5WLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sZWk6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLlYmJjI8PXRoaXMuVi5sZW5ndGgmJgohdGhpcy5KZigpJiYoYT0hMCk7cmV0dXJuIGF9LGVuOmZ1bmN0aW9uKGEpe3RoaXMubmE9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5uYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm5hPSJVTktOT1dOIn10cnl7dGhpcy5UZj1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx0bTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuZmgoKS5sZW5ndGh9LGZoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmUodGhpcy5KLCJWQVNUQWRUYWdVUkkiKX0seGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GZSh0aGlzLkosIkFkU3lzdGVtIil9LCRlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksCmI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKGQpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEmJiF0aGlzLnNoKGEpKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8ZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLmxiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5zaChhLnBhcmVudE5vZGUpOiExfSxLbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxCbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sQWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYih0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCmJoOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksTmE6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLElwOmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLmxiKGFbY10pfSk7dmFyIGQ9dGhpcy5vcHRpb25zLk5hfHwxRTM7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGQtYS5OYSktTWF0aC5hYnMoZC1iLk5hKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGQtYS5OYSktTWF0aC5hYnMoZC1iLk5hKX0pLGI9Zy5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSx3bDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixjPSExLGQ9W10sYj0hMSxnPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2c9Yj10aGlzLndkKGFbaF0pO3RyeXtjPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7Yz1ifWQucHVzaChjKTtlLnB1c2goZyl9MTxhLmxlbmd0aD8oYj1kLGg9Zyk6KGI9YyxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxHYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LE9sOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGQ9Yy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUuVm4oZCxhKSwwPmImJihiPSExKX1jYXRjaChnKXtiPSExfXJldHVybiBifSxGZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubGIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEllOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLndkKGEpOiIifSx3ZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5JZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBSPWMuYWt8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy55anx8VGE7bmV3IFRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5MYT1bXTt0aGlzLk09W107dGhpcy5lYz0iIjt0aGlzLnU9dGhpcy50Yz10aGlzLnhiPSExO3RoaXMuTWU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLk5lPSIifWMuSGo9YTthLnByb3RvdHlwZT17JGs6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sSWw6ZnVuY3Rpb24oKXtpZighdGhpcy5NZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm1hKXt2YXIgYT10aGlzLm9yaWdpbi5tYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5NZT1hW2RdKX1yZXR1cm4gdGhpcy5NZX0sJGc6ZnVuY3Rpb24oKXtpZih0aGlzLk5lKXJldHVybiB0aGlzLk5lO3ZhciBhPSIiOyhhPXRoaXMuSWwoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLk5lPWF9LFNsOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTS5sZW5ndGg7YysrKWlmKDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5NW2NdO3JldHVybiBhfX19KShjKTt2YXIgUmE9Yy5Ianx8UmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5Sbnx8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB3PXtnZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixLYToiWE1MX1BBUlNFX0VSUk9SIn0sV2Y6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLEthOiJEVVJBVElPTl9FUlJPUiJ9LFljOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixLYToiRU1QVFlfVkFTVCJ9LCRmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApLYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sWGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsS2E6IkxPQURfRVJST1IifSxiZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsS2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKaXA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsS2E6Ik1FRElBRklMRV9FUlJPUiJ9LFpkOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLEthOiJEVU1NWV9BRCJ9fSxFPXtZZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLEthOiJOT19BRFMifSxaZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsS2E6Ik5PX01FRElBRklMRVMifSxqcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixLYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGZlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLEthOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5YbT1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBWYT1jLlhtfHxWYTtuZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnFkPWM7dGhpcy5MYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBTYT1jLlFpfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuR2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYT1jLkdrfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuVWg9YTt0aGlzLnZpZGVvPWM7dGhpcy5WZD1bXTt0aGlzLlJoPVtdO3RoaXMuZmY9W107dGhpcy5Nbz0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLksoKX1jLmtwPWE7YS5wcm90b3R5cGU9e0s6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuVWgubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5VaFthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7aC5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3ZhciBrPWguY29udGVudFdpbmRvdztrLmNxPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy50bi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5rbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuVmQucHVzaCh7c3JjOmQsZnJhbWU6aCxUbTplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5mZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLmZmW2NdO2QudHlwZT09PWEmJmQuTWsodGhpcy5DbChhKSl9fSwKQ2w6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bXE6ITAsbHE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7WnA6InZpZGVvIixwcToianNDdXN0b20iLHFxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAscnE6MSxKcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LApSbDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuVmQubGVuZ3RoO2MrKylpZih0aGlzLlZkW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuVmRbY10uVG07cmV0dXJuIiJ9LHRuOmZ1bmN0aW9uKGEsYyl7dGhpcy5SaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5SbChjKSx2ZW5kb3I6Y30pO3RoaXMuWW4oKX0sa246ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLk1vLm1hcChmdW5jdGlvbihhKXt0aGlzLnBnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMucGcoYSxjKX0scGc6ZnVuY3Rpb24oYSxjKXt0aGlzLmZmLnB1c2goe3R5cGU6YSxNazpjLGpxOiExfSl9LFluOmZ1bmN0aW9uKCl7dGhpcy5SaC5tYXAoZnVuY3Rpb24oYSl7YS5tbXx8KGEuYnEoe2FkU2Vzc2lvbklkOmUuWCgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEubnEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5tbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuaGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLmhrfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLmtiPWEuWGcoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWCgxMCk7dGhpcy5BPUMucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuTWE9e307dGhpcy5xZz0hMTsKdGhpcy5iYz1bXX1jLk9pPWE7YS5wcm90b3R5cGU9e3ZsOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMudmwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLlpsKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxmbzpmdW5jdGlvbigpe3RoaXMucWc9ITB9LG9pOmZ1bmN0aW9uKCl7dGhpcy5BPUMucG9wKCk7dGhpcy5BfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkEuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQS5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxKaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkJjLHRoaXMuYy5sKCkpfSx3bjpmdW5jdGlvbigpe3RoaXMucWd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay5uZCx0aGlzLmMubCgpKSl9LEJmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5BLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQS5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7CnRoaXMuYy5SYyYmdGhpcy5jLlJjKCk/dGhpcy5jLlhnKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5pYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sWmw6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LHRsOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGljOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudGwodGhpcy5rYik7aWYoYy54IT10aGlzLk1hLnh8fGMueSE9dGhpcy5NYS55fHxjLnBvc2l0aW9uIT10aGlzLk1hLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLk1hLndpZHRofHxjLmhlaWdodCE9dGhpcy5NYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5NYS53aWR0aCYmMDx0aGlzLk1hLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuS2UoKTtyZXR1cm59dGhpcy5NYT1jO3RoaXMuYy5SYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5BLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5BLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmJjLmxlbmd0aDthKyspdGhpcy5iY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLkdmKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuaWMuYmluZCh0aGlzKSwxMCl9LG9nOmZ1bmN0aW9uKGEpe3RoaXMuYmN8fCh0aGlzLmJjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5iYy5wdXNoKGEpfSxLZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQSYmdGhpcy5BLnBhdXNlJiZ0aGlzLkEucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBZYT1jLk9pfHxZYSxDPVtdLFphPTA7MTAwPlphO1phKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5YKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxiYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5WbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyICRhPWMuVm18fCRhO25ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkFqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuSWQoYSk7dGhpcy5IZygpfSxJZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sSGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlJhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5XKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx3YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sT2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5SYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGFiPWMuQWp8fGFiOyhmdW5jdGlvbihjKXtjLnpqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jYSgpO3RoaXMuWmI9dGhpcy5aYnx8ITE7dGhpcy5oZz10aGlzLmpnPQp0aGlzLnBoPXRoaXMudWE9dGhpcy5MZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLnJsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5MZj0hMDt0aGlzLnBoJiZ0aGlzLnpnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuR2I7YSYmYS5rYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmxkKCk7dGhpcy5waD0hMDt0aGlzLnpnKCl9LmJpbmQodGhpcykpOwp0aGlzLnVnKCl9LHpnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWmIpe3RoaXMubGQoKTtpZighdGhpcy5MZiYmIXRoaXMubGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLkxmJiZ0aGlzLmhnJiYhdGhpcy5qZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19LGxkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxkaDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSx1ZzpmdW5jdGlvbigpe2lmKHRoaXMubGQoKSl7dmFyIGE9CnRoaXMuZGgoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5qZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmhnPWEuR3B9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWcoKX0uYmluZCh0aGlzKSwxMDApfSxLcDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5YcCgpOiExfSxHYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuR2MoKTotMX0sTGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0scmw6ZnVuY3Rpb24oYSxiKXt0aGlzLlpiPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLlpifHwzMDI9PXRoaXMuWmI/dGhpcy51YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuWmIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZCgpfS5iaW5kKHRoaXMpLDEwMCl9LG1kOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPyh0aGlzLncoKSx0aGlzLnBhKCkpOmEuT2UoKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5MbChhKT8odGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1kKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBiYj1jLnpqfHxiYjsoZnVuY3Rpb24oYyl7Yy5Caj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG9tOmZ1bmN0aW9uKCl7d2luZG93Lk9PLkxqLm9rLm1rP3dpbmRvdy5PTy5Mai5vay5tay5FcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVGE9MTUwMDt2YXIgYT1jYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5IZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYWIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IGJiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBjYj1jLkJqfHxjYixkYj1uZXcgY2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnhvPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZWI9Yy54b3x8ZWI7bmV3IGViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLklpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMua2E9ITE7dGhpcy5naCgpfSxnaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlcoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5naCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LEphOmZ1bmN0aW9uKCl7dGhpcy5NaCgpfSxNaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVSYmKDAsdGhpcy5VKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGZiPWMuSWl8fGZiOyhmdW5jdGlvbihjKXtjLkhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LHdnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5wYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLnBhKCk6dGhpcy5nKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLndnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMud2coYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBnYj1jLkhpfHxnYjsoZnVuY3Rpb24oYyl7Yy5KaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBoOmZ1bmN0aW9uKGEpe2E9bmV3IGZiKGEpO2Eua2E/dGhpcy5QKCk6dGhpcy5MKGEpfHwoYS5JZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgZ2IoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5zbHx8KHRoaXMuc2w9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLlBoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5QaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBoYj1jLkppfHxoYixTPW5ldyBoYihyKTtTLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuY209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYj1jLmNtfHxpYjtuZXcgaWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Waj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxSYzpmdW5jdGlvbigpe3ZhciBhPW07cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBUPWMuVmp8fFQ7KGZ1bmN0aW9uKGMpe2MuVWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eC5kZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp4LmRkKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuUG0oYSl9LmJpbmQodGhpcykpO3guZGQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5kZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5EKCl9LmJpbmQodGhpcykpO3guVWwoKX0sUG06ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy53KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMucGEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5EKCl9fSl9KShjKTt2YXIgVT1jLlVqfHxVOyhmdW5jdGlvbihjKXtjLldqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLkNkJiYoYT1lLmlsKGEsdGhpcy5DZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBUKGQpO2lmKCF0aGlzLkwoZCkpe3RoaXMuTihkKTsKdmFyIGY9bmV3IFUoZCx0aGlzLkcpO2YuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLkNkfHwodGhpcy5DZD1bXSksdGhpcy5DZC5wdXNoKGFbYl0pLGQ9bmV3IFQoaCksdGhpcy5MKGQpfHwodGhpcy5OKGQpLGY9bmV3IFUoZCx0aGlzLkcpLGYuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sZGQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2FdfHwodGhpcy5hYVthXT17fSk7dGhpcy5hYVthXVtiXXx8KHRoaXMuYWFbYV1bYl09W10pO3RoaXMuYWFbYV1bYl0ucHVzaChjKX0scm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5hYXx8dGhpcy5hYSYmIXRoaXMuYWFbYl0pdGhpcy5OY3x8Cih0aGlzLk5jPVtdKSx0aGlzLk5jLnB1c2goYSksdGhpcy52bigpJiYodGhpcy5yZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2JdW2NdJiYwPHRoaXMuYWFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYl1bY11bZF0oYSl9fSxVbDpmdW5jdGlvbigpe2lmKHRoaXMuTmMpZm9yKHZhciBhPTA7YTx0aGlzLk5jLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuTmNbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2NdW2RdJiYwPHRoaXMuYWFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5hYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYWFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmeC5ybyhhKX19KX0pKGMpO3ZhciBqYj1jLldqfHxqYix4PW5ldyBqYihyKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5qbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtiPWMuamx8fGtiO25ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkVpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlcoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHdhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSx0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbGI9Yy5FaXx8bGI7KGZ1bmN0aW9uKGMpe2MuRmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG1iPWMuRml8fAptYjsoZnVuY3Rpb24oYyl7Yy5HaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IGxiKGQpO3RoaXMuTChoKXx8KHRoaXMuTihoKSwobmV3IG1iKGgsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxMOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuSWEpaWYoYj09dGhpcy5JYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuSWFbYS5oYSgpXT8hMDohMX19KX0pKGMpO3ZhciBuYj1jLkdpfHxuYixvYj1uZXcgbmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1sPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5tbHx8cGI7bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mud2o9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5CZz10aGlzLkVjPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3ZhciBiPXRoaXMuT2coYS5zb3VyY2UuX2VudnZhcnMpO2ImJih0aGlzLkVjPWIpO2lmKCF0aGlzLkJnJiYoYS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwKYS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5CZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMudmQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVyhiKTt0aGlzLmpuKHRoaXMuZ2V0UmF3UGxheWVyKCksYSk7dGhpcy5nZXRSYXdQbGF5ZXIoKX0sdmQ6ZnVuY3Rpb24oKXtpZih0aGlzLkVjKXJldHVybiB0aGlzLkVjO2lmKHRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycyl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO2lmKGE9dGhpcy5PZyhhKSlyZXR1cm4gdGhpcy5FYz1hfX0sT2c6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7YSYmYS52aWRlb1Nsb3QmJihiPWEpO2EmJmEuaGR2cGFpZCYmKGI9YS5oZHZwYWlkKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LGpuOmZ1bmN0aW9uKGEsYil7YSYmYS5wYXVzZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucGF1c2UmJnRoaXMuZWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YSYmYS5yZXN1bWVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEucmVzdW1lJiZ0aGlzLmVhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEubXV0ZSYmdGhpcy5lYS5tdXRlKCl9LmJpbmQodGhpcykpO2EmJmEudW5tdXRlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5lYSYmdGhpcy5lYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLnVubXV0ZSYmdGhpcy5lYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LHFoOmZ1bmN0aW9uKGEpe3RoaXMuZWE9YX0sUjpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHFiPWMud2p8fHFiOyhmdW5jdGlvbihjKXtjLnZqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy53aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj10aGlzLmdldFBsYXllcigpOwphLmF1dG9zdGFydCYmIXRoaXMud2kmJih0aGlzLmcoKSx0aGlzLndpPSEwLHRoaXMubGEoKSk7Yi5SYSgpLmFkZEV2ZW50TGlzdGVuZXIoYS5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLnZkKCk/dGhpcy5EKCk6KHRoaXMuemV8fCh0aGlzLnplPTEpLHRoaXMuemUrKywxMDA8dGhpcy56ZT90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCkpfX0pfSkoYyk7dmFyIHJiPWMudmp8fHJiOyhmdW5jdGlvbihjKXtjLnhqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYT1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goYil7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxhLmxlbmd0aDtkKyspYz0KbmV3IHFiKGFbZF0pLHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IHJiKGMsdGhpcy5HKSkuZigpKX19ZWxzZSB0aGlzLlAoKX19KX0pKGMpO3ZhciBzYj1jLnhqfHxzYixWPW5ldyBzYihyKTtWLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB0Yj1jLklvfHx0YjtuZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5maz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5UKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlcoYSk7dGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxKYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVT8oMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkphKCl9LmJpbmQodGhpcyksNDAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpOwp2YXIgdWI9Yy5ma3x8dWI7KGZ1bmN0aW9uKGMpe2MuZWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSWM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGE9YS5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5pbWFBZHNMb2FkZXJ9LGduOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5lYnx8KHRoaXMuZWI9W10pO3RoaXMuZWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnBhKCk6dGhpcy5tKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3RoaXMueGM9CiEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxmOmZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLkJhP3RoaXMuZ24odGhpcy5CYSk6KHRoaXMuQmE9dGhpcy5JYygpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtpZihhLmlzUGxheWluZyYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLkJhKXt0aGlzLkQoKTtyZXR1cm59aWYoIXRoaXMueGMpe3RoaXMuRCgpO3JldHVybn1hPSEwO2lmKHRoaXMuZWImJnRoaXMuZWIubGVuZ3RoJiYxPHRoaXMuZWIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy5lYi5sZW5ndGgtMTtiKyspMTAwOSE9dGhpcy5lYltiXSYmMzAzIT10aGlzLmViW2JdJiY0MDMhPXRoaXMuZWJbYl0mJihhPSExKTtpZihhKXRoaXMudygiZW1wdHkiKSx0aGlzLnBhKCk7CmVsc2V7dGhpcy5EKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgdmI9Yy5la3x8dmI7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpe3ZhciBjPW5ldyB1YihhLml0ZW0oYikpO3RoaXMuTChjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuTihjKSwobmV3IHZiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciB3Yj1jLmdrfHx3Yix4Yj1uZXcgd2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlBpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgeWI9Yy5QaXx8eWI7bmV3IHliKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5UKGEpO3RoaXMuVyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmxmPSExfSxKYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5abSgpfS5iaW5kKHRoaXMpLDUwMCl9LFptOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQb3NpdGlvbigpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVSYmdGhpcy5VKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0RHVyYXRpb24mJihiPWEucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGJ9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGI9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmxmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmxmKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5wbGF5YmFjayYmYS5wbGF5YmFjay5nZXRQbGF5U3RhdGU/KGEucGxheWJhY2suZ2V0UGxheVN0YXRlKCksInBsYXlpbmciPT1hLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKToKITF9LGFvOmZ1bmN0aW9uKCl7dGhpcy5sZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIHpiPWMuUGp8fHpiOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYik7dGhpcy5wYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5GbT0xMDt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMucGN8fCh0aGlzLnBjPTAsYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIpO3RoaXMuZygpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksCndpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLnZlcnNpb25OdW1iZXJ8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpOih0aGlzLnBjfHx0aGlzLnBjKyssdGhpcy5wYzw9dGhpcy5GbT8odGhpcy5wYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuYW8oKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEFiPWMuT2p8fEFiOyhmdW5jdGlvbihjKXtjLlFqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksYj0hMTthJiZhWzBdJiYoYj1hWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpKSYmCmJbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB6Yih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBBYihhLHRoaXMuRykpLmYoKSkpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIEJiPWMuUWp8fEJiLENiPW5ldyBCYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBEYj1jLnVtfHxEYjtuZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Oaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTsKdGhpcy5pc1BsYXlpbmc9ITE7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9IiI7YS5jdXJyZW50VGltZSYmKGI9YS5jdXJyZW50VGltZSk7cmV0dXJuIGJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTA7YS5kdXJhdGlvbiYmKGI9YS5kdXJhdGlvbik7cmV0dXJuIGJ9LEphOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpLGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJmImJjE+Yi1hP3RoaXMuVSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpLAoyMDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRWI9Yy5Oanx8RWI7KGZ1bmN0aW9uKGMpe2MuTWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUmEoKSxiPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YiYmYi5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5sYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmFsKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthPXRoaXMuQ2IoKTsKMDxhLmdldEN1cnJlbnRUaW1lKCk/dGhpcy53bSgpOnRoaXMueWcoKTthLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmcoKXx8KHRoaXMubSgiY29udGVudHBsYXkiKSx0aGlzLmcoITApKX0uYmluZCh0aGlzKSwxRTMpfSxhbDpmdW5jdGlvbigpe3RoaXMuZmcoKXx8dGhpcy5nKCEwKX0sd206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkNiKCk7IWEub2EmJmEuViYmYS5EcCYmYS5GcCYmKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmcoKSl9LHlnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5DYigpO2EuYWRzTG9hZGVyP2EuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYzthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYyBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtjXSl7Yz1hW2NdO2JyZWFrIGF9Yz12b2lkIDB9MTAwOT09Y3x8MzAzPT1jfHw0MDM9PQpjPyh0aGlzLncoKSx0aGlzLnBhKCkpOih0aGlzLm0oImFkZXJyb3IiLGMpLHRoaXMuZygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlnKCl9LmJpbmQodGhpcyksMTAwKX0sQ2I6ZnVuY3Rpb24oKXtpZighdGhpcy5HaClmb3IodmFyIGE9Yy5aYy5DYigpLGI9dGhpcy5nZXRQbGF5ZXIoKS5SYSgpLmlkLGU9MDtlPGEubGVuZ3RoO2UrKylhW2VdLmlkPT1iJiYodGhpcy5HaD1hW2VdKTtyZXR1cm4gdGhpcy5HaH0sWXA6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sZzpmdW5jdGlvbihhKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9hP3RoaXMuQ2IoKS5hZHNMb2FkZXI/dGhpcy5EKCEwKTp0aGlzLkQoKTp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEZiPWMuTWp8fEZiOyhmdW5jdGlvbihjKXtjLlpjPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sVGs6ZnVuY3Rpb24oYSl7YT1uZXcgRWIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IEZiKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe3ZhciBhPWMuWmMuQ2IoKTtpZihhJiZhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLlRrKGFbYl0pO3RoaXMuUCgpfX0pO2MuWmMuQ2I9ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZihtJiZtLnBsYXllcmFwaSYmKGE9bS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO3ZhciBhPVtdLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJtcC1jb250YWluZXIiKTtpZihiJiZiLmxlbmd0aCl7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPQpiW2NdLmZlcm1vZDtkJiZhLnB1c2goZCl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmIubGVuZ3RoKXtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10mJmJbY10uZmVybW9kJiZhLnB1c2goYltjXS5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QpLGJbY10mJmJbY10ucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9cmV0dXJuW119fSkoYyk7dmFyIEdiPWMuWmN8fEdiLEhiPW5ldyBHYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLmhwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgSWI9Yy5ocHx8SWI7bmV3IEliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MudGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO0YmJihhPWEuZmlyc3RDaGlsZCk7aWYoYSl7dGhpcy5UKGEpO2lmKGEudGFnTmFtZSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZW1iZWQiKVswXSl9Yj90aGlzLlcoYik6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0sV3A6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPD1lLkRiKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmCihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXtpZihGKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihGKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSx3YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUjpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sUmM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sUmE6ZnVuY3Rpb24oKXt2YXIgYTtGPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5maXJzdENoaWxkKToKYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YSE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVz1jLnRqfHxXOyhmdW5jdGlvbihjKXtjLnNqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm1mPSIiO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YSYmKHRoaXMubWY9YS5pZCk7Rj93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGM9YS5wbGF5ZXJDb250YWluZXI7YyYmdGhpcy5tZiYmYyE9dGhpcy5tZnx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLkYoInRlbGU1LmRlIikmJiJwb3N0cm9sbCI9PWEuYWRUeXBlfHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5tKCJhZGVycm9yIixhLmVxKSx0aGlzLkQoKSwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubSgiYWRlcnJvciIpLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBYPWMuc2p8fFg7KGZ1bmN0aW9uKGMpe2MudWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7Rj0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKEYpZm9yKHZhciBiPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLApjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbZF0pKWE9bmV3IFcoYSksYS5rYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX1lbHNlIGlmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWE9bmV3IFcoYSksYS5rYT90aGlzLnJmKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFgoYSx0aGlzLkcpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBGLEpiPWMudWp8fEpiLEtiPW5ldyBKYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk5pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgTGI9Yy5OaXx8TGI7bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWk9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/YS5HZXRWaWRlb0VsP2EuR2V0RWw/KGI9YS5HZXRWaWRlb0VsKCksYz1hLkdldEVsKCksYiYmYz8odGhpcy5UKGMpLHRoaXMuVyhiKSk6dGhpcy5aKCkpOnRoaXMuWigpOnRoaXMuWigpOnRoaXMuWigpfSx5bjpmdW5jdGlvbigpe30sdGE6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuUGxheSgpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR29yaWxsYU1lZGlhIn0sYXE6ZnVuY3Rpb24oKXt9fSl9KShjKTsKdmFyIE1iPWMuWWl8fE1iOyhmdW5jdGlvbihjKXtjLlhpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMudmcoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2EuZGV0YWlsJiYiY29udGVudFBsYXllclBsYXkiPT1hLmRldGFpbC5uYW1lJiZ0aGlzLmxhKCl9LmJpbmQodGhpcykpfSx2ZzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy52ZygpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy53KCksdGhpcy5wYSgpKToodGhpcy5tKCJhZGVycm9yIixhKSx0aGlzLmcoKSl9fSxnOmZ1bmN0aW9uKGEpe3RoaXMuRChhKX19KX0pKGMpO3ZhciBOYj1jLlhpfHxOYjsoZnVuY3Rpb24oYyl7Yy5aaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE1iKGFbYl0pO2Mua2F8fHRoaXMuTChjKXx8KHRoaXMuTihjKSwobmV3IE5iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBPYj1jLlppfHxPYixQYj1uZXcgT2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWI9Yy5Uanx8UWI7bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Mua2s9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKGEmJmFbMF0pe2Zvcih2YXIgYj1hPWFbMF07YiYmYi5wYXJlbnROb2RlOyl7aWYoIkJPRFkiPT1iLnBhcmVudE5vZGUubm9kZU5hbWUpe2I9Yi5wYXJlbnROb2RlO2JyZWFrfWI9Yi5wYXJlbnROb2RlfXRoaXMuVyhhKTt0aGlzLlQoYil9ZWxzZSB0aGlzLlooKX0sVGQ6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Yj1uZXcgQ3VzdG9tRXZlbnQoYSx7ZGV0YWlsOnt9fSk6KGI9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYi5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSxkYXRhKSk7YiYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYil9LGhuOmZ1bmN0aW9uKCl7dGhpcy5YYz0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7aWYoYS5kZXRhaWwmJiJhZFJlcXVlc3QiPT0KYS5kZXRhaWwubmFtZSl0cnl7dGhpcy5YY3x8KHRoaXMuWGM9ITAsdGhpcy5UZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0aGlzLlRkKCJ4LWRsOC1oZC1jb250ZW50LXBhdXNlLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5YYyYmKHRoaXMuVGQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5YYz0hMSksdGhpcy5UZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSx3YTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFJiPWMua2t8fFJiOyhmdW5jdGlvbihjKXtjLmprPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxRaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGMoYSl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5kYyhhKX0uYmluZCh0aGlzKSkpLGEmJmEuYWRkQWRFcnJvckxpc3RlbmVyJiZhLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmRjKGEpfS5iaW5kKHRoaXMpKSk6CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUWguYmluZCh0aGlzKSwxMCl9LGRjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlPyhiLmdldEVycm9yQ29kZSgpLHRoaXMubSgiYWRlcnJvciIsYi5nZXRFcnJvckNvZGUoKSksdGhpcy5xaz0hMCwxMDA5PT1iLmdldEVycm9yQ29kZSgpfHwzMDM9PWIuZ2V0RXJyb3JDb2RlKCl8fDQwMz09Yi5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLmcoKSk6KHRoaXMucWt8fHRoaXMubSgibm9mcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGNnOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmRjKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXRbYV0pO3RoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQodGhpcy5jZy5iaW5kKHRoaXMpLAoxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5RaCgpO3RoaXMuY2coKTt0aGlzLmxuKCl9LGxuOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLmdvLmJpbmQodGhpcykpO3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1wdXNoLWVycm9yLWJ1Y2tldCIsZnVuY3Rpb24oYSl7dGhpcy5kYyhhKX0uYmluZCh0aGlzKSl9LGc6ZnVuY3Rpb24oYSl7dGhpcy5mbj90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTAwKX0sZ286ZnVuY3Rpb24oYSl7dGhpcy5mbj0hMDtpZihhJiZhLmRldGFpbClmb3IodmFyIGIgaW4gYS5kZXRhaWwpImFkVGFnVXJsIj09YiYmKGEuZGV0YWlsW2JdfHx0aGlzLmRjKGEpKX19KX0pKGMpO3ZhciBTYj1jLmprfHxTYjsoZnVuY3Rpb24oYyl7Yy5saz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgUmIod2luZG93LkRMOF9HTE9CQUxTKTthLmthfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYS5obigpLGE9bmV3IFNiKGEsdGhpcy5HKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWEuZ28uYmluZChhKSksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIFRiPWMubGt8fFRiLFViPW5ldyBUYihmYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlFtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmI9Yy5RbXx8VmI7bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuWWo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5LaD0hMTsKdmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5XKGMpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5KbT1hfS5iaW5kKHRoaXMpKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9ZWxzZSB0aGlzLlooKX0seW46ZnVuY3Rpb24oKXt9LHRhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPTE7cmV0dXJuIGEudmlkZW9Nb2RlbCYmYS52aWRlb01vZGVsLmdldCYmKGI9YS52aWRlb01vZGVsLmdldCgidm9sdW1lIiksCjA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkptfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmR1cmF0aW9ufSxSOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LEphOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlJkKGEpfS5iaW5kKHRoaXMpKX0sUmQ6ZnVuY3Rpb24oYSl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YSYmKGE9dGhpcy5nZXRDdXJyZW50VGltZSgpKTsKdmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLktoJiYodGhpcy5LaD0hMCx0aGlzLlUmJnRoaXMuVSgpKX19KX0pKGMpO3ZhciBOPWMuWWp8fE47KGZ1bmN0aW9uKGMpe2MuWGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKCF0aGlzLkRlKWlmKHRoaXMuSWJ8fCh0aGlzLkliPTApLHRoaXMuSWIrKywxNTx0aGlzLkliKXtpZih3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSlyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLkxuKCk6dGhpcy5nKCEwKSwhMDt0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIik7YS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmcoKTp0aGlzLmcoITApfWVsc2UgaWYoYT0KYS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuRGU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEpO3RoaXMucmIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfSxyYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVhfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuTz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLApmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgTz1jLlhqfHxPOyhmdW5jdGlvbihjKXtjLlpqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKTt0aGlzLlRhPS0xfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYT1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Eua2F8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGI9MDtiPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDtiKyspYT1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1tiXSksCmEua2F8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmKGE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEua2F8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSkpO3RoaXMucmYoKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBXYj1jLlpqfHxXYixYYj1uZXcgV2Iocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlJtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgWWI9Yy5SbXx8WWI7bmV3IFliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MucGo9CnEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYik7YiYmdGhpcy5UKGIucGFyZW50Tm9kZSl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFk9Yy5wanx8WTsoZnVuY3Rpb24oYyl7Yy5vaj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5taD0wO3RoaXMuTz10aGlzLk98fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy51YT10aGlzLktjPXRoaXMuQmE9CnRoaXMuZmQ9ITE7dGhpcy5PaD1lLk1iKDEwKTt0aGlzLnVoKCl9LHVoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLm9hPWEuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy50YigpLCEwO3RoaXMubWgrKztpZigxMDx0aGlzLm1oKXRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLmcoITApOnRoaXMuZygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWguYmluZCh0aGlzKSwxMDApLCExfSx0YjpmdW5jdGlvbigpe3ZhciBhPXRoaXMub2E7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmNhKGEsITApO3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmJhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy56YSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRiKCl9LmJpbmQodGhpcyksMjApfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTtpZihhLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRFcnJvcil7dmFyIGM9YS5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxyYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVhfSxDYTpmdW5jdGlvbigpe3RoaXMudWE9ITB9LGJhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5yYigpPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hcGkucGxheWVkJiZiLmFwaS5wbGF5ZWQoKT90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5vanx8WjsoZnVuY3Rpb24oYyl7Yy5xaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7dmFyIGE9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFkod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBaKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGE9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgWmI9Yy5xanx8WmIsJGI9bmV3IFpiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuJGp8fAphYztuZXcgYWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5WaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWEmJmI/KHRoaXMuVChhKSx0aGlzLlcoYiksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5aKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIGJjPWMuVml8fGJjOyhmdW5jdGlvbihjKXtjLlVpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsCmIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy54ZygpfSx4ZzpmdW5jdGlvbihhKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYT8odGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGNjPWMuVWl8fGNjOyhmdW5jdGlvbihjKXtjLldpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyBiYyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYS5rYSl7dGhpcy5QKCk7cmV0dXJufWlmKCF0aGlzLkwoYSkpe3RoaXMuTihhKTsobmV3IGNjKGEsdGhpcy5HKSkuZigpO3RoaXMuUCgpO3JldHVybn19dGhpcy5QKCl9fSl9KShjKTsKdmFyIGRjPWMuV2l8fGRjLGVjPW5ldyBkYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuJGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBmYz1jLiRsfHxmYztuZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy56aT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTthPyh0aGlzLlQoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5XKGEpOnRoaXMuWigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBnYz1jLnppfHxnYzsoZnVuY3Rpb24oYyl7Yy55aT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Eub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKTt0aGlzLnRlKCk7dGhpcy50ZygpfSxjYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuTz1hLGIubSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQphLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7YnJlYWt9fSxyYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVhfSxDYTpmdW5jdGlvbigpe3RoaXMudWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LHRnOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYS5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYT1hLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZhLmFkc0xvYWRlcilmb3IodmFyIGI9MDtiPGEuYWRzTG9hZGVyLmxlbmd0aDtiKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZHNMb2FkZXJbYl0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnBhKCkpOnRoaXMuZygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudGcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnRlLmJpbmQodGhpcyksMTAwKX0sdGU6ZnVuY3Rpb24oKXtpZighdGhpcy56YSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTphLl9wbGF5ZXJPcHRpb25zJiZhLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8YS5fYWRSZWdpc3RlcmVkP3RoaXMuZygpOnRoaXMuZyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy50ZS5iaW5kKHRoaXMpLAoxMDApfX0sZzpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxhLmJpbmQodGhpcyksMUU0KTt0aGlzLkQoYSl9fSl9KShjKTt2YXIgaGM9Yy55aXx8aGM7KGZ1bmN0aW9uKGMpe2MuQWk9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxRYTpmdW5jdGlvbihhKXthPW5ldyBnYyhhKTthLmthP3RoaXMuUCgpOnRoaXMuTChhKXx8KHRoaXMuTihhKSwobmV3IGhjKGEsdGhpcy5HKSkuZigpKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLlFhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2FdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5RYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYz1jLkFpfHxpYyxqYz1uZXcgaWMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Xbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGtjPWMuV258fGtjO25ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLnZoPXRoaXMueGg9dGhpcy53aD0hMTt0aGlzLkVkPVtdO3RoaXMucWY9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGVjP251bGw6ZWMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mICRiP251bGw6JGIsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFM/bnVsbDpTLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixqdzoidW5kZWZpbmVkIj09PQp0eXBlb2YgdWE/bnVsbDp1YSx0djI6InVuZGVmaW5lZCI9PT10eXBlb2YgWGI/bnVsbDpYYix0Zm1zdWl0ZVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4P251bGw6eCxuZXh0UGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIEtiP251bGw6S2IseHltYXRpY1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLEdvcmlsbGFNZWRpYXBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBQYj9udWxsOlBiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBvYj9udWxsOm9iLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBkYj9udWxsOmRiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2I/bnVsbDpDYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgSmE/bnVsbDpKYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHhiP251bGw6eGIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgamM/bnVsbDpqYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFY/bnVsbDpWfX1jLkpqPWE7YS5wcm90b3R5cGU9e2Y6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuTWwoYSk6W10sYzt0aGlzLnhoPSEwO2lmKGEubGVuZ3RoKXt0aGlzLndoPSEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLldoKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy5xZil7aWYodGhpcy52aClicmVhaztjPXRoaXMucWZbZF07dGhpcy5PZihjKSYmKHRoaXMuRWQucHVzaChjKSx0aGlzLldoKGMpKX19LE9mOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sTWw6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMucWZbZF0sdGhpcy5PZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxXaDpmdW5jdGlvbihhKXt0aGlzLk9mKGEpJiZhLmYoKX0sY286ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mCnEmJiF0aGlzLndoKWZvcih0aGlzLnZoPSEwLGE9MDthPHRoaXMuRWQubGVuZ3RoO2ErKyl0aGlzLkVkW2FdLlRiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuRWRbYV0uVGIpfX19KShjKTt2YXIgbGM9Yy5Kanx8bGMsTD1uZXcgbGM7TC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5ibXx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLApjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0xKSxlLkZjKGsuQ28pLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLGMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuTm0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtELndpZHRoPTE7RC5oZWlnaHQ9MTtELnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Quc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChEKTt2YXIgcmM9RC5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1ELmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChEKTsKdmFyIEg9bmV3IEksbT0hMTtILmZhKCk7SC5yaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZmEoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnJoKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7SC5mYSgpO3ZhciBzYz1yYyhmdW5jdGlvbigpe2UuUmcod2luZG93LEguZW0oKSx7aWQ6c2N9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy4kaXx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkxoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy56ZD0wO3RoaXMuYmI9IiI7dGhpcy5GZD0KW107dGhpcy5HZD0wO3RoaXMuTmg9ITE7dGhpcy5uZj1bXTtlLnBiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5CaT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihhKXt0aGlzLkxoPWF9LHhmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5SKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQ246ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSxCbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrCiImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5uYik7dmFyIGQ9ITEsZj0hMTtpZih0aGlzLmZtKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5xYSx0aGlzLm5iLnBmLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5XbCgpKXRoaXMueG4oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuZm8oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsCmgpO2wuem4odGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX0oYT10aGlzLkVtKGEpKXx8ZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuV2UmJihkPXRoaXMucGxheWVyLldlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLlllKGEsZCxmKTt0aGlzLnBsYXllci5ZaChsKX19LGZtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMuemQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy56ZC5nZXRUaW1lKCksdGhpcy56ZD1hLDNFNTxjPyEwOiExO3RoaXMuemQ9YTtyZXR1cm4hMX0sVG46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS53ZigicHJlcm9sbCIpOwp2YXIgYT10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInByZXJvbGxBZFRhZyIpJiYoYT10aGlzLkZhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5OZyhhKSk/dGhpcy5TYyhhKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInByZSIsITApLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfSxTbjpmdW5jdGlvbihhKXtpZighdGhpcy5MaCl7ZS53ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuSG4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuTmcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksCmUubyhrLm5kLHRoaXMucGxheWVyLmwoKSkpfX0sTmc6ZnVuY3Rpb24oYSl7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgYz0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEoYyl9cmV0dXJuIGF9LHBuOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuUG4odGhpcy5Tbi5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5KYSgpfSxLZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS53ZigibWlkcm9sbCIpO2lmKCF0aGlzLkFoKXt0aGlzLkFoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm5kLAp0aGlzLnBsYXllci5sKCkpKX19LG5uOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuR24odGhpcy5LZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5hZigpfSxmOmZ1bmN0aW9uKCl7dGhpcy5UbigpO3RoaXMucGxheWVyLmFmJiZ0aGlzLm5uKCk7dGhpcy5wbigpfSxxbjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkZkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5ncChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuR2Q9dGhpcy5GZC5sZW5ndGh9LFdsOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkdkJiYoYT0hMCk7cmV0dXJuIGF9LAp4bjpmdW5jdGlvbihhKXt0aGlzLk5oPWE7Zm9yKGE9MDthPHRoaXMuRmQubGVuZ3RoO2ErKyl0aGlzLkZkW2FdWyJmdW5jdGlvbiJdKHRoaXMuY24uYmluZCh0aGlzKSl9LGNuOmZ1bmN0aW9uKGEpe3RoaXMuR2QtLTthJiZ0aGlzLm5mLnB1c2goYSk7MD49dGhpcy5HZCYmdGhpcy5OaCgpfSxFbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZD0wO2Q8dGhpcy5uZi5sZW5ndGg7ZCsrKWM9dGhpcy5uZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy5CaXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLmxsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoRGFoQmVpRGlvY2FlUG9vcyxEYWhCZWlEaW9jYWVQb29zKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
144.76.165.195 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.195.165.76.144.clients.your-server.de
Software
openresty/1.15.8.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

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

Response headers

Date
Mon, 16 Dec 2019 09:47:19 GMT
Last-Modified
Thu, 16 May 2019 12:48:02 GMT
Server
openresty/1.15.8.2
ETag
"5cdd5c02-18"
Access-Control-Allow-Methods
GET
Content-Type
application/octet-stream
Access-Control-Allow-Credentials
true
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
truncated
/ Frame F06D
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
766b927f4a196d963e30061a3505a97940e0b806cdb57e017c0cea7279dacd15

Request headers

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

Response headers

Content-Type
text/javascript
/
ssl.3.damoh.tvtoday.de/d31728ad567a1180e9c9174c43da5a4ea91aec61/
112 B
674 B
XHR
General
Full URL
https://ssl.3.damoh.tvtoday.de/d31728ad567a1180e9c9174c43da5a4ea91aec61/
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.89.206 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.206.89.251.148.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
7a625d2dfdc959f77d95c2f8460330b62b1567d49c94e647bf84923ed18f3ddc

Request headers

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

Response headers

Date
Mon, 16 Dec 2019 09:47:19 GMT
Server
TornadoServer/5.0
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
https://www.tvtoday.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
112
54c6bdece4b08bb8dcaea327_245.webp
images.tvtoday.de/itv/2019-12-16/
9 KB
9 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-12-16/54c6bdece4b08bb8dcaea327_245.webp
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
28f4bbd7328d8fd561c3afa67625e3316209e6877a108d0e1f1d16e1a18a6204
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:04:32 GMT
content-encoding
gzip
last-modified
Mon, 02 Dec 2019 10:27:54 GMT
age
2567
etag
"2456-598b608511320-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
x-varnish
238439062 239553070
status
200
cache-control
public, max-age=7200
strict-transport-security
max-age=15768000
accept-ranges
bytes
5de7da6c8189654e205c5f74_245.webp
images.tvtoday.de/itv/2019-12-16/
8 KB
8 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-12-16/5de7da6c8189654e205c5f74_245.webp
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
2d81d31825781645ec2422b55a3cf5e3e1e98a310729c7d793ce10cb95f626d2
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:03:31 GMT
content-encoding
gzip
last-modified
Fri, 13 Dec 2019 03:08:59 GMT
age
2628
etag
"1e90-5998d2ede12cf-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
x-varnish
154950797 240912165
status
200
cache-control
public, max-age=7200
strict-transport-security
max-age=15768000
accept-ranges
bytes
5ddced1881896505dcbb994e_245.webp
images.tvtoday.de/itv/2019-12-16/
5 KB
6 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-12-16/5ddced1881896505dcbb994e_245.webp
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
6e962a595dd0d416d641d879cbe211e013c2940dbc4448f2bbd78db14c2b3a78
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 08:05:13 GMT
content-encoding
gzip
last-modified
Mon, 02 Dec 2019 10:52:08 GMT
age
6125
etag
"1536-598b65efa8f6f-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
x-varnish
236409488 237660327
status
200
cache-control
public, max-age=7200
strict-transport-security
max-age=15768000
accept-ranges
bytes
54c6bdece4b08bb8dcaea327_245.webp
images.tvtoday.de/itv/2019-12-16/
9 KB
9 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-12-16/54c6bdece4b08bb8dcaea327_245.webp
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/app/js/main.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
28f4bbd7328d8fd561c3afa67625e3316209e6877a108d0e1f1d16e1a18a6204
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:04:32 GMT
content-encoding
gzip
last-modified
Mon, 02 Dec 2019 10:27:54 GMT
age
2567
etag
"2456-598b608511320-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
x-varnish
236378430 239588845
status
200
cache-control
public, max-age=7200
strict-transport-security
max-age=15768000
accept-ranges
bytes
594a777ff033af6dd0171511_245.webp
images.tvtoday.de/itv/2019-12-16/
6 KB
6 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-12-16/594a777ff033af6dd0171511_245.webp
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
05fc803ef0508750ea5226b79af4b3eee169701f9c27332f4f1d132f6b84ef99
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 08:05:20 GMT
content-encoding
gzip
last-modified
Mon, 02 Dec 2019 10:54:42 GMT
age
6119
etag
"1882-598b6682bf44a-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
x-varnish
237599745 235000520
status
200
cache-control
public, max-age=7200
strict-transport-security
max-age=15768000
accept-ranges
bytes
57eb8edaf033af5c8baf6d8a_245.webp
images.tvtoday.de/itv/2019-12-16/
2 KB
2 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-12-16/57eb8edaf033af5c8baf6d8a_245.webp
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
400487dca671603c9251c3d0c81ee543fd2012d66616a15301351ee2b0eb770c
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 08:05:13 GMT
content-encoding
gzip
last-modified
Fri, 13 Dec 2019 03:09:22 GMT
age
6125
etag
"8c4-5998d30434fdd-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
x-varnish
238439065 239749473
status
200
cache-control
public, max-age=7200
strict-transport-security
max-age=15768000
accept-ranges
bytes
5de7da6c8189654e205c5f74_245.webp
images.tvtoday.de/itv/2019-12-16/
8 KB
8 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-12-16/5de7da6c8189654e205c5f74_245.webp
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/app/js/main.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
2d81d31825781645ec2422b55a3cf5e3e1e98a310729c7d793ce10cb95f626d2
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:04:09 GMT
content-encoding
gzip
last-modified
Fri, 13 Dec 2019 03:08:59 GMT
age
2590
etag
"1e90-5998d2ede12cf-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
x-varnish
242254401 230902606
status
200
cache-control
public, max-age=7200
strict-transport-security
max-age=15768000
accept-ranges
bytes
57eb8edaf033af5c8baf6d8a_780.jpg
images.tvtoday.de/itv/2019-12-16/
17 KB
18 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-12-16/57eb8edaf033af5c8baf6d8a_780.jpg
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
a30f0860fa55750296d4bddba114d53b24985b823998b5e7d75f05047d841bb0
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 08:59:04 GMT
last-modified
Fri, 13 Dec 2019 03:09:23 GMT
age
2895
etag
"454b-5998d30488fb3"
vary
X-Forwarded-Proto,x-requested-with
content-type
image/jpeg
status
200
cache-control
public, max-age=1209600
x-varnish
236450908 215842463
strict-transport-security
max-age=15768000
accept-ranges
bytes
546d7764e4b03c03eaeb0af0_780.jpg
images.tvtoday.de/itv/2019-12-16/
43 KB
43 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-12-16/546d7764e4b03c03eaeb0af0_780.jpg
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
8c420a2ee92719680ab03ba4cd1921c082220aa743092049899381a8e65c147a
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 08:53:01 GMT
last-modified
Mon, 02 Dec 2019 10:54:07 GMT
age
3258
etag
"aa68-598b6660de29c"
vary
X-Forwarded-Proto,x-requested-with
content-type
image/jpeg
status
200
cache-control
max-age=1209600, public
x-varnish
235288285 238379619
strict-transport-security
max-age=15768000
accept-ranges
bytes
546106c0e4b08cb8014b72f8_159.webp
images.tvtoday.de/itv/2019-12-16/
3 KB
4 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-12-16/546106c0e4b08cb8014b72f8_159.webp
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
36ad53e668d5303cfb7f895221307eff56f2c52cfa585724c1e84cf42267cca0
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 09:37:33 GMT
content-encoding
gzip
last-modified
Mon, 02 Dec 2019 11:32:03 GMT
age
586
etag
"d28-598b6edc17272-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
x-varnish
154950805 229667790
status
200
cache-control
public, max-age=7200
strict-transport-security
max-age=15768000
accept-ranges
bytes
573c1c4ff033af6d34ad53d3_159.webp
images.tvtoday.de/itv/2019-12-16/
3 KB
3 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-12-16/573c1c4ff033af6d34ad53d3_159.webp
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
e17d7cdfea89bfe158cecfbc2674999e77e5f515032f020fb49cd2736197c012
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Mon, 16 Dec 2019 08:40:47 GMT
content-encoding
gzip
last-modified
Mon, 02 Dec 2019 10:34:11 GMT
age
3992
etag
"a96-598b61ec7ce75-gzip"
vary
X-Forwarded-Proto,x-requested-with,Accept-Encoding
x-varnish
238439068 216248817
status
200
cache-control
public, max-age=7200
strict-transport-security
max-age=15768000
accept-ranges
bytes

Verdicts & Comments Add Verdict or Comment

158 JavaScript Global Variables

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

object| onformdata object| onpointerrawupdate object| lazySizesConfig function| getParameterByName boolean| mobileRedirect object| mobileParam object| _deq number| horAdCounter number| verAdCounter number| oopAdCounter string| adHomadUnit object| _aeq function| whenDefined object| _sp_ number| kameleoonLoadingTimeout object| kameleoonQueue number| kameleoonStartLoadTime object| kameleoonS string| kameleoonCc object| kameleoonStn function| kameleoonDisplayPage number| kameleoonDisplayPageTimeOut function| reloadGAStats string| GoogleAnalyticsObject function| ga function| IHOFDdd function| UABPreloaded object| iankgCln object| iankgClne object| iankgClni boolean| iankglsn object| iankga85Flags string| iankg620Rnd boolean| iankgnpm boolean| videoScriptIsAlreadyExecuted function| UABPVreloaded object| iankgdabatc object| el1 object| el2 boolean| TftAdEngineBlocked function| adEngineCheck object| dataLayer string| szmvars object| iom object| iam_data object| iam_data_video object| iam_data_text function| reloadIam function| reloadIamVideo function| reloadIamText object| html5 object| Modernizr function| autoOptIn object| Kameleoon object| jstz object| bowser function| tfmvideopkg_getUrlParam boolean| tfmvideodebug boolean| tfmplayerdebug object| tfmvideopkg_internal_script_config boolean| playerAsync undefined| param string| imaURL object| imaScript object| head function| tfmsuite function| VideoPlayerQueue function| $ function| jQuery object| google object| google_tag_data object| gaplugins object| gaGlobal object| gaData object| google_tag_manager object| __core-js_shared__ object| core function| setImmediate function| clearImmediate object| regeneratorRuntime boolean| _babelPolyfill function| addEventHandler boolean| bfaAdEngineRun object| TFM object| apntag object| googletag object| _oldQueue object| apstag object| _deqOptions object| google_js_reporting_queue number| google_srt object| _google_rum_ns_ object| google_persistent_state_async number| google_global_correlator function| mb function| Goog_AdSense_Lidar_sendVastEvent function| Goog_AdSense_Lidar_getViewability function| Goog_AdSense_Lidar_getUrlSignalsArray function| Goog_AdSense_Lidar_getUrlSignalsList object| ima object| _google undefined| _oldVPQueue object| _vpq function| generateInfolayer boolean| apstagLOADED object| criteo_pubtag object| Criteo object| ggeac object| closure_memoize_cache_ object| googleToken object| googleIMState function| processGoogleToken object| _EQLService object| _EQPScript function| adDetection function| testWebPSupport function| require function| requirejs function| define boolean| iankg6b5sdl boolean| iankg6b5sdln string| iankgdabagenat string| iankgdabasthash boolean| iankgcceforceimp boolean| iankgd0eBody boolean| iankgedbDetect object| iankg206Mobile object| iankgdaba1 object| iankgdabao1 object| iankgdabao2 object| iankgdabao3 object| iankgdaba2 number| iankgdabad3 number| uabInject object| iankgdaba4 object| iankgdaba5 boolean| iankg99bij number| __cleverPushSdkLoadCount object| CleverPush undefined| google_measure_js_timing object| __emqSegments object| _EQPService object| _emqYL object| _emqConImpact string| ada_publisher object| _adrtx object| _emqAdexGif string| _emqstr function| calculateDay function| homadAdTag object| exportz undefined| _ object| lazySizes undefined| Backbone object| DahBeiDiocaePoos function| videopkgInterface boolean| iankgedbTrack string| hic_qos

6 Cookies

Domain/Path Name / Value
.tvtoday.de/ Name: ioam2018
Value: 0010c551d432ed8b95df752a5:1607939237464:1576489637464:.tvtoday.de:2:tvspielf:D/T/R/H/W/-/-/Thema_Entertainment_tvtoday:noevent:1576489637464:6utj1v
.tvtoday.de/ Name: _gat
Value: 1
www.tvtoday.de/ Name: tvt_session
Value: 1
www.tvtoday.de/ Name: adp_segs
Value: e0
.tvtoday.de/ Name: _gid
Value: GA1.2.690815348.1576489638
.tvtoday.de/ Name: _ga
Value: GA1.2.927227706.1576489638

9 Console Messages

Source Level URL
Text
console-api log URL: https://www.tvtoday.de/(Line 24)
Message:
mobileAlternate: https://m.tvtoday.de/
console-api log URL: https://www.tvtoday.de/(Line 238)
Message:
GA LOAD:
console-api log URL: https://www.tvtoday.de/(Line 284)
Message:
TftAdEngineBlocked:: false
console-api log URL: https://www.tvtoday.de/(Line 327)
Message:
IAM: {"st":"tvspielf","cp":"D/T/R/H/W/-/-/Thema_Entertainment_tvtoday","sv":"ke","sc":"yes"}
console-api info URL: https://acdn.adnxs.com/ast/ast.js(Line 1)
Message:
AST library loaded: 0.27.1
console-api log URL: https://www.tvtoday.de/app/js/main.js(Line 56)
Message:
RW: init sliders
console-api log URL: https://www.tvtoday.de/app/js/main.js(Line 56)
Message:
RW: init sliders
console-api log URL: https://www.tvtoday.de/(Line 6098)
Message:
AdBlockerNotDetected
console-api log URL: https://www.tvtoday.de/app/js/main.js(Line 55)
Message:
homead ready

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=15768000

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.

a.bf-ad.net
a.bf-tools.net
a2.tvspielfilm.de
acdn.adnxs.com
ad.doubleclick.net
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
c.amazon-adsystem.com
cdn.adrtx.net
cdn.emetriq.de
d.df-srv.de
de.ioam.de
eacgkwdpqg.kameleoon.eu
emq.bf-tools.net
hgc-cf-cache-1.svonm.com
images.tvtoday.de
mms.tvtoday.de
p.yieldlab.net
s0.2mdn.net
s3.amazonaws.com
script.ioam.de
securepubads.g.doubleclick.net
sourcepoint.mgr.consensu.org
ssl.1.damoh.tvtoday.de
ssl.3.damoh.tvtoday.de
static.cleverpush.com
static.criteo.net
stats.g.doubleclick.net
tvtoday.de
uobsoe.com
ups.xplosion.de
uss.xplosion.de
www.google-analytics.com
www.googletagmanager.com
www.summerhamster.com
www.tvtoday.de
xpl.theadex.com
108.128.219.65
108.128.71.27
13.225.86.250
136.243.25.87
143.204.101.112
144.76.165.195
148.251.89.206
151.106.72.75
172.217.16.130
172.217.23.166
178.250.2.130
192.229.233.4
23.210.249.83
23.45.108.65
2600:9000:2156:4600:1c:8c89:a300:93a1
2606:4700:30::681b:a280
2a00:1450:4001:808::2002
2a00:1450:4001:808::2008
2a00:1450:4001:808::200e
2a00:1450:4001:809::2006
2a00:1450:4001:820::2002
2a00:1450:400c:c00::9c
2a02:26f0:6c00:29d::6828
34.252.231.90
35.156.112.30
35.157.148.50
52.217.46.214
52.28.51.75
85.114.136.51
89.163.159.104
91.215.100.39
91.215.103.65
93.190.69.242
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
04ddaf434e3bf0c61fc756f30da65a7af9567b9341c0c1e303d2d45fa85b80cc
05fc803ef0508750ea5226b79af4b3eee169701f9c27332f4f1d132f6b84ef99
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844
0f144f16507d02eabc67a131e4d54ac36266dcfe3dac263a6971265371eff7b9
1556e80f2449b238ae34da15f72fb533d48e51c91463d21e0f8ac92d1687dff6
1b9ada5417311d6a13b2b908e50f27901317485e5872055bc00b0a113b376741
1d5b7c64458f4af91dcfee0354be47adde1f739b5aded03a7ab6068a1bb6ca97
1edf1b134be52f97bb2e7113a2ff33835364239a8722bcd274312d3337364312
216fd62bccc74ef4e4d35292cd4874e7072a4fb30685afb6235d894a3ec1a2df
22f138e2189f2659b3f920aaf4cb81963493984091199acf38dbb3db7be3235d
269c041346b314dac39976bad59326c89eb4775525dcf31322cb23cf3e20eaad
28645074de9b2587a42c2317b5876b375d933409b068567bb62d26e7316f6510
28f4bbd7328d8fd561c3afa67625e3316209e6877a108d0e1f1d16e1a18a6204
297b51cc3bbf20d153ebfdc821489f7868ee4b2805dd02baa1e75a9f9df5acb9
2d81d31825781645ec2422b55a3cf5e3e1e98a310729c7d793ce10cb95f626d2
2fcbe9ed682b16557f66e6fd4e7fa33b647eb54f921f4a3c37c526fb30ba45ab
30524ff4955653cc592d92ff6faff230d201fe166242858d5aa5027e9f1fe429
30da2bff9b5cb0f94b04c9c21ec607dfb1b46cf706802a093185036b333f89e6
331b05ab63a9fc51ff711345c41007cd9e450ab4ba93d623d2455df04878e5b9
36ad53e668d5303cfb7f895221307eff56f2c52cfa585724c1e84cf42267cca0
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
3ee079327ca98fa867616dbc2388dda9b94848b8fe7c945ff97374f29c3a219d
400487dca671603c9251c3d0c81ee543fd2012d66616a15301351ee2b0eb770c
471b15c341415f023cd5387eb0bd4626883d010312f7b2a12f184613bda3f7df
4941783359a81dff9812879352d96a5fa591ea43b7885bda4d7dfafb6eeae167
55939c2de2394be59e2e002dabd0d212b5d90e4603db6806bffb9c7a0ea3aef8
5b67c887d3a441917d165b32455563748c8297b897a39c2ccc7ea473000972e2
61707b28661f63dcf759e2a0f72e47463b99a8512410f8b79b7e1d23d4a4384c
62214dab0c26ba36487bfa2d0498b0931ca9c8e20a2864b55ff509e3876d8692
642bc872e7ce1cec0d3f50c189637bdb0fa4ed98c29efbc10552401466f3e6c0
690d7246feaf6fe5da94c9567722d1bcad401dc61d96dad7e5d74a974345ca43
6e962a595dd0d416d641d879cbe211e013c2940dbc4448f2bbd78db14c2b3a78
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
766b927f4a196d963e30061a3505a97940e0b806cdb57e017c0cea7279dacd15
7a2e7a80d7542d5e8ae0beeb3abd52a5f0346c99cca5ffa4c0f222699abfe64d
7a5372b92f6883db660dbf263da349934097ea31feadb4815f1d2e614fa8049b
7a625d2dfdc959f77d95c2f8460330b62b1567d49c94e647bf84923ed18f3ddc
7b41fff425469bb0aeb49e3d3121869a67d0abc5a4066ffc15b13496337d34e8
7b84ad05a1cd574cb60a714339871a417b170364ba05111fa04a17388fbc9687
7d2f2875cdf32b9c50856aba00226b12b9b0c6a6af0862d734636b53a622375d
8039ea769adb8aa78916156b4270035b4b24c079f2312c302c83d6c4bc18a521
8269a7587721b8aae1e6c9eed81cfdfbf197c1cea2038b3016b2ebd0fff7a742
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
846a580f99df0ce08977e665d4288d32c1ab4d6c6e0e0ce62ace41996b9457bb
85cda4d55bcace5081124025c8f8a4d9ed4bebc5ef464e9aa880c84f7cb9783c
86e336d7c11289fcf362377a925930189115a6548830833846316370bdbb36de
8c420a2ee92719680ab03ba4cd1921c082220aa743092049899381a8e65c147a
9009cb93d1afd929fd7733d19b1687bcabf10d0ab66857c05b97c9d284f94594
982d1a4e04c43018897e9d17e02a3c0cc34554e85bfd21712bd7758811731495
9c41ba408efaf3a7a36099370bc814e38b0afd42229fa9e0e6040740620c85c0
9ce49a6036072f670176d60dfcd39ccfb8458af1f72af91cf028ef7d8c81570a
9d70d6b5316518c3a8856a3655156437e00baefd015180efabc83cd42302cced
a04d89285d02f2ee80ff43dd68bf87758e896cb3cd6765bfd7402cef3c29863a
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a1d3db8192b827a383ef379c9098656bc3c1d8fc7f7a4f92dbfd6d53ccc98378
a30f0860fa55750296d4bddba114d53b24985b823998b5e7d75f05047d841bb0
a82712e7f23f58c7f3c38944001a3fd5f077e89de326b729da4c145ff033b232
ac698a5d5dba594941637805012e41cb13ad4b44dbf30f1a74bc13e6731933e3
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
ae30a9d80a92eb70de9db8230617ee98f545644f75d438edd37514a77df1e8d3
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277
b099ee6a5d30b54ef508de7ddfb2a78cd440ba624d27ed7d8b3f9a855f7d3de7
b3c189aaaed7f2c4888bc904fc4e3f3283644917bb521666856002dd296ccc6b
b7ead0edd75a003c2025421abe7409a0c6f3d28b155142e73179233a6c39c9d7
b8243d311999104b3e32ed10aa49a352cb1fb0582b52a5bbcb403e24dcba7b97
be69d76ceaa48339ebdbe0cca8b8d4c79bd4fde5dd10010f757726cfe01426b9
be726dcabb9c264b1d1816ec0da60cb11fbb9b76afee12a82683d808a62a810c
bf6433080882816ede69d3317d486fa7fd2b63995f0e3bc7971465221e058c99
c1d083bf2ae4deb1081b1951cc5ed004cd0b65d939f0ad342ed0926380ca9ebd
c1d8d0e208043b079796d6587de0a29649b78e3f106197885de7d7821f73a1d6
cb1fc22564d89d69f593dd78451b9a636b56bed60cdebd96a217383af1c359cd
d033f3bf9adb39b1aded5345a6731e4cf70ef85f0019b32464ebe55714c5a4cd
d4139cbcf4017cb369059548b41fe657c0d0c24284cd3192f073a0d65059fa69
d7414b3a412e2829b3c6a846fbf3038ee39bb472d77fba00a79632d41c2fea88
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
dd11699e5bc91d667cc55e032cf45a9e599f3cebc0e3f71e2539e97ca8703d1f
ddfa922e4f9fcd81cf6ab8c51707fe681cf1001ad918e793eabeea5d8b2c6967
e036552afb7291b3ae838e7b683bb4c71a06f893cff2b02cb293e2615a55444e
e17d7cdfea89bfe158cecfbc2674999e77e5f515032f020fb49cd2736197c012
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e7d741d34398d228b877596588051702f9779ce5c65c98f8abc01e82975a012a
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
ef9b43f42c2651dd324d95c7f388e060986793507748e775dd19a3b96c3a40fc
efaaf412e172f2c502b7570e7cb0cca95f05218dc58d3834ef517218224fa7eb
f00a7c5b31e91ca786e1f4640ef94f625a53bc242da3af1f9b465bdad1fc38ac
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f1fa81246afeff0e57b9fa2088638468c7a630ff6e7b48a87bde96098afcf100
ff2923d417cb27beee17edf6dfbf7a272f854cbde0d3200c87040392159c6d82