GET
H2
|
200
|
Primary Request
/
Show response
www.tvtoday.de/
Redirect Chain
-
http://tvtoday.de/
-
https://www.tvtoday.de/
|
610 KB
66 KB
|
113ms
38ms
|
Document
text/html |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
dfdd70c.css
www.tvtoday.de/css/
|
313 KB
39 KB
|
45ms
44ms
|
Stylesheet
text/css |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
StickySearchController.js
Show response
www.tvtoday.de/app/js/components/header/
|
404 B
488 B
|
47ms
46ms
|
Script
application/javascript |
151.106.72.75
PLUSSERVER-ASN1
|
|
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 |
|
GET
H2
|
200
|
roboto-v18-latin-regular.woff2
www.tvtoday.de/bundles/frontend/fonts/
|
15 KB
15 KB
|
48ms
46ms
|
Font
application/octet-stream |
151.106.72.75
PLUSSERVER-ASN1
|
|
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 |
|
GET
H2
|
200
|
roboto-condensed-v16-latin-700.woff2
www.tvtoday.de/bundles/frontend/fonts/
|
15 KB
15 KB
|
47ms
46ms
|
Font
application/octet-stream |
151.106.72.75
PLUSSERVER-ASN1
|
|
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 |
|
GET
H2
|
200
|
roboto-v18-latin-700.woff2
www.tvtoday.de/bundles/frontend/fonts/
|
15 KB
15 KB
|
48ms
47ms
|
Font
application/octet-stream |
151.106.72.75
PLUSSERVER-ASN1
|
|
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/
- 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 |
|
GET
H2
|
200
|
wrapperMessagingWithoutDetection.js
Show response
cdn.privacy-mgmt.com/
|
148 KB
43 KB
|
119ms
49ms
|
Script
application/javascript |
143.204.93.103
AMAZON-02
|
|
|
GET
H2
|
200
|
channel_webp_optimized.css
a2.tvspielfilm.de/images/tv/sender/mini/
|
22 KB
3 KB
|
99ms
30ms
|
Stylesheet
text/css |
2.20.143.13
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
46cfa08.js
Show response
www.tvtoday.de/js/
|
16 KB
5 KB
|
41ms
38ms
|
Script
application/javascript |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
adengine.js
Show response
a.bf-ad.net/adengine/tvtoday/
|
600 KB
184 KB
|
36ms
14ms
|
Script
application/x-javascript |
2a02:26f0:6c00::210:bab2
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
tfm.videopkg.min.js
Show response
www.tvtoday.de/js/
|
150 KB
44 KB
|
41ms
39ms
|
Script
application/javascript |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
iam.js
Show response
script.ioam.de/
|
19 KB
8 KB
|
89ms
30ms
|
Script
application/javascript |
91.215.103.64
INFONLINE-AS
|
|
|
GET
H2
|
200
|
tvt_logo_500x100.png
www.tvtoday.de/bundles/frontend/images/logos/
|
37 KB
38 KB
|
42ms
39ms
|
Image
image/png |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://www.tvtoday.de/bundles/frontend/images/logos/tvt_logo_500x100.png?10.499
- 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 |
|
GET
H2
|
200
|
vikings,201441_navigation_100.jpg
images.tvtoday.de/files/images/201807/3/
|
7 KB
7 KB
|
79ms
70ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
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 |
|
GET
H2
|
200
|
avengers-age-of-ultron,201255_navigation_100.jpg
images.tvtoday.de/files/images/201807/3/
|
13 KB
13 KB
|
79ms
70ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/files/images/201807/3/avengers-age-of-ultron,201255_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
- e8aaebf9f69815ea93b6beff9b78806dacc9bcbf2a25eeee2297d5a95f1e2431
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
tvs_partner_logo.png
www.tvtoday.de/bundles/frontend/images/logos/
|
4 KB
5 KB
|
43ms
41ms
|
Image
image/png |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://www.tvtoday.de/bundles/frontend/images/logos/tvs_partner_logo.png?10.499
- 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 |
|
GET
H2
|
200
|
600b258d8189651233c5b165_780.jpg
images.tvtoday.de/itv/2021-01-31/
|
51 KB
52 KB
|
78ms
70ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/itv/2021-01-31/600b258d8189651233c5b165_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
- 12bfeecd8c7ec4be87b778077faea6a53e86fa5a0caf36e67bc8e4d63dd0edf3
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
tatort-im-tv-quicklink-startseite-2020,225318_tm_100.jpg
images.tvtoday.de/files/images/202002/4/
|
22 KB
22 KB
|
78ms
69ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/files/images/202002/4/tatort-im-tv-quicklink-startseite-2020,225318_tm_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
- 8d60669fddbf6b72a2e5fc8c13da74bbf90d1ea5da6676e058346414a14f2d55
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
fussball-im-tv-quicklink-startseite-2020,225320_tm_100.jpg
images.tvtoday.de/files/images/202002/3/
|
16 KB
16 KB
|
78ms
69ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/files/images/202002/3/fussball-im-tv-quicklink-startseite-2020,225320_tm_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
- 19d502b1c90d16b4132b9b01229277607cd18150518ec92a806c475a7426238b
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
erotik-im-tv-quicklink-startseite-2020,225322_tm_100.jpg
images.tvtoday.de/files/images/202002/5/
|
17 KB
18 KB
|
59ms
51ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/files/images/202002/5/erotik-im-tv-quicklink-startseite-2020,225322_tm_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
- 103f77ffb505419ca5a6e4a8b74d9398f58ed76e484002911fd94e5796075bbb
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
tv-tipps-heute-quicklink-startseite-2020,225317_tm_100.jpg
images.tvtoday.de/files/images/202002/2/
|
10 KB
10 KB
|
35ms
34ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/files/images/202002/2/tv-tipps-heute-quicklink-startseite-2020,225317_tm_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
- 07effd27c24e20b1fc30659b8b771d95c785ab4d3dc3dedaccfcfbfd95b435e6
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
alle-spielfilme-quicklink-startseite-2020,225321_tm_100.jpg
images.tvtoday.de/files/images/202002/2/
|
12 KB
12 KB
|
34ms
33ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/files/images/202002/2/alle-spielfilme-quicklink-startseite-2020,225321_tm_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
- 4dd67b29cc3e3eb840d0dce2c9088000e06b21134aabb021f2a2f98e5dc124b8
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
mediatheken-tipps-quicklink-startseite-2020,225319_tm_100.jpg
images.tvtoday.de/files/images/202002/2/
|
15 KB
16 KB
|
35ms
34ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/files/images/202002/2/mediatheken-tipps-quicklink-startseite-2020,225319_tm_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
- e83b8ec23b952200c3ba4729bfbac3b4379e66de48a31ca39c255fa7201ea65a
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
de.js
Show response
a.bf-tools.net/de/
|
12 KB
4 KB
|
29ms
8ms
|
Script
application/x-javascript |
2a02:26f0:6c00::210:bab2
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
analytics.js
Show response
www.google-analytics.com/
|
46 KB
19 KB
|
26ms
5ms
|
Script
text/javascript |
2a00:1450:4001:811::200e
GOOGLE
|
|
|
GET
H2
|
200
|
gtm.js
Show response
www.googletagmanager.com/
|
114 KB
39 KB
|
50ms
29ms
|
Script
application/javascript |
2a00:1450:4001:811::2008
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
tx.io
Show response
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&ct=0100000000&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=DK%2FHove...
-
https://de.ioam.de/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&ct=0100000000&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=DK%2FHove...
|
0
717 B
|
30ms
30ms
|
Script
application/x-javascript |
91.215.103.65
INFONLINE-AS
|
|
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&ct=0100000000&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=DK%2FHovedstaden&cb=0016&i2=0016b6eff25a0c99b60172bd7&ep=1634893380&vr=421&id=b3ypd5&i3=0016b6eff25a0c99b60172bd7%3A1641334487546%3A1612131287546%3A.tvtoday.de%3A1%3Atvspielf%3AD%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday%3Anoevent%3A1612131287546&n1=1&dntt=0<=1612131287547&ev=&cs=2nfa8k&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.06.2 0028
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
DATA
|
200
OK
|
truncated
/
|
43 B
0
|
|
Image
image/gif |
|
|
|
GET
H2
|
200
|
neu-tvt-titel-neutral-11-2017,188926_issuemainimage_20.jpg
www.tvtoday.de/files/images/201711/2/
|
15 KB
15 KB
|
59ms
57ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
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 |
|
GET
H2
|
200
|
tv-today-scheine-75euro-mit-stoerer,206997_issueproductimage_100.jpg
www.tvtoday.de/files/images/201901/2/
|
4 KB
4 KB
|
59ms
58ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
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 |
|
GET
H2
|
200
|
2b652e5.js
Show response
www.tvtoday.de/js/
|
25 KB
8 KB
|
46ms
45ms
|
Script
application/javascript |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
live-tv-small.png
www.tvtoday.de/bundles/frontend/images/
|
17 KB
17 KB
|
44ms
44ms
|
Image
image/png |
151.106.72.75
PLUSSERVER-ASN1
|
|
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/css/dfdd70c.css?10.499
- 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 |
|
GET
DATA
|
200
OK
|
truncated
/
|
698 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
2 KB
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
856 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
596 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
427 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
1 KB
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
298 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
1 KB
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
1 KB
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
1 KB
0
|
|
Image
image/svg+xml |
|
|
|
POST
H3-Q050
|
200
|
collect
Show response
www.google-analytics.com/j/
|
4 B
390 B
|
45ms
12ms
|
XHR
text/plain |
2a00:1450:4001:811::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/j/collect?v=1&_v=j87&aip=1&a=619600064&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=1600x1200&je=0&_u=YEBAAEABAAAAAC~&jid=1576212692&gjid=1952992538&cid=1781516874.1612131288&tid=UA-1909021-1&_gid=289073915.1612131288&_r=1&_slc=1&cd4=0&z=257234275
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:811::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- aec60bc104db041b1512185839f18f52986df7e569e5445f740dd60f763fbca8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
ima3.js
Show response
s0.2mdn.net/instream/html5/
|
316 KB
109 KB
|
33ms
14ms
|
Script
text/javascript |
2a00:1450:4001:816::2006
GOOGLE
|
|
|
OPTIONS
H2
|
200
|
native-message
cmp.tvtoday.de/wrapper/tcfv2/v1/gdpr/
Frame
|
0
0
|
113ms
36ms
|
Other
text/html |
65.9.58.127
AMAZON-02
|
|
General
- Full URL
- https://cmp.tvtoday.de/wrapper/tcfv2/v1/gdpr/native-message?requestUUID=64f4f008-d317-49b5-9447-fd57a55443b0&hasCsp=true&env=prod&consentLanguage=de&body=%7B%22accountId%22%3A217%2C%22requestUUID%22%3A%2264f4f008-d317-49b5-9447-fd57a55443b0%22%2C%22propertyHref%22%3A%22https%3A%2F%2Fwww.tvtoday.de%2F%22%2C%22euconsent%22%3Anull%2C%22meta%22%3A%22%7B%5C%22mmsCookies%5C%22%3A%5B%5D%2C%5C%22resolved%5C%22%3Anull%7D%22%2C%22clientMMSOrigin%22%3A%22https%3A%2F%2Fcmp.tvtoday.de%22%2C%22targetingParams%22%3A%22%7B%5C%22test%5C%22%3A1%7D%22%2C%22campaignEnv%22%3A%22prod%22%2C%22pubData%22%3A%7B%7D%7D
- Protocol
- H2
- Server
-
65.9.58.127
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
/
Express
- Resource Hash
|
GET
H2
|
200
|
native-message
Show response
cmp.tvtoday.de/wrapper/tcfv2/v1/gdpr/
|
44 KB
6 KB
|
46ms
45ms
|
XHR
application/json |
65.9.58.127
AMAZON-02
|
|
General
- Full URL
- https://cmp.tvtoday.de/wrapper/tcfv2/v1/gdpr/native-message?requestUUID=64f4f008-d317-49b5-9447-fd57a55443b0&hasCsp=true&env=prod&consentLanguage=de&body=%7B%22accountId%22%3A217%2C%22requestUUID%22%3A%2264f4f008-d317-49b5-9447-fd57a55443b0%22%2C%22propertyHref%22%3A%22https%3A%2F%2Fwww.tvtoday.de%2F%22%2C%22euconsent%22%3Anull%2C%22meta%22%3A%22%7B%5C%22mmsCookies%5C%22%3A%5B%5D%2C%5C%22resolved%5C%22%3Anull%7D%22%2C%22clientMMSOrigin%22%3A%22https%3A%2F%2Fcmp.tvtoday.de%22%2C%22targetingParams%22%3A%22%7B%5C%22test%5C%22%3A1%7D%22%2C%22campaignEnv%22%3A%22prod%22%2C%22pubData%22%3A%7B%7D%7D
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
65.9.58.127
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
/
Express
- Resource Hash
- 7fbc6e423bc418ef72eb926ea7cf3f00fcf85a0dfa0214f75f3d33d982e27bd3
|
POST
H2
|
200
|
collect
Show response
stats.g.doubleclick.net/j/
|
1 B
443 B
|
41ms
15ms
|
XHR
text/plain |
2a00:1450:400c:c00::9a
GOOGLE
|
|
General
- Full URL
- https://stats.g.doubleclick.net/j/collect?t=dc&aip=1&_r=3&v=1&_v=j87&tid=UA-1909021-1&cid=1781516874.1612131288&jid=1576212692&gjid=1952992538&_gid=289073915.1612131288&_u=YEBAAEAAAAAAAC~&z=893932857
- 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::9a
Brussels, Belgium,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
DATA
|
200
OK
|
truncated
/
|
42 B
0
|
|
Image
image/webp |
|
|
|
GET
H2
|
200
|
sprite_web_optimized_1608300055.webp
a2.tvspielfilm.de/images/tv/sender/mini/
|
202 KB
202 KB
|
34ms
34ms
|
Image
image/webp |
2.20.143.13
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
config.js
Show response
www.tvtoday.de/app/js/
|
827 B
553 B
|
33ms
33ms
|
Script
application/javascript |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
J3RiYyySpNWjwhM-yuppie-xeroxed-86,217986_artikel_100.jpg
images.tvtoday.de/files/images/255207/6/
|
68 B
278 B
|
43ms
43ms
|
Image
image/png |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
main.js
Show response
www.tvtoday.de/app/js/
|
452 KB
123 KB
|
33ms
33ms
|
Script
application/javascript |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
J3RiYyySpNWjwhMFTtCjrORlxyRnJQHZDkvMnegIpbwqpJWqcreT8uQdjUlU4xkeT8f.png
uobsoe.com/img/promotools/
|
68 B
242 B
|
125ms
39ms
|
Image
image/png |
136.243.25.120
HETZNER-AS
|
|
|
GET
H2
|
200
|
index.html
Show response
cmp.tvtoday.de/
Frame 48D1
|
4 KB
2 KB
|
101ms
33ms
|
Document
text/html |
65.9.58.127
AMAZON-02
|
|
General
- Full URL
- https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=c0250da6-b372-4d63-9d46-5ad069eb81f8&requestUUID=64f4f008-d317-49b5-9447-fd57a55443b0&preload_message=true&consentLanguage=de
- Requested by
- Host: www.tvtoday.de
URL: https://www.tvtoday.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
65.9.58.127
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 03da065f9be8acf8e981c2e0d36522bdbfc47decc9fe5b8d4fb4fb404a5ec43a
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
|
39 B
717 B
|
434ms
112ms
|
XHR
application/json |
52.216.17.35
AMAZON-02
|
|
|
GET
H2
|
200
|
homad_clienConfig.json
Show response
www.tvtoday.de/js/
|
291 B
393 B
|
36ms
35ms
|
XHR
application/json |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
546a818fe4b03c03eae5f0fb_780.jpg
images.tvtoday.de/itv/2021-01-31/
|
25 KB
26 KB
|
38ms
37ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/itv/2021-01-31/546a818fe4b03c03eae5f0fb_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
- 6668173a26e386c46c209eb428bb5c71223725118705f1cec27961e76a87542c
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
jurassic-world-neue-abenteuer,230621_tm_100.jpg
images.tvtoday.de/files/images/202101/1/
|
15 KB
16 KB
|
36ms
35ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/files/images/202101/1/jurassic-world-neue-abenteuer,230621_tm_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
- f56e62cc728881f7a85d94b689685f0095106ae0b3a8a344709abcefcea262fc
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
dreamygo,230616_tm_100.jpg
images.tvtoday.de/files/images/202101/1/
|
9 KB
10 KB
|
36ms
36ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/files/images/202101/1/dreamygo,230616_tm_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
- 0a5831440f66b5fdb994c860ca64e766c421c79c504ba57f1dcf5b49c85c52c0
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
omar-sy,230610_tm_100.jpg
images.tvtoday.de/files/images/202101/1/
|
10 KB
10 KB
|
37ms
36ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/files/images/202101/1/omar-sy,230610_tm_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
- 50e59b43cf21b2bf563fb5778b6e4f358e698a0438b5a1098edd4d35be7ce4d9
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.tvtoday.de/
|
234 B
1014 B
|
101ms
33ms
|
XHR
application/json |
143.204.93.40
AMAZON-02
|
|
|
GET
H2
|
200
|
Notice.16489.css
cmp.tvtoday.de/
Frame 48D1
|
28 KB
5 KB
|
36ms
36ms
|
Stylesheet
text/css |
65.9.58.127
AMAZON-02
|
|
General
- Full URL
- https://cmp.tvtoday.de/Notice.16489.css
- Requested by
- Host: cmp.tvtoday.de
URL: https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=c0250da6-b372-4d63-9d46-5ad069eb81f8&requestUUID=64f4f008-d317-49b5-9447-fd57a55443b0&preload_message=true&consentLanguage=de
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
65.9.58.127
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 4fd413be818cadcb46c36f2bc05d65d5970a6b1b29bf01021a1609151b9810ee
|
GET
H2
|
200
|
polyfills.ede70.js
Show response
cmp.tvtoday.de/
Frame 48D1
|
5 KB
2 KB
|
36ms
36ms
|
Script
application/javascript |
65.9.58.127
AMAZON-02
|
|
General
- Full URL
- https://cmp.tvtoday.de/polyfills.ede70.js
- Requested by
- Host: cmp.tvtoday.de
URL: https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=c0250da6-b372-4d63-9d46-5ad069eb81f8&requestUUID=64f4f008-d317-49b5-9447-fd57a55443b0&preload_message=true&consentLanguage=de
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
65.9.58.127
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 533b23c57b1770cc3ee9c15b998b2eb494fa0adb2d6929fd22a9b78adfade3a7
|
GET
H2
|
200
|
Notice.d391c.js
Show response
cmp.tvtoday.de/
Frame 48D1
|
163 KB
40 KB
|
36ms
36ms
|
Script
application/javascript |
65.9.58.127
AMAZON-02
|
|
General
- Full URL
- https://cmp.tvtoday.de/Notice.d391c.js
- Requested by
- Host: cmp.tvtoday.de
URL: https://cmp.tvtoday.de/index.html?message_id=391552&consentUUID=c0250da6-b372-4d63-9d46-5ad069eb81f8&requestUUID=64f4f008-d317-49b5-9447-fd57a55443b0&preload_message=true&consentLanguage=de
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
65.9.58.127
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 53a653cd123dfae9383c014be06ee2a27d8c32b325d9ac7d96a55c3f2969a960
|
GET
H2
|
200
|
/
d2p3zdq8vjvnxd.cloudfront.net/
Frame 48D1
|
26 B
366 B
|
43ms
15ms
|
Image
image/gif |
2600:9000:206f:ac00:13:7ad6:7840:21
AMAZON-02
|
|
|
GET
H2
|
200
|
noun_Security_2839859.png
p5.focus.de/fol/multimedia/consentlayer/
Frame 48D1
|
24 KB
25 KB
|
32ms
8ms
|
Image
image/webp |
2a02:26f0:6c00::210:bb29
AKAMAI-ASN1
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.2.damoh.tvtoday.de/8ab94c584631fca5ad9c17beb7124bb6a66670fe/
|
247 KB
76 KB
|
248ms
99ms
|
XHR
application/javascript |
148.251.3.103
HETZNER-AS
|
|
|
GET
H3-Q050
|
200
|
collect
www.google-analytics.com/
|
35 B
122 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:811::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j87&aip=1&a=619600064&t=timing&_s=2&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=1600x1200&je=0&plt=1117&pdt=50&dns=6&rrt=74&srt=38&tcp=68&dit=700&clt=700&_gst=293&_gbt=475&_u=YEBAAEABAAAAAC~&jid=&gjid=&cid=1781516874.1612131288&tid=UA-1909021-1&_gid=289073915.1612131288&cd4=0&z=1387654186
- Protocol
- H3-Q050
- Security
- QUIC,
, AES_128_GCM
- Server
-
2a00:1450:4001:811::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
DATA
|
200
OK
|
truncated
Show response
/
|
247 KB
0
|
|
Script
text/javascript |
|
|
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
|
39 B
717 B
|
112ms
110ms
|
XHR
application/json |
52.216.17.35
AMAZON-02
|
|
|
GET
H2
|
200
|
homad_clienConfig.json
Show response
www.tvtoday.de/js/
|
291 B
393 B
|
39ms
37ms
|
XHR
application/json |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.tvtoday.de/
|
234 B
1014 B
|
34ms
33ms
|
XHR
application/json |
143.204.93.40
AMAZON-02
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.2.damoh.tvtoday.de/68b5510d63f30f47935bf3ebaf5dcb32104fa6ab/
|
234 B
1 KB
|
91ms
90ms
|
XHR
application/json |
148.251.3.103
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.tvtoday.de/
|
24 B
356 B
|
153ms
37ms
|
Script
application/octet-stream |
78.46.33.212
HETZNER-AS
|
|
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,KGZ1bmN0aW9uKCkge2Z1bmN0aW9uIGVhKGspe3ZhciBuPTA7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG48ay5sZW5ndGg/e2RvbmU6ITEsdmFsdWU6a1tuKytdfTp7ZG9uZTohMH19fXZhciBoYT0iZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnRpZXM/T2JqZWN0LmRlZmluZVByb3BlcnR5OmZ1bmN0aW9uKGssbix4KXtrIT1BcnJheS5wcm90b3R5cGUmJmshPU9iamVjdC5wcm90b3R5cGUmJihrW25dPXgudmFsdWUpfTtmdW5jdGlvbiBGYShrKXtrPVsib2JqZWN0Ij09dHlwZW9mIGdsb2JhbFRoaXMmJmdsb2JhbFRoaXMsIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdywib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYsIm9iamVjdCI9PXR5cGVvZiBnbG9iYWwmJmdsb2JhbCxrXTtmb3IodmFyIG49MDtuPGsubGVuZ3RoOysrbil7dmFyIHg9a1tuXTtpZih4JiZ4Lk1hdGg9PU1hdGgpcmV0dXJuIHh9dGhyb3cgRXJyb3IoIkNhbm5vdCBmaW5kIGdsb2JhbCBvYmplY3QiKTt9CnZhciBRYT1GYSh0aGlzKTtmdW5jdGlvbiBVYSgpe1VhPWZ1bmN0aW9uKCl7fTtRYS5TeW1ib2x8fChRYS5TeW1ib2w9VmEpfWZ1bmN0aW9uIGpiKGssbil7dGhpcy5hPWs7aGEodGhpcywiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pfWpiLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9O3ZhciBWYT1mdW5jdGlvbigpe2Z1bmN0aW9uIGsoeCl7aWYodGhpcyBpbnN0YW5jZW9mIGspdGhyb3cgbmV3IFR5cGVFcnJvcigiU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIik7cmV0dXJuIG5ldyBqYigianNjb21wX3N5bWJvbF8iKyh4fHwiIikrIl8iK24rKyx4KX12YXIgbj0wO3JldHVybiBrfSgpOwpmdW5jdGlvbiB1Yigpe1VhKCk7dmFyIGs9UWEuU3ltYm9sLml0ZXJhdG9yO2t8fChrPVFhLlN5bWJvbC5pdGVyYXRvcj1RYS5TeW1ib2woIlN5bWJvbC5pdGVyYXRvciIpKTsiZnVuY3Rpb24iIT10eXBlb2YgQXJyYXkucHJvdG90eXBlW2tdJiZoYShBcnJheS5wcm90b3R5cGUsayx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHZiKGVhKHRoaXMpKX19KTt1Yj1mdW5jdGlvbigpe319ZnVuY3Rpb24gdmIoayl7dWIoKTtrPXtuZXh0Omt9O2tbUWEuU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtyZXR1cm4ga31mdW5jdGlvbiBFYihrKXt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yJiZrW1N5bWJvbC5pdGVyYXRvcl07cmV0dXJuIG4/bi5jYWxsKGspOntuZXh0OmVhKGspfX0KZnVuY3Rpb24gRmIoayl7aWYoIShrIGluc3RhbmNlb2YgQXJyYXkpKXtrPUViKGspO2Zvcih2YXIgbix4PVtdOyEobj1rLm5leHQoKSkuZG9uZTspeC5wdXNoKG4udmFsdWUpO2s9eH1yZXR1cm4ga312YXIgUGI9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/T2JqZWN0LmNyZWF0ZTpmdW5jdGlvbihrKXtmdW5jdGlvbiBuKCl7fW4ucHJvdG90eXBlPWs7cmV0dXJuIG5ldyBufSxRYjtpZigiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LnNldFByb3RvdHlwZU9mKVFiPU9iamVjdC5zZXRQcm90b3R5cGVPZjtlbHNle3ZhciBSYjthOnt2YXIgU2I9e1VkOiEwfSxUYj17fTt0cnl7VGIuX19wcm90b19fPVNiO1JiPVRiLlVkO2JyZWFrIGF9Y2F0Y2goayl7fVJiPSExfVFiPVJiP2Z1bmN0aW9uKGssbil7ay5fX3Byb3RvX189bjtpZihrLl9fcHJvdG9fXyE9PW4pdGhyb3cgbmV3IFR5cGVFcnJvcihrKyIgaXMgbm90IGV4dGVuc2libGUiKTtyZXR1cm4ga306bnVsbH0KdmFyIFViPVFiO2Z1bmN0aW9uIHkoayxuKXtrLnByb3RvdHlwZT1QYihuLnByb3RvdHlwZSk7ay5wcm90b3R5cGUuY29uc3RydWN0b3I9aztpZihVYilVYihrLG4pO2Vsc2UgZm9yKHZhciB4IGluIG4paWYoInByb3RvdHlwZSIhPXgpaWYoT2JqZWN0LmRlZmluZVByb3BlcnRpZXMpe3ZhciBHPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix4KTtHJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoayx4LEcpfWVsc2Uga1t4XT1uW3hdfWZ1bmN0aW9uIG1jKGssbil7aWYobil7dmFyIHg9UWE7az1rLnNwbGl0KCIuIik7Zm9yKHZhciBHPTA7RzxrLmxlbmd0aC0xO0crKyl7dmFyIEs9a1tHXTtLIGluIHh8fCh4W0tdPXt9KTt4PXhbS119az1rW2subGVuZ3RoLTFdO0c9eFtrXTtuPW4oRyk7biE9RyYmbnVsbCE9biYmaGEoeCxrLHtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pfX0KbWMoIlByb21pc2UiLGZ1bmN0aW9uKGspe2Z1bmN0aW9uIG4odCl7dGhpcy5iPTA7dGhpcy5jPXZvaWQgMDt0aGlzLmE9W107dmFyIHE9dGhpcy5nKCk7dHJ5e3QocS5yZXNvbHZlLHEucmVqZWN0KX1jYXRjaChyKXtxLnJlamVjdChyKX19ZnVuY3Rpb24geCgpe3RoaXMuYT1udWxsfWZ1bmN0aW9uIEcodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBuP3Q6bmV3IG4oZnVuY3Rpb24ocSl7cSh0KX0pfWlmKGspcmV0dXJuIGs7eC5wcm90b3R5cGUuYj1mdW5jdGlvbih0KXtpZihudWxsPT10aGlzLmEpe3RoaXMuYT1bXTt2YXIgcT10aGlzO3RoaXMuZyhmdW5jdGlvbigpe3EuYygpfSl9dGhpcy5hLnB1c2godCl9O3ZhciBLPVFhLnNldFRpbWVvdXQ7eC5wcm90b3R5cGUuZz1mdW5jdGlvbih0KXtLKHQsMCl9O3gucHJvdG90eXBlLmM9ZnVuY3Rpb24oKXtmb3IoO3RoaXMuYSYmdGhpcy5hLmxlbmd0aDspe3ZhciB0PXRoaXMuYTt0aGlzLmE9W107Zm9yKHZhciBxPTA7cTx0Lmxlbmd0aDsrK3Epe3ZhciByPQp0W3FdO3RbcV09bnVsbDt0cnl7cigpfWNhdGNoKHcpe3RoaXMuaSh3KX19fXRoaXMuYT1udWxsfTt4LnByb3RvdHlwZS5pPWZ1bmN0aW9uKHQpe3RoaXMuZyhmdW5jdGlvbigpe3Rocm93IHQ7fSl9O24ucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHcpe3JldHVybiBmdW5jdGlvbihJKXtyfHwocj0hMCx3LmNhbGwocSxJKSl9fXZhciBxPXRoaXMscj0hMTtyZXR1cm57cmVzb2x2ZTp0KHRoaXMuRikscmVqZWN0OnQodGhpcy5pKX19O24ucHJvdG90eXBlLkY9ZnVuY3Rpb24odCl7aWYodD09PXRoaXMpdGhpcy5pKG5ldyBUeXBlRXJyb3IoIkEgUHJvbWlzZSBjYW5ub3QgcmVzb2x2ZSB0byBpdHNlbGYiKSk7ZWxzZSBpZih0IGluc3RhbmNlb2Ygbil0aGlzLkIodCk7ZWxzZXthOnN3aXRjaCh0eXBlb2YgdCl7Y2FzZSAib2JqZWN0Ijp2YXIgcT1udWxsIT10O2JyZWFrIGE7Y2FzZSAiZnVuY3Rpb24iOnE9ITA7YnJlYWsgYTtkZWZhdWx0OnE9ITF9cT90aGlzLm8odCk6dGhpcy5mKHQpfX07Cm4ucHJvdG90eXBlLm89ZnVuY3Rpb24odCl7dmFyIHE9dm9pZCAwO3RyeXtxPXQudGhlbn1jYXRjaChyKXt0aGlzLmkocik7cmV0dXJufSJmdW5jdGlvbiI9PXR5cGVvZiBxP3RoaXMucyhxLHQpOnRoaXMuZih0KX07bi5wcm90b3R5cGUuaT1mdW5jdGlvbih0KXt0aGlzLmwoMix0KX07bi5wcm90b3R5cGUuZj1mdW5jdGlvbih0KXt0aGlzLmwoMSx0KX07bi5wcm90b3R5cGUubD1mdW5jdGlvbih0LHEpe2lmKDAhPXRoaXMuYil0aHJvdyBFcnJvcigiQ2Fubm90IHNldHRsZSgiK3QrIiwgIitxKyIpOiBQcm9taXNlIGFscmVhZHkgc2V0dGxlZCBpbiBzdGF0ZSIrdGhpcy5iKTt0aGlzLmI9dDt0aGlzLmM9cTt0aGlzLm0oKX07bi5wcm90b3R5cGUubT1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuYSl7Zm9yKHZhciB0PTA7dDx0aGlzLmEubGVuZ3RoOysrdClRLmIodGhpcy5hW3RdKTt0aGlzLmE9bnVsbH19O3ZhciBRPW5ldyB4O24ucHJvdG90eXBlLkI9ZnVuY3Rpb24odCl7dmFyIHE9dGhpcy5nKCk7CnQuc2MocS5yZXNvbHZlLHEucmVqZWN0KX07bi5wcm90b3R5cGUucz1mdW5jdGlvbih0LHEpe3ZhciByPXRoaXMuZygpO3RyeXt0LmNhbGwocSxyLnJlc29sdmUsci5yZWplY3QpfWNhdGNoKHcpe3IucmVqZWN0KHcpfX07bi5wcm90b3R5cGUudGhlbj1mdW5jdGlvbih0LHEpe2Z1bmN0aW9uIHIoVSxHYSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIFU/ZnVuY3Rpb24ocmEpe3RyeXt3KFUocmEpKX1jYXRjaChzYSl7SShzYSl9fTpHYX12YXIgdyxJLGJhPW5ldyBuKGZ1bmN0aW9uKFUsR2Epe3c9VTtJPUdhfSk7dGhpcy5zYyhyKHQsdykscihxLEkpKTtyZXR1cm4gYmF9O24ucHJvdG90eXBlLmNhdGNoPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRoZW4odm9pZCAwLHQpfTtuLnByb3RvdHlwZS5zYz1mdW5jdGlvbih0LHEpe2Z1bmN0aW9uIHIoKXtzd2l0Y2gody5iKXtjYXNlIDE6dCh3LmMpO2JyZWFrO2Nhc2UgMjpxKHcuYyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBzdGF0ZTogIisKdy5iKTt9fXZhciB3PXRoaXM7bnVsbD09dGhpcy5hP1EuYihyKTp0aGlzLmEucHVzaChyKX07bi5yZXNvbHZlPUc7bi5yZWplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKGZ1bmN0aW9uKHEscil7cih0KX0pfTtuLnJhY2U9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBuKGZ1bmN0aW9uKHEscil7Zm9yKHZhciB3PUViKHQpLEk9dy5uZXh0KCk7IUkuZG9uZTtJPXcubmV4dCgpKUcoSS52YWx1ZSkuc2MocSxyKX0pfTtuLmFsbD1mdW5jdGlvbih0KXt2YXIgcT1FYih0KSxyPXEubmV4dCgpO3JldHVybiByLmRvbmU/RyhbXSk6bmV3IG4oZnVuY3Rpb24odyxJKXtmdW5jdGlvbiBiYShyYSl7cmV0dXJuIGZ1bmN0aW9uKHNhKXtVW3JhXT1zYTtHYS0tOzA9PUdhJiZ3KFUpfX12YXIgVT1bXSxHYT0wO2RvIFUucHVzaCh2b2lkIDApLEdhKyssRyhyLnZhbHVlKS5zYyhiYShVLmxlbmd0aC0xKSxJKSxyPXEubmV4dCgpO3doaWxlKCFyLmRvbmUpfSl9O3JldHVybiBufSk7CmZ1bmN0aW9uIG5jKCl7dGhpcy5jPSExO3RoaXMuZz1udWxsO3RoaXMuYj12b2lkIDA7dGhpcy5hPTE7dGhpcy5sPTA7dGhpcy5pPW51bGx9ZnVuY3Rpb24gb2Moayl7aWYoay5jKXRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTtrLmM9ITB9bmMucHJvdG90eXBlLmY9ZnVuY3Rpb24oayl7dGhpcy5iPWt9O2Z1bmN0aW9uIHBjKGssbil7ay5pPXtaZDpuLGhlOiEwfTtrLmE9ay5sfW5jLnByb3RvdHlwZS5yZXR1cm49ZnVuY3Rpb24oayl7dGhpcy5pPXtyZXR1cm46a307dGhpcy5hPXRoaXMubH07ZnVuY3Rpb24gcWMoayxuLHgpe2suYT14O3JldHVybnt2YWx1ZTpufX1mdW5jdGlvbiB6YyhrKXt0aGlzLmE9bmV3IG5jO3RoaXMuYj1rfQpmdW5jdGlvbiBBYyhrLG4pe29jKGsuYSk7dmFyIHg9ay5hLmc7aWYoeClyZXR1cm4gQmMoaywicmV0dXJuImluIHg/eFsicmV0dXJuIl06ZnVuY3Rpb24oRyl7cmV0dXJue3ZhbHVlOkcsZG9uZTohMH19LG4say5hLnJldHVybik7ay5hLnJldHVybihuKTtyZXR1cm4gQ2Moayl9ZnVuY3Rpb24gQmMoayxuLHgsRyl7dHJ5e3ZhciBLPW4uY2FsbChrLmEuZyx4KTtpZighKEsgaW5zdGFuY2VvZiBPYmplY3QpKXRocm93IG5ldyBUeXBlRXJyb3IoIkl0ZXJhdG9yIHJlc3VsdCAiK0srIiBpcyBub3QgYW4gb2JqZWN0Iik7aWYoIUsuZG9uZSlyZXR1cm4gay5hLmM9ITEsSzt2YXIgUT1LLnZhbHVlfWNhdGNoKHQpe3JldHVybiBrLmEuZz1udWxsLHBjKGsuYSx0KSxDYyhrKX1rLmEuZz1udWxsO0cuY2FsbChrLmEsUSk7cmV0dXJuIENjKGspfQpmdW5jdGlvbiBDYyhrKXtmb3IoO2suYS5hOyl0cnl7dmFyIG49ay5iKGsuYSk7aWYobilyZXR1cm4gay5hLmM9ITEse3ZhbHVlOm4udmFsdWUsZG9uZTohMX19Y2F0Y2goeCl7ay5hLmI9dm9pZCAwLHBjKGsuYSx4KX1rLmEuYz0hMTtpZihrLmEuaSl7bj1rLmEuaTtrLmEuaT1udWxsO2lmKG4uaGUpdGhyb3cgbi5aZDtyZXR1cm57dmFsdWU6bi5yZXR1cm4sZG9uZTohMH19cmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX0KZnVuY3Rpb24gRGMoayl7dGhpcy5uZXh0PWZ1bmN0aW9uKG4pe29jKGsuYSk7ay5hLmc/bj1CYyhrLGsuYS5nLm5leHQsbixrLmEuZik6KGsuYS5mKG4pLG49Q2MoaykpO3JldHVybiBufTt0aGlzLnRocm93PWZ1bmN0aW9uKG4pe29jKGsuYSk7ay5hLmc/bj1CYyhrLGsuYS5nWyJ0aHJvdyJdLG4say5hLmYpOihwYyhrLmEsbiksbj1DYyhrKSk7cmV0dXJuIG59O3RoaXMucmV0dXJuPWZ1bmN0aW9uKG4pe3JldHVybiBBYyhrLG4pfTt1YigpO3RoaXNbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfX1mdW5jdGlvbiBFYyhrKXtmdW5jdGlvbiBuKEcpe3JldHVybiBrLm5leHQoRyl9ZnVuY3Rpb24geChHKXtyZXR1cm4gay50aHJvdyhHKX1yZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oRyxLKXtmdW5jdGlvbiBRKHQpe3QuZG9uZT9HKHQudmFsdWUpOlByb21pc2UucmVzb2x2ZSh0LnZhbHVlKS50aGVuKG4seCkudGhlbihRLEspfVEoay5uZXh0KCkpfSl9CmZ1bmN0aW9uIEZjKGspe3JldHVybiBFYyhuZXcgRGMobmV3IHpjKGspKSl9ZnVuY3Rpb24gR2MoayxuKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGssbil9Cm1jKCJXZWFrTWFwIixmdW5jdGlvbihrKXtmdW5jdGlvbiBuKHIpe3RoaXMuYT0ocSs9TWF0aC5yYW5kb20oKSsxKS50b1N0cmluZygpO2lmKHIpe3I9RWIocik7Zm9yKHZhciB3OyEodz1yLm5leHQoKSkuZG9uZTspdz13LnZhbHVlLHRoaXMuc2V0KHdbMF0sd1sxXSl9fWZ1bmN0aW9uIHgoKXt9ZnVuY3Rpb24gRyhyKXt2YXIgdz10eXBlb2YgcjtyZXR1cm4ib2JqZWN0Ij09PXcmJm51bGwhPT1yfHwiZnVuY3Rpb24iPT09d31mdW5jdGlvbiBLKHIpe2lmKCFHYyhyLHQpKXt2YXIgdz1uZXcgeDtoYShyLHQse3ZhbHVlOnd9KX19ZnVuY3Rpb24gUShyKXt2YXIgdz1PYmplY3Rbcl07dyYmKE9iamVjdFtyXT1mdW5jdGlvbihJKXtpZihJIGluc3RhbmNlb2YgeClyZXR1cm4gSTtLKEkpO3JldHVybiB3KEkpfSl9aWYoZnVuY3Rpb24oKXtpZigha3x8IU9iamVjdC5zZWFsKXJldHVybiExO3RyeXt2YXIgcj1PYmplY3Quc2VhbCh7fSksdz1PYmplY3Quc2VhbCh7fSksST1uZXcgayhbW3IsMl0sClt3LDNdXSk7aWYoMiE9SS5nZXQocil8fDMhPUkuZ2V0KHcpKXJldHVybiExO0kuZGVsZXRlKHIpO0kuc2V0KHcsNCk7cmV0dXJuIUkuaGFzKHIpJiY0PT1JLmdldCh3KX1jYXRjaChiYSl7cmV0dXJuITF9fSgpKXJldHVybiBrO3ZhciB0PSIkanNjb21wX2hpZGRlbl8iK01hdGgucmFuZG9tKCk7USgiZnJlZXplIik7USgicHJldmVudEV4dGVuc2lvbnMiKTtRKCJzZWFsIik7dmFyIHE9MDtuLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24ocix3KXtpZighRyhyKSl0aHJvdyBFcnJvcigiSW52YWxpZCBXZWFrTWFwIGtleSIpO0socik7aWYoIUdjKHIsdCkpdGhyb3cgRXJyb3IoIldlYWtNYXAga2V5IGZhaWw6ICIrcik7clt0XVt0aGlzLmFdPXc7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLmdldD1mdW5jdGlvbihyKXtyZXR1cm4gRyhyKSYmR2Mocix0KT9yW3RdW3RoaXMuYV06dm9pZCAwfTtuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24ocil7cmV0dXJuIEcocikmJkdjKHIsdCkmJkdjKHJbdF0sCnRoaXMuYSl9O24ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihyKXtyZXR1cm4gRyhyKSYmR2Mocix0KSYmR2Moclt0XSx0aGlzLmEpP2RlbGV0ZSByW3RdW3RoaXMuYV06ITF9O3JldHVybiBufSk7Cm1jKCJNYXAiLGZ1bmN0aW9uKGspe2Z1bmN0aW9uIG4oKXt2YXIgcT17fTtyZXR1cm4gcS5ZYT1xLm5leHQ9cS5oZWFkPXF9ZnVuY3Rpb24geChxLHIpe3ZhciB3PXEuYTtyZXR1cm4gdmIoZnVuY3Rpb24oKXtpZih3KXtmb3IoO3cuaGVhZCE9cS5hOyl3PXcuWWE7Zm9yKDt3Lm5leHQhPXcuaGVhZDspcmV0dXJuIHc9dy5uZXh0LHtkb25lOiExLHZhbHVlOnIodyl9O3c9bnVsbH1yZXR1cm57ZG9uZTohMCx2YWx1ZTp2b2lkIDB9fSl9ZnVuY3Rpb24gRyhxLHIpe3ZhciB3PXImJnR5cGVvZiByOyJvYmplY3QiPT13fHwiZnVuY3Rpb24iPT13P1EuaGFzKHIpP3c9US5nZXQocik6KHc9IiIrICsrdCxRLnNldChyLHcpKTp3PSJwXyIrcjt2YXIgST1xLmJbd107aWYoSSYmR2MocS5iLHcpKWZvcihxPTA7cTxJLmxlbmd0aDtxKyspe3ZhciBiYT1JW3FdO2lmKHIhPT1yJiZiYS5rZXkhPT1iYS5rZXl8fHI9PT1iYS5rZXkpcmV0dXJue2lkOncsbGlzdDpJLGluZGV4OnEsdWE6YmF9fXJldHVybntpZDp3LApsaXN0OkksaW5kZXg6LTEsdWE6dm9pZCAwfX1mdW5jdGlvbiBLKHEpe3RoaXMuYj17fTt0aGlzLmE9bigpO3RoaXMuc2l6ZT0wO2lmKHEpe3E9RWIocSk7Zm9yKHZhciByOyEocj1xLm5leHQoKSkuZG9uZTspcj1yLnZhbHVlLHRoaXMuc2V0KHJbMF0sclsxXSl9fWlmKGZ1bmN0aW9uKCl7aWYoIWt8fCJmdW5jdGlvbiIhPXR5cGVvZiBrfHwhay5wcm90b3R5cGUuZW50cmllc3x8ImZ1bmN0aW9uIiE9dHlwZW9mIE9iamVjdC5zZWFsKXJldHVybiExO3RyeXt2YXIgcT1PYmplY3Quc2VhbCh7eDo0fSkscj1uZXcgayhFYihbW3EsInMiXV0pKTtpZigicyIhPXIuZ2V0KHEpfHwxIT1yLnNpemV8fHIuZ2V0KHt4OjR9KXx8ci5zZXQoe3g6NH0sInQiKSE9cnx8MiE9ci5zaXplKXJldHVybiExO3ZhciB3PXIuZW50cmllcygpLEk9dy5uZXh0KCk7aWYoSS5kb25lfHxJLnZhbHVlWzBdIT1xfHwicyIhPUkudmFsdWVbMV0pcmV0dXJuITE7ST13Lm5leHQoKTtyZXR1cm4gSS5kb25lfHw0IT1JLnZhbHVlWzBdLnh8fAoidCIhPUkudmFsdWVbMV18fCF3Lm5leHQoKS5kb25lPyExOiEwfWNhdGNoKGJhKXtyZXR1cm4hMX19KCkpcmV0dXJuIGs7dWIoKTt2YXIgUT1uZXcgV2Vha01hcDtLLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24ocSxyKXtxPTA9PT1xPzA6cTt2YXIgdz1HKHRoaXMscSk7dy5saXN0fHwody5saXN0PXRoaXMuYlt3LmlkXT1bXSk7dy51YT93LnVhLnZhbHVlPXI6KHcudWE9e25leHQ6dGhpcy5hLFlhOnRoaXMuYS5ZYSxoZWFkOnRoaXMuYSxrZXk6cSx2YWx1ZTpyfSx3Lmxpc3QucHVzaCh3LnVhKSx0aGlzLmEuWWEubmV4dD13LnVhLHRoaXMuYS5ZYT13LnVhLHRoaXMuc2l6ZSsrKTtyZXR1cm4gdGhpc307Sy5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHEpe3E9Ryh0aGlzLHEpO3JldHVybiBxLnVhJiZxLmxpc3Q/KHEubGlzdC5zcGxpY2UocS5pbmRleCwxKSxxLmxpc3QubGVuZ3RofHxkZWxldGUgdGhpcy5iW3EuaWRdLHEudWEuWWEubmV4dD1xLnVhLm5leHQscS51YS5uZXh0LllhPXEudWEuWWEsCnEudWEuaGVhZD1udWxsLHRoaXMuc2l6ZS0tLCEwKTohMX07Sy5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmI9e307dGhpcy5hPXRoaXMuYS5ZYT1uKCk7dGhpcy5zaXplPTB9O0sucHJvdG90eXBlLmhhcz1mdW5jdGlvbihxKXtyZXR1cm4hIUcodGhpcyxxKS51YX07Sy5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHEpe3JldHVybihxPUcodGhpcyxxKS51YSkmJnEudmFsdWV9O0sucHJvdG90eXBlLmVudHJpZXM9ZnVuY3Rpb24oKXtyZXR1cm4geCh0aGlzLGZ1bmN0aW9uKHEpe3JldHVybltxLmtleSxxLnZhbHVlXX0pfTtLLnByb3RvdHlwZS5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuIHgodGhpcyxmdW5jdGlvbihxKXtyZXR1cm4gcS5rZXl9KX07Sy5wcm90b3R5cGUudmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHgodGhpcyxmdW5jdGlvbihxKXtyZXR1cm4gcS52YWx1ZX0pfTtLLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHEscil7Zm9yKHZhciB3PXRoaXMuZW50cmllcygpLApJOyEoST13Lm5leHQoKSkuZG9uZTspST1JLnZhbHVlLHEuY2FsbChyLElbMV0sSVswXSx0aGlzKX07Sy5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXT1LLnByb3RvdHlwZS5lbnRyaWVzO3ZhciB0PTA7cmV0dXJuIEt9KTt2YXIgSGM9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5hc3NpZ24/T2JqZWN0LmFzc2lnbjpmdW5jdGlvbihrLG4pe2Zvcih2YXIgeD0xO3g8YXJndW1lbnRzLmxlbmd0aDt4Kyspe3ZhciBHPWFyZ3VtZW50c1t4XTtpZihHKWZvcih2YXIgSyBpbiBHKUdjKEcsSykmJihrW0tdPUdbS10pfXJldHVybiBrfTttYygiT2JqZWN0LmFzc2lnbiIsZnVuY3Rpb24oayl7cmV0dXJuIGt8fEhjfSk7bWMoIk9iamVjdC5pcyIsZnVuY3Rpb24oayl7cmV0dXJuIGs/azpmdW5jdGlvbihuLHgpe3JldHVybiBuPT09eD8wIT09bnx8MS9uPT09MS94Om4hPT1uJiZ4IT09eH19KTsKbWMoIkFycmF5LnByb3RvdHlwZS5pbmNsdWRlcyIsZnVuY3Rpb24oayl7cmV0dXJuIGs/azpmdW5jdGlvbihuLHgpe3ZhciBHPXRoaXM7RyBpbnN0YW5jZW9mIFN0cmluZyYmKEc9U3RyaW5nKEcpKTt2YXIgSz1HLmxlbmd0aDt4PXh8fDA7Zm9yKDA+eCYmKHg9TWF0aC5tYXgoeCtLLDApKTt4PEs7eCsrKXt2YXIgUT1HW3hdO2lmKFE9PT1ufHxPYmplY3QuaXMoUSxuKSlyZXR1cm4hMH1yZXR1cm4hMX19KTsKbWMoIlN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMiLGZ1bmN0aW9uKGspe3JldHVybiBrP2s6ZnVuY3Rpb24obix4KXtpZihudWxsPT10aGlzKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSAndGhpcycgdmFsdWUgZm9yIFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMgbXVzdCBub3QgYmUgbnVsbCBvciB1bmRlZmluZWQiKTtpZihuIGluc3RhbmNlb2YgUmVnRXhwKXRocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IHRvIFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMgbXVzdCBub3QgYmUgYSByZWd1bGFyIGV4cHJlc3Npb24iKTtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZihuLHh8fDApfX0pOwptYygiQXJyYXkuZnJvbSIsZnVuY3Rpb24oayl7cmV0dXJuIGs/azpmdW5jdGlvbihuLHgsRyl7eD1udWxsIT14P3g6ZnVuY3Rpb24ocSl7cmV0dXJuIHF9O3ZhciBLPVtdLFE9InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmbltTeW1ib2wuaXRlcmF0b3JdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBRKXtuPVEuY2FsbChuKTtmb3IodmFyIHQ9MDshKFE9bi5uZXh0KCkpLmRvbmU7KUsucHVzaCh4LmNhbGwoRyxRLnZhbHVlLHQrKykpfWVsc2UgZm9yKFE9bi5sZW5ndGgsdD0wO3Q8UTt0KyspSy5wdXNoKHguY2FsbChHLG5bdF0sdCkpO3JldHVybiBLfX0pOwooZnVuY3Rpb24oKXtmdW5jdGlvbiBrKCl7dGhpcy5vPXRoaXMuZz10aGlzLmI9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmY9MDt0aGlzLmM9IiI7dGhpcy5sPSExfWZ1bmN0aW9uIG4oYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIHgoYSxjKXthPUUuY2FsbCh0aGlzLGEsYyl8fHRoaXM7YS5zPSExO3JldHVybiBhfWZ1bmN0aW9uIEcoYSl7cmV0dXJuIEEuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIEsoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIFEoYSxjKXtyZXR1cm4gRS5jYWxsKHRoaXMsYSxjKXx8dGhpc31mdW5jdGlvbiB0KGEpe3JldHVybiBBLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiBxKGEpe3JldHVybiBGLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiByKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2EuUz0hMTthLks9MTA7YS5OPSExO2EuSWE9ITE7YS5PPSExO2EuUD0hMTthLnM9MDthLnU9ITE7CmEuY2E9bC5zKDEwKTthLlg9ITE7YS5jPSExO2EuWj0hMTtyZXR1cm4gYX1mdW5jdGlvbiB3KGEpe3JldHVybiBBLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiBJKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5sPS0xO3JldHVybiBhfWZ1bmN0aW9uIGJhKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2EuWD0hMTthLm89ITE7YS5pc1BsYXlpbmc9ITE7YS5mPTA7YS5zPSExO3JldHVybiBhfWZ1bmN0aW9uIFUoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLmY9ITE7YS5sPTA7YS51PTA7YS5kdXJhdGlvbj0wO2EubT0hMTtyZXR1cm4gYX1mdW5jdGlvbiBHYShhKXtyZXR1cm4gRi5jYWxsKHRoaXMsYSl8fHRoaXN9ZnVuY3Rpb24gcmEoYSxjKXthPUUuY2FsbCh0aGlzLGEsYyl8fHRoaXM7YS5BPSExO2Eucz0hMTthLk09ITE7cmV0dXJuIGF9ZnVuY3Rpb24gc2EoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLmY9ITE7cmV0dXJuIGF9ZnVuY3Rpb24gVmIoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLAphKXx8dGhpc31mdW5jdGlvbiB3YihhLGMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLlg9ITE7cmV0dXJuIGF9ZnVuY3Rpb24gV2EoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLmY9ITE7cmV0dXJuIGF9ZnVuY3Rpb24gV2IoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIFhhKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2EuWD0hMTthLnBhcmVudD1udWxsO2EuYz17fTtyZXR1cm4gYX1mdW5jdGlvbiBSYShhKXthPUEuY2FsbCh0aGlzLGEpfHx0aGlzO2EuZj1udWxsO3JldHVybiBhfWZ1bmN0aW9uIFhiKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5jPSExO3JldHVybiBhfWZ1bmN0aW9uIEdiKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2EuYz0iIjtyZXR1cm4gYX1mdW5jdGlvbiBLYShhKXtyZXR1cm4gQS5jYWxsKHRoaXMsYSl8fHRoaXN9ZnVuY3Rpb24geGIoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIFlhKGEsCmMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLm89ITE7cmV0dXJuIGF9ZnVuY3Rpb24gU2EoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLkxhPSExO3ZvaWQgMD09YS5mJiYoYS5mPSExKTtyZXR1cm4gYX1mdW5jdGlvbiBZYihhKXtyZXR1cm4gRi5jYWxsKHRoaXMsYSl8fHRoaXN9ZnVuY3Rpb24gSGIoYSxjKXthPUUuY2FsbCh0aGlzLGEsYyl8fHRoaXM7YS5mPTA7YS5vPTEwO3JldHVybiBhfWZ1bmN0aW9uIHlhKGEpe2E9QS5jYWxsKHRoaXMsYSl8fHRoaXM7YS5mPTA7cmV0dXJuIGF9ZnVuY3Rpb24gWmIoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIGtiKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2EuYz1bXTthLmY9ITE7YS5vPSExO3JldHVybiBhfWZ1bmN0aW9uIExhKGEpe2E9QS5jYWxsKHRoaXMsYSl8fHRoaXM7YS5MYT0hMTtyZXR1cm4gYX1mdW5jdGlvbiAkYihhKXtyZXR1cm4gRi5jYWxsKHRoaXMsYSl8fHRoaXN9ZnVuY3Rpb24gSWIoYSwKYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2Eubz0hMTthLmM9MDtyZXR1cm4gYX1mdW5jdGlvbiBxYShhKXthPUEuY2FsbCh0aGlzLGEpfHx0aGlzO2EuZj0hMTthLm09ITE7YS5CPSExO2EubD1bXTthLnM9ITE7cmV0dXJuIGF9ZnVuY3Rpb24gSmIoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIGFjKGEsYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gWmEoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLm11dGVkPSExO3JldHVybiBhfWZ1bmN0aW9uIHJjKCl7dGEuc3x8KHRhLnM9MCk7dGEucysrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9dGEuQSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT10YS5BKTsxMD50YS5zJiZ3aW5kb3cuc2V0VGltZW91dChyYyw1MDApfWZ1bmN0aW9uIGNiKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5zPTA7YS5jPVtdO2EubT1bXTthLm89W107cmV0dXJuIGF9ZnVuY3Rpb24geWIoYSwKYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gJGEoYSl7cmV0dXJuIEEuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIGJjKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5jPSExO3JldHVybiBhfWZ1bmN0aW9uIGNjKGEsYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gZGIoYSl7cmV0dXJuIEEuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIEtiKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5tPSExO3JldHVybiBhfWZ1bmN0aW9uIHpiKGEsYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gSGEoYSl7cmV0dXJuIEEuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIGRjKGEpe3JldHVybiBGLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiBNYShhLGMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLnM9ITE7YS5BPSExO2EuTj0hMTthLnU9ITE7YS5EPSExO2EuYz0hMTtyZXR1cm4gYX1mdW5jdGlvbiB6YShhKXtyZXR1cm4gQS5jYWxsKHRoaXMsCmEpfHx0aGlzfWZ1bmN0aW9uIGVjKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5sPTE1MDA7cmV0dXJuIGF9ZnVuY3Rpb24gZWIoYSxjKXthPUUuY2FsbCh0aGlzLGEsYyl8fHRoaXM7YS5YPSExO2EudT0hMTthLkQ9ITE7YS5zPSExO2EuYz0wO3JldHVybiBhfWZ1bmN0aW9uIHVhKGEpe2E9QS5jYWxsKHRoaXMsYSl8fHRoaXM7YS5mPTA7YS5sPSExO3JldHVybiBhfWZ1bmN0aW9uIGZjKGEpe3JldHVybiBGLmNhbGwodGhpcyxhKXx8dGhpc31mdW5jdGlvbiBnYyhhLGMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLmFiPW51bGw7cmV0dXJuIGF9ZnVuY3Rpb24gYWIoYSl7YT1BLmNhbGwodGhpcyxhKXx8dGhpczthLmFiPW51bGw7YS5sPS0xO2EuZj1nLlRjO3JldHVybiBhfWZ1bmN0aW9uIGhjKGEpe2E9Ri5jYWxsKHRoaXMsYSl8fHRoaXM7YS5sPS0xO3JldHVybiBhfWZ1bmN0aW9uIEFiKGEsYyl7cmV0dXJuIEUuY2FsbCh0aGlzLGEsYyl8fHRoaXN9ZnVuY3Rpb24gQWEoYSl7YT0KQS5jYWxsKHRoaXMsYSl8fHRoaXM7YS5tPSExO2EuZj0hMTtyZXR1cm4gYX1mdW5jdGlvbiBCYihhKXthPUYuY2FsbCh0aGlzLGEpfHx0aGlzO2EubT0hMTtyZXR1cm4gYX1mdW5jdGlvbiBmYShhLGMpe2E9RS5jYWxsKHRoaXMsYSxjKXx8dGhpczthLkZhPSExO2EuTT0hMTthLkRhPSExO2EudT0hMTthLks9ITE7YS5HYT1sLnMoMTApO2EuUz0hMDthLmRhPSExO2EuRz0hMTthLlg9ITE7YS5XYT0iIjthLkthPSExO2Eubz0hMTthLlA9ITE7YS5JYT0hMTthLmltYT0hMTtyZXR1cm4gYX1mdW5jdGlvbiBCYShhKXtyZXR1cm4gQS5jYWxsKHRoaXMsYSl8fHRoaXN9ZnVuY3Rpb24gQ2IoYSl7cmV0dXJuIEYuY2FsbCh0aGlzLGEpfHx0aGlzfWZ1bmN0aW9uIGZiKGEsYyl7YT1FLmNhbGwodGhpcyxhLGMpfHx0aGlzO2Euc3RhdHVzPWEuRjthLmNhPSExO2EuSz0hMTthLm89ITE7YS5QPSExO2EuaXNQbGF5aW5nPSExO2EuRz0xO2EuTj0wO2Eucz1bXTthLmY9ITE7YS5NPVtdO2EuQT0wO2EudT0KMDthLk89ITE7YS5vbmNlPSExO2EuWj0hMTthLlM9W107YS5EPSExO3JldHVybiBhfWZ1bmN0aW9uIGxhKGEpe2E9QS5jYWxsKHRoaXMsYSl8fHRoaXM7dm9pZCAwPT1hLlRhJiYoYS5UYT0hMSk7dm9pZCAwPT1hLmYmJihhLmY9ITEpO3ZvaWQgMD09YS5sJiYoYS5sPSExKTt2b2lkIDA9PWEueWQmJihhLnlkPSExKTtyZXR1cm4gYX1mdW5jdGlvbiBpYyhhKXtyZXR1cm4gRi5jYWxsKHRoaXMsYSl8fHRoaXN9ZnVuY3Rpb24gTGIoYSxjKXtyZXR1cm4gRS5jYWxsKHRoaXMsYSxjKXx8dGhpc31mdW5jdGlvbiBsYihhKXthPUEuY2FsbCh0aGlzLGEpfHx0aGlzO2EuTGE9ITE7cmV0dXJuIGF9ZnVuY3Rpb24gRShhLGMpe3RoaXMucGxheWVyPSIiO3RoaXMuVz1udWxsO3RoaXMuWT0iMSI7dGhpcy5pYT0iMiI7dGhpcy5rYT0iMyI7dGhpcy5GPTA7dGhpcy5tPVtdO3RoaXMubD1bXTt0aGlzLkI9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSwKdW5rbm93bjo2fTt0aGlzLmZhPSExO3RoaXMuc3RhdHVzPXRoaXMuRjt0aGlzLmlkPWwuZygxMCk7dGhpcy5nYShhKTt0aGlzLndhKGMpfWZ1bmN0aW9uIEEoYSl7dGhpcy5jPXRoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuaT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuaGM9IiI7dGhpcy5GPW51bGw7dGhpcy5WKCl9ZnVuY3Rpb24gRihhKXt0aGlzLmY9e307dGhpcy5hPW51bGw7dGhpcy5GPTA7dGhpcy5sPTE1MDt0aGlzLmxjPTA7dGhpcy5LKGEpfWZ1bmN0aW9uIG1iKCl7dGhpcy5nPXRoaXMuaT0hMTt0aGlzLmI9W107dGhpcy5jPXt9fWZ1bmN0aW9uIGlhKGEsYyl7dGhpcy5sPWN8fHt9O3RoaXMuVD1hO3RoaXMuVmE9YS54YSgpO3RoaXMuYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmEuaWQ9bC5nKDEwKTt0aGlzLmY9YmIucG9wKCk7dGhpcy5mfHwobC50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLmY9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5mLmlkPSJhZFhkaXNwbGF5Iix0aGlzLmYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLmI9e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MCxwb3NpdGlvbjoiIn07dGhpcy5CPSExO3RoaXMuaT1bXTt0aGlzLm09ITF9ZnVuY3Rpb24gQyhhLGMpe3ZhciBkPUVycm9yLmNhbGwodGhpcyxhLnR5cGUpO3RoaXMubWVzc2FnZT1kLm1lc3NhZ2U7InN0YWNrImluIGQmJih0aGlzLnN0YWNrPWQuc3RhY2spO3RoaXMudHlwZT1hO3RoaXMuZGF0YT1jO3RoaXMuZGF0YXx8KHRoaXMuZGF0YT17fSk7dGhpcy5kYXRhLmRldGFpbHN8fCh0aGlzLmRhdGEuZGV0YWlscz1DLmEuUGQpO3RoaXMuZGV0YWlscz10aGlzLmRhdGEuZGV0YWlsc31mdW5jdGlvbiBqYShhLGMsZCxlKXt0aGlzLmM9ImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQgYXBwbGljYXRpb24vamF2YXNjcmlwdCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQgYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IHRleHQvZWNtYXNjcmlwdCB0ZXh0L2phdmFzY3JpcHQgdGV4dC9qc2NyaXB0IHRleHQveC1lY21hc2NyaXB0IHRleHQveC1qYXZhc2NyaXB0Ii5zcGxpdCgiICIpOwp0aGlzLmphPWE7dGhpcy5hPWM7dGhpcy5DPWU7dGhpcy50Yz0wO3RoaXMuZHVyYXRpb249dGhpcy5vKCk7dGhpcy5vYz10aGlzLmwoKTt0aGlzLlViPXRoaXMubSgpO3RoaXMuWGI9dGhpcy5GKCk7dGhpcy50ZD0hMTt0aGlzLmk9dGhpcy5nPSIiO3RoaXMuZXJyb3I9bnVsbDt0aGlzLkdkPVtdfWZ1bmN0aW9uIFcoYSxjKXthPXZvaWQgMD09PWE/IiI6YTtjPXZvaWQgMD09PWM/ITE6Yzt2YXIgZD12YS5jYWxsKHRoaXMpfHx0aGlzO2Quc3JjPWE7ZC5kYT1jO2QuYT1udWxsO2QuTWE9W107ZC5aPVtdO2QuYj1bXTtkLmk9W107ZC5XPSExO2QuWT0hMTtkLmM9ITE7ZC5sPSExO2QuRD0xO2Quc3JjLmxlbmd0aCYmZC5sb2FkKGQuc3JjKTtyZXR1cm4gZH1mdW5jdGlvbiBuYihhKXthPXZvaWQgMD09PWE/IiI6YTt2YXIgYz1JYS5jYWxsKHRoaXMsbnVsbCl8fHRoaXM7Yy5hPW51bGw7Yy5zcmM9YTtyZXR1cm4gY31mdW5jdGlvbiBJYShhLGMpe3RoaXMuQz1hO3RoaXMucG9zaXRpb249dm9pZCAwPT09CmM/InByZXJvbGwiOmM7dGhpcy5zPW51bGw7dGhpcy5qYT1bXTt0aGlzLmI9W107dGhpcy5nPVtdO3RoaXMuZHVyYXRpb249MH1mdW5jdGlvbiBUYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLmRhdGE9Yzt0aGlzLmphPVtdfWZ1bmN0aW9uIE5hKGEsYyl7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5pZD1jKyJjb250YWluZXIiO2EuYXBwZW5kQ2hpbGQoZCk7YT1jYS5jYWxsKHRoaXMsZCxjKXx8dGhpczthLmNvbnRhaW5lcj1kO2EuamE9W107YS5sPVtdO2EuZj0tMTthLmZvcm1hdD0icG9ydHJhaXQiO2EuRCgpO3JldHVybiBhfWZ1bmN0aW9uIGNhKGEsYyxkKXt2YXIgZT12YS5jYWxsKHRoaXMpfHx0aGlzO2Uud2I9YTtlLmlkPWM7ZS5iPU9iamVjdC5hc3NpZ24oe30se3dpZHRoOiIxMDAlIixoZWlnaHQ6IjEwMCUiLHByZWxvYWQ6ImF1dG8iLGF1dG9wbGF5OiIifSxkKTtlLmE9ZS5zKCk7ZS5hLnNldEF0dHJpYnV0ZSgicG9zdGVyIiwiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vdmVydGljYWxpenIvYmxhY2sucG5nIik7CmUuTz0iMDAwMCI7ZS5QPSIiO2UucGFyZW50PW51bGw7ZS5HKCk7ZS5LKCk7cmV0dXJuIGV9ZnVuY3Rpb24gUyhhKXt2YXIgYz12YS5jYWxsKHRoaXMpfHx0aGlzO2Mud2I9YTtjLmNvbnRhaW5lcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmNvbnRhaW5lci5pZD0ibGltb3Jvb3QiO2MuY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yy5jb250YWluZXIuc3R5bGUudG9wPSIwIjtjLmNvbnRhaW5lci5zdHlsZS5sZWZ0PSIwIjtjLmNvbnRhaW5lci5zdHlsZS53aWR0aD0iMTAwJSI7Yy5jb250YWluZXIuc3R5bGUuaGVpZ2h0PSIxMDAlIjtjLmI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy51PW51bGw7Yy5BPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2MuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5PPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpjLmM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5hPW51bGw7Yy5tPW51bGw7Yy5mPW51bGw7Yy5sYWJlbD1udWxsO2Mucz1udWxsO2MuTj0tMTtjLnBsYXllcj1uZXcgTmEoYy5jb250YWluZXIsImxpbW9fdmlkZW8iKTtjLnBsYXllci5wYXJlbnQ9YztjLnBsYXllci5vbigiY29tcGxldGUiLGZ1bmN0aW9uKCl7Yy5iYSgpfSk7Yy5vbigidmlkZW9zdGFydCIsZnVuY3Rpb24oKXtjLksmJiFjLlMmJihnLmoudHJhY2soInZydGNsenJfcmV0dXJuZWQiLCIiLCEwKSxjLlM9ITApfSk7Yy5ZPSExO2MuQj1bXTtjLmk9W107Yy5XPTA7Yy5LPSExO2MuUz0hMTtjLkQ9ITE7Yy5sYSgpO3JldHVybiBjfWZ1bmN0aW9uIFIoYSl7dmFyIGM9UC5jYWxsKHRoaXMpfHx0aGlzO2cuai50cmFjaygidnJ0Y2x6cl9zZXR1cCIsIiIsITApO2MubT1hO2MucGFyZW50PW51bGw7Yy5CPSExO2Mucz1nLnYuYigidmVydGljYWxpenIiKXx8e307Yy5hPW5ldyBTO2MuYS5hPWM7Yy5yYz1jLnMuYWxpYXN8fAoic3ZtcHJldmlldyI7LTEhPT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCImcHJldmlldyIpJiYoYy5yYz0ic3ZtcHJldmlldyIpO2MuVT0oYy5zLmFwaXx8Imh0dHBzOi8vd3d3LndlbGVjdC5kZS9hcGkvdjEvY29uc3VtcHRpb25zL29mZmVyL2J5X2FsaWFzL1thbGlhc10vIikucmVwbGFjZSgiW2FsaWFzXSIsYy5yYykrIj9nZHByPVtnZHByXSZnZHByX2NvbnNlbnQ9W2dkcHJfY29uc2VudF0iO2MuYj1bXTtjLk89ITE7Yy5TKCk7Yy5tfHwoYy5QKCksYy51KCkpO3JldHVybiBjfWZ1bmN0aW9uIFYoKXt2YXIgYT1QLmNhbGwodGhpcyl8fHRoaXM7YS5aPSJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCI7YS5hPW51bGw7YS5iPSExO2EuZj0hMTthLm09ITE7YS5QPTA7YS5CPTA7YS5zPTA7YS5PPVtdO3JldHVybiBhfWZ1bmN0aW9uIE9hKCl7dmFyIGE9TC5jYWxsKHRoaXMpfHx0aGlzOwphLmE9bnVsbDtyZXR1cm4gYX1mdW5jdGlvbiBvYSgpe3ZhciBhPUwuY2FsbCh0aGlzKXx8dGhpczthLmE9bnVsbDthLndhKCk7YS5iYT0hMTthLmRhPSIiO3JldHVybiBhfWZ1bmN0aW9uIEwoKXt2YXIgYT1QLmNhbGwodGhpcyl8fHRoaXM7YS52aWRlb1RhZz1udWxsO2Eua2E9MUUzO2EuZj0hMTthLlM9ITE7YS51PSExO2EuUD0hMTthLlo9ITE7YS5PPSExO2EuQj0hMTtyZXR1cm4gYX1mdW5jdGlvbiBQKCl7dmFyIGE9dmEuY2FsbCh0aGlzKXx8dGhpczthLmV2ZW50PXtZYjoicmVhZHkiLFBhOiJlcnJvciIsT2E6ImVuZGVkIixwYzoidGltZXVwZGF0ZSIsR2M6ImltcHJlc3Npb24iLEtjOiJzdGFydCIsRmM6ImZpcnN0UXVhcnRpbGUiLEhjOiJtaWRwb2ludCIsTGM6InRoaXJkUXVhcnRpbGUiLEVjOiJjcmVhdGl2ZVZpZXciLHBkOiJza2lwIixxZDoidGltZWNoYW5nZSIsbWM6ImNsaWNrdGhyb3VnaCIsSWM6InBhdXNlIixvZDoicmVzdW1lIixOZDoibXV0ZSIsU2Q6InVubXV0ZSJ9OwphLkM9bnVsbDthLmM9bnVsbDthLmk9bnVsbDthLk49LTE7YS5EPW51bGw7cmV0dXJuIGF9ZnVuY3Rpb24gdShhLGMsZCl7dGhpcy5hPW51bGw7dGhpcy5qZChhKTthLlQuYWE/dGhpcy5iYT1hLlQuYWEoKTp0aGlzLmJhPSIiO2EuVC5DZCYmYS5ULkNkKHtwYXVzZTp0aGlzLmtjLmJpbmQodGhpcykscmVzdW1lOnRoaXMuTWIuYmluZCh0aGlzKSxtdXRlOnRoaXMuSWIuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5LZC5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5hLlZhO3RoaXMucGxheWVyPXRoaXMuYS5UO3RoaXMuZj1udWxsO3RoaXMuaT1jO3RoaXMucz1udWxsO3RoaXMudmlkZW89e307dGhpcy5oYT17fTt0aGlzLllkPWcuai5nKDEwKTt0aGlzLmdhPTA7dGhpcy5aPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWj1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJigoYT10aGlzLmEuVCkmJnRoaXMuYS5ULkNhJiYKKGE9dGhpcy5hLlQuQ2EoKSksdGhpcy5aPWQuYWRtZXNzYWdlKGEpKSk7ZCYmInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlJjPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuVz0hMTt0aGlzLmw9bnVsbDt0aGlzLkM9e307dGhpcy5LYT0tMTt0aGlzLm09dGhpcy5WYj0hMTt0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5iZT1nLmouZygxMCk7dGhpcy56YT1nLmouZygxMCk7dGhpcy50YT1nLmouZygxMCk7dGhpcy5QYj1nLmouZygxMCk7dGhpcy5nPXt9O3RoaXMuSmI9dGhpcy5wYT10aGlzLlA9ITE7Zy5qLmcoMTApO3RoaXMuRmE9dGhpcy5pYT10aGlzLk09dGhpcy5sYT0hMTt0aGlzLlk9W107dGhpcy5OPXt9O3RoaXMua2E9dGhpcy5HYT0hMTt0aGlzLkE9bnVsbDt0aGlzLmM9dGhpcy5VPSExO3RoaXMuQj1udWxsO3RoaXMud2E9e307dGhpcy5EYT17fTt0aGlzLmliPSExO3RoaXMuZGlzcGxheT1udWxsfWZ1bmN0aW9uIG9iKCl7dGhpcy5pPQp0aGlzLmVjPSIiO3RoaXMuYjt0aGlzLmE9e319ZnVuY3Rpb24gQ2EoKXt9ZnVuY3Rpb24gdmEoKXt0aGlzLkY9bmV3IE1hcDt0aGlzLm89bmV3IE1hcDt0aGlzLk09bmV3IE1hcH1mdW5jdGlvbiBkYShhKXt0aGlzLmE9dGhpcy5wYXJzZShhKTt0aGlzLmY9IiJ9ZnVuY3Rpb24gdihhKXt0aGlzLmRhdGE9YXx8e307dGhpcy50eXBlPXRoaXMuZXJyb3JNZXNzYWdlPSIifWZ1bmN0aW9uIHooKXt0aGlzLkZkPSExO3RoaXMuVT0ic2V0dXAiO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlFiLmJpbmQodGhpcykpO3RoaXMub2E9dGhpcy5uYT1udWxsO3RoaXMudT10aGlzLmZhPSExO3RoaXMuTz1bXTt0aGlzLmhiPSExO3RoaXMuaT17fTt0aGlzLmdhKCk7dGhpcy5iYT0hMTt0aGlzLks9bnVsbDt0aGlzLmw9bmV3IE1hcDt0aGlzLnliKCl9ZnVuY3Rpb24gSCgpe2cuSD10aGlzO3dhPXRoaXM7dGhpcy5KYT0hMTt0aGlzLlFhPSIiO3RoaXMubmE9dGhpcy5VPXRoaXMuQT0KbnVsbDt0aGlzLk9iPXRoaXMuYmE9dGhpcy5BYj0hMTt0aGlzLmY9IiI7dGhpcy56Yj0hMTt0aGlzLkJhPXRoaXMuZmM9IiI7dGhpcy55Yj10aGlzLmI9dGhpcy5hPXRoaXMuZWQ9ITE7dGhpcy5nPVtdO3RoaXMuamI9dGhpcy5EPSIiO3RoaXMuZmI9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5XYT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMudT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5IYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5LPSIiO3RoaXMuTj1bXTt0aGlzLk89W107dGhpcy5nYT1bXTt0aGlzLlo9IiI7dGhpcy5TPSExO3RoaXMuR2E9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5jYT0hMTt0aGlzLk5iPXRoaXMuaGE9bnVsbDt0aGlzLmxiPXRoaXMuaWE9dGhpcy5pYj10aGlzLkthPXRoaXMucGI9dGhpcy5xYT10aGlzLkc9ITE7CnRoaXMuQj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5xYj0iIjt0aGlzLmVhPTA7dGhpcy5kYT10aGlzLnhiPSExO3RoaXMuYml0cmF0ZT0xRTM7dGhpcy5rYT10aGlzLmxhPSIiO3RoaXMua2I9bnVsbDt0aGlzLkhkPSExO3RoaXMuTT10aGlzLlk9bnVsbDt0aGlzLmk9e307dGhpcy5EYT0wO3RoaXMuQmI9dGhpcy5vPSExO3RoaXMuVz0xMDt0aGlzLnRiPWZ1bmN0aW9uKCl7fTt0aGlzLnphPS0xO3RoaXMuaGI9dGhpcy5vYT0hMTt0aGlzLnBhPXt9fWZ1bmN0aW9uIHBiKCl7dGhpcy5hPXRoaXMuYj0hMX1mdW5jdGlvbiBnYihhLGMsZCxlLGYpe3RoaXMuYT1hO3RoaXMuZj10aGlzLkY9ITE7dGhpcy5tPWQ7dGhpcy5jPSExO3RoaXMudGltZW91dD0wO3RoaXMubz0hMTt0aGlzLmc9LTE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuYT1uZXcgUGEoYSkpO3ZhciBoPXRoaXMuYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshY3x8CjQhPWgucmVhZHlTdGF0ZXx8MjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1c3x8KHRoaXMuaSgpLHRoaXMubChoKSxnLnYuYigiY29tcGFuaW9ucyIpJiYoaD10aGlzLkIoaCkpLGMoaCkpO2QmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz8odGhpcy5pKCksdGhpcy5sKGgpLGQoaCkpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJmcuai5CKHRoaXMuYS51cmwpJiYhZiYmbC50cmFjaygic3RhdHNfaGRfcmVxdWVzdF9mYWlsZWQiLCJzdGF0dXMwIiwhMCk7ZSYmNCE9aC5yZWFkeVN0YXRlJiZlKGgpfS5iaW5kKHRoaXMpfWZ1bmN0aW9uIFBhKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWZ1bmN0aW9uIHFiKCl7dGhpcy5hPXt9O3RoaXMuYz17fTt0aGlzLmNsaWVudD17fTt0aGlzLmk9e319ZnVuY3Rpb24gaGIoKXt9ZnVuY3Rpb24gSmEoKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsCkphKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixKYSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsSmEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsSmEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixKYSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixKYSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsSmEpO3NjPSEwO2Zvcih2YXIgYT0wO2E8YmIubGVuZ3RoO2ErKyliYlthXS5sb2FkKCk7Zm9yKGE9MDthPGJiLmxlbmd0aDthKyspe3ZhciBjPWJiW2FdLnBsYXkoKTtpZih2b2lkIDAhPT1jKWMudGhlbihmdW5jdGlvbigpe30pWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSl9TWImJihNYigpLE1iPSExKX1mdW5jdGlvbiB0Yygpe3ZhciBhPXdpbmRvdy5PTzthfHwoYT13aW5kb3cuak9PUGxheWVyXzApO3JldHVybiBhfWZ1bmN0aW9uIHVjKCl7dHJ5e2wuRyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKX1jYXRjaChmKXt9aWYoZy52Lmcpe3ZhciBhPQpJYyhmdW5jdGlvbigpe2wuaGEod2luZG93LE5iLmMoKSx7aWQ6YX0pfSw1MDApO2lmKGwuaGIpd2EuWGQoKTtlbHNle2cudi5hLnBhdXNlQnV0dG9ufHwoZy52LmEucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpnLnYuYS5wbGF5QnV0dG9ufHwoZy52LmEucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmcudi5hLm11dGVCdXR0b258fChnLnYuYS5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKZy52LmEudW5tdXRlQnV0dG9ufHwoZy52LmEudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKZy52LmEuc2tpcGFibGVCdXR0b258fChnLnYuYS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2cudi5hLnNraXBCdXR0b258fChnLnYuYS5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CndhLlNhfHxuZXcgSDtpZihnLnYuYigiYnlwYXNzIikpe3ZhciBjPWcudi5iKCJjbGllbnRDb25maWciKTtpZigib2JqZWN0Ij09PXR5cGVvZiBjKXt2YXIgZD1jLmFsaWFzO3ZhciBlPWMuc2VydmVyfWQmJmU/KGcuSC5kYT0hMCxnLkguVihkLGUpLGcuSC5GYigpKTpnLkguU2EoZy52LmEuZ2xvYmFsQ29uZmlnLGcudi5hLmNsaWVudENvbmZpZyxnLnYuYS5wcmVjaGVja2VkLGcudi5hLm9uUmVhZHksZy52LmEub25GYWlsdXJlLGcudi5hKX1lbHNlIGcuSC5TYShnLnYuYS5nbG9iYWxDb25maWcsZy52LmEuY2xpZW50Q29uZmlnLGcudi5hLnByZWNoZWNrZWQsZy52LmEub25SZWFkeSxnLnYuYS5vbkZhaWx1cmUsZy52LmEpO2RvY3VtZW50LmhkX3JlYWR5PSEwfX1lbHNlIEpjKHVjLDUwKX1mdW5jdGlvbiBYKGEsYyl7aWYoZy52LmcmJndhLlNhKXsoZy52LmEuYWRUYWd8fGcudi5hLnByZXJvbGxBZFRhZykmJmEucGF1c2UoKTtsLmEodi5iLGEuQ2EoKSk7aWYoYS5nZXRDdXJyZW50VGltZSl7dmFyIGQ9CmEuZ2V0Q3VycmVudFRpbWUoKTtkJiZsLnRyYWNrKCJhY3RpdmF0ZWRBdCIsZCl9Yz93YS5KYT0hMDpsLnRyYWNrKCJzdGF0c19oZF9hYmQiLCIiLCEwKTtkPW5ldyBrO2QuQihhKTtkLkcod2EpO2QuRihnLnYuYSk7ZC53KCl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe1goYSxjKX0uYmluZCh0aGlzKSw1MCl9cWIucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSl7cmV0dXJuIDA8T2JqZWN0LmtleXMoYXx8e30pLmxlbmd0aCYmYS5jb25zdHJ1Y3Rvcj09PU9iamVjdH07cWIucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaVthXXx8dGhpcy5jbGllbnRbYV18fHRoaXMuYVthXX07cWIucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtyZXR1cm57ZW1iZWQ6dGhpcy5hLGdsb2JhbDp0aGlzLmMsY2xpZW50OnRoaXMuY2xpZW50LGN1c3RvbWVyOnRoaXMuaX19O1FhLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHFiLnByb3RvdHlwZSx7Zzp7Y29uZmlndXJhYmxlOiEwLAplbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmwodGhpcy5hKX19fSk7dmFyIGc9e3Y6bnVsbCxIOm51bGwsajpudWxsfTtnLnY9bmV3IHFiO1BhLnByb3RvdHlwZS5hPWZ1bmN0aW9uKGEpe3RoaXMuZGF0YS5ob21hZF9tYWNyb3M9YX07UGEucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYShKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYyl7fX07Z2IucHJvdG90eXBlLkI9ZnVuY3Rpb24oYSl7aWYoYSYmYS5yZXNwb25zZVRleHQmJmEucmVzcG9uc2VUZXh0LmluZGV4T2YmJjA8PWEucmVzcG9uc2VUZXh0LmluZGV4T2YoIklGcmFtZVJlc291cmNlIikpdHJ5e3ZhciBjPXt9O2MucmVzcG9uc2VUZXh0PWEucmVzcG9uc2VUZXh0O2Zvcih2YXIgZD0obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGMucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDb21wYW5pb25BZHMiKSxlPTA7ZTxkLmxlbmd0aDtlKyspZm9yKHZhciBmPQpkW2VdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJRnJhbWVSZXNvdXJjZSIpLGg9MDtoPGYubGVuZ3RoO2grKyl7dmFyIG09Zy5qLkJkKGZbaF0pLEQ9Zy5qLk4obSxnLkgsITApO2cuai5jKG0pO2MucmVzcG9uc2VUZXh0PWMucmVzcG9uc2VUZXh0LnJlcGxhY2UobSxEKTtjLnJlc3BvbnNlWE1MPShuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYy5yZXNwb25zZVRleHQsInRleHQveG1sIil9Zy5qLnRyYWNrKCJzdGF0c19oZF9jb21wYW5pb24iLCIiLCEwKTtyZXR1cm4gY31jYXRjaChNKXt9cmV0dXJuIGF9O2diLnByb3RvdHlwZS5sPWZ1bmN0aW9uKGEpe3ZhciBjPSExO2lmKGEmJiEoYS5yZXNwb25zZSYmYS5yZXNwb25zZS5pbmRleE9mJiYwPD1hLnJlc3BvbnNlLmluZGV4T2YoInN0YXRzX2hkX2FsaXZlIikpKXRyeXt2YXIgZD1hLmdldEFsbFJlc3BvbnNlSGVhZGVycygpO2lmKDA8PWQuaW5kZXhPZigiZGF0ZToiKXx8MDw9ZC5pbmRleE9mKCJEYXRlOiIpKWM9YS5nZXRSZXNwb25zZUhlYWRlcigiRGF0ZSIpOwppZihjKXt2YXIgZT1uZXcgRGF0ZShjKTtnLkgub2F8fChnLkgub2E9ZS5nZXRUaW1lKCkpO2cuSC5oYj1lLmdldFRpbWUoKTt2YXIgZj1nLkguaGItZy5ILm9hO2lmKGYpe3ZhciBoPU1hdGguZmxvb3IoZi82RTQpLG09TWF0aC5mbG9vcihmLzM2RTUpLEQ9TWF0aC5mbG9vcihmLzg2NEU1KTthPSIiOzU8PWgmJihhPSI1bWluIik7MTA8PWgmJihhPSIxMG1pbiIpOzIwPD1oJiYoYT0iMjBtaW4iKTszMDw9aCYmKGE9IjMwbWluIik7NDU8PWgmJihhPSI0NW1pbiIpOzE8PW0mJihhPW0rImgiKTsxPD1EJiYoYT1EKyJkIik7YSYmZy5ILnBhJiYhZy5ILnBhW2FdJiYoZy5ILnBhW2FdPSEwLGcuai50cmFjaygic3RhdHNfaGRfYWxpdmUiLGEsITApKX19fWNhdGNoKE0pe319O2diLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7dGhpcy50aW1lb3V0JiYodGhpcy5nPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucy5iaW5kKHRoaXMpLHRoaXMudGltZW91dCkpfTtnYi5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3RoaXMuZyYmCndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nKTt0aGlzLmc9ITF9O2diLnByb3RvdHlwZS5zPWZ1bmN0aW9uKCl7dGhpcy5pKCk7dGhpcy5vPSEwO3RoaXMuYi5vPSEwO3RoaXMuYi5hYm9ydCgpfTtnYi5wcm90b3R5cGUubG9hZD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5kYXRhO2lmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGM9YTthPSIiO2Zvcih2YXIgZCBpbiBjKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoY1tkXSk7YT1hLnN1YnN0cigxKX10aGlzLmYmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuYi51cmxDYWxsZWQ9dGhpcy5hLnVybDt0cnl7dGhpcy5jP3RoaXMuYi5vcGVuKHRoaXMuYS5tZXRob2QsdGhpcy5hLnVybCwhMSk6dGhpcy5iLm9wZW4odGhpcy5hLm1ldGhvZCx0aGlzLmEudXJsLCEwKSx0aGlzLkZ8fCh0aGlzLmIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLmIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGFbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwidHJ1ZSIpLGEmJjA8YS5sZW5ndGgmJmEuaW5kZXhPZiYmKDA8YS5pbmRleE9mKCJob21hZF90cmFja19rZXkiKXx8MDxhLmluZGV4T2YoImhvbWFkX2F0IikpJiYoYSs9IiZob21hZF92ZXJzaW9uPTIwMjEwMTI2XzEwNDkiKSx0aGlzLmIuc2VuZChhKSx0aGlzLnUoKX1jYXRjaChlKXthPXRoaXMuYS5kYXRhLmhhc093blByb3BlcnR5KCJob21hZF90cmFja19rZXkiKXx8dGhpcy5hLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksZy5qLkIodGhpcy5hLnVybCkmJiFhJiZsLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0X2ZhaWxlZCIsImNhdGNoIiwhMCksdGhpcy5tJiZ0aGlzLm0oKX1yZXR1cm4gdGhpcy5ifTtwYi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXt0aGlzLmI9YX07cGIucHJvdG90eXBlLmM9CmZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtwYi5wcm90b3R5cGUuaT1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoZSxmKXtlLmFkZEV2ZW50TGlzdGVuZXIoZixmdW5jdGlvbigpe30pfXZhciBjPXtVZToiQWRDbGlja1RocnUiLFdlOiJBZEVycm9yIixYZToiQWRTdG9wcGVkIiwkZToiQWRMaW5lYXJDaGFuZ2UiLGFmOiJBZFRhZ1BhcnNlZCIsZGY6IkFkVmlkZW9Db21wbGV0ZSIsZ2Y6IkFkTG9hZGVkIixoZjoiQWRTa2lwcGVkIixqZjoiQWRTdGFydGVkIixZZToiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLFplOiJBZEltcHJlc3Npb24iLFZlOiJBZENyZWF0aXZlVmlldyIsYmY6IkFkVmlkZW9NaWRwb2ludCIsY2Y6IkFkUGF1c2VkIixlZjoiQWRWaWRlb1N0YXJ0IixmZjoiQWRQbGF5aW5nIn07d2luZG93LnNtYXJ0Y2xpZW50Y29yZSYmd2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCYmKGM9d2luZG93LnNtYXJ0Y2xpZW50Y29yZS5FVkVOVCk7Zm9yKHZhciBkIGluIGMpYy5oYXNPd25Qcm9wZXJ0eShkKSYmCmEodGhpcy5iLGNbZF0se30pfTtwYi5wcm90b3R5cGUuZz1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoZCxlKXtkLmFkZEV2ZW50TGlzdGVuZXIoZSxmdW5jdGlvbigpe30pfWlmKHRoaXMuYSYmdGhpcy5hLkpjKWZvcih2YXIgYyBpbiB0aGlzLmEuSmMpdGhpcy5hLkpjLmhhc093blByb3BlcnR5KGMpJiZhKHRoaXMuYSx0aGlzLmEuSmNbY10se30pO3RoaXMuYSYmdGhpcy5hLmdldEVycm9yJiZ3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt9LmJpbmQodGhpcyksMTApfTtwYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3RoaXMuYiYmdGhpcy5pKCk7dGhpcy5hJiZ0aGlzLmcoKX07SC5wcm90b3R5cGUuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuSmEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5RYSxhZHRhZ21vZGlmaWVyOnRoaXMuQSxhZHRhZ21vZGlmaWVyQWR2OnRoaXMuVSxhZHRhZ3JlZ2V4OnRoaXMubmEsYml0cmF0ZTp0aGlzLmJpdHJhdGUsanNwb3B1cHM6dGhpcy5BYiwKc2lkZWxvYWRzOnRoaXMuYmEsZGlzYWJsZXRlc3RzOnRoaXMuT2IsaG9tYWRBbGlhczp0aGlzLmYsaXNJbml0aWFsaXplZDp0aGlzLnpiLGdsb2JhbENvbmZpZzp0aGlzLmZjLGNsaWVudENvbmZpZzp0aGlzLkJhLGlzRW5hYmxlZDp0aGlzLmEsaXNWZXJpZmllZDp0aGlzLmIsaXNCbG9ja2VkOnRoaXMueWIsc2VydmVyOnRoaXMuZyxzdm1Db25maWc6dGhpcy5ELGhvbWFkQWRwYXRoOnRoaXMuamIsSE9NQURfVkVSSUZJRUQ6dGhpcy5mYixIT01BRF9CTE9DS0VEOnRoaXMuV2EsSE9NQURfTk9CTE9DS0VSOnRoaXMudSxIT01BRF9BREJMT0NLRVI6dGhpcy5IYix0ZXN0SGlkZTp0aGlzLkssdGVzdFRhZ3M6dGhpcy5OLHRlc3RUYWdzSlM6dGhpcy5PLHRlc3RUYWdzWEhSOnRoaXMuZ2EsdGVzdDNQQ29va2llOnRoaXMuWix0aHJvdHRsZTp0aGlzLkdhLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuY2EsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5OYiwKYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5HLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5xYSx1c2VTdHJpY3RDaGVja3M6dGhpcy5wYix1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5LYSxjb25maWdGYWlsdXJlczp0aGlzLkIsc2l0ZUNvbmZpZzp0aGlzLmksc2VydmVySWQ6dGhpcy5EYSxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMubyx2cGFpZDp0aGlzLmlhLHNraXBBbGxvd2VkOnRoaXMubGIsdm1hcHM6dGhpcy5xYixhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuZGEsYWRGYWxsYmFja1VSTDp0aGlzLmxhLGFkRmFsbGJhY2tDb25maWc6dGhpcy5rYSx5aWVsZGxhYjp0aGlzLmtiLF9jb25maWc6Zy52LmYoKX19O0gucHJvdG90eXBlLlNiPWZ1bmN0aW9uKCl7dmFyIGE9ITEsYztmb3IoYyBpbiB0aGlzLkIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5CW2NdJiYxPT10aGlzLkJbY10mJihhPSEwKTtyZXR1cm4gYX07SC5wcm90b3R5cGUuaGQ9ZnVuY3Rpb24oYSl7dGhpcy5CW2FdPQohMH07SC5wcm90b3R5cGUuUWI9ZnVuY3Rpb24oKXt2YXIgYT1bXSxjO2ZvcihjIGluIHRoaXMuQikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLkJbY10mJjE9PXRoaXMuQltjXSYmYS5wdXNoKGMpO3JldHVybiBhfTtILnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9dm9pZCAwPT09ZD8hMTpkO2lmKCEodGhpcy5KYXx8dm9pZCAwIT09YyYmYykpcmV0dXJuIG5ldyBQYShhKTtjPWcuai5CKGEpO3ZhciBlPWwuYyhhKTtpZihjKXt2YXIgZj10aGlzLndhKCk/YTplLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIjthPWUucGF0aC5zdWJzdHIoMSl9ZWxzZSBmPXRoaXMucygpLGE9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIik7ZCYmKHRoaXMuUWF8fHRoaXMuQXx8dGhpcy5VfHx0aGlzLm5hfHxnLnYuYigidGNmX2NvbmZpZyIpKSYmKGE9dGhpcy5DYihhKSk7ZD1uZXcgUGEoZik7ZC51cmw9ZjtjPWM/ZS5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOgp0aGlzLnRhKGUuaG9zdCk7ZC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YztkLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1hO2QuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND1sLkEoYSk7ZC5tZXRob2Q9IlBPU1QiO3JldHVybiBkfTtILnByb3RvdHlwZS53YT1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuZyYmdGhpcy5nLmxlbmd0aCYmMDx0aGlzLmcubGVuZ3RoJiYoYT10aGlzLmdbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxhPShhPWEuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX07SC5wcm90b3R5cGUudGE9ZnVuY3Rpb24oYSl7dmFyIGM9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5mJiYwPHRoaXMuZi5sZW5ndGgpcmV0dXJuIHRoaXMuZjtmb3IoYyBpbiB0aGlzLmYpe3ZhciBkPXRoaXMuZltjXTtpZihkLmhhc093blByb3BlcnR5KCJ1cmwiKSYmCmQudXJsPT09YSlyZXR1cm4gZC5hbGlhc31yZXR1cm4ibm9uZSJ9O0gucHJvdG90eXBlLmZhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ1t0aGlzLkRhXX07SC5wcm90b3R5cGUucz1mdW5jdGlvbigpe3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiLGM9dGhpcy5mYSgpO2E9bC5pYihhKTt2YXIgZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGMucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfTtILnByb3RvdHlwZS5EYj1mdW5jdGlvbihhKXt2YXIgYz0hMSxkPSIiO2lmKGEuZXZhbCl0cnl7ZD1ldmFsKCIoIithLmV2YWwrIikoKSIpfWNhdGNoKGUpe2M9ITB9ZWxzZSBjPSEwO2MmJiJLRUVQIiE9PWEuZmFsbGJhY2smJihkPWEuZmFsbGJhY2spO3JldHVybiBkfTtILnByb3RvdHlwZS4kYj1mdW5jdGlvbihhLGMpe2E9bC5jKGEpO3ZhciBkO2ZvcihkIGluIGMpe2lmKGNbZF0uc3VidmFsdWVzKXt2YXIgZT0KZGVjb2RlVVJJQ29tcG9uZW50KGEucXVlcnlLZXlbZF0pLnNwbGl0KCImIik7dmFyIGY9e307Zm9yKHZhciBoPTA7aDxlLmxlbmd0aDtoKyspe3ZhciBtPWVbaF0uc3BsaXQoIj0iKTtmW21bMF1dPW1bMV19Zm9yKHZhciBEIGluIGNbZF0uc3VidmFsdWVzKWZbRF09dGhpcy5EYihjW2RdLnN1YnZhbHVlc1tEXSk7ZT1bXTtmb3IoRCBpbiBmKWUucHVzaChEKyI9IitmW0RdKTtmPWU9ZW5jb2RlVVJJQ29tcG9uZW50KGUuam9pbigiJiIpKX1lbHNlIGY9dGhpcy5EYihjW2RdKTthLnF1ZXJ5S2V5W2RdPWZ9Yz1bXTtmb3IoZCBpbiBhLnF1ZXJ5S2V5KWMucHVzaChkKyI9IithLnF1ZXJ5S2V5W2RdKTtyZXR1cm4gYS5ob3N0K2EucGF0aCsiPyIrYy5qb2luKCImIil9O0gucHJvdG90eXBlLkNiPWZ1bmN0aW9uKGEpe3RoaXMuUWEmJihhKz10aGlzLlFhKTtpZih0aGlzLkEpZm9yKHZhciBjIGluIHRoaXMuQSl0aGlzLkEuaGFzT3duUHJvcGVydHkoYykmJihhPWEucmVwbGFjZShjLHRoaXMuQVtjXSkpOwppZihsLk8pZm9yKHZhciBkPTA7ZDxsLk8ubGVuZ3RoO2QrKyl7dmFyIGU9bC5PW2RdO2ZvcihjIGluIGUpYT1hLnJlcGxhY2UoYyxlW2NdKX10aGlzLlUmJihhPXRoaXMuJGIoYSx0aGlzLlUpKTtpZihkPWcudi5iKCJ0Y2ZfY29uZmlnIikpYz1kLmNvbnNlbnRfc3RyaW5nX3BsYWNlaG9sZGVyfHwiW2dkcHJfY29uc2VudF0iLGQ9ZC5nZHByX2FwcGxpZXNfcGxhY2Vob2xkZXJ8fCJbZ2Rwcl0iLGcuVWEmJihhPWEucmVwbGFjZShjLGcuVWEuZWN8fCJ1bmRlZmluZWQiKSxhPWEucmVwbGFjZShkLGcuVWEuV2M/InRydWUiOiJmYWxzZSIpKTtyZXR1cm4gYX07SC5wcm90b3R5cGUubWE9ZnVuY3Rpb24oYSl7Zy52LmIoImdkcHIiKSYmKGE9bmV3IGRhKGEpLCghYS5iKCJnZHByIil8fGEuYigiZ2RwciIpJiYwPT09YS5nKCJnZHByIikubGVuZ3RoKSYmYS5pKCJnZHByIiwiW2dkcHJdIiksYS5iKCJjb25zZW50Iil8fGEuYigiZ2Rwcl9jb25zZW50Iil8fGEubCgpLGEuYigiY29uc2VudCIpJiYKMD09PWEuZygiY29uc2VudCIpLmxlbmd0aCYmYS5pKCJjb25zZW50IiwiW2dkcHJfY29uc2VudF0iKSxhLmIoImdkcHJfY29uc2VudCIpJiYwPT09YS5nKCJnZHByX2NvbnNlbnQiKS5sZW5ndGgmJmEuaSgiZ2Rwcl9jb25zZW50IiwiW2dkcHJfY29uc2VudF0iKSxhPWEudG9TdHJpbmcoKSk7dmFyIGM9Zy52LmIoInRjZl9jb25maWciKTtpZihjKXt2YXIgZD1jLmNvbnNlbnRfc3RyaW5nX3BsYWNlaG9sZGVyfHwiW2dkcHJfY29uc2VudF0iO2M9Yy5nZHByX2FwcGxpZXNfcGxhY2Vob2xkZXJ8fCJbZ2Rwcl0iO2cuVWEmJihhPWEucmVwbGFjZShkLGcuVWEuZWN8fCJ1bmRlZmluZWQiKSxhPWEucmVwbGFjZShjLGcuVWEuV2M/IjEiOiIwIikpfWVsc2UgYT1hLnJlcGxhY2UoIltnZHByX2NvbnNlbnRdIixnLlVhLmVjfHwidW5kZWZpbmVkIiksYT1hLnJlcGxhY2UoIltnZHByXSIsZy5VYS5XYz8iMSI6IjAiKTtyZXR1cm4gYX07SC5wcm90b3R5cGUuTWI9ZnVuY3Rpb24oKXt0aGlzLmkmJgp0aGlzLmkuY2xpZW50QVBJcyYmdGhpcy5JYih0aGlzLmkuY2xpZW50QVBJcyl9O0gucHJvdG90eXBlLkliPWZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPW5ldyBwYjthLnB1Ymxpc2hlckFQSSYmYy5mKGEucHVibGlzaGVyQVBJKTthLnBsYXllciYmYy5jKGEucGxheWVyKTtjLncoKX19O0gucHJvdG90eXBlLlY9ZnVuY3Rpb24oYSxjKXt0aGlzLmY9YTt0aGlzLmc9Yzt0aGlzLmE9ITB9O0gucHJvdG90eXBlLlNhPWZ1bmN0aW9uKGEsYyxkLGUsZixoKXt3YT10aGlzO3RoaXMuemI9ITA7dGhpcy5mYz1hO3RoaXMuQmE9Yzt0aGlzLmVkPWQ7dGhpcy5oYT1lO3RoaXMudGI9Zjt0aGlzLmk9aHx8e307dGhpcy5NYigpO3RoaXMuWmIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQmEpdGhpcy5UYigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy5CYSl0cnl7dGhpcy5CYT1jKCksdGhpcy5kYygpfWNhdGNoKG0pe3RoaXMuQWEoIm5vQ2xpZW50Q29uZmlnIil9ZWxzZSBpZigib2JqZWN0Ij09CnR5cGVvZiB0aGlzLkJhKXRyeXt0aGlzLkJhPWMsdGhpcy5kYygpfWNhdGNoKG0pe3RoaXMuQWEoIm5vQ2xpZW50Q29uZmlnIil9fTtILnByb3RvdHlwZS5tPWZ1bmN0aW9uKGEpe3ZhciBjPW51bGw7dHJ5e2M9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2M9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYy5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBjfTtILnByb3RvdHlwZS5YZD1mdW5jdGlvbigpe3RoaXMuYT0hMTt0aGlzLmI9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm0odGhpcy51KSk7dGhpcy5GKCl9O0gucHJvdG90eXBlLkZiPWZ1bmN0aW9uKCl7dGhpcy5iPXRoaXMuSmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm0odGhpcy5IYikpO3RoaXMuRigpfTtILnByb3RvdHlwZS5aYj1mdW5jdGlvbigpe3RoaXMubChuZXcgUGEodGhpcy5mYyt0aGlzLlAoImdsb2JhbCIpKSx0aGlzLlJiLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmhkKCJnbG9iYWwiKTsKIm9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLmRjKCl9LmJpbmQodGhpcyksITApfTtILnByb3RvdHlwZS5UYj1mdW5jdGlvbigpe3RoaXMubChuZXcgUGEodGhpcy5CYSt0aGlzLlAoImNsaWVudCIsLTEhPXRoaXMuQmEuaW5kZXhPZigiPyIpKSksdGhpcy5kYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5oZCgiY2xpZW50Iik7dGhpcy5BYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX07SC5wcm90b3R5cGUuUD1mdW5jdGlvbihhLGMpe2M9KCh2b2lkIDA9PT1jPzA6Yyk/IiYiOiI/IikrKCJjYWNoZT0iK2wucygpKTt0aGlzLmkmJnRoaXMuaS5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGM9IiIpO3RoaXMuaSYmdGhpcy5pLm5vQ2FjaGVCdXN0ZXImJihjPSIiKTtyZXR1cm4gY307SC5wcm90b3R5cGUuQWE9ZnVuY3Rpb24oYSl7aWYoIXRoaXMucWEpe3RoaXMucWE9ITA7dmFyIGM9ZnVuY3Rpb24oZSl7ZXx8CihlPXdpbmRvdyk7Zm9yKHZhciBmPWUuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksaD0wO2g8Zi5sZW5ndGg7aCsrKXtpZihmW2hdJiZmW2hdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgZltoXS5wYXVzZSl0cnl7ZltoXS5wYXVzZSgpfWNhdGNoKG0pe31mW2hdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZltoXSl9Zj1lLmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoaD0wO2g8Zi5sZW5ndGg7aCsrKWZbaF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmW2hdKTtmPWUuZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihoPTA7aDxmLmxlbmd0aDtoKyspZltoXSYmZltoXS5wYXJlbnROb2RlJiZmW2hdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZltoXSk7Zj1lLmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGg9MDtoPGYubGVuZ3RoO2grKylmW2hdJiYKZltoXS5wYXJlbnROb2RlJiZmW2hdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZltoXSk7aWYoZS5zZWxmIT1lLnRvcClmb3IoZT1lLmRvY3VtZW50O2UuaGFzQ2hpbGROb2RlcygpOyllLnJlbW92ZUNoaWxkKGUubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09bC5HKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy50Yj1mdW5jdGlvbigpe30pOyJmb2N1cy5kZSI9PWwuRyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMudGI9ZnVuY3Rpb24oKXt9KTtpZih0aGlzLnRiJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMudGIpdGhpcy50YigpO2Vsc2V7YygpO3dpbmRvdy5zZXRJbnRlcnZhbChjLDUwMCk7dHJ5e2Mod2luZG93LnRvcCksd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7Yyh3aW5kb3cudG9wKX0sNTAwKX1jYXRjaChlKXt9fXRoaXMuYj10aGlzLnliPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKHRoaXMuV2EpKTt0aGlzLkYoKTtsLlAodi5jYSk7CnZhciBkPWwuRyh0aGlzLmZhKCkpO2R8fChkPWwuRyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2wudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX07SC5wcm90b3R5cGUuUmI9ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYil7dmFyIGM9e307dHJ5e2M9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZil7Yy5lbmFibGVkPSJmYWxzZSJ9dmFyIGQ9ITE7dHJ5e3ZhciBlPWwuYyh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtlJiZlLmluZGV4T2YmJjA8PWUuaW5kZXhPZigidHZub3ciKSYmKGQ9ITApfWNhdGNoKGYpe31pZighKGR8fGMuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmYy5oYXNPd25Qcm9wZXJ0eSgiZm9yY2VfZGlzYWJsZWQiKSkpdHJ5e2M9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYS5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGYpe31nLnYuYz1jO3RoaXMuYT1sLm0oYy5lbmFibGVkKTt0aGlzLmI9CiF0aGlzLmE7dGhpcy5hPyJvYmplY3QiIT10eXBlb2YgdGhpcy5CYXx8dGhpcy5EfHx0aGlzLmZ8fHRoaXMuZGMoKToodGhpcy5KYT10aGlzLmE9ITEsdGhpcy5iPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKHRoaXMudSkpLHRoaXMuRigpKX19O0gucHJvdG90eXBlLmRjPWZ1bmN0aW9uKGEpe3ZhciBjPSExO2EmJihjPWEucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihjKXRyeXtkPUpTT04ucGFyc2UoYy50b1N0cmluZygpKX1jYXRjaChmKXtkPXRoaXMuQmF9ZWxzZSBkPXRoaXMuQmE7Yz0hMTt0cnl7dmFyIGU9bC5jKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2UmJmUuaW5kZXhPZiYmMDw9ZS5pbmRleE9mKCJ0dm5vdyIpJiYoYz0hMCl9Y2F0Y2goZil7fWU9ZnVuY3Rpb24oKXtmb3IodmFyIGY9MDtmPGQuc2VydmVyLmxlbmd0aDtmKyspe3ZhciBoPWQuc2VydmVyW2ZdO3RyeXtpZih2b2lkIDA9PT1ofHwhaC5yZXBsYWNlKCJbaGFzaF0iLGwuaWIoKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSkpLm1hdGNoKC9eKGh0dHBzPyk6XC9cLyhbdy4tXSopOj8uKihbMC05XSspP1wvKFthLWYwLTldezQwfSlcLz8kL2cpKXJldHVybiExfWNhdGNoKG0pe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTsKaWYoIShjfHxkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJmQuaGFzT3duUHJvcGVydHkoInNlcnZlciIpJiZlKCkmJmQuaGFzT3duUHJvcGVydHkoImFsaWFzIikmJmQuaGFzT3duUHJvcGVydHkoImNvbmZpZyIpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIithLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goZil7fWcudi5jbGllbnQ9ZDt0aGlzLmE9bC5tKGQuZW5hYmxlZCk7dGhpcy5iPSF0aGlzLmE7dGhpcy5nPWQuc2VydmVyfHxbXTtmb3IoYT0wO2E8dGhpcy5nLmxlbmd0aDthKyspdGhpcy5nW2FdPXRoaXMuZ1thXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7aWYoKGwuYigid2ViLmRlIil8fGwuYigiZ214Lm5ldCIpfHxsLmIoImdteC5hdCIpfHxsLmIoImdteC5jaCIpfHxsLmIoIjF1bmQxLmRlIikpJiYhdGhpcy53YSgpKWZvcihhPTA7YTx0aGlzLmcubGVuZ3RoO2ErKyl0aGlzLmdbYV09CnRoaXMuZ1thXS5yZXBsYWNlKCJbaGFzaF0iLCJzc2wiKS5jb25jYXQoIltoYXNoXS8iKTt0aGlzLkViKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5rYT1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5EPWQuY29uZmlnfHwiIjt0aGlzLmY9ZC5hbGlhc3x8bnVsbDt0aGlzLmpiPWQuYWRwYXRofHwiIjt0aGlzLkRhPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLmcubGVuZ3RoKTt0aGlzLmEmJnRoaXMuRCYmdGhpcy5mJiZ0aGlzLmcubGVuZ3RoP3RoaXMuamMoITEpOih0aGlzLkphPXRoaXMuYT0hMSx0aGlzLmI9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLm0odGhpcy51KSksdGhpcy5GKCkpfTtILnByb3RvdHlwZS5FYj1mdW5jdGlvbihhKXt0aGlzLmxhfHwodGhpcy5sYT1hfHwiIil9O0gucHJvdG90eXBlLmpjPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLmIpe3ZhciBjPXt9O2lmKGEpe2M9bmV3IFBhKHRoaXMucygpKTt2YXIgZD1sLmModGhpcy5EKTtjLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KInMzaG9tYWRnbG9iYWxjb25maWdzIjtjLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1kLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yy5tZXRob2Q9IlBPU1QifWVsc2UgYz1uZXcgUGEodGhpcy5EK3RoaXMuUCgiY3VzdG9tZXIiKSk7dGhpcy5sKGMsdGhpcy5NYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5oZCgiY3VzdG9tZXIiKTthP3RoaXMuUmQ/dGhpcy5BYSgibm9TVk1Db25maWciKToodGhpcy5SZD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuamMoITApfS5iaW5kKHRoaXMpLCEwKX19O0gucHJvdG90eXBlLk1jPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLmIpe3ZhciBjPWEucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShjLnRvU3RyaW5nKCkpfWNhdGNoKGYpe2lmKCF0aGlzLmNhJiZ0aGlzLmEpe3RoaXMuY2E9CiEwO3RoaXMuamMoITApO3JldHVybn19Yz0hMTt0cnl7dmFyIGU9bC5jKHRvcC5sb2NhdGlvbi5ocmVmKS5ob3N0O2UmJmUuaW5kZXhPZiYmMDw9ZS5pbmRleE9mKCJ0dm5vdyIpJiYoYz0hMCl9Y2F0Y2goZil7fWlmKCEoY3x8ZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiYoZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGhpZGUiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFncyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzanMiKXx8ZC5oYXNPd25Qcm9wZXJ0eSgidGVzdGFkdGFnc3hociIpKSkpdHJ5e2Q9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYS5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGYpe31nLnYuaT1kO3RoaXMucGI9bC5tKGQuc3RyaWN0KTt0aGlzLkthPWwubShkLnN0cmljdF9jb25maWdfZW5hYmxlZCk7dGhpcy5pYj1kLmR1cmF0aW9uX2NoZWNrX3BlbmFsdHlfZGlzYWJsZWR8fCExO3RoaXMubz1sLm0oZC5lbmFibGVRdWFydGlsZVRyYWNraW5nKTsKdGhpcy5hPWwubShkLmVuYWJsZWQpO3RoaXMuSz1kLnRlc3RoaWRlfHwiIjt0aGlzLk89ZC50ZXN0YWR0YWdzanN8fGQudGVzdGFkdGFnc3x8W107dGhpcy5nYT1kLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMuWj1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy5RYT1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLkE9ZC5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMuVT1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubmE9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuQWI9ZC5qc3BvcHVwc3x8ITE7dGhpcy5iYT1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5pYT1kLnZwYWlkfHwhMTt0aGlzLmkudnBhaWQ9dGhpcy5pYTt0aGlzLmxiPWQuc2tpcGFsbG93ZWR8fCExO3RoaXMuVz1kLmNhcHRpb25fZHVyYXRpb258fCExO3RoaXMucWI9ZC52bWFwc3x8IiI7dGhpcy5kYT1kLmFsdGVybmF0ZV9jbGlja3Rocm91Z2h8fCExO3RoaXMuYml0cmF0ZT1kLmJpdHJhdGV8fDFFMzt0aGlzLkViKGQuYWRfZmFsbGJhY2tfVVJMfHwKIiIpO3RoaXMua2E9ZC5hZF9mYWxsYmFja19jb25maWd8fCExO3RoaXMuR2E9ZC50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9ZC52aWRlb3BsYXphfHx7fTt0aGlzLmtiPWQueWllbGRsYWJ8fG51bGw7dGhpcy5ZPWQuc2FuZGJveHNjcmlwdHN8fG51bGw7ZC5hbGlhcyYmKHRoaXMuZj1kLmFsaWFzKTshdGhpcy5jYSYmdGhpcy5hPyh0aGlzLmNhPSEwLHRoaXMuamMoITApKTp0aGlzLmEmJiF0aGlzLlFjKCkmJih0aGlzLkt8fHRoaXMuT3x8dGhpcy5OfHx0aGlzLmdhKT90aGlzLmVkPyh0aGlzLkphPXRoaXMuYj0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubSh0aGlzLnUpKSx0aGlzLnNhKCksdGhpcy5GKCkpOnRoaXMuT2MoKToodGhpcy5hPSExLHRoaXMuRmEoKSl9fTtILnByb3RvdHlwZS51ZT1mdW5jdGlvbihhKXt0aGlzLkhkPSEwO3ZhciBjPWZ1bmN0aW9uKGQpe2lmKGQ9ZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoIihefCApIitkKyI9KFteO10rKSIpKSlyZXR1cm4gZFsyXX0oImFkcF9zZWdzIil8fAoiZTAiO2M9dGhpcy5rYi51cmwucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpLnRvU3RyaW5nKCkpLnJlcGxhY2UoIltzZWdzXSIsZW5jb2RlVVJJQ29tcG9uZW50KGMpKTtjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCIsaG9tYWRfdXJsX3N1ZmZpeDpjLGhvbWFkX3VybF9zdWZmaXhfYmFzZTY0OmwuQShjKSxob21hZF9oYXNoX2d1ZXNzZWQ6ITB9O2wubGEodGhpcy5zKCksIlBPU1QiLGMsZnVuY3Rpb24oZCl7dHJ5e3ZhciBlPUpTT04ucGFyc2UoZC5yZXNwb25zZVRleHQpfWNhdGNoKGgpe31sLnRyYWNrKCJzdGF0c19oZF95bF9kYXRhIiwoZSYmZS5sZW5ndGgpLnRvU3RyaW5nKCksITApO3RyeXtpZihlJiZlLmxlbmd0aCYmdGhpcy5rYi5wYXJhbWV0ZXIpe3ZhciBmPXRoaXMua2IucGFyYW1ldGVyLnNwbGl0KCJbaWRdIikuam9pbihlWzBdLmlkfHwiMCIpO2Y9Zi5zcGxpdCgiW3NpemVdIikuam9pbihlWzBdLmFkc2l6ZXx8MCk7Zj1mLnNwbGl0KCJbcHJpY2VdIikuam9pbigodGhpcy5rYi5wcmljZV9tdWx0aXBsaWVyPwplWzBdLnByaWNlKnRoaXMua2IucHJpY2VfbXVsdGlwbGllcjplWzBdLnByaWNlKXx8MCk7dGhpcy5RYSs9Zn19Y2F0Y2goaCl7YSgpfWEoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe2EoKX0uYmluZCh0aGlzKSl9O0gucHJvdG90eXBlLk9jPWZ1bmN0aW9uKCl7dGhpcy5OYygpO3RoaXMuUGMoKX07SC5wcm90b3R5cGUuUGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKE0pe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrTSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK00rIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBjPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTsKZS53aWR0aD0xO2UuaGVpZ2h0PTE7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtlLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBmPWwuZygxMCksaD1sLmcoMTApLG09bC5nKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGYsZnVuY3Rpb24oKXtkKys7Yz1jLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKztjPWMucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihtLGZ1bmN0aW9uKCl7ZCsrO2M9Yy5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSk7dmFyIEQ9YXRvYigiUEdoMGJXdytQR2hsWVdRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQZz09IikrYShtLCJpbmxpbmUiKSthdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShoLCJldmFsIikrCmF0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStsLkEoYShmLCJkYXRhIikpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKTtlLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQud3JpdGUoRCl9Y2F0Y2goTSl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSl9Y2F0Y2goTyl7fWlmKDMhPWQpe3ZhciBNPWwuRigpO2lmKChNLnVifHxNLnZiKSYmIU0uaWMmJiFsLnJhKCkpe2lmKHRoaXMuaSYmdGhpcy5pLnBsYXllciYmdGhpcy5pLnBsYXllci5sZW5ndGgpe2wudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGMsITApO3JldHVybn1sLmIoInRlbGU1LmRlIil8fGwuYigidGFnZXNzcGllZ2VsLmRlIil8fHRoaXMuQWEoImNzcF8iKwpjKX1sLnRyYWNrKCJzdGF0c19oZF9jc3AiLGMsITApfX0uYmluZCh0aGlzKSwxRTMpfTtILnByb3RvdHlwZS5GYT1mdW5jdGlvbigpe3RoaXMuYj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMubSh0aGlzLnUpKTt0aGlzLkYoKX07SC5wcm90b3R5cGUuQmM9ZnVuY3Rpb24oYSl7dGhpcy5HPSEwO3RoaXMuYnx8KHRoaXMuYj10aGlzLkphPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKGEpKSx0aGlzLkYoKSx0aGlzLnNhKCkpfTtILnByb3RvdHlwZS5OYz1mdW5jdGlvbigpe2lmKHRoaXMuSyl7dmFyIGE9bC5GKCk7aWYoKGEudWJ8fGEudmIpJiZ0aGlzLmdiKCkpdGhpcy5CYyh0aGlzLkhiKTtlbHNle2E9ITE7dHJ5e3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Muc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5LKTtjLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuSyk7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGMpO3ZhciBkPTA9PT1jLm9mZnNldFdpZHRofHwwPT09Yy5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChjKTthPWR9Y2F0Y2goZSl7fWE/dGhpcy5CYyh0aGlzLkhiKTp0aGlzLm9iKCl9fWVsc2UgdGhpcy5vYigpfTtILnByb3RvdHlwZS5tZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt0cnl7ZT1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLGwucygpKSx0aGlzLk1lKGUsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5sZC5iaW5kKHRoaXMpLGMuYmluZCh0aGlzKSl9Y2F0Y2goZil7dGhpcy5sZCgpfX1mdW5jdGlvbiBjKCl7dGhpcy5CYyh0aGlzLkhiKX1pZigodGhpcy5OPXRoaXMuZ2EpJiZ0aGlzLk4ubGVuZ3RoKXt2YXIgZD10aGlzLk4uc2xpY2UoKSxlPSIiO2EuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5sZCgpfTtILnByb3RvdHlwZS5NZT1mdW5jdGlvbihhLGMsZCl7ZnVuY3Rpb24gZSgpe2YoKSYmCmMoKX1mdW5jdGlvbiBmKCl7cmV0dXJuIGg/KHdpbmRvdy5jbGVhclRpbWVvdXQoaCksITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSgpfSwzRTMpO3RoaXMubChuZXcgUGEoYSksZSxmdW5jdGlvbigpe2YoKSYmZCgpfSl9O0gucHJvdG90eXBlLm9iPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RyeXtlPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsbC5zKCkpLHRoaXMuTmUoZSwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLm1kLmJpbmQodGhpcyksYy5iaW5kKHRoaXMpKX1jYXRjaChmKXt0aGlzLm1kKCl9fWZ1bmN0aW9uIGMoKXt0aGlzLkJjKHRoaXMuSGIpfWlmKHRoaXMuTyYmdGhpcy5PLmxlbmd0aCl7dmFyIGQ9dGhpcy5PLnNsaWNlKCksZTthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMubWQoKX07SC5wcm90b3R5cGUuTmU9ZnVuY3Rpb24oYSxjLGQpe2Z1bmN0aW9uIGUoKXtoKCkmJmMoKX1mdW5jdGlvbiBmKCl7aCgpJiZkKCl9ZnVuY3Rpb24gaCgpe3JldHVybiBtPwood2luZG93LmNsZWFyVGltZW91dChtKSwhMCk6ITF9bC5nKCk7dmFyIG09d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKE0sTyl7Tz09YSYmaCgpJiZmKCl9O3ZhciBEPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRCk7RC5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtELnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO0Qub25sb2FkPWU7RC5vbmVycm9yPWY7RC5zcmM9YTtELmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmKX1jYXRjaChNKXtlKCl9fTtILnByb3RvdHlwZS5sZD1mdW5jdGlvbigpe2lmKHRoaXMuWil0cnl7bC5sYSh0aGlzLlosImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuUz0hbC5tKGEuY2MpO3RoaXMuRmEoKX0uYmluZCh0aGlzKSx0aGlzLm5iLmJpbmQodGhpcykpfWNhdGNoKGEpe3RoaXMubmIoKX1lbHNlIHRoaXMuRmEoKX07CkgucHJvdG90eXBlLm5iPWZ1bmN0aW9uKCl7dGhpcy5iPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKHRoaXMudSkpO3RoaXMuRigpO3RoaXMuc2EoKX07SC5wcm90b3R5cGUuZ2I9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIUpTT04ucGFyc2UoJ3sidGVzdGFkdGFnc3hociI6ImhlcmUgYmUgZHJhZ29ucyIsICJlbmFibGVkIjp0cnVlfScpLnRlc3RhZHRhZ3N4aHJ8fCFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJjb25maWciOiJoZXJlIGJlIGRyYWdvbnMifScpLmVuYWJsZWR8fCFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6ImhlcmUgYmUgZHJhZ29ucyJ9JykuZW5hYmxlZHx8ImZ1bmN0aW9uKCl7fSI9PT1DdXN0b21FdmVudC50b1N0cmluZygpfHwhMX1jYXRjaChhKXtyZXR1cm4iZmFpbCJ9fTtILnByb3RvdHlwZS5GPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPSIwIixkPSIwIjt0cnl7bC5yYSgpJiYoYz0iMSIpfWNhdGNoKGUpe2M9CjJ9dGhpcy5HJiYoZD0iMSIpO2wudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYysiIitkLCEwKTtnLmouYigiZ2lnYS5kZSIpJiZ0aGlzLkcmJmwudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMuZ2IoKSwhMCk7bC5GKCk7KHRoaXMuSmEmJnRoaXMuYXx8bC5TKCkpJiZ0aGlzLlkmJnRoaXMuR2IoKTt0aGlzLlomJmwudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzcyIsdGhpcy5TLnRvU3RyaW5nKCksITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5tKHRoaXMuZmIpKTt0aGlzLmhhJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuaGEmJnRoaXMuaGEoe2hvbWFkQ29va2llQnlwYXNzOnRoaXMuU30pO2lmKHRoaXMuYSl0cnl7dGhpcy56YT1zZXRJbnRlcnZhbChmdW5jdGlvbigpe2ZldGNoKGEuZmMrYS5QKCJnbG9iYWwiKSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZS5qc29uKCl9KS50aGVuKGZ1bmN0aW9uKGUpeyExPT09Zy5qLm0oZS5lbmFibGVkKT8oYS5hPQohMSwhMD09PWcuai5tKGUubGVlcm95KSYmY2xlYXJJbnRlcnZhbChhLnphKSk6YS5hPSEwfSkuY2F0Y2goKTtmZXRjaChhLkQrYS5QKCJjdXN0b21lciIpKS50aGVuKGZ1bmN0aW9uKGUpe3JldHVybiBlLmpzb24oKX0pLnRoZW4oZnVuY3Rpb24oZSl7ITE9PT1nLmoubShlLmVuYWJsZWQpPyhhLmE9ITEsITA9PT1nLmoubShlLmxlZXJveSkmJmNsZWFySW50ZXJ2YWwoYS56YSkpOmEuYT0hMH0pLmNhdGNoKCl9LDNFNSl9Y2F0Y2goZSl7fX07SC5wcm90b3R5cGUuR2I9ZnVuY3Rpb24oKXt0aGlzLk09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5NLmlkPWwuZygxMCk7dGhpcy5NLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuTS5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk0uY29udGVudFdpbmRvdyxjPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7dGhpcy5ZJiYoYy5vbmxvYWQ9ZnVuY3Rpb24oKXtmb3IodmFyIGQsZT0wO2U8dGhpcy5ZLmxlbmd0aDtlKyspZD0KYS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxkLnR5cGU9InRleHQvamF2YXNjcmlwdCIsZC5zcmM9dGhpcy5ZW2VdLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSxhLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZCl9LmJpbmQodGhpcykpO2Muc3JjPWwuTigiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyIsdGhpcyk7YS5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpfS5iaW5kKHRoaXMpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5NKX07SC5wcm90b3R5cGUuTGI9ZnVuY3Rpb24oKXtpZih0aGlzLkthJiZ0aGlzLlNiKCkpe3ZhciBhPXRoaXMuUWIoKTthJiZhLmpvaW4mJmwudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19O0gucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSxjLGQsZSxmLGgpe2U9dm9pZCAwPT09ZT8hMTplO2Y9dm9pZCAwPT09CmY/ITE6ZjtoPXZvaWQgMD09PWg/ITE6aDt0aGlzLmVhfHwodGhpcy5lYT0wKTt0aGlzLmVhKys7MUUzPHRoaXMuZWEmJiF0aGlzLnhiJiYodGhpcy54Yj0hMCxsLnRyYWNrKCJzdGF0c19oZF9yZXF1ZXN0Y291bnQiLCgxRTMpLnRvU3RyaW5nKCksITApKTt2YXIgbT1hLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIik7YT1uZXcgZ2IoYSxjLGQsbnVsbCxtKTtlJiYoYS5GPSEwKTtmJiZsLkFjKCkmJihhLmY9ITApO2gmJihhLmM9ITApO2lmKEQpe3ZhciBEPXBhcnNlSW50KEQsMTApOzA8RCYmKGEudGltZW91dD1EKX1yZXR1cm4gYS5sb2FkKCl9O0gucHJvdG90eXBlLkpiPWZ1bmN0aW9uKCl7dGhpcy5CYnx8KHRoaXMuQmI9ITAsbC5yYSgpfHxsLlcoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIsCntob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYz1udWxsLGQ9bnVsbCxlPSIiO3RyeXsoYz1hLnJlc3BvbnNlWE1MKXx8KGM9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChoKXt0aGlzLkFhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihlPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGVbMF0mJihlPWVbMF0pLGUpe2U9ZSYmZS5jaGlsZE5vZGVzJiZlLmNoaWxkTm9kZXNbMF0/ZS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLndhKCl8fChlPWwuYyhlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2E9ZnVuY3Rpb24oaCl7dmFyIG09IiI7dHJ5e2gmJmgudGFyZ2V0JiZoLnRhcmdldC5lcnJvciYmCihtPWgudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKEQpe31mLm5ldHdvcmtTdGF0ZT09Zi5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5BYSgibWVkaWFmaWxlX25vc291cmNlIittKX07Zi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1mLmR1cmF0aW9uJiZ0aGlzLkFhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtjLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixhLmJpbmQodGhpcykpO2YuYXBwZW5kQ2hpbGQoYyk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsZSk7Zi5sb2FkKCl9ZWxzZSB0aGlzLkFhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5BYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuQWEoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkFhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLAp0aGlzKSl9O0gucHJvdG90eXBlLktiPWZ1bmN0aW9uKCl7dGhpcy5jKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLmMoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMubChhLHRoaXMuUmMuYmluZCh0aGlzKSx0aGlzLkRjLmJpbmQodGhpcykpfTtILnByb3RvdHlwZS5SYz1mdW5jdGlvbihhKXt2YXIgYz1udWxsLGQ9bnVsbDt0cnl7KGM9YS5yZXNwb25zZVhNTCl8fChjPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7cmV0dXJufWR8fAp0aGlzLlBiKCl9O0gucHJvdG90eXBlLkRjPWZ1bmN0aW9uKCl7fTtILnByb3RvdHlwZS5QYj1mdW5jdGlvbigpe2wuUCh2LlApO2wudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuQWEoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9O0gucHJvdG90eXBlLnNhPWZ1bmN0aW9uKCl7aWYodGhpcy5hJiZ0aGlzLmJhLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuYmEubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5iYVthXTsicmVxdWVzdCI9PWMudHlwZSYmbC5XKGMudXJsLGMuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yy50eXBlKXt2YXIgZD1uZXcgQ2E7d2luZG93W2QuYSgpXT10aGlzO2wuVyhjLnVybCxjLmFsaWFzLG51bGwsZnVuY3Rpb24oZSl7aWYoZS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoZS5yZXNwb25zZVRleHQpfWNhdGNoKGYpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fTtILnByb3RvdHlwZS5RYz1mdW5jdGlvbigpe3JldHVybiAxMDAqCk1hdGgucmFuZG9tKCk8dGhpcy5HYX07dmFyIHdhPXt9O3oucHJvdG90eXBlLk9iPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RoaXMuRmQ9ITB9d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixhLmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLGEuYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGEuYmluZCh0aGlzKSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixhLmJpbmQodGhpcykpfTt6LnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7dGhpcy5uYXx8KHRoaXMubmE9dGhpcy5nKDEwKSk7cmV0dXJuIHRoaXMubmF9O3oucHJvdG90eXBlLmxiPWZ1bmN0aW9uKCl7dmFyIGE9ZnVuY3Rpb24oKXt2YXIgZj0obmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fApuYXZpZ2F0b3IuYXx8IngiKSkuc3BsaXQoIiAiKS5qb2luKCIiKSxoPU1hdGgubWF4KE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvNjApLE1hdGgucm91bmQoKERhdGUubm93KCkvMUUzKzEwKS82MCkpLnRvU3RyaW5nKCksbT1mLnNsaWNlKDAsZi5sZW5ndGgvMikuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKTtmPWYuc2xpY2UoZi5sZW5ndGgvMikuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKTtyZXR1cm4gaCttK2grZitofSgpLGM9ZnVuY3Rpb24oZil7dmFyIGg9MCxtO2lmKDA9PWYubGVuZ3RoKXJldHVybiBoO3ZhciBEPTA7Zm9yKG09Zi5sZW5ndGg7RDxtO0QrKyloPShoPDw1KS1oK2YuY2hhckNvZGVBdChEKSxofD0wO3JldHVybiBNYXRoLmFicyhoKX0oYSkudG9TdHJpbmcoKTtjPShjK2Muc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKSkuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKS5tYXRjaCgvLnsxLDJ9L2cpLm1hcChOdW1iZXIpO2E9YnRvYShhKS5yZXBsYWNlKC9bXmEtel0vZ2ksCiIiKS5zdWJzdHIoMCwxMDApO2Zvcih2YXIgZD0iIixlPTA7ZTxjLmxlbmd0aDtlKyspZCs9YS5jaGFyQXQoY1tlXSk7cmV0dXJuIGR8fCJ6b3JrIn07ei5wcm90b3R5cGUuRGE9ZnVuY3Rpb24oKXt0aGlzLm9hfHwodGhpcy5vYT1NYXRoLnJhbmRvbSgpKTtyZXR1cm4gdGhpcy5vYX07ei5wcm90b3R5cGUuZ2E9ZnVuY3Rpb24oKXt0aGlzLmk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fTt6LnByb3RvdHlwZS5wb3N0TWVzc2FnZT1mdW5jdGlvbihhLGMpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYywiKiIpfTt6LnByb3RvdHlwZS5mPQpmdW5jdGlvbihhLGMsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YyxkYXRhOmR9KX07ei5wcm90b3R5cGUuUWI9ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuUGIoYS5kYXRhKX07ei5wcm90b3R5cGUuUGI9ZnVuY3Rpb24oYSl7aWYodGhpcy5pJiZ0aGlzLmkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGM9dGhpcy5pLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXRoaXMuaSYmdGhpcy5pLmV2ZW50bGlzdGVuZXImJnRoaXMuaS5ldmVudGxpc3RlbmVyW2RdJiZhLmV2ZW50PT10aGlzLmkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmkuZXZlbnRsaXN0ZW5lcltkXS5jYihhKX07ei5wcm90b3R5cGUuWj1mdW5jdGlvbihhLGMpe3RoaXMuaS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpjfSl9O3oucHJvdG90eXBlLldhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GKCk7CnJldHVybiBnLnFjPyExOmcudi5iKCJ2cGFpZCIpJiYhYS5yYSYmKGEudWJ8fGEudmIpfTt6LnByb3RvdHlwZS5xYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmIoIm1hcnRoYXN0ZXdhcnQuY29tIil8fHRoaXMuYigiZmFuZG9tLmNvbSIpfHx0aGlzLmIoImdpZ2EuZGUiKXx8dGhpcy5iKCJraW5vLmRlIil8fHRoaXMuYigic3BpZWxldGlwcHMuZGUiKXx8dGhpcy5iKCJkZXNpcmVkLmRlIil9O3oucHJvdG90eXBlLkZiPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GKCk7cmV0dXJuIGEudWJ8fGEudmJ8fGEuaWN8fGEuemN9O3oucHJvdG90eXBlLkdiPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYigic3BpZWdlbC5kZSIpfHx0aGlzLmIoIndlYi5kZSIpfHx0aGlzLmIoImdteC5uZXQiKX07ei5wcm90b3R5cGUuSWI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iKCJzcGllZ2VsLmRlIikmJiJwcmVyb2xsIj09PXRoaXMuVSYmLjM+dGhpcy5EYSgpfTt6LnByb3RvdHlwZS5NYj1mdW5jdGlvbigpe3ZhciBhPQpnLnYuYigidmVydGljYWxpenIiKXx8e307cmV0dXJuIHRoaXMucmEoKSYmZy5qLmIoInNwaWVnZWwuZGUiKSYmdGhpcy5EYSgpPChhLnRha2VvdmVyfHwuMTQpfHx0aGlzLkxiKCl9O3oucHJvdG90eXBlLk5iPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmEoKSYmLTEhPT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJ2ZXJ0aWNhbGl6ciIpfTt6LnByb3RvdHlwZS5MYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJhKCkmJi0xIT09d2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigidmVydGljYWxpenIiKSYmLTEhPT13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCImZm9yY2UiKX07ei5wcm90b3R5cGUuTT1mdW5jdGlvbigpe2lmKGcucWMpcmV0dXJuITE7aWYoZy5WZClyZXR1cm4hMDt2YXIgYT1nLnYuYigidmVydGljYWxpenIiKXx8e307cmV0dXJuIGEmJmEuZW5hYmxlZCYmYS5sb2dvJiZ0aGlzLnJhKCl8fHRoaXMuTmIoKX07ei5wcm90b3R5cGUuS2E9ZnVuY3Rpb24oKXtyZXR1cm4tMSE9CndpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIiZzdGFuZGFsb25lIil9O3oucHJvdG90eXBlLnNhPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiB0aGlzLmwuZ2V0KCJmZXRjaCIpKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9hY3Rpdml0eSIse2NyZWRlbnRpYWxzOiJvbWl0In0pLnRoZW4oZnVuY3Rpb24oYSl7cmV0dXJuIDIwMCE9PWEuc3RhdHVzfHwiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvYWN0aXZpdHkiIT09YS51cmx9KS5jYXRjaChmdW5jdGlvbigpe3JldHVybiEwfSl9Y2F0Y2goYSl7cmV0dXJuITF9fTt6LnByb3RvdHlwZS55Yj1mdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5ib2R5KXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTthLndpZHRoPTE7YS5oZWlnaHQ9MTthLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTsKdmFyIGM9YS5jb250ZW50V2luZG93fWVsc2UgYz13aW5kb3d9Y2F0Y2goTyl7Yz13aW5kb3d9dmFyIGQ9Yy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksZT1jLnNldFRpbWVvdXQuYmluZCh3aW5kb3cpLGY9Yy5kb2N1bWVudC5jcmVhdGVFbGVtZW50LmJpbmQoZG9jdW1lbnQpLGg9Yy5KU09OLG09Yy5KU09OLnBhcnNlLEQ9Yy5DdXN0b21FdmVudDt0cnl7dmFyIE09Yy5mZXRjaC5iaW5kKHdpbmRvdyk7dGhpcy5sLnNldCgiZmV0Y2giLE0pfWNhdGNoKE8pe310aGlzLmwuc2V0KCJjcmVhdGVFbGVtZW50IixmKTt0aGlzLmwuc2V0KCJzZXRJbnRlcnZhbCIsZCk7dGhpcy5sLnNldCgic2V0VGltZW91dCIsZSk7dGhpcy5sLnNldCgiSlNPTiIsaCk7dGhpcy5sLnNldCgiSlNPTi5wYXJzZSIsbSk7dGhpcy5sLnNldCgiQ3VzdG9tRXZlbnQiLEQpO2RvY3VtZW50LmJvZHkmJmEmJmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSl9O3oucHJvdG90eXBlLmthPWZ1bmN0aW9uKGEpe3ZhciBjPQp0aGlzLGQsZTtyZXR1cm4gRmMoZnVuY3Rpb24oZil7cmV0dXJuIDE9PWYuYT8oZD1jLmlhKGEpLGU9e21ldGhvZDoiUE9TVCIsaGVhZGVyczp7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9LGJvZHk6ZGEuYSh7aG9tYWRfcmVzb2x2ZV9oYXNoOmR9KX0scWMoZixmZXRjaChhLGUpLnRoZW4oZnVuY3Rpb24oaCl7cmV0dXJuIGguanNvbigpfSkudGhlbihmdW5jdGlvbihoKXtyZXR1cm4gaC51cmx9KSwyKSk6Zi5yZXR1cm4oZi5iKX0pfTt6LnByb3RvdHlwZS5mYj1mdW5jdGlvbihhKXt2YXIgYyxkO3JldHVybiBGYyhmdW5jdGlvbihlKXtyZXR1cm4gMT09ZS5hPyhjPWcuSC5zKCksZD17bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn0sYm9keTpkYS5hKHtob21hZF91cmxfc3VmZml4OmEsaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoOiEwLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH0pfSwKcWMoZSxmZXRjaChjLGQpLnRoZW4oZnVuY3Rpb24oZil7cmV0dXJuIGYuanNvbigpfSkudGhlbihmdW5jdGlvbihmKXtyZXR1cm4gZy5ILmZhKCkucmVwbGFjZSgiW2hhc2hdIixmLmhhc2gpfSksMikpOmUucmV0dXJuKGUuYil9KX07ei5wcm90b3R5cGUuZGE9ZnVuY3Rpb24oYSxjKXtjPXZvaWQgMD09PWM/ITE6Yzt2YXIgZD10aGlzLGUsZjtyZXR1cm4gRmMoZnVuY3Rpb24oaCl7c3dpdGNoKGguYSl7Y2FzZSAxOmlmKCEoZC5CKGEpJiZkLldhKCkmJmQucWIoKSkpe2guYT0yO2JyZWFrfXJldHVybiBxYyhoLGQua2EoYSkuY2F0Y2goZnVuY3Rpb24oKXtyZXR1cm4gYX0pLDMpO2Nhc2UgMzplPWguYixkLkIoZSl8fDAhPT1lLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpfHwoYz0hMCxhPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQoZSkrIiZ0eXBlPWpzIik7Y2FzZSAyOnJldHVybiBhPQpkYS5iKGEpLGY9ZC5vKGEsYyl8fCIiLGQuYmEmJihmPW5ldyBSZXF1ZXN0KGEpKSxxYyhoLGZldGNoKGYpLDQpO2Nhc2UgNDpyZXR1cm4gaC5yZXR1cm4oaC5iKX19KX07ei5wcm90b3R5cGUuQWI9ZnVuY3Rpb24oYSl7dGhpcy5iYT0hMTthJiZhLmluZGV4T2YmJjA8PWEuaW5kZXhPZigiaGRtYz10cnVlIikmJmcucGxheWVyJiZnLnBsYXllci5hYSYmIk9ubHlIT01BRCI9PWcucGxheWVyLmFhKCkmJiFnLkguRyYmKHRoaXMuYmE9ITAsZy5qLnRyYWNrKCJzdGF0c19oZF9ub2hvbWFkIiwiIiwhMCkpfTt6LnByb3RvdHlwZS5vPWZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1uZXcgZGEoZy5ILm1hKGEpKTtpZih0aGlzLkIoYSkpe3ZhciBmPWUuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTt2YXIgaD1hO2E9ZS5wYXRofWVsc2UgZj1jPyJ2cGFpZCI6Zy5ILnRhKGUuaG9zdCksaD1nLkgucygpLGE9Yz9hOmUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpOwphPWcuSC5DYihhKTtmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOmYsaG9tYWRfdXJsX3N1ZmZpeDphLGhvbWFkX3VybF9zdWZmaXhfYmFzZTY0OmJ0b2EoYS50b1N0cmluZygpKX07dGhpcy5XYSgpJiYoZi5ob21hZF92cGFpZF9jb21wYXRpYmxlPSEwKTtmPU9iamVjdC5hc3NpZ24oe30sZixkKTtkPXttZXRob2Q6IlBPU1QiLGhlYWRlcnM6eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifSxjcmVkZW50aWFsczoiaW5jbHVkZSIsYm9keTpkYS5hKGYpfTtyZXR1cm4gbmV3IFJlcXVlc3QoaCxkKX07ei5wcm90b3R5cGUuQmI9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5pYShhKSxkPSExO2lmKGMpcmV0dXJuIHRoaXMubGEoYSwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDpjfSxmdW5jdGlvbihlKXt0cnl7ZD1KU09OLnBhcnNlKGUucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goZil7fX0sZnVuY3Rpb24oKXt9LCEwKSxkfTt6LnByb3RvdHlwZS5pYT0KZnVuY3Rpb24oYSl7dmFyIGM9L14oaHR0cHM/KTpcL1wvKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspP1wvPyhbYS1mMC05XXs0MH0pXC8/JC9nO2lmKChjPWMuZXhlYyhhKSkmJihjWzJdfHxjWzVdKSl7aWYoY1syXSlyZXR1cm4gY1syXTtpZihjWzVdKXJldHVybiBjWzVdfWVsc2UgaWYoYz0vXihodHRwcz8pOlwvXC8oW3cuLV0qKTo/LiooWzAtOV0rKT9cLz8oW2EtZjAtOV17NDB9KVwvPyQvZywoYz1jLmV4ZWMoYSkpJiZjWzRdKXJldHVybiBjWzRdO3JldHVybiExfTt6LnByb3RvdHlwZS54Yj1mdW5jdGlvbihhLGMpe2lmKGMmJiEoMD50aGlzLmMoYSkuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYT09Yyl7aWYodGhpcy5FYihhKSlyZXR1cm47KGM9dGhpcy5CYihhKSl8fChjPWEpfTA9PT1jLmluZGV4T2YoIi8vIikmJihjPSJodHRwczoiK2MpO3RoaXMuaS51cmxzW2FdPWM7dGhpcy5pLnVybHNbY109YTt0aGlzLmkuaG9tYWRVcmxzW2FdPWM7dGhpcy5pLm9yaWdpbmFsVXJsc1tjXT0KYX19O3oucHJvdG90eXBlLkViPWZ1bmN0aW9uKGEpe3ZhciBjPSExO3RoaXMuaS5ob21hZFVybHNbYV0mJihjPXRoaXMuaS5ob21hZFVybHNbYV0pO3JldHVybiBjfTt6LnByb3RvdHlwZS50YT1mdW5jdGlvbihhKXt2YXIgYz0hMTt0aGlzLmkub3JpZ2luYWxVcmxzJiZ0aGlzLmkub3JpZ2luYWxVcmxzW2FdJiYoYz10aGlzLmkub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gY307ei5wcm90b3R5cGUuS2I9ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX07ei5wcm90b3R5cGUuemE9ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGM9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYysrO3JldHVybiBjfTt6LnByb3RvdHlwZS5UYj1mdW5jdGlvbihhLGMsZCl7YSYmKGEuc3R5bGVbY109ZCl9O3oucHJvdG90eXBlLnFhPWZ1bmN0aW9uKGEsYyl7Yz10aGlzLkNiKGMpOwpmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLlRiKGEsY1tkXS5rZXksY1tkXS52YWx1ZSl9O3oucHJvdG90eXBlLnpiPWZ1bmN0aW9uKGEpe2lmKCJzdHJpbmciIT09dHlwZW9mIGEpcmV0dXJuIiI7dHJ5e3JldHVybiBhLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Euc2xpY2UoMSl9Y2F0Y2goYyl7cmV0dXJuIiJ9fTt6LnByb3RvdHlwZS5DYj1mdW5jdGlvbihhKXthPWEuc3BsaXQoIjsiKTtmb3IodmFyIGM9W10sZCxlPSIiLGY9MDtmPGEubGVuZ3RoO2YrKyl7dmFyIGg9YVtmXS5zcGxpdCgiOiIpO2Q9aFswXS50cmltKCk7aFsxXSYmaFsxXS50cmltP2U9aFsxXS50cmltKCk6ZT0iIjtkLmluZGV4T2YmJjA8PWQuaW5kZXhPZigiLSIpJiYoaD1kLnNwbGl0KCItIiksZD1oWzBdK3RoaXMuemIoaFsxXSkpO2Q9e2tleTpkLHZhbHVlOmV9O2MucHVzaChkKX1yZXR1cm4gY307ei5wcm90b3R5cGUuUz1mdW5jdGlvbigpe2Zvcih2YXIgYT0id2ViLmRlIHBjZ2FtZXMuZGUgcGNnYW1lc2hhcmR3YXJlLmRlIHZpZGVvZ2FtZXN6b25lLmRlIGdhbWV6b25lLmRlIGdhbWVzYWt0dWVsbC5kZSBidWZmZWQuZGUgZ29sZW0uZGUiLnNwbGl0KCIgIiksCmM9dGhpcy5GKCksZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKHRoaXMuYihhW2RdKSYmKGMudmJ8fGMuQWN8fGMudWIpKXJldHVybiEwO3JldHVybiExfTt6LnByb3RvdHlwZS5jYT1mdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfTt6LnByb3RvdHlwZS5GYT1mdW5jdGlvbihhLGMpe3ZhciBkPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBmPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWYpcmV0dXJuITE7dmFyIGg9Zi5oZWlnaHQqZi53aWR0aDthPWYud2lkdGg7dmFyIG09Zi5oZWlnaHQ7MD5mLnRvcCYmKG0rPWYudG9wKTtmLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmCihtLT1mLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5mLmxlZnQmJihhKz1mLmxlZnQpO2YucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoYS09Zi5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+bSYmKG09MCk7MD5hJiYoYT0wKTswPGgmJihkPTEwMC9oKmEqbSk7ZD49YyYmKGU9ITApO3JldHVybiBlfTt6LnByb3RvdHlwZS5HYT1mdW5jdGlvbihhKXt2YXIgYz10aGlzLkZhKGEuZWx8fChhLmRpc3BsYXk/YS5kaXNwbGF5LnhjKCk6e30pLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYyl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPQohMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2EoYSl9LmJpbmQodGhpcyksMTAwKX07ei5wcm90b3R5cGUuU2I9ZnVuY3Rpb24oYSl7Zm9yKDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKX07ei5wcm90b3R5cGUuQj1mdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YS5tYXRjaCgvXihodHRwcz8pOlwvXC8oW2EtZjAtOV17NDB9KT9cLj8oW1x3XC5cLV0qKVwuKGRhbW9ofGhvbWFkKVwuKFtcd1wuXC1dKik6PyhbMC05XSspP1wvPyhbYS1mMC05XXs0MH0pP1wvPygoXD98IykuKik/JC8pfTt6LnByb3RvdHlwZS5zPWZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9O3oucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKE1hdGguYWJzKGEpKXx8MTA7cmV0dXJuIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLnNwbGl0KCIiKS5zb3J0KGZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucmFuZG9tKCktCi41fSkuam9pbigiIikuc3Vic3RyKDAsYSl9O3oucHJvdG90eXBlLmliPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMocmIpe3ZhciBpYj0iIixzYjtmb3Ioc2I9NzswPD1zYjtzYi0tKXt2YXIgamM9cmI+Pj40KnNiJjE1O2liKz1qYy50b1N0cmluZygxNil9cmV0dXJuIGlifWZ1bmN0aW9uIGQocmIsaWIpe3JldHVybiByYjw8aWJ8cmI+Pj4zMi1pYn12YXIgZSxmPUFycmF5KDgwKSxoPTE3MzI1ODQxOTMsbT00MDIzMjMzNDE3LEQ9MjU2MjM4MzEwMixNPTI3MTczMzg3OCxPPTMyODUzNzc1MjA7dmFyIE49YS5sZW5ndGg7dmFyIG1hPVtdO2ZvcihlPTA7ZTxOLTM7ZSs9NCl7dmFyIGthPWEuY2hhckNvZGVBdChlKTw8MjR8YS5jaGFyQ29kZUF0KGUrMSk8PDE2fGEuY2hhckNvZGVBdChlKzIpPDw4fGEuY2hhckNvZGVBdChlKzMpO21hLnB1c2goa2EpfXN3aXRjaChOJTQpe2Nhc2UgMDplPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmU9YS5jaGFyQ29kZUF0KE4tMSk8PDI0fDgzODg2MDg7YnJlYWs7CmNhc2UgMjplPWEuY2hhckNvZGVBdChOLTIpPDwyNHxhLmNoYXJDb2RlQXQoTi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KE4tMyk8PDI0fGEuY2hhckNvZGVBdChOLTIpPDwxNnxhLmNoYXJDb2RlQXQoTi0xKTw8OHwxMjh9Zm9yKG1hLnB1c2goZSk7MTQhPW1hLmxlbmd0aCUxNjspbWEucHVzaCgwKTttYS5wdXNoKE4+Pj4yOSk7bWEucHVzaChOPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxtYS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspZltlXT1tYVthK2VdO2ZvcihlPTE2Ozc5Pj1lO2UrKylmW2VdPWQoZltlLTNdXmZbZS04XV5mW2UtMTRdXmZbZS0xNl0sMSk7a2E9aDtOPW07dmFyIG5hPUQ7dmFyIFk9TTt2YXIgeGE9Tztmb3IoZT0wOzE5Pj1lO2UrKyl7dmFyIFo9ZChrYSw1KSsoTiZuYXx+TiZZKSt4YStmW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NTt4YT1ZO1k9bmE7bmE9ZChOLDMwKTtOPWthO2thPVp9Zm9yKGU9MjA7Mzk+PWU7ZSsrKVo9CmQoa2EsNSkrKE5ebmFeWSkreGErZltlXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUseGE9WSxZPW5hLG5hPWQoTiwzMCksTj1rYSxrYT1aO2ZvcihlPTQwOzU5Pj1lO2UrKylaPWQoa2EsNSkrKE4mbmF8TiZZfG5hJlkpK3hhK2ZbZV0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHhhPVksWT1uYSxuYT1kKE4sMzApLE49a2Esa2E9Wjtmb3IoZT02MDs3OT49ZTtlKyspWj1kKGthLDUpKyhOXm5hXlkpK3hhK2ZbZV0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHhhPVksWT1uYSxuYT1kKE4sMzApLE49a2Esa2E9WjtoPWgra2EmNDI5NDk2NzI5NTttPW0rTiY0Mjk0OTY3Mjk1O0Q9RCtuYSY0Mjk0OTY3Mjk1O009TStZJjQyOTQ5NjcyOTU7Tz1PK3hhJjQyOTQ5NjcyOTV9Wj1jKGgpK2MobSkrYyhEKStjKE0pK2MoTyk7cmV0dXJuIFoudG9Mb3dlckNhc2UoKX07ei5wcm90b3R5cGUuQT1mdW5jdGlvbihhKXtmb3IodmFyIGM9IiIsZCxlLGYsaCxtLEQsTT0wO008YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KE0rKyksCmU9YS5jaGFyQ29kZUF0KE0rKyksZj1hLmNoYXJDb2RlQXQoTSsrKSxoPWQ+PjIsZD0oZCYzKTw8NHxlPj40LG09KGUmMTUpPDwyfGY+PjYsRD1mJjYzLGlzTmFOKGUpP209RD02NDppc05hTihmKSYmKEQ9NjQpLGM9YysiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChtKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChEKTtyZXR1cm4gY307ei5wcm90b3R5cGUuQWM9ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLmhhc093blByb3BlcnR5KCJ2ZW5kb3IiKSYmCi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX07ei5wcm90b3R5cGUuRj1mdW5jdGlvbigpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsYz17fTtjLnZiPS9GaXJlZm94XC98RnhpT1NcLy8udGVzdChhKSYmIS9TZWFtb25rZXlcLy8udGVzdChhKTtjLnpjPS9PUFJcL3xPcGVyYVwvfE9QVFwvLy50ZXN0KGEpO2Mua2U9L1RyaWRlbnRcLzcuMDt8OyBNU0lFLy50ZXN0KGEpO2MuaWM9L0VkZ2VcL3xFZGdcL3xFZGdpT1NcL3xFZGdBXC8vLnRlc3QoYSk7Yy5tZT0vU2Ftc3VuZ0Jyb3dzZXJcLy8udGVzdChhKTtjLnBlPS9ZYUJyb3dzZXJcL3xZb3dzZXJcLy8udGVzdChhKTtjLm9lPS9VQ0Jyb3dzZXJcLy8udGVzdChhKTtjLmllPS9GQkFOfEZCQVYvLnRlc3QoYSk7Yy5sZT0vSW5zdGFncmFtLy50ZXN0KGEpO2MubmU9L1R3aXR0ZXIvLnRlc3QoYSk7Yy5iZD1jLm1lfHxjLnBlfHxjLm9lfHxjLmllfHxjLmxlfHxjLm5lO2MudWI9L0Nocm9tZVwvfENyaU9TXC8vLnRlc3QoYSkmJgohL0Nocm9taXVtXC8vLnRlc3QoYSkmJiFjLnpjJiYhYy5pYyYmIWMuYmQ7Yy5BYz0vU2FmYXJpXC8vLnRlc3QoYSkmJiFjLnZiJiYhYy51YiYmIWMuemMmJiFjLmljJiYhYy5iZDtjLnJhPS9pUGhvbmV8aVBhZHxpUG9kfEFuZHJvaWR8QmxhY2tCZXJyeXxQbGF5Qm9va3xNb2JpbGV8T3BlcmEgTWluaXxJRU1vYmlsZXxGeGlPU3xDcmlPU3xFZGdpT1MvLnRlc3QoYSk7Yy5zZj0hYy52YiYmIWMuemMmJiFjLmtlJiYhYy5pYyYmIWMudWImJiFjLkFjJiYhYy5iZDtjLnJmPS9ib3R8YmluZ2JvdHxnb29nbGVib3R8Y3Jhd2xlcnxzcGlkZXJ8cm9ib3R8Y3Jhd2xpbmcvLnRlc3QoYSk7dHJ5e2MuamU9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3IuYnx8L0hlYWRsZXNzQ2hyb21lXC8vLnRlc3QoYSl9Y2F0Y2goZCl7Yy5qZT0hMX1yZXR1cm4gY307ei5wcm90b3R5cGUucmE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GKCkucmF9Owp6LnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBjPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZT0xNDtlLS07KWRbY1tlXV09YVtlXXx8IiI7ZC5xdWVyeUtleT17fTtkW2NbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihmLGgsbSl7aCYmKGQucXVlcnlLZXlbaF09bSl9KTtyZXR1cm4gZH07ei5wcm90b3R5cGUudW5pcXVlPQpmdW5jdGlvbihhKXtmb3IodmFyIGM9e30sZD1bXSxlPTAsZj1hLmxlbmd0aDtlPGY7KytlKWMuaGFzT3duUHJvcGVydHkoYVtlXSl8fChkLnB1c2goYVtlXSksY1thW2VdXT0xKTtyZXR1cm4gZH07ei5wcm90b3R5cGUuRz1mdW5jdGlvbihhKXthPXRoaXMuYyhhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGM9IiI7YVthLmxlbmd0aC0yXSYmKGMrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYys9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGN9O3oucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dmFyIGM9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYz13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2MmJi0xPGMuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfTt6LnByb3RvdHlwZS5uYj1mdW5jdGlvbigpe3ZhciBhPSIiLGM9IiI7dHJ5e2E9d2luZG93LmxvY2F0aW9uLmhvc3QsYz13aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsCndpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGM9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZCl7fXJldHVybiBhK2N9O3oucHJvdG90eXBlLkRiPWZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBkPVtdLGU9W10sZj0wO2Y8Yy5sZW5ndGg7ZisrKWRbY1tmXV09ITA7Zm9yKGY9MDtmPGEubGVuZ3RoO2YrKylkW2FbZl1dfHxlLnB1c2goYVtmXSk7cmV0dXJuIGV9O3oucHJvdG90eXBlLmdiPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9LTEsZT0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxjPygoZT1hLnNwbGl0KCIlIikpJiYoZT1lWzBdKSxkPU1hdGgucm91bmQoYy8xMDAqZSkpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goZil7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH07ei5wcm90b3R5cGUuWmI9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5nYihhLGMpfTsKei5wcm90b3R5cGUud2E9ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBjPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxjPU1hdGguZmxvb3IoYS82MCksYz10aGlzLmpiKGMpKyI6Iit0aGlzLmpiKE1hdGguZmxvb3IoYS02MCpjKSkpO3JldHVybiBjfTt6LnByb3RvdHlwZS5qYj1mdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX07ei5wcm90b3R5cGUucGE9ZnVuY3Rpb24oYSl7dGhpcy5VPWF9O3oucHJvdG90eXBlLmhhPWZ1bmN0aW9uKGEsYyxkKXtkLnN0YXRlPXRoaXMuVTt0aGlzLmVhKGQpO3RyeXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCl2YXIgZT1uZXcgQ3VzdG9tRXZlbnQoYyx7ZGV0YWlsOmR9KTtlbHNlIGU9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZS5pbml0Q3VzdG9tRXZlbnQoYywhMSwhMSxkKTthLmRpc3BhdGNoRXZlbnQoZSl9Y2F0Y2goZil7dGhpcy5oYj0KITAsZG9jdW1lbnQuYm9keT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKSxhLndpZHRoPTEsYS5oZWlnaHQ9MSxhLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSksYT1hLmNvbnRlbnRXaW5kb3cpOmE9d2luZG93LHdpbmRvdy5DdXN0b21FdmVudD1hLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19O3oucHJvdG90eXBlLlA9ZnVuY3Rpb24oYSl7dmFyIGMsZDtjfHwoYz0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7aWYoYSYmMTAwNT09YS5jb2RlJiYodGhpcy5iKCJmb2N1cyIpfHx0aGlzLmIoImdpZ2EiKSkpe3ZhciBlPSJfIithLmhvbWFkSW1wcmVzc2lvbkFkSWQ7dGhpcy5LfHwodGhpcy5LPXtob21hZEltcHJlc3Npb25BZElkczp7fX0pO3RoaXMuSy5ob21hZEltcHJlc3Npb25BZElkc1tlXT90aGlzLksuaG9tYWRJbXByZXNzaW9uQWRJZHNbZV0rKzp0aGlzLksuaG9tYWRJbXByZXNzaW9uQWRJZHNbZV09MTt0aGlzLnRyYWNrKCJzdGF0c190bXBfYWRzdGFydCIsCnRoaXMuSy5ob21hZEltcHJlc3Npb25BZElkc1tlXSwhMCl9dGhpcy5oYShkLGMsYSk7ZyYmZy5wbGF5ZXImJmcucGxheWVyLmFlJiZnLnBsYXllci5hZShhLm5hbWUsYSl9O3oucHJvdG90eXBlLmE9ZnVuY3Rpb24oYSxjLGQsZSxmLGgpe3ZhciBtPWE7ZCYmYyYmKGM9di5hKGMsZCkpO2MmJihtPXYuYShhLGMpKTtlJiYobT12LmEobSxlKSk7ZiYmKG09di5hKG0sZikpO2gmJihtPXYuYShtLGgpKTt0aGlzLlAobSl9O3oucHJvdG90eXBlLlJiPWZ1bmN0aW9uKGEpe3ZhciBjPXt9O2lmKCFhLmNvZGUpcmV0dXJuITE7aWYoYS5zcGVjaWFsX3RyYWNrfHxhLmNvcnJvYm9yYXRlX3RyYWNrKWM9YTtlbHNlIGlmKCEoYS5jb2RlJiYxMDA1PD1hLmNvZGUmJjEwMjk+PWEuY29kZSl8fDEwMjM9PWEuY29kZXx8MTAxOD09YS5jb2RlKXJldHVybjt0cnl7dmMmJihjLnNlc3Npb25faWQ9dmMpO2MuYWRzZXNzaW9uX2lkPWEuYWRzZXNzaW9uX2lkP2EuYWRzZXNzaW9uX2lkOiJlcG9uIjthLmhvbWFkSW1wcmVzc2lvbkFkSWQmJgooYy5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpO2MuZXZlbnQ9YS5jb2RlO2Muc2l0ZV9ocmVmPXRoaXMubmIoKTtpZihhLnN0YXRlKXN3aXRjaChhLnN0YXRlKXtjYXNlICJwcmVyb2xsIjpjLnBvc2l0aW9uPTE7YnJlYWs7Y2FzZSAibWlkcm9sbCI6Yy5wb3NpdGlvbj0yO2JyZWFrO2Nhc2UgInBvc3Ryb2xsIjpjLnBvc2l0aW9uPTM7YnJlYWs7ZGVmYXVsdDpjLnBvc2l0aW9uPTB9YS52aWRlb19kdXJhdGlvbiYmKGMudmlkZW9fZHVyYXRpb249YS52aWRlb19kdXJhdGlvbik7YS5kdXJhdGlvbiYmKGMuYWRfZHVyYXRpb249YS5kdXJhdGlvbil9Y2F0Y2goZCl7fXJldHVybiBjfTt6LnByb3RvdHlwZS4kYj1mdW5jdGlvbihhKXthLnNwZWNpYWxfdHJhY2s9ITA7YS5zZXNzaW9uX2lkPXRoaXMuRCgpO2EuZXZlbnRfY29kZXx8KGEuZXZlbnRfY29kZT05OTkwMCk7YS5jb2RlPWEuZXZlbnRfY29kZTthLmV2ZW50X25hbWV8fChhLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMuZWEoYSl9Owp6LnByb3RvdHlwZS5lYT1mdW5jdGlvbihhKXt2YXIgYz10aGlzLlJiKGEpO2lmKGMpaWYoZy5IJiZnLkguYil7aWYoZy5ILmEpe2lmKCJvYmplY3QiPT10eXBlb2YgYyl0cnl7Yz1KU09OLnN0cmluZ2lmeShjKX1jYXRjaChkKXtjPWMudG9TdHJpbmc/Yy50b1N0cmluZygpOiIifWMmJmMudHJpbSYmKGM9Yy50cmltKCkpO2E9Zy5ILnMoKTtoYihnLkguYyhhLCEwKSwidHJhY2tpbmciKTthPWcuSC5jKGEsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2EuZGF0YS5ob21hZF9hdD1jO2cuSC5sKGEsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSl9fWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKGMpfS5iaW5kKHRoaXMpLDUwMCl9O3oucHJvdG90eXBlLnRyYWNrPWZ1bmN0aW9uKGEsYyxkKXtpZihkPXZvaWQgMD09PWQ/ITE6ZClpZihnLkgmJmcuSC5iKXtpZihnLkguYSl7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7YyYmYy50cmltJiYoYz0KYy50cmltKCkpO3ZhciBlPWcuSC5zKCk7aGIoZy5ILmMoZSwhMCksInRyYWNraW5nIik7ZT1nLkguYyhlLCEwKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtlLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2UuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGMrIiIpKyIqIjtnLkgubChlLGZ1bmN0aW9uKGYpe3ZhciBoPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihoPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYysiIikmJihoPSExKX1jYXRjaChtKXt9aHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGZbMF0/ZlswXToiIikrKGZbMV0/ZlsxXToiIiksITApfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSl9fWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmMsZCl9LmJpbmQodGhpcyksNTAwKX07ei5wcm90b3R5cGUuWT1mdW5jdGlvbihhKXtpZighZ3x8IWcuSC5iKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZKGEpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihnLkguYSl7dmFyIGM9YS5qb2luKCIsIiksZD1nLkgucygpO2Q9Zy5ILmMoZCwhMCk7ZC5kYXRhLmhvbWFkX3RyYWNrPWM7Zy5ILmwoZCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9KX19O3oucHJvdG90eXBlLm1hPWZ1bmN0aW9uKCl7Zy5IJiZnLkguYj9nLkguYSYmZy5ILktiKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksNTAwKX07ei5wcm90b3R5cGUucGI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9O3oucHJvdG90eXBlLkJkPWZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMub2IoYSk6IiJ9O3oucHJvdG90eXBlLm9iPQpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnBiKGEpO2MmJihjPWMudHJpbSgpKTshYyYmYS50ZXh0Q29udGVudCYmKGM9YS50ZXh0Q29udGVudCxjPWMudHJpbSgpKTtyZXR1cm4gY307ei5wcm90b3R5cGUuTj1mdW5jdGlvbihhLGMsZCxlKXtkPXZvaWQgMD09PWQ/ITE6ZDtlPXZvaWQgMD09PWU/e306ZTtpZih0aGlzLkIoYSl8fHRoaXMuS2IoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO2lmKHdpbmRvdy5zYW5kYm94JiZ3aW5kb3cuc2FuZGJveC5nZCYmd2luZG93LnNhbmRib3guZ2RbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdKXt2YXIgZj13aW5kb3cuc2FuZGJveDswPD1mLmdkWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxmLmdkWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpfWlmKHRoaXMudGEoYSkpcmV0dXJuIHRoaXMudGEoYSk7Zj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTsKZi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLkEoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtlJiZlLnBvc3QmJihmWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihmLmhvbWFkX3ZwYWlkX3NjcmlwdGluamVjdD1KU09OLnN0cmluZ2lmeSh7aGVhZDoiaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vc2FuZGJveF9zYS5qcyJ9KSxmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO2UmJmUub25seVVSTCYmKGYuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBoPSExO2Q9ITE7ZD10aGlzLmMoYSk7ZD10aGlzLlcoYSxjLnRhKGQuaG9zdCksZixmdW5jdGlvbihtKXtoPW0ucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sCmMsITApO3RyeXtofHwoaD1kKSxoPUpTT04ucGFyc2UoaC50b1N0cmluZygpKX1jYXRjaChtKXtoPSExfWgudXJsJiZoLmhhc2gmJihoPWMuZmEoKS5yZXBsYWNlKCJbaGFzaF0iLGguaGFzaCkpO3RoaXMueGIoaCxhKTtyZXR1cm4gaH07ei5wcm90b3R5cGUuVz1mdW5jdGlvbihhLGMsZCxlLGYsaCxtLEQpe209dm9pZCAwPT09bT8hMTptO0Q9dm9pZCAwPT09RD8hMTpEO3ZhciBNPWh8fGcuSDtoPSEwO0QmJihoPSExKTtpZihNJiZNLmIpaWYoTS5hKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goTil7ZihOKX1pZigic3RyaW5nIiE9dHlwZW9mIGEpZigpO2Vsc2V7aGIoTS5jKGEsaCksImxvYWRSZXNvdXJjZVRocm91Z2hIb21hZCIpO2g9TS5jKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YztoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIE8gaW4gZCloLmRhdGFbT109ZFtPXTtyZXR1cm4gTS5sKGgsZSxmLCExLAohMSxtKX19ZWxzZSBmKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVyhhLGMsZCxlLGYsTSxtLEQpfS5iaW5kKHRoaXMpLDUwMCl9O3oucHJvdG90eXBlLmxhPWZ1bmN0aW9uKGEsYyxkLGUsZixoKXt2YXIgbT0hMDttPXZvaWQgMD09PW0/ITE6bTt2YXIgRD0hMDsodm9pZCAwPT09aD8wOmgpJiYoRD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIE0gaW4gaClkKz0iJiIrTSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhbTV0pO2Q9ZC5zdWJzdHIoMSl9dmFyIE89bmV3IFhNTEh0dHBSZXF1ZXN0O08ub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWV8fDQhPU8ucmVhZHlTdGF0ZXx8MjAwIT1PLnN0YXR1cyYmMjAxIT1PLnN0YXR1c3x8ZShPKTtmJiY0PT1PLnJlYWR5U3RhdGUmJjIwMCE9Ty5zdGF0dXMmJjIwMSE9Ty5zdGF0dXMmJmYoTyl9O3RyeXtPLm9wZW4oYyxhLEQpLE8ud2l0aENyZWRlbnRpYWxzPW0sMDxkLmxlbmd0aCYmCk8uc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksTy5zZW5kKGQpfWNhdGNoKE4pe2YmJmYoKX19O3oucHJvdG90eXBlLkpiPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9ITE7aWYoYylmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKylpZihjW2VdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfTt6LnByb3RvdHlwZS5tPWZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9O3ZhciBsPW5ldyB6O2cuaj1sO2cuai5PYigpO3ZhciBEYT1sO3YucHJvdG90eXBlLmdldEVycm9yQ29kZT1mdW5jdGlvbigpe3JldHVybiIifTt2LnByb3RvdHlwZS5nZXRUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudHlwZX07di5hPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9e30sZTtmb3IoZSBpbiBjKWRbZV09Y1tlXTtmb3IoZSBpbiBhKWRbZV09YVtlXTtyZXR1cm4gZH07di5jYT17Y29kZToiMTAwMCIsCnR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O3YuaT17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07di5nYT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTt2Lk89e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07di5pYT17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTt2LkE9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O3YubD17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O3YuRj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07di5EPXtjb2RlOiIxMDA4IiwKdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O3YuZj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07di5tPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O3YuZGE9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTt2LlU9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O3YuUD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O3YuaGE9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O3YuTT17Y29kZToiMTAxNSIsCnR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07di5OPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07di5nPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O3YuYj17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O3YuYz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O3YudT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O3Yucz17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O3YuQj17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIiwKbmFtZToiYWRQYXVzZSJ9O3YuRz17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O3Yubz17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O3YuZWE9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07di5XPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O3YuWGE9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O3YuJGE9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTt2Lks9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTt2LmZhPXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTsKdi5iYT17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O3YuWj17Y29kZToiMTAzMiIsdHlwZToidmFzdGR1cmF0aW9uZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O3YuWT17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTt2LlM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9OyhmdW5jdGlvbihhLGMpeyJvYmplY3QiPT09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT09dHlwZW9mIG1vZHVsZT9jKGV4cG9ydHMpOiJmdW5jdGlvbiI9PT10eXBlb2YgZGVmaW5lJiZkZWZpbmUucWY/ZGVmaW5lKFsiZXhwb3J0cyJdLGMpOmMoYS5rZj17fSl9KSh0aGlzLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMocCl7InN0cmluZyIhPT0KdHlwZW9mIHAmJihwPVN0cmluZyhwKSk7aWYoL1teYS16MC05XC0jJCUmJyorLl5fYHx+XS9pLnRlc3QocCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGVhZGVyIGZpZWxkIG5hbWUiKTtyZXR1cm4gcC50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIGQocCl7InN0cmluZyIhPT10eXBlb2YgcCYmKHA9U3RyaW5nKHApKTtyZXR1cm4gcH1mdW5jdGlvbiBlKHApe3ZhciBCPXtuZXh0OmZ1bmN0aW9uKCl7dmFyIEo9cC5zaGlmdCgpO3JldHVybntkb25lOnZvaWQgMD09PUosdmFsdWU6Sn19fTtaLkRkJiYoVWEoKSx1YigpLEJbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiBCfSk7cmV0dXJuIEJ9ZnVuY3Rpb24gZihwKXt0aGlzLm1hcD17fTtwIGluc3RhbmNlb2YgZj9wLmZvckVhY2goZnVuY3Rpb24oQixKKXt0aGlzLmFwcGVuZChKLEIpfSx0aGlzKTpBcnJheS5pc0FycmF5KHApP3AuZm9yRWFjaChmdW5jdGlvbihCKXt0aGlzLmFwcGVuZChCWzBdLApCWzFdKX0sdGhpcyk6cCYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocCkuZm9yRWFjaChmdW5jdGlvbihCKXt0aGlzLmFwcGVuZChCLHBbQl0pfSx0aGlzKX1mdW5jdGlvbiBoKHApe2lmKHAuYm9keVVzZWQpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoIkFscmVhZHkgcmVhZCIpKTtwLmJvZHlVc2VkPSEwfWZ1bmN0aW9uIG0ocCl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKEIsSil7cC5vbmxvYWQ9ZnVuY3Rpb24oKXtCKHAucmVzdWx0KX07cC5vbmVycm9yPWZ1bmN0aW9uKCl7SihwLmVycm9yKX19KX1mdW5jdGlvbiBEKHApe3ZhciBCPW5ldyBGaWxlUmVhZGVyLEo9bShCKTtCLnJlYWRBc0FycmF5QnVmZmVyKHApO3JldHVybiBKfWZ1bmN0aW9uIE0ocCl7cD1uZXcgVWludDhBcnJheShwKTtmb3IodmFyIEI9QXJyYXkocC5sZW5ndGgpLEo9MDtKPHAubGVuZ3RoO0orKylCW0pdPVN0cmluZy5mcm9tQ2hhckNvZGUocFtKXSk7cmV0dXJuIEIuam9pbigiIil9CmZ1bmN0aW9uIE8ocCl7aWYocC5zbGljZSlyZXR1cm4gcC5zbGljZSgwKTt2YXIgQj1uZXcgVWludDhBcnJheShwLmJ5dGVMZW5ndGgpO0Iuc2V0KG5ldyBVaW50OEFycmF5KHApKTtyZXR1cm4gQi5idWZmZXJ9ZnVuY3Rpb24gTigpe3RoaXMuYm9keVVzZWQ9ITE7dGhpcy5zZD1mdW5jdGlvbihwKXsodGhpcy5hYz1wKT8ic3RyaW5nIj09PXR5cGVvZiBwP3RoaXMuYmM9cDpaLmJsb2ImJkJsb2IucHJvdG90eXBlLmlzUHJvdG90eXBlT2YocCk/dGhpcy5yYj1wOlouZm9ybURhdGEmJkZvcm1EYXRhLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKHApP3RoaXMucmQ9cDpaLnNlYXJjaFBhcmFtcyYmVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKHApP3RoaXMuYmM9cC50b1N0cmluZygpOlouYXJyYXlCdWZmZXImJlouYmxvYiYmcCYmRGF0YVZpZXcucHJvdG90eXBlLmlzUHJvdG90eXBlT2YocCk/KHRoaXMuYmI9TyhwLmJ1ZmZlciksdGhpcy5hYz1uZXcgQmxvYihbdGhpcy5iYl0pKToKWi5hcnJheUJ1ZmZlciYmKEFycmF5QnVmZmVyLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKHApfHxpYihwKSk/dGhpcy5iYj1PKHApOnRoaXMuYmM9cD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocCk6dGhpcy5iYz0iIjt0aGlzLmhlYWRlcnMuZ2V0KCJjb250ZW50LXR5cGUiKXx8KCJzdHJpbmciPT09dHlwZW9mIHA/dGhpcy5oZWFkZXJzLnNldCgiY29udGVudC10eXBlIiwidGV4dC9wbGFpbjtjaGFyc2V0PVVURi04Iik6dGhpcy5yYiYmdGhpcy5yYi50eXBlP3RoaXMuaGVhZGVycy5zZXQoImNvbnRlbnQtdHlwZSIsdGhpcy5yYi50eXBlKTpaLnNlYXJjaFBhcmFtcyYmVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKHApJiZ0aGlzLmhlYWRlcnMuc2V0KCJjb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCIpKX07Wi5ibG9iJiYodGhpcy5ibG9iPWZ1bmN0aW9uKCl7dmFyIHA9aCh0aGlzKTsKaWYocClyZXR1cm4gcDtpZih0aGlzLnJiKXJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5yYik7aWYodGhpcy5iYilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLmJiXSkpO2lmKHRoaXMucmQpdGhyb3cgRXJyb3IoImNvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgYmxvYiIpO3JldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuYmNdKSl9LHRoaXMuYXJyYXlCdWZmZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iYj9oKHRoaXMpfHxQcm9taXNlLnJlc29sdmUodGhpcy5iYik6dGhpcy5ibG9iKCkudGhlbihEKX0pO3RoaXMudGV4dD1mdW5jdGlvbigpe3ZhciBwPWgodGhpcyk7aWYocClyZXR1cm4gcDtpZih0aGlzLnJiKXtwPXRoaXMucmI7dmFyIEI9bmV3IEZpbGVSZWFkZXIsSj1tKEIpO0IucmVhZEFzVGV4dChwKTtyZXR1cm4gSn1pZih0aGlzLmJiKXJldHVybiBQcm9taXNlLnJlc29sdmUoTSh0aGlzLmJiKSk7aWYodGhpcy5yZCl0aHJvdyBFcnJvcigiY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyB0ZXh0Iik7CnJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5iYyl9O1ouZm9ybURhdGEmJih0aGlzLmZvcm1EYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oa2EpfSk7dGhpcy5qc29uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oSlNPTi5wYXJzZSl9O3JldHVybiB0aGlzfWZ1bmN0aW9uIG1hKHAsQil7Qj1CfHx7fTt2YXIgSj1CLmJvZHk7aWYocCBpbnN0YW5jZW9mIG1hKXtpZihwLmJvZHlVc2VkKXRocm93IG5ldyBUeXBlRXJyb3IoIkFscmVhZHkgcmVhZCIpO3RoaXMudXJsPXAudXJsO3RoaXMuY3JlZGVudGlhbHM9cC5jcmVkZW50aWFscztCLmhlYWRlcnN8fCh0aGlzLmhlYWRlcnM9bmV3IGYocC5oZWFkZXJzKSk7dGhpcy5tZXRob2Q9cC5tZXRob2Q7dGhpcy5tb2RlPXAubW9kZTt0aGlzLnNpZ25hbD1wLnNpZ25hbDtKfHxudWxsPT1wLmFjfHwoSj1wLmFjLHAuYm9keVVzZWQ9ITApfWVsc2UgdGhpcy51cmw9U3RyaW5nKHApO3RoaXMuY3JlZGVudGlhbHM9CkIuY3JlZGVudGlhbHN8fHRoaXMuY3JlZGVudGlhbHN8fCJzYW1lLW9yaWdpbiI7aWYoQi5oZWFkZXJzfHwhdGhpcy5oZWFkZXJzKXRoaXMuaGVhZGVycz1uZXcgZihCLmhlYWRlcnMpO3A9Qi5tZXRob2R8fHRoaXMubWV0aG9kfHwiR0VUIjt2YXIgcGE9cC50b1VwcGVyQ2FzZSgpO3RoaXMubWV0aG9kPS0xPHNiLmluZGV4T2YocGEpP3BhOnA7dGhpcy5tb2RlPUIubW9kZXx8dGhpcy5tb2RlfHxudWxsO3RoaXMuc2lnbmFsPUIuc2lnbmFsfHx0aGlzLnNpZ25hbDt0aGlzLnJlZmVycmVyPW51bGw7aWYoKCJHRVQiPT09dGhpcy5tZXRob2R8fCJIRUFEIj09PXRoaXMubWV0aG9kKSYmSil0aHJvdyBuZXcgVHlwZUVycm9yKCJCb2R5IG5vdCBhbGxvd2VkIGZvciBHRVQgb3IgSEVBRCByZXF1ZXN0cyIpO3RoaXMuc2QoSil9ZnVuY3Rpb24ga2EocCl7dmFyIEI9bmV3IEZvcm1EYXRhO3AudHJpbSgpLnNwbGl0KCImIikuZm9yRWFjaChmdW5jdGlvbihKKXtpZihKKXt2YXIgcGE9Si5zcGxpdCgiPSIpOwpKPXBhLnNoaWZ0KCkucmVwbGFjZSgvXCsvZywiICIpO3BhPXBhLmpvaW4oIj0iKS5yZXBsYWNlKC9cKy9nLCIgIik7Qi5hcHBlbmQoZGVjb2RlVVJJQ29tcG9uZW50KEopLGRlY29kZVVSSUNvbXBvbmVudChwYSkpfX0pO3JldHVybiBCfWZ1bmN0aW9uIG5hKHApe3ZhciBCPW5ldyBmO3AucmVwbGFjZSgvXHI/XG5bXHQgXSsvZywiICIpLnNwbGl0KC9ccj9cbi8pLmZvckVhY2goZnVuY3Rpb24oSil7Sj1KLnNwbGl0KCI6Iik7dmFyIHBhPUouc2hpZnQoKS50cmltKCk7cGEmJkIuYXBwZW5kKHBhLEouam9pbigiOiIpLnRyaW0oKSl9KTtyZXR1cm4gQn1mdW5jdGlvbiBZKHAsQil7Qnx8KEI9e30pO3RoaXMudHlwZT0iZGVmYXVsdCI7dGhpcy5zdGF0dXM9dm9pZCAwPT09Qi5zdGF0dXM/MjAwOkIuc3RhdHVzO3RoaXMub2s9MjAwPD10aGlzLnN0YXR1cyYmMzAwPnRoaXMuc3RhdHVzO3RoaXMuc3RhdHVzVGV4dD0ic3RhdHVzVGV4dCJpbiBCP0Iuc3RhdHVzVGV4dDoiT0siO3RoaXMuaGVhZGVycz0KbmV3IGYoQi5oZWFkZXJzKTt0aGlzLnVybD1CLnVybHx8IiI7dGhpcy5zZChwKX1mdW5jdGlvbiB4YShwLEIpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihKLHBhKXtmdW5jdGlvbiB3Yygpe2FhLmFib3J0KCl9dmFyIEVhPW5ldyBtYShwLEIpO2lmKEVhLnNpZ25hbCYmRWEuc2lnbmFsLmFib3J0ZWQpcmV0dXJuIHBhKG5ldyBhLkRPTUV4Y2VwdGlvbigiQWJvcnRlZCIsIkFib3J0RXJyb3IiKSk7dmFyIGFhPW5ldyBYTUxIdHRwUmVxdWVzdDthYS5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgRGI9e3N0YXR1czphYS5zdGF0dXMsc3RhdHVzVGV4dDphYS5zdGF0dXNUZXh0LGhlYWRlcnM6bmEoYWEuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCl8fCIiKX07RGIudXJsPSJyZXNwb25zZVVSTCJpbiBhYT9hYS5yZXNwb25zZVVSTDpEYi5oZWFkZXJzLmdldCgiWC1SZXF1ZXN0LVVSTCIpO0oobmV3IFkoInJlc3BvbnNlImluIGFhP2FhLnJlc3BvbnNlOmFhLnJlc3BvbnNlVGV4dCxEYikpfTthYS5vbmVycm9yPQpmdW5jdGlvbigpe3BhKG5ldyBUeXBlRXJyb3IoIk5ldHdvcmsgcmVxdWVzdCBmYWlsZWQiKSl9O2FhLm9udGltZW91dD1mdW5jdGlvbigpe3BhKG5ldyBUeXBlRXJyb3IoIk5ldHdvcmsgcmVxdWVzdCBmYWlsZWQiKSl9O2FhLm9uYWJvcnQ9ZnVuY3Rpb24oKXtwYShuZXcgYS5ET01FeGNlcHRpb24oIkFib3J0ZWQiLCJBYm9ydEVycm9yIikpfTthYS5vcGVuKEVhLm1ldGhvZCxFYS51cmwsITApOyJpbmNsdWRlIj09PUVhLmNyZWRlbnRpYWxzP2FhLndpdGhDcmVkZW50aWFscz0hMDoib21pdCI9PT1FYS5jcmVkZW50aWFscyYmKGFhLndpdGhDcmVkZW50aWFscz0hMSk7InJlc3BvbnNlVHlwZSJpbiBhYSYmWi5ibG9iJiYoYWEucmVzcG9uc2VUeXBlPSJibG9iIik7RWEuaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKERiLEtjKXthYS5zZXRSZXF1ZXN0SGVhZGVyKEtjLERiKX0pO0VhLnNpZ25hbCYmKEVhLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsd2MpLGFhLm9ucmVhZHlzdGF0ZWNoYW5nZT0KZnVuY3Rpb24oKXs0PT09YWEucmVhZHlTdGF0ZSYmRWEuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0Iix3Yyl9KTthYS5zZW5kKCJ1bmRlZmluZWQiPT09dHlwZW9mIEVhLmFjP251bGw6RWEuYWMpfSl9VWEoKTt2YXIgWj17c2VhcmNoUGFyYW1zOiJVUkxTZWFyY2hQYXJhbXMiaW4gc2VsZixEZDoiU3ltYm9sImluIHNlbGYmJiJpdGVyYXRvciJpbiBTeW1ib2wsYmxvYjoiRmlsZVJlYWRlciJpbiBzZWxmJiYiQmxvYiJpbiBzZWxmJiYhMCxmb3JtRGF0YToiRm9ybURhdGEiaW4gc2VsZixhcnJheUJ1ZmZlcjoiQXJyYXlCdWZmZXIiaW4gc2VsZn07aWYoWi5hcnJheUJ1ZmZlcil2YXIgcmI9IltvYmplY3QgSW50OEFycmF5XTtbb2JqZWN0IFVpbnQ4QXJyYXldO1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldO1tvYmplY3QgSW50MTZBcnJheV07W29iamVjdCBVaW50MTZBcnJheV07W29iamVjdCBJbnQzMkFycmF5XTtbb2JqZWN0IFVpbnQzMkFycmF5XTtbb2JqZWN0IEZsb2F0MzJBcnJheV07W29iamVjdCBGbG9hdDY0QXJyYXldIi5zcGxpdCgiOyIpLAppYj1BcnJheUJ1ZmZlci5pc1ZpZXd8fGZ1bmN0aW9uKHApe3JldHVybiBwJiYtMTxyYi5pbmRleE9mKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwKSl9O2YucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbihwLEIpe3A9YyhwKTtCPWQoQik7dmFyIEo9dGhpcy5tYXBbcF07dGhpcy5tYXBbcF09Sj9KKyIsICIrQjpCfTtmLnByb3RvdHlwZVsiZGVsZXRlIl09ZnVuY3Rpb24ocCl7ZGVsZXRlIHRoaXMubWFwW2MocCldfTtmLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24ocCl7cD1jKHApO3JldHVybiB0aGlzLmhhcyhwKT90aGlzLm1hcFtwXTpudWxsfTtmLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24ocCl7cmV0dXJuIHRoaXMubWFwLmhhc093blByb3BlcnR5KGMocCkpfTtmLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24ocCxCKXt0aGlzLm1hcFtjKHApXT1kKEIpfTtmLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHAsQil7Zm9yKHZhciBKIGluIHRoaXMubWFwKXRoaXMubWFwLmhhc093blByb3BlcnR5KEopJiYKcC5jYWxsKEIsdGhpcy5tYXBbSl0sSix0aGlzKX07Zi5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3ZhciBwPVtdO3RoaXMuZm9yRWFjaChmdW5jdGlvbihCLEope3AucHVzaChKKX0pO3JldHVybiBlKHApfTtmLnByb3RvdHlwZS52YWx1ZXM9ZnVuY3Rpb24oKXt2YXIgcD1bXTt0aGlzLmZvckVhY2goZnVuY3Rpb24oQil7cC5wdXNoKEIpfSk7cmV0dXJuIGUocCl9O2YucHJvdG90eXBlLmVudHJpZXM9ZnVuY3Rpb24oKXt2YXIgcD1bXTt0aGlzLmZvckVhY2goZnVuY3Rpb24oQixKKXtwLnB1c2goW0osQl0pfSk7cmV0dXJuIGUocCl9O1ouRGQmJihVYSgpLHViKCksZi5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXT1mLnByb3RvdHlwZS5lbnRyaWVzKTt2YXIgc2I9IkRFTEVURSBHRVQgSEVBRCBPUFRJT05TIFBPU1QgUFVUIi5zcGxpdCgiICIpO04uY2FsbChtYS5wcm90b3R5cGUpO04uY2FsbChZLnByb3RvdHlwZSk7WS5lcnJvcj1mdW5jdGlvbigpe3ZhciBwPW5ldyBZKG51bGwsCntzdGF0dXM6MCxzdGF0dXNUZXh0OiIifSk7cC50eXBlPSJlcnJvciI7cmV0dXJuIHB9O3ZhciBqYz1bMzAxLDMwMiwzMDMsMzA3LDMwOF07WS5yZWRpcmVjdD1mdW5jdGlvbihwLEIpe2lmKC0xPT09amMuaW5kZXhPZihCKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCBzdGF0dXMgY29kZSIpO3JldHVybiBuZXcgWShudWxsLHtzdGF0dXM6QixoZWFkZXJzOntsb2NhdGlvbjpwfX0pfTthLkRPTUV4Y2VwdGlvbj1zZWxmLkRPTUV4Y2VwdGlvbjt0cnl7bmV3IGEuRE9NRXhjZXB0aW9ufWNhdGNoKHApe2EuRE9NRXhjZXB0aW9uPWZ1bmN0aW9uKEIsSil7dGhpcy5tZXNzYWdlPUI7dGhpcy5uYW1lPUo7dGhpcy5zdGFjaz1FcnJvcihCKS5zdGFja30sYS5ET01FeGNlcHRpb24ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSxhLkRPTUV4Y2VwdGlvbi5wcm90b3R5cGUuY29uc3RydWN0b3I9YS5ET01FeGNlcHRpb259eGEuYT0hMDtzZWxmLmZldGNofHwoc2VsZi5mZXRjaD0KeGEsc2VsZi5IZWFkZXJzPWYsc2VsZi5SZXF1ZXN0PW1hLHNlbGYuUmVzcG9uc2U9WSk7YS5IZWFkZXJzPWY7YS5SZXF1ZXN0PW1hO2EuUmVzcG9uc2U9WTthLmZldGNoPXhhO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0pO2RhLmE9ZnVuY3Rpb24oYSxjKXtjPXZvaWQgMD09PWM/ITA6YztyZXR1cm4gT2JqZWN0LmtleXMoYSkubWFwKGZ1bmN0aW9uKGQpe3JldHVybiBjP1tkLGFbZF1dLm1hcChlbmNvZGVVUklDb21wb25lbnQpLmpvaW4oIj0iKTpbZCxhW2RdXS5qb2luKCI9Iil9KS5qb2luKCImIil9O2RhLmI9ZnVuY3Rpb24oYSl7W3twYXR0ZXJuOi9cWyhyYW5kb218cm5kfGNhY2hlYnVzdGVyfGNvcnJlbGF0b3IpXF0vZyx2YWx1ZTpnLmoucygxMCl9LHtwYXR0ZXJuOi9cWyhyZWZlcnJlcl91cmwpXF0vZyx2YWx1ZTpkb2N1bWVudC5yZWZlcnJlcn0se3BhdHRlcm46L1xbKGRlc2NyaXB0aW9uX3VybHx1cmwpXF0vZyx2YWx1ZTpkb2N1bWVudC5sb2NhdGlvbi5ocmVmfSwKe3BhdHRlcm46L1xbKHRpbWV8dGltZXN0YW1wKVxdL2csdmFsdWU6KG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKX1dLmZvckVhY2goZnVuY3Rpb24oYyl7YT1hLnJlcGxhY2UoYy5wYXR0ZXJuLGMudmFsdWUpfSk7cmV0dXJuIGF9O2RhLnByb3RvdHlwZS5sPWZ1bmN0aW9uKCl7dGhpcy5hLnF1ZXJ5S2V5LmdkcHJfY29uc2VudD0iW2dkcHJfY29uc2VudF0iO3RoaXMuYS5xdWVyeT1kYS5hKHRoaXMuYS5xdWVyeUtleSwhMSk7dGhpcy5jKCl9O2RhLnByb3RvdHlwZS5pPWZ1bmN0aW9uKGEsYyl7dGhpcy5hLnF1ZXJ5S2V5W2FdPWM7dGhpcy5hLnF1ZXJ5PWRhLmEodGhpcy5hLnF1ZXJ5S2V5LCExKTt0aGlzLmMoKX07ZGEucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5xdWVyeUtleVthXX07ZGEucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5xdWVyeUtleS5oYXNPd25Qcm9wZXJ0eShhKX07ZGEucHJvdG90eXBlLmM9ZnVuY3Rpb24oKXt0aGlzLnBhcnNlKHRoaXMudG9TdHJpbmcoKSl9OwpkYS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5hLnByb3RvY29sLmxlbmd0aD90aGlzLmEucHJvdG9jb2wrIjovLyI6IiIsdGhpcy5hLnZkLHRoaXMuYS5wYXRoLHRoaXMuYS5xdWVyeS5sZW5ndGg/Ij8iK3RoaXMuYS5xdWVyeToiIix0aGlzLmEuYW5jaG9yLmxlbmd0aD8iIyIrdGhpcy5hLmFuY2hvcjoiIl0uam9pbigiIil9O2RhLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihhKXt2YXIgYz10aGlzO2E9ZGEuYihhKTt0aGlzLmY9dGhpcy52LmRkW3RoaXMudi5LZT8ic3RyaWN0IjoibG9vc2UiXS5leGVjKGEpO2E9MTQ7Zm9yKHZhciBkPXt9O2EtLTspZFt0aGlzLnYua2V5W2FdXT10aGlzLmZbYV18fCIiO2RbdGhpcy52LnEubmFtZV09e307ZFt0aGlzLnYua2V5WzEyXV0ucmVwbGFjZSh0aGlzLnYucS5kZCxmdW5jdGlvbihlLGYsaCl7ZiYmKGRbYy52LnEubmFtZV1bZl09aCl9KTtyZXR1cm4gZH07UWEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZGEucHJvdG90eXBlLAp7djp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJue0tlOiExLGtleToic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VyaW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKSxxOntuYW1lOiJxdWVyeUtleSIsZGQ6Lyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nfSxkZDp7c3RyaWN0Oi9eKD86KFteOlwvPyNdKyk6KT8oPzpcL1wvKCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSk/KCgoKD86W14/I1wvXSpcLykqKShbXj8jXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLGxvb3NlOi9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvfX19fSwKcHJvdG9jb2w6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEucHJvdG9jb2x9fSx2ZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS52ZH19LGhvc3Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuaG9zdH19LHBhdGg6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEucGF0aH19LHF1ZXJ5Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLnF1ZXJ5fX0sYW5jaG9yOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLmFuY2hvcn19fSk7dmEucHJvdG90eXBlLmNhPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuTS5oYXMoYSk/KGModGhpcy5NLmdldChhKSksCiEwKTohMX07dmEucHJvdG90eXBlLm9uPWZ1bmN0aW9uKGEsYyxkKXtkPXZvaWQgMD09PWQ/ITE6ZDt0aGlzLkYuaGFzKGEpfHx0aGlzLkYuc2V0KGEsW10pO3RoaXMuRi5nZXQoYSkucHVzaChjKTtkJiZ0aGlzLmNhKGEsYyl9O3ZhLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKGEsYyxkKXtkPXZvaWQgMD09PWQ/ITE6ZDt0aGlzLm8uaGFzKGEpfHx0aGlzLm8uc2V0KGEsW10pO2QmJnRoaXMuY2EoYSxjKXx8dGhpcy5vLmdldChhKS5wdXNoKGMpfTt2YS5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXt2YXIgYz12b2lkIDA9PT1jPyEwOmM7aWYoITA9PT1jKXRoaXMuRi5kZWxldGUoYSksdGhpcy5vLmRlbGV0ZShhKTtlbHNle3ZhciBkPWZ1bmN0aW9uKGUpe3ZhciBmPWUuZ2V0KGEpO2YmJmUuc2V0KGEsZi5maWx0ZXIoZnVuY3Rpb24oaCl7cmV0dXJuIGghPT1jfSkpfTtkKHRoaXMuRik7ZCh0aGlzLm8pfX07dmEucHJvdG90eXBlLko9ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBkKGgsbSxEKXtmb3IodmFyIE09CltdLE89MjtPPGFyZ3VtZW50cy5sZW5ndGg7KytPKU1bTy0yXT1hcmd1bWVudHNbT107KE89aC5nZXQobSkpJiZPLmxlbmd0aCYmTy5mb3JFYWNoKGZ1bmN0aW9uKE4pe04uYXBwbHkobnVsbCxGYihNKSl9KX1mb3IodmFyIGU9W10sZj0xO2Y8YXJndW1lbnRzLmxlbmd0aDsrK2YpZVtmLTFdPWFyZ3VtZW50c1tmXTt0aGlzLk0uc2V0LmFwcGx5KHRoaXMuTSxbYV0uY29uY2F0KEZiKGUpKSk7ZC5hcHBseShudWxsLFt0aGlzLm8sYV0uY29uY2F0KEZiKGUpKSk7ZC5hcHBseShudWxsLFt0aGlzLkYsYV0uY29uY2F0KEZiKGUpKSk7dGhpcy5vLmRlbGV0ZShhKX07Q2EucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dmFyIGM9MCxkO2lmKDA9PWEubGVuZ3RoKXJldHVybiBjO3ZhciBlPTA7Zm9yKGQ9YS5sZW5ndGg7ZTxkO2UrKyl7dmFyIGY9YS5jaGFyQ29kZUF0KGUpO2M9KGM8PDUpLWMrZjtjfD0wfXJldHVybiBNYXRoLmFicyhjKX07Q2EucHJvdG90eXBlLnlhPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8KMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuYXx8IngiKX07Q2EucHJvdG90eXBlLmk9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX07Q2EucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhLDEwKTtyZXR1cm4gNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hP1N0cmluZy5mcm9tQ2hhckNvZGUoYSk6MD49CmE/IiI6NjU+YT90aGlzLmIoYSs2NSk6OTA8YT90aGlzLmIoTWF0aC5yb3VuZChhLzIpKTphLnRvU3RyaW5nKCl9O0NhLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1hLmxlbmd0aC0xLGQ9IiI7MDw9YztkKz1hW2MtLV0pO3JldHVybiBkfTtDYS5wcm90b3R5cGUuYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZyh0aGlzLnlhKCkpO2E9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpO2Zvcih2YXIgYz0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYys9dGhpcy5iKGFbZF0pOzA9PWMubGVuZ3RoJiYoYz0iem9yayIpO3JldHVybiBjfTtDYS5wcm90b3R5cGUuYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmEoKSsiMiJ9O0NhLnByb3RvdHlwZS5mPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nKHRoaXMuaSgpKTthPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKTtmb3IodmFyIGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWMrPQp0aGlzLmIoYVtkXSk7MD09Yy5sZW5ndGgmJihjPSJ6b3JrIik7cmV0dXJuIGN9O29iLnByb3RvdHlwZS5tPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXdpbmRvdzshdGhpcy5iOyl7dHJ5e2lmKGEuZnJhbWVzLl9fdGNmYXBpTG9jYXRvcnx8YS5mcmFtZXMuX19jbXBMb2NhdG9yKXRoaXMuYj1hfWNhdGNoKGMpe31pZihhPT09d2luZG93LnRvcClicmVhaztpZihhPT09YS5wYXJlbnQpYnJlYWs7YT1hLnBhcmVudH13aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5jLmJpbmQodGhpcykpfTtvYi5wcm90b3R5cGUuZj1mdW5jdGlvbihhLGMsZCxlKXtpZih0aGlzLmIpe3ZhciBmPU1hdGgucmFuZG9tKCkrIiI7YT17X190Y2ZhcGlDYWxsOntjb21tYW5kOmEscGFyYW1ldGVyOmUsdmVyc2lvbjpjLGNhbGxJZDpmfX07dGhpcy5hW2ZdPWQ7dGhpcy5iLnBvc3RNZXNzYWdlKGEsIioiKX1lbHNlIGQoe21zZzoiQ01QIG5vdCBmb3VuZCJ9LCExKX07b2IucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7dmFyIGM9Cnt9O2lmKCJzdHJpbmciPT09dHlwZW9mIGEuZGF0YSl0cnl7Yz1KU09OLnBhcnNlKGEuZGF0YSl9Y2F0Y2goZCl7fWVsc2UgYz1hLmRhdGE7YyYmYy5fX3RjZmFwaVJldHVybiYmKGE9Yy5fX3RjZmFwaVJldHVybikmJmEuY2FsbElkJiZ0aGlzLmEmJnRoaXMuYVthLmNhbGxJZF0mJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmFbYS5jYWxsSWRdJiYodGhpcy5hW2EuY2FsbElkXShhLnJldHVyblZhbHVlLGEuc3VjY2VzcyksZGVsZXRlIHRoaXMuYVthLmNhbGxJZF0pfTtvYi5wcm90b3R5cGUubD1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYztGYyhmdW5jdGlvbihkKXtjPWEuZi5iaW5kKGEpOyFhLmImJndpbmRvdy5fX3RjZmFwaSYmKGM9d2luZG93Ll9fdGNmYXBpKTtyZXR1cm4gZC5yZXR1cm4obmV3IFByb21pc2UoZnVuY3Rpb24oZSl7YygiZ2V0VENEYXRhIiwyLGZ1bmN0aW9uKGYsaCl7aD8odGhpcy5pPWYsdGhpcy5lYz1mLnRjU3RyaW5nLHRoaXMuV2M9dGhpcy5pLmdkcHJBcHBsaWVzLAplKHRoaXMuZWMpKTplKCExKX0uYmluZChhKSl9KSl9KX07b2IucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLmwoKX07Zy5VYT1uZXcgb2I7Zy5VYS5nKCk7dS5wcm90b3R5cGUuTmI9ZnVuY3Rpb24oYSl7dGhpcy5nPWF9O3UucHJvdG90eXBlLiRiPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nLm1pblZpczt0aGlzLmdbdGhpcy5iYV0mJnRoaXMuZ1t0aGlzLmJhXS5taW5WaXMmJihhPXRoaXMuZ1t0aGlzLmJhXS5taW5WaXMpO3JldHVybiBhfTt1LnByb3RvdHlwZS5UZT1mdW5jdGlvbigpeyJwcmVyb2xsIj09Zy5qLlUmJmcuai50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLk8oKSwhMCk7dGhpcy5PZSgpO2cuai5hKHYudSx0aGlzLmIoKSl9O3UucHJvdG90eXBlLmVhPWZ1bmN0aW9uKGEsYyxkKXt2YXIgZT10aGlzO2cuai5NKCkmJigodGhpcy5jPWcuai5GZCl8fGcuai50cmFjaygidnJ0Y2x6cl9ub2ludGVyYWN0aW9uIiwiIiwhMCkpOyJ2ZXJ0aWNhbGl6ciI9PT0KYSYmKHRoaXMuYz0hMCk7Zy5qLmZhPW51bGw7aWYodGhpcy5pLmIpdGhpcy5nYSsrLHRoaXMuaS5MYigpLGcuai5JYigpJiZ0aGlzLmdiKCkmJnRoaXMuaGIoKT90aGlzLlRiKCk6KGcuSC5nZXRDb25maWcoKSx0aGlzLmkuSmEmJnRoaXMuaS5hPyhnLmouQWIoYSksdGhpcy5jPyh0aGlzLlU9ITAsdGhpcy5sPW5ldyBXLHRoaXMuZmEoKSk6KHRoaXMuVGUoKSx0aGlzLmw9bmV3IFcoYSksdGhpcy5sLm9uKCJjb21wbGV0ZSIsZnVuY3Rpb24oaCl7aC55Yz9lLmZhKCk6ZS5GKCl9LCEwKSx0aGlzLmwub24oImVycm9yIixmdW5jdGlvbihoKXtlLnNhKGgpO2UuRigpfSwhMCkpKTp0aGlzLkYoKSk7ZWxzZXt2YXIgZj10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtmLmVhKGEsYyxkKX0sNTApfX07dS5wcm90b3R5cGUuZmE9ZnVuY3Rpb24oKXt0aGlzLkZhPXRoaXMuaWE9dGhpcy5wYT0hMTsodGhpcy5DPXRoaXMubD90aGlzLmwuWmMoKTpudWxsKT8oIndlbGVjdCI9PT10aGlzLkEmJmcudi5iKCJhZF9mYWxsYmFjayIpJiYKZy5qLnRyYWNrKCJzdGF0c193dF9hdmFpbGFibGUiLCEwLCEwKSx0aGlzLk9iKHRoaXMuQyksdGhpcy5HYih0aGlzLkMpLHRoaXMuWT10aGlzLkZiKHRoaXMuQyksdGhpcy4kZCgpKTp0aGlzLmM/dGhpcy5PYih0aGlzLkMpOnRoaXMudWMoKX07dS5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMubC5pLGQ9MDtkPGMubGVuZ3RoO2QrKyl0aGlzLmZiKGNbZF0sY1tkXS5lcnJvcik7dGhpcy5DIGluc3RhbmNlb2YgamEmJih0aGlzLkMuZXJyb3I9YSYmYSBpbnN0YW5jZW9mIEM/YTpuZXcgQyhDLkYpLHRoaXMuZmIodGhpcy5DLHRoaXMuQy5lcnJvcikpfTt1LnByb3RvdHlwZS5mYj1mdW5jdGlvbihhLGMpe3N3aXRjaChjLnR5cGUpe2Nhc2UgQy5nOmMuZGV0YWlscz09Qy5hLlRkP2cuai5hKHYuZ2EsdGhpcy5iKCkpOihnLmoubWEoKSxjLmRldGFpbHM9PUMuYS5RZC5jb2RlJiZnLmouYSh2LlUsdGhpcy5iKCkpKTtnLmouYSh2Lk8sdGhpcy5iKCkpO3RoaXMuUGUoKTsKdGhpcy5vKCJlbXB0eSIpOyJ3ZWxlY3QiPT09dGhpcy5BJiZnLnYuYigiYWRfZmFsbGJhY2siKSYmZy5qLnRyYWNrKCJzdGF0c193dF9hdmFpbGFibGUiLCExLCEwKTt0aGlzLmkuUyYmZy5qLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuaS5TLCEwKTticmVhaztjYXNlIEMuYjpnLmouYSh2LmRhLHRoaXMuYigpKTt0aGlzLm8oInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSBDLkI6Zy5qLmEodi5oYSx0aGlzLmIoKSk7dGhpcy5vKCJ3cmFwcGVybGltaXQiKTticmVhaztjYXNlIEMubzpnLmouYSh2LmlhLHRoaXMuYigpKTt0aGlzLm8oInhtbHBhcnNlIik7YnJlYWs7Y2FzZSBDLmk6Zy5qLmEodi5pLHRoaXMuYigpKTt0aGlzLm8oIm5vbWVkaWEiKTticmVhaztjYXNlIEMubTpnLmouYSh2LmksdGhpcy5iKCkpO3RoaXMubygibWVkaWFlcnJvciIpO2JyZWFrO2Nhc2UgQy5mOmcuai5hKHYuYmEsdGhpcy5iKCkpO3RoaXMubygiZHVtbXlhZCIpO2JyZWFrOwpjYXNlIEMubDpnLmouYSh2LlosdGhpcy5iKCkpO3RoaXMubygiZHVyYXRpb24iKTticmVhaztjYXNlIEMuYzpnLmouYSh2LmksdGhpcy5iKCkpO2MmJmMuZGF0YSYmYy5kYXRhLmRldGFpbHMmJmMuZGF0YS5kZXRhaWxzLmNvZGU9PUMuYS5uZC5jb2RlP3RoaXMubygiT05MWV9NRVpaQU5JTkUiKTp0aGlzLm8oIk5PX1BMQVlBQkxFX0FEUyIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5vKCJ1bmtub3duIil9YSYmYS5qYSYmdGhpcy52ZShhLGEuZXJyb3IudHlwZS5jb2RlKX07dS5wcm90b3R5cGUudmU9ZnVuY3Rpb24oYSxjKXthPWEuamEuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiJlcnJvciI9PT1lLmlkfSk7aWYoOTAxPGN8fDE+YyljPTkwMDtmb3IoYz17IltFUlJPUkNPREVdIjpjfTthLmxlbmd0aDspdHJ5e3ZhciBkPWEucG9wKCk7dGhpcy5kYShkLnVybCxkLnR5cGUsYyl9Y2F0Y2goZSl7fX07dS5wcm90b3R5cGUuR2I9ZnVuY3Rpb24oYSl7aWYoYSl7YS5vcmlnaW4mJihhPWEub3JpZ2luKTsKaWYoYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgdSl0cnl7dGhpcy5oYT10aGlzLnplKGEpfWNhdGNoKGMpe310aGlzLkdiKGEucGFyZW50KX19O3UucHJvdG90eXBlLkZiPWZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgdXx8KGM9dGhpcy5GYihhLnBhcmVudCkpLGMucHVzaCh0aGlzLndlKGEpKSk7cmV0dXJuIGN9O3UucHJvdG90eXBlLndlPWZ1bmN0aW9uKGEpe3ZhciBjPSIiLGQ9W107aWYoYSYmYS5SYSYmYS5SYS5nZXRBdHRyaWJ1dGUpe2M9YS5SYS5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQucHVzaChhW2VdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmMsY3JlYXRpdmVJRDpkfX07dS5wcm90b3R5cGUuemU9CmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ9W10sZT0iIjtpZihhLlJhKXt2YXIgZj1hLlJhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7dmFyIGg9YS5SYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlJhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGU9YS5SYS5nZXRBdHRyaWJ1dGUoImlkIiksZC5wdXNoKGUpKTthLlJhLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZT1hLlJhLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGQucHVzaChlKSk7Zm9yKHZhciBtPTA7bTxoLmxlbmd0aDttKyspaFttXS5nZXRBdHRyaWJ1dGUoImlkIikmJihlPWhbbV0uZ2V0QXR0cmlidXRlKCJpZCIpLGQucHVzaChlKSksaFttXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGU9aFttXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxkLnB1c2goZSkpO2ZvcihtPTA7bTxmLmxlbmd0aDttKyspYy5wdXNoKGEuQmQoZlttXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmQsYWRJZDplfX07dS5wcm90b3R5cGUuU2E9CmZ1bmN0aW9uKCl7dGhpcy5NPSExfTt1LnByb3RvdHlwZS5NYz1mdW5jdGlvbigpe3RoaXMucy5yZW1vdmVDaGlsZCh0aGlzLmYpO3RoaXMubT10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5XPSExO3RoaXMuS2IodGhpcy5kaXNwbGF5KTt0aGlzLmRpc3BsYXkucmVtb3ZlKCl9O3UucHJvdG90eXBlLk9iPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuYS5ZYygpLGQ9Zy52LmIoImNvbnRhaW5lci5zdHlsZSIpLGU9cGFyc2VJbnQoZy52LmIoInpJbmRleCIpfHwxRTQsMTApOy0tZTtkJiZnLmoucWEoYyxkKyIiKTtjLnpJbmRleD1lO3RoaXMucz1jO2cudi5iKCJza2lwT2Zmc2V0IikmJiF0aGlzLkMuWGImJih0aGlzLkMuWGI9Zy52LmIoInNraXBPZmZzZXQiKSk7dGhpcy5kaXNwbGF5PW51bGw7dGhpcy5kaXNwbGF5PXRoaXMuZWUoYSk7dGhpcy5kaXNwbGF5LkNlKGEpO3RoaXMuZGlzcGxheS5qZCh0aGlzLmEpO3RoaXMuZGlzcGxheS5FZSh0aGlzLlMoKSk7dGhpcy5kaXNwbGF5LkZlKGMpOwp0aGlzLlJjJiZ0aGlzLnBsYXllci5YYygpJiZ0aGlzLmRpc3BsYXkuR2UodGhpcy5wbGF5ZXIuWGMoKS8xMDApO3RoaXMuUWModGhpcy5kaXNwbGF5KTt0aGlzLmRpc3BsYXkuVigpPyh0aGlzLkxlKHRoaXMuTygpKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGcudi5iKCJpbm5lcldhcnBwZXIuc3R5bGUiKT9hLnN0eWxlPWcudi5iKCJpbm5lcldhcnBwZXIuc3R5bGUiKSsiIjooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIix0aGlzLmMmJihhLnN0eWxlLnRvcD0iOHB4IixhLnN0eWxlLmxlZnQ9IjhweCIsYS5zdHlsZS53aWR0aD0iY2FsYygxMDAlIC0gMTZweCkiLGEuc3R5bGUuaGVpZ2h0PSJjYWxjKDEwMCUgLSAxNnB4KSIsYS5zdHlsZS5ib3JkZXI9IjFweCBzb2xpZCB3aGl0ZSIpKSx0aGlzLmY9dGhpcy5zLmFwcGVuZENoaWxkKGEpLHRoaXMuYyYmdGhpcy5kaXNwbGF5IGluc3RhbmNlb2YKUiYmdGhpcy5hLlZjKCEwKSx0aGlzLmRpc3BsYXkuc2IodGhpcy5mKSk6dGhpcy5LYih0aGlzLmRpc3BsYXkpfTt1LnByb3RvdHlwZS5qZD1mdW5jdGlvbihhKXt0aGlzLmE9YX07dS5wcm90b3R5cGUuZWU9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxkPW51bGwsZT1udWxsLGY9bnVsbDtpZihhJiZhLnUoKSl7dHJ5eyhlPXRoaXMuYS5ULmdldFJhd1BsYXllcigpKSYmZS5lbnZ2YXJzJiYoZj1lLmVudnZhcnMoKSk7Zi52aWRlb1Nsb3R8fChlPXRoaXMuYS5UKSYmZS53YyYmKGY9ZS53YygpKTtpZihmLnZpZGVvU2xvdClyZXR1cm4gZD1uZXcgT2EsZC5zKGYudmlkZW9TbG90KSxkO3Rocm93InZpZGVvVGFnIjt9Y2F0Y2goaCl7ZD1uZXcgTH1nLnFjP2Q9bmV3IG9hOmQ9bmV3IEx9ZWxzZSBhJiZhLmYoKT8odGhpcy5HYT0hMCxkPW5ldyBWKTp0aGlzLmMmJihnLkNjPyhkPWcuQ2MsZC5jb250aW51ZSgpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRWIuYmluZCh0aGlzKSwwKSk6ZD1uZXcgUiwKdGhpcy5DPW5ldyBqYShbXSxbXSxbXSxudWxsKSx0aGlzLkMuWGI9NSx0aGlzLmEuZyhmdW5jdGlvbihoKXtjLmRpc3BsYXkucmVzaXplKGgpfSkpO3JldHVybiBkfTt1LnByb3RvdHlwZS5RYz1mdW5jdGlvbihhKXt2YXIgYz10aGlzO2Eub24oYS5ldmVudC5ZYix0aGlzLkViLmJpbmQodGhpcykpO2Eub24oYS5ldmVudC5wYyx0aGlzLnRlLmJpbmQodGhpcykpO2Eub24oYS5ldmVudC5HYyx0aGlzLkJiLmJpbmQodGhpcykpO2Eub24oYS5ldmVudC5LYyx0aGlzLmxiLmJpbmQodGhpcykpO2Eub24oYS5ldmVudC5FYyx0aGlzLnpiLmJpbmQodGhpcykpO2Eub24oYS5ldmVudC5GYyx0aGlzLkFiLmJpbmQodGhpcykpO2Eub24oYS5ldmVudC5IYyx0aGlzLkNiLmJpbmQodGhpcykpO2Eub24oYS5ldmVudC5MYyx0aGlzLm5iLmJpbmQodGhpcykpO2Eub24oYS5ldmVudC5wZCx0aGlzLnJlLmJpbmQodGhpcykpO2Eub24oYS5ldmVudC5xZCx0aGlzLm9iLmJpbmQodGhpcykpO2Eub24oYS5ldmVudC5tYywKdGhpcy55Yi5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuT2EsdGhpcy5mZS5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuUGEsdGhpcy5xZS5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQuSWMsdGhpcy5uYS5iaW5kKHRoaXMpKTthLm9uKGEuZXZlbnQub2QsdGhpcy5vYS5iaW5kKHRoaXMpKTt0aGlzLmMmJihhLm9uKCJjbG9zZSIsZnVuY3Rpb24oKXtjLmtjKCk7Yy5hLlZjKCExKTtjLmYuc3R5bGUudG9wPSIwIjtjLmYuc3R5bGUubGVmdD0iMCI7Yy5mLnN0eWxlLndpZHRoPSIxMDAlIjtjLmYuc3R5bGUuaGVpZ2h0PSIxMDAlIjtjLmYuc3R5bGUuYm9yZGVyPSJub25lIn0pLGEub24oInVuY2xvc2UiLGZ1bmN0aW9uKCl7Yy5hLlZjKCEwKTtjLmYuc3R5bGUudG9wPSI4cHgiO2MuZi5zdHlsZS5sZWZ0PSI4cHgiO2MuZi5zdHlsZS53aWR0aD0iY2FsYygxMDAlIC0gMTZweCkiO2MuZi5zdHlsZS5oZWlnaHQ9ImNhbGMoMTAwJSAtIDE2cHgpIjtjLmYuc3R5bGUuYm9yZGVyPSIxcHggc29saWQgd2hpdGUifSksCmEub24oIlNIT1dDT05UUk9MUyIsZnVuY3Rpb24oKXt0aGlzLkcoKTt0aGlzLkQoKX0uYmluZCh0aGlzKSkpfTt1LnByb3RvdHlwZS5LYj1mdW5jdGlvbihhKXthLmcoYS5ldmVudC5ZYik7YS5nKGEuZXZlbnQucGMpO2EuZyhhLmV2ZW50LkdjKTthLmcoYS5ldmVudC5LYyk7YS5nKGEuZXZlbnQuRWMpO2EuZyhhLmV2ZW50LkZjKTthLmcoYS5ldmVudC5IYyk7YS5nKGEuZXZlbnQuTGMpO2EuZyhhLmV2ZW50Lk9hKTthLmcoYS5ldmVudC5QYSl9O3UucHJvdG90eXBlLkViPWZ1bmN0aW9uKCl7dGhpcy5QYygpO3RoaXMuYS5NKCk7dGhpcy5kaXNwbGF5IGluc3RhbmNlb2YgVnx8dGhpcy5MZCgpO3RoaXMuTWQoKTt0aGlzLmpiKCk7dGhpcy5hLkQoKTt0aGlzLkJlKCk7dGhpcy5jJiZ0aGlzLnUoKX07dS5wcm90b3R5cGUudGU9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5hLlQ7YT1hLmN1cnJlbnRUaW1lO3RoaXMuVmI9ITA7Yy5IYSYmYy5IYSgpJiZnLmouYSh2LmIsdGhpcy5iKCkpO2M9TWF0aC5mbG9vcihhKTsKdGhpcy5JZChjKTtpZighdGhpcy5pYSl7YT0yRTM7dmFyIGQ9NTAsZT1nLnYuYigidmlld2FibGVJbXByZXNzaW9uIik7ZSYmKGUucGVyY2VudCYmKGQ9ZS5wZXJjZW50KSxlLnRpbWVNUyYmKGE9ZS50aW1lTVMpKTt0aGlzLmlhPXtkaXNwbGF5OnRoaXMuZGlzcGxheSxjYjpmdW5jdGlvbigpe3RoaXMuRmE9ITA7Zy5qLmEodi5lYSx0aGlzLmIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YSxwZXJjZW50OmQsc3RhcnRUaW1lOiExfTtnLmouR2EodGhpcy5pYSl9YT0iIjt0aGlzLkMuWGImJihkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpKSYmKGM9dGhpcy5DLlhiLWMsMDxjP2E9Zy52LmIoInNraXBhYmxlQnV0dG9uIik6KGE9Zy52LmIoInNraXBCdXR0b24iKSx0aGlzLld8fCh0aGlzLlc9ITAsZy5qLnRyYWNrKCJ2cnRjbHpyX3NraXBfYWN0aXZlIiwiIiwhMCksZC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmRpc3BsYXkuZWEoKTsKdGhpcy50cmFjaygic2tpcCIpO2cuai5hKHYuYyx0aGlzLmIoKSk7dGhpcy5DLnRkPyh0aGlzLk1jKCksdGhpcy5DLm9yaWdpbi50ZigpKTp0aGlzLkYoKX0uYmluZCh0aGlzKSkpKSx0aGlzLmRpc3BsYXkuRyhhKSYmKGE9dGhpcy5kaXNwbGF5LkcoYSkpLGE9YS5yZXBsYWNlKCJbdGltZV0iLGMpLGQuaW5uZXJIVE1MPWEpO3RoaXMubSYmKGM9dGhpcy5kaXNwbGF5LmdldER1cmF0aW9uKCksYT10aGlzLmRpc3BsYXkuZ2V0Q3VycmVudFRpbWUoKSx0aGlzLm0uaW5uZXJIVE1MPXRoaXMuWi5yZXBsYWNlKCJbdGltZV0iLGcuai53YShjLWEpKSx0aGlzLmMmJnRoaXMudSgpKX07dS5wcm90b3R5cGUuemI9ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX07dS5wcm90b3R5cGUuQmI9ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5QfHx0aGlzLlFlKCk7Zy5qLmEodi5tLHRoaXMuYigpKX07dS5wcm90b3R5cGUubGI9ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIiwKZnVuY3Rpb24oKXt0aGlzLlNiKCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5TYigpfS5iaW5kKHRoaXMpKTt0aGlzLnRyYWNrKCJzdGFydCIpO3RoaXMuaS5vJiZ0aGlzLmNhKCJzdGFydCIpO2cuai5hKHYuQSx0aGlzLmIoKSk7dGhpcy5jJiZ0aGlzLkQoKX07dS5wcm90b3R5cGUuQWI9ZnVuY3Rpb24oKXt0aGlzLmkubyYmKGcuai50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5jYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMucGE9ITApO3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTtnLmouYSh2LmwsdGhpcy5iKCkpfTt1LnByb3RvdHlwZS5DYj1mdW5jdGlvbigpe3RoaXMuaS5vJiYoZy5qLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5jYSgibWlkcG9pbnQiKSk7dGhpcy50cmFjaygibWlkcG9pbnQiKTtnLmouYSh2LkYsdGhpcy5iKCkpfTt1LnByb3RvdHlwZS5uYj0KZnVuY3Rpb24oKXt0aGlzLmkubyYmKGcuai50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5jYSgidGhpcmRRdWFydGlsZSIpKTt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zy5qLmEodi5ELHRoaXMuYigpKX07dS5wcm90b3R5cGUucmU9ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zy5qLmEodi5jLHRoaXMuYigpKX07dS5wcm90b3R5cGUub2I9ZnVuY3Rpb24oKXtnLmouYSh2LkcsdGhpcy5iKCkpO3RoaXMuZGlzcGxheSYmdGhpcy5kaXNwbGF5LmdldEN1cnJlbnRUaW1lJiZ0aGlzLmRpc3BsYXkuZ2V0RHVyYXRpb24mJnRoaXMuSmQodGhpcy5kaXNwbGF5LmdldEN1cnJlbnRUaW1lKCksdGhpcy5kaXNwbGF5LmdldER1cmF0aW9uKCkpfTt1LnByb3RvdHlwZS5uYT1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuemEpO2EmJihhLmlubmVySFRNTD10aGlzLmcucGxheUJ1dHRvbik7dGhpcy5CJiYodGhpcy5CLnN0eWxlLmRpc3BsYXk9CiJibG9jayIsdGhpcy5LKCksdGhpcy51KCkpO3RoaXMudHJhY2soInBhdXNlIiwhMCk7Zy5qLmEodi5CLHRoaXMuYigpKX07dS5wcm90b3R5cGUub2E9ZnVuY3Rpb24oKXsid2VsZWN0Ij09PXRoaXMuQSYmKHRoaXMuVT0hMSx0aGlzLkcoKSk7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy56YSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuZy5wYXVzZUJ1dHRvbik7dGhpcy5CJiYodGhpcy5CLnN0eWxlLmRpc3BsYXk9Im5vbmUiKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtnLmouYSh2LnMsdGhpcy5iKCkpO3RoaXMuYyYmdGhpcy5EKCl9O3UucHJvdG90eXBlLkRiPWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy50YSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuZy51bm11dGVCdXR0b24pO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlFiKCJtdXRlZCIpO2cuai5hKHYuWGEsdGhpcy5iKCkpfTt1LnByb3RvdHlwZS5wYj1mdW5jdGlvbigpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnRhKTthJiYoYS5pbm5lckhUTUw9dGhpcy5nLm11dGVCdXR0b24pO3RoaXMudHJhY2soInVubXV0ZSIsITApO3RoaXMuUWIoInVubXV0ZWQiKTtnLmouYSh2LiRhLHRoaXMuYigpKX07dS5wcm90b3R5cGUueWI9ZnVuY3Rpb24oYSl7dGhpcy5hLlQmJnRoaXMuYS5ULnpkJiZ0aGlzLmEuVC56ZCgpO2lmKGcuai5yYSgpJiYibm9uZSI9PT10aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXkpdGhpcy5jJiYodGhpcy5VPSExKSx0aGlzLkcoKTtlbHNlIGlmKGF8fHRoaXMuQy5VYil7dHJ5e3ZhciBjPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuQy50Y3x8KHRoaXMuQy50Yz0xKTtpZigxMDA+Yy10aGlzLkMudGMpcmV0dXJuO3RoaXMuQy50Yz1jfWNhdGNoKGQpe31nLmouYSh2Lk0sdGhpcy5iKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTthPSJfdG9wIjtpZih0aGlzLmkuZGF8fCJ3ZWxlY3QiPT09dGhpcy5BKWE9Il9ibGFuayI7CndpbmRvdy5vcGVuKHRoaXMuQy5VYixhKX19O3UucHJvdG90eXBlLmZlPWZ1bmN0aW9uKCl7aWYodGhpcy5DKWcuSC5vJiYhdGhpcy5QJiYoZy5qLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCksdGhpcy5jYSgiY29tcGxldGUiKSksdGhpcy50cmFjaygiY29tcGxldGUiKSxnLmouYSh2LmYsdGhpcy5iKCkpLHRoaXMuRigpO2Vsc2UgaWYodGhpcy5jKXt0aGlzLk09ITE7dGhpcy5nYSsrO3RyeXt0aGlzLmRpc3BsYXkucmVtb3ZlKCl9Y2F0Y2goYSl7fXRyeXt0aGlzLnMucmVtb3ZlQ2hpbGQodGhpcy5mKX1jYXRjaChhKXt9dGhpcy5tPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLlc9ITE7dGhpcy5kaXNwbGF5LnBhdXNlKCk7dGhpcy5hLmMoKTt0aGlzLlZiPSExO3RoaXMuUygpLmZkKCk7dGhpcy5tYSgpfX07dS5wcm90b3R5cGUucWU9ZnVuY3Rpb24oYSl7YSBpbnN0YW5jZW9mIEM/KHRoaXMuc2EoYSksdGhpcy5GKCEwKSk6KCJ2cGFpZGVycm9yIj09YSYmKHRoaXMubygidnBhaWRlcnJvciIpLApnLmouYSh2LmZhLHRoaXMuYigpKSx0aGlzLkYoKSksInZlcnRpY2FsaXpyIj09YSYmdGhpcy5GKCksIk5PT1BWSURFTyI9PWEmJih0aGlzLlA9ITAsdGhpcy5GKCkpLGE9PUMuaSYmdGhpcy5zYShDLmkpLCJwbGF5cHJvbWlzZUZhaWxlZCIhPWF8fHRoaXMubGF8fHRoaXMuRigpKX07dS5wcm90b3R5cGUuQmU9ZnVuY3Rpb24oKXt0aGlzLmxhfHx0aGlzLk5jKCl9O3UucHJvdG90eXBlLk5jPWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LnBsYXkoKTt0aGlzLlMoKS5rZCh0aGlzKX07dS5wcm90b3R5cGUuT2M9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPVtdLGQsZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9Zy5qLmlhKGFbZV0pLGMucHVzaChkKTthPXtoYXNoZXM6Y307YT12LmEoYSx0aGlzLnFhKCkpO2cuai4kYihhKX07dS5wcm90b3R5cGUuRj1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/ITE6YTt0aGlzLkMmJnRoaXMuQy5HZCYmdGhpcy5PYyh0aGlzLkMuR2QpO2lmKCF0aGlzLk0paWYodGhpcy5NPQohMCx0aGlzLkZhfHwoZy5qLmEodi5XLHRoaXMuYigpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSwhdGhpcy5sfHx0aGlzLmwuY3x8dGhpcy5sLmx8fHRoaXMubC5BKXt0aGlzLk09ITE7dGhpcy5nYSsrO3RyeXt0aGlzLmRpc3BsYXkucmVtb3ZlKCl9Y2F0Y2goYyl7fXRyeXt0aGlzLnMucmVtb3ZlQ2hpbGQodGhpcy5mKX1jYXRjaChjKXt9dGhpcy5tPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLlc9ITE7dHJ5e3RoaXMuZGlzcGxheS5wYXVzZSgpfWNhdGNoKGMpe310aGlzLmEuYygpO3RoaXMuVmI9ITE7dGhpcy5TKCkuZmQoKTtpZih0aGlzLmwmJnRoaXMubC55YyYmdGhpcy5sLmMpdGhpcy5mYSgpO2Vsc2V7aWYodGhpcy5sJiZ0aGlzLmwubCYmYSl7aWYodGhpcy5sLnljKXt0aGlzLmZhKCk7cmV0dXJufWlmKHRoaXMubC5BKXt0aGlzLmwuVSgpO3JldHVybn19dGhpcy51YygpfX1lbHNlIHRoaXMudWMoKX07dS5wcm90b3R5cGUuYj1mdW5jdGlvbigpe3RyeXt2YXIgYT1PYmplY3QuYXNzaWduKHt9LAp0aGlzLkMmJnRoaXMuQy5jZT90aGlzLkMub2M6bnVsbCx0aGlzLmEuVC5DYSgpLHRoaXMucWIoKSx0aGlzLnFhKCkpfWNhdGNoKGMpe2E9e319cmV0dXJuIGF9O3UucHJvdG90eXBlLlNiPWZ1bmN0aW9uKCl7dGhpcy5KYnx8KHRoaXMuSmI9ITAsdGhpcy5wYXx8Zy5qLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX07dS5wcm90b3R5cGUuSWQ9ZnVuY3Rpb24oYSl7dGhpcy5vYigpO2E9PXRoaXMuS2F8fHRoaXMuUHx8KDA9PWEmJih0aGlzLkJiKCksdGhpcy56YigpLHRoaXMubGIoKSksYT09TWF0aC5mbG9vcih0aGlzLkMuZHVyYXRpb24vNCkmJnRoaXMuQWIoKSxhPT1NYXRoLmZsb29yKHRoaXMuQy5kdXJhdGlvbi8yKSYmdGhpcy5DYigpLGE9PU1hdGguZmxvb3IoMyp0aGlzLkMuZHVyYXRpb24vNCkmJnRoaXMubmIoKSx0aGlzLkthPWEpfTt1LnByb3RvdHlwZS5MZT1mdW5jdGlvbihhKXtnLmoudHJhY2soInN0YXRzX2hkX2FkX3NldHVwIiwKYSwhMCl9O3UucHJvdG90eXBlLk9lPWZ1bmN0aW9uKCl7Zy5qLlkoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5PKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfTt1LnByb3RvdHlwZS5RZT1mdW5jdGlvbigpe2cuai5ZKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuTygpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX07dS5wcm90b3R5cGUuUGU9ZnVuY3Rpb24oKXtnLmouWShbInN0YXRzX2hkX2FkX2VtcHR5OiIrdGhpcy5PKCksInN0YXRzX2hkX2FkX2VtcHR5X3N1bSJdKX07dS5wcm90b3R5cGUubz1mdW5jdGlvbihhKXtnLmouWShbInN0YXRzX2hkX2FkX2Vycm9yOiIrYSwic3RhdHNfaGRfYWRfZXJyb3Jfc3VtIl0pfTt1LnByb3RvdHlwZS5jYT1mdW5jdGlvbihhKXsodGhpcy5HYXx8dGhpcy5pLm8pJiZnLmoudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLk8oKSwhMCl9O3UucHJvdG90eXBlLlFiPWZ1bmN0aW9uKGEpe3RoaXMuaS5vJiYKZy5qLnRyYWNrKCJzdGF0c19oZF8iK2EsImNvbnRlbnQiLCEwKX07dS5wcm90b3R5cGUuSmQ9ZnVuY3Rpb24oYSxjKXthPU1hdGguZmxvb3IoYSk7aWYoIXRoaXMuRGFbIl8iK2FdKXt2YXIgZD10aGlzLldhKHRoaXMuQy5qYSwicHJvZ3Jlc3MiKTt0aGlzLkRhWyJfIithXT1bXTtmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKyl7dmFyIGY9ZFtlXTthPT1nLmouZ2IoZi5vZmZzZXQsYykmJih0aGlzLmRhKGYudXJsLCJwcm9ncmVzcyIpLHRoaXMuRGFbIl8iK2FdLnB1c2goZikpfX19O3UucHJvdG90eXBlLnRyYWNrPWZ1bmN0aW9uKGEsYyl7Yz12b2lkIDA9PT1jPyExOmM7aWYoInByb2dyZXNzIiE9YSYmIXRoaXMuUCl7dGhpcy53YSYmdGhpcy53YS50cmFjayYmdGhpcy53YS50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJm51bGwhPWcuai5mYSYmZy5qLnRyYWNrKCJzdGF0c19oZF9hZHhfaW1wcmVzc2lvbiIsZy5qLmZhLnRvU3RyaW5nKCksITApO2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PQphfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7dmFyIGQ9YSsiSGFzQmVlblRyYWNrZWQiO2lmKHRoaXNbZF0pcmV0dXJuO3RoaXNbZF09ITB9ZD1bXTt0cnl7ZD10aGlzLldhKHRoaXMuQy5qYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgZT1kLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMua2E9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5oYS5pbXByZXNzaW9ucyYmZy5qLkpiKGUudXJsLHRoaXMuaGEuaW1wcmVzc2lvbnMpP3RoaXMuZGEoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGYpe3RyeXt2YXIgaD1mLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2cuai5hKHYubyx0aGlzLkMub2MsdGhpcy5hLlQuQ2EoKSx0aGlzLnFiKCkse2FkSWQ6dGhpcy5oYS5hZElkLGltcHJlc3Npb25VUkw6aH0sdGhpcy5xYSgpKX1jYXRjaChtKXt9fS5iaW5kKHRoaXMpKTp0aGlzLmRhKGUudXJsLGUudHlwZSl9Y2F0Y2goZil7fWlmKCFjKXRyeXt0aGlzLkMuamE9CnRoaXMuWmIodGhpcy5DLmphLGEpfWNhdGNoKGYpe319fTt1LnByb3RvdHlwZS5PPWZ1bmN0aW9uKCl7dmFyIGE9Zy5qLnJhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGM9IiI7Zy5qLnUmJihjPSJfcmVjeWNsZWQiKTt0aGlzLkdhJiYoYz0iX3ZwYWlkIik7IndlbGVjdCI9PT10aGlzLkEmJihjPSJfd2VsZWN0Iik7cmV0dXJuIGErY307dS5wcm90b3R5cGUuZGE9ZnVuY3Rpb24oYSxjLGQsZSl7ZD12b2lkIDA9PT1kP3t9OmQ7ZT12b2lkIDA9PT1lP251bGw6ZTt2YXIgZj12b2lkIDA9PT1mP251bGw6ZjtpZihhJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoKXt2YXIgaD10aGlzLmkuYyhhKTtkJiZoLmIoZCk7ZXx8KGU9dGhpcy54Yik7Znx8KGY9dGhpcy54Yik7ZD1mdW5jdGlvbigpe3RoaXMuTGIoYSk7ZSgpfS5iaW5kKHRoaXMpO3ZhciBtPWZ1bmN0aW9uKCl7dGhpcy5MYihhKTtmKCl9LmJpbmQodGhpcyk7Zy5qLmJhPygiaW1wcmVzc2lvbiIhPWN8fHRoaXMuaWJ8fCh0aGlzLmliPQohMCxjPWcuai5OKCJodHRwczovL2hvbWFkLXZhc3QtaW1wcmVzc2lvbnMuczMuYW1hem9uYXdzLmNvbS93ZWxlY3QuZGUuZ2lmP3NhbHQ9MC4iK2cuai5zKDE2KSxnLkgpLGM9dGhpcy5pLmMoYyksdGhpcy5pLmwoYyxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LCExLCEwKSksKG5ldyBJbWFnZSkuc3JjPWEpOih0aGlzLkRjKGEpLHRoaXMuaS5sKGgsZCxtLCExLCEwKSl9fTt1LnByb3RvdHlwZS5EYz1mdW5jdGlvbihhKXt0aGlzLk5bYV09Im9wZW4ifTt1LnByb3RvdHlwZS5MYj1mdW5jdGlvbihhKXt0aGlzLk5bYV09ImNsb3NlZCJ9O3UucHJvdG90eXBlLiRkPWZ1bmN0aW9uKCl7dGhpcy5OPXt9fTt1LnByb3RvdHlwZS5SZT1mdW5jdGlvbigpe3ZhciBhPTAsYztmb3IoYyBpbiB0aGlzLk4pdGhpcy5OLmhhc093blByb3BlcnR5KGMpJiYib3BlbiI9PXRoaXMuTltjXSYmYSsrO3JldHVybiBhfTt1LnByb3RvdHlwZS5XYT1mdW5jdGlvbihhLGMpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihkKXtyZXR1cm4gZC50eXBlPT0KY30pfTt1LnByb3RvdHlwZS5aYj1mdW5jdGlvbihhLGMpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihkKXtyZXR1cm4gZC50eXBlIT09Y30pfTt1LnByb3RvdHlwZS5QYz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5UO2EudWQmJmEudWQodGhpcy55Yi5iaW5kKHRoaXMpKX07dS5wcm90b3R5cGUuTGQ9ZnVuY3Rpb24oKXtpZighdGhpcy5tKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmdbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuZ1siY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPQoiOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO3RoaXMuYz9hLmlubmVySFRNTD0iV2VyYnVuZyI6YS5pbm5lckhUTUw9dGhpcy5aLnJlcGxhY2UoIlt0aW1lXSIsZy5qLndhKDApKTt2YXIgYz10aGlzLmdbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLmkuVyYmKGM9dGhpcy5pLlcpO2MmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMudS5iaW5kKHRoaXMpLDFFMypjKTt0aGlzLm09dGhpcy5mLmFwcGVuZENoaWxkKGEpO3RoaXMuYyYmKHRoaXMubS5zdHlsZS50cmFuc2Zvcm1PcmlnaW49ImJvdHRvbSBjZW50ZXIiLHRoaXMubS5zdHlsZS50cmFuc2Zvcm09InNjYWxlKDEuNSkiLHRoaXMudSgpKX19O3UucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXsodGhpcy5nWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuaS5XfHx0aGlzLmMpJiZ0aGlzLm0mJnRoaXMubS5zdHlsZSYmCih0aGlzLm0uc3R5bGUuZGlzcGxheT0ibm9uZSIpfTt1LnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5kaXNwbGF5LmdldER1cmF0aW9uKCksYz10aGlzLmRpc3BsYXkuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmRpc3BsYXkubCgpfHxhJiZjJiYodGhpcy5nWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuaS5XfHx0aGlzLmMpJiZ0aGlzLm0mJnRoaXMubS5zdHlsZSYmKHRoaXMubS5zdHlsZS5kaXNwbGF5PSJibG9jayIpfTt1LnByb3RvdHlwZS5NZD1mdW5jdGlvbigpe2lmKCFnLmouY2EodGhpcy5jb250cm9scykpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLmJlO3RoaXMuZ1siY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuZ1siY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0KIkFyaWFsLCBWZXJkYW5hIixjLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkcoKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLksoKTt0aGlzLnUoKX0uYmluZCh0aGlzKSk7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5nWyJwbGF5UGF1c2Uuc3R5bGUiXT9kLnN0eWxlPXRoaXMuZ1sicGxheVBhdXNlLnN0eWxlIl06KGQuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxkLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZC5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtkLmlkPXRoaXMuemE7ZC5pbm5lckhUTUw9dGhpcy5nLnBhdXNlQnV0dG9uOwpkLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLlJiLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUmIuYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5HKCk7dGhpcy5EKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LKCk7dGhpcy51KCl9LmJpbmQodGhpcykpO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuZ1sibXV0ZS5zdHlsZSJdP2Uuc3R5bGU9dGhpcy5nWyJtdXRlLnN0eWxlIl06KGUuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGUuc3R5bGVbImZsb2F0Il09InJpZ2h0IixlLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2UuaWQ9dGhpcy50YTtlLmlubmVySFRNTD10aGlzLmcubXV0ZUJ1dHRvbjtlLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5TZS5iaW5kKHRoaXMpKTtlLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLkcoKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLksoKTt0aGlzLnUoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5nWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmdbInNraXAuc3R5bGUiXTp0aGlzLmRpc3BsYXkuSygpP2cuai5xYShmLHRoaXMuZGlzcGxheS5LKCkpOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksZi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGYuc3R5bGUudG9wPSItNTBweCIsZi5zdHlsZS5yaWdodD0iMHB4IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5QYjtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YXIgaD0KZi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7aCYmaFswXSYmKGhbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGg9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7aCYmaFswXSYmKGhbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGQpO3RoaXMuQy5YYiYmYy5hcHBlbmRDaGlsZChmKTtjLmFwcGVuZENoaWxkKGUpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7Zy5qLnJhKCl8fCh0aGlzLmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuRygpO3RoaXMuRCgpfS5iaW5kKHRoaXMpKSx0aGlzLmYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5LKCk7dGhpcy51KCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMuZi5hcHBlbmRDaGlsZChjKTt0aGlzLmdbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT8KYS5zdHlsZT10aGlzLmdbInJlc3VtZUNvbnRyb2wuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuekluZGV4PSIxMDAwMCIsYS5zdHlsZS5kaXNwbGF5PSJub25lIixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGMub25lcnJvcj1mdW5jdGlvbigpe3RoaXMuQiYmKHRoaXMuQi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmEuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy5CPXRoaXMuZi5hcHBlbmRDaGlsZChhKTt0aGlzLmEuZyhmdW5jdGlvbihoKXt0aGlzLkIuc3R5bGUuaGVpZ2h0PWguaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpO3RoaXMuYyYmKGQuc3R5bGUudHJhbnNmb3JtT3JpZ2luPSJib3R0b20gbGVmdCIsZC5zdHlsZS50cmFuc2Zvcm09InNjYWxlKDEuNSkiLGUuc3R5bGUudHJhbnNmb3JtT3JpZ2luPSJib3R0b20gcmlnaHQiLGUuc3R5bGUudHJhbnNmb3JtPSJzY2FsZSgxLjUpIik7dGhpcy5hLlQuRWEmJiF0aGlzLmMmJnRoaXMuYS5ULkVhKCkmJihnLmouYSh2LkssdGhpcy5iKCkpLHRoaXMuSWIoKSk7dGhpcy5LKCl9fTt1LnByb3RvdHlwZS5LPWZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn07dS5wcm90b3R5cGUuRz1mdW5jdGlvbigpeyJoaWRkZW4iPT10aGlzLmNvbnRyb2xzLnN0eWxlLnZpc2liaWxpdHl8fHRoaXMuQiYmImJsb2NrIj09dGhpcy5CLnN0eWxlLmRpc3BsYXl8fAp0aGlzLlV8fHRoaXMuZGlzcGxheS5sKCl8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9O3UucHJvdG90eXBlLlJiPWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LmlzUGF1c2VkKCk/KHRoaXMuZGlzcGxheS5wbGF5KCksdGhpcy5vYSgpKToodGhpcy5kaXNwbGF5LnBhdXNlKCksdGhpcy5uYSgpKX07dS5wcm90b3R5cGUua2M9ZnVuY3Rpb24oKXtpZighdGhpcy5kaXNwbGF5LmlzUGF1c2VkKCl8fHRoaXMuYyl0aGlzLmRpc3BsYXkucGF1c2UoKSx0aGlzLm5hKCl9O3UucHJvdG90eXBlLk1iPWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LmlzUGF1c2VkKCkmJih0aGlzLmRpc3BsYXkucGxheSgpLHRoaXMub2EoKSl9O3UucHJvdG90eXBlLlNlPWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LmViKCk/KHRoaXMuZGlzcGxheS4kYSgpLHRoaXMucGIoKSk6KHRoaXMuZGlzcGxheS5YYSgpLHRoaXMuRGIoKSl9O3UucHJvdG90eXBlLkliPWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5LmViKCl8fAoodGhpcy5kaXNwbGF5LlhhKCksdGhpcy5EYigpKX07dS5wcm90b3R5cGUuS2Q9ZnVuY3Rpb24oKXt0aGlzLmRpc3BsYXkuZWIoKSYmKHRoaXMuZGlzcGxheS4kYSgpLHRoaXMucGIoKSl9O3UucHJvdG90eXBlLnVjPWZ1bmN0aW9uKCl7aWYodGhpcy5nYigpKWlmKHRoaXMuaGIoKSl7aWYoZy5qLnRyYWNrKCJzdGF0c19oZF9iYWNrZmlsbF9hbGxvd2VkIiwid2VsZWN0IiwhMCksdGhpcy5UYigpKXt0aGlzLk09ITE7cmV0dXJufX1lbHNlIHRoaXMuV2QoKT9nLmoudHJhY2soInN0YXRzX2hkX2JhY2tmaWxsX2FsbG93ZWQiLCJ2ZXJ0aWNhbGl6ciIsITApOmcuai50cmFjaygic3RhdHNfaGRfYmFja2ZpbGxfYWxsb3dlZCIsIm5vbmUiLCEwKTtlbHNlIGcuai50cmFjaygic3RhdHNfaGRfYmFja2ZpbGxfYWxsb3dlZCIsImZhbHNlIiwhMCk7dGhpcy5sYT0hMDt0aGlzLm1hKCl9O3UucHJvdG90eXBlLmdiPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5pLkd8fGcuai5HYigpLGM9KCF0aGlzLmthfHwKdGhpcy5BZSgpKSYmIXRoaXMuQSxkPWcuai5GYigpLGU9InByZXJvbGwiPT09Zy5qLlU7cmV0dXJuIGEmJmMmJmQmJmV9O3UucHJvdG90eXBlLmhiPWZ1bmN0aW9uKCl7dmFyIGE9Zy52LmIoImFkX2ZhbGxiYWNrIik7YT1nLkguaWEmJmEmJmEudXJsO3ZhciBjPSFnLmoucmEoKTtyZXR1cm4gYSYmY307dS5wcm90b3R5cGUuV2Q9ZnVuY3Rpb24oKXtyZXR1cm4gZy5qLkYoKS5yYSYmZy5qLk0oKX07dS5wcm90b3R5cGUuQWU9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIHRoaXMuZGlzcGxheSYmMT50aGlzLmRpc3BsYXkuZ2V0RHVyYXRpb24oKSYmNT09PXRoaXMuQy5kdXJhdGlvbn1jYXRjaChhKXtyZXR1cm4hMX19O3UucHJvdG90eXBlLnhlPWZ1bmN0aW9uKCl7dmFyIGE9Zy52LmIoImFkX2ZhbGxiYWNrIiksYz1nLmouYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTsoYT1hP2EudXJsOm51bGwpfHwic3ZtcHJldmlldyIhPWMuYW5jaG9yfHwoYT0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0X3Rlc3QueG1sIik7CnJldHVybiBhfTt1LnByb3RvdHlwZS5UYj1mdW5jdGlvbigpe3ZhciBhPXRoaXMueGUoKTt0aGlzLkE9IndlbGVjdCI7dGhpcy5VPXRoaXMua2E9ITA7cmV0dXJuIGEmJihnLmoudHJhY2soInN0YXRzX2hkX2JhY2tmaWxsX3N0YXJ0Iiwid2VsZWN0IiwhMCksYT1nLkgubWEoYSksYT1nLmouTihhLHRoaXMuaSwhMSx7b25seVVSTDohMH0pKT8odGhpcy5lYShhLCEwLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwKTohMX07dS5wcm90b3R5cGUubWE9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hPyExOmE7dGhpcy5SZSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWEoITApfS5iaW5kKHRoaXMpLDIwMCk6KHRoaXMuZGlzcGxheSYmKHRoaXMuZGlzcGxheS5wYXVzZSgpLHRoaXMuYyYmdGhpcy5kaXNwbGF5JiZ0aGlzLmRpc3BsYXkucmVtb3ZlKCkpLHRoaXMuYS5jKCksdGhpcy5hLkcoKSx0aGlzLlZiPSExLGcuai5hKHYuTix0aGlzLmIoKSksdGhpcy5TKCkuZmQoKSl9Owp1LnByb3RvdHlwZS5TPWZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5UJiYoYT10aGlzLmEuVCk7cmV0dXJuIGF9O3UucHJvdG90eXBlLmpiPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy4kYigpO2EmJihnLmouRmEodGhpcy52aWRlbyxhKT90aGlzLk1iKCk6dGhpcy5rYygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qYigpfS5iaW5kKHRoaXMpLDEwMCkpfTt1LnByb3RvdHlwZS5xYj1mdW5jdGlvbigpe3ZhciBhPXt9O2lmKHRoaXMuQyl7YS5jbGlja3Rocm91Z2g9dGhpcy5DLlViO2EuZHVyYXRpb249dGhpcy5DLmR1cmF0aW9uO2EuYWRQb2Q9dGhpcy5DLnRkO3ZhciBjPXRoaXMuZGlzcGxheTtjJiYoYS5jdXJyZW50VGltZT1jLmdldEN1cnJlbnRUaW1lKCksYS52aWRlb19kdXJhdGlvbj10aGlzLmRpc3BsYXkuZ2V0RHVyYXRpb24oKSk7dGhpcy5ZJiYwPHRoaXMuWS5sZW5ndGgmJihhLmFkSWRzPXRoaXMuWSl9cmV0dXJuIGF9O3UucHJvdG90eXBlLnFhPQpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuWWQrIi0iK3RoaXMuZ2E7dGhpcy5DJiZ0aGlzLkMuQWQmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5DLkFkKCkpO3JldHVybiBhfTt1LnByb3RvdHlwZS54Yj1mdW5jdGlvbigpe307eShQLHZhKTtQLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7cmV0dXJuITB9O1AucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe307UC5wcm90b3R5cGUueGM9ZnVuY3Rpb24oKXt9O1AucHJvdG90eXBlLmdldEN1cnJlbnRUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIDB9O1AucHJvdG90eXBlLmdldER1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDB9O1AucHJvdG90eXBlLmw9ZnVuY3Rpb24oKXtyZXR1cm4hMX07UC5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe307UC5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt9O1AucHJvdG90eXBlLmlzUGF1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuITF9O1AucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7fTsKUC5wcm90b3R5cGUuJGE9ZnVuY3Rpb24oKXt9O1AucHJvdG90eXBlLmViPWZ1bmN0aW9uKCl7cmV0dXJuITF9O1AucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbigpe307UC5wcm90b3R5cGUuc2I9ZnVuY3Rpb24oKXt9O1AucHJvdG90eXBlLkdlPWZ1bmN0aW9uKGEpe3RoaXMuTj1hfTtQLnByb3RvdHlwZS5xYT1mdW5jdGlvbigpe3ZhciBhPSEwOy0xPT09dGhpcy5OJiYoYT0hMSk7cmV0dXJuIGF9O1AucHJvdG90eXBlLmpkPWZ1bmN0aW9uKGEpe3RoaXMuaT1hfTtQLnByb3RvdHlwZS5GZT1mdW5jdGlvbihhKXt0aGlzLmM9YX07UC5wcm90b3R5cGUuWWM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jfTtQLnByb3RvdHlwZS5DZT1mdW5jdGlvbihhKXt0aGlzLkM9YX07UC5wcm90b3R5cGUuZWE9ZnVuY3Rpb24oKXt9O1AucHJvdG90eXBlLks9ZnVuY3Rpb24oKXtyZXR1cm4iIn07UC5wcm90b3R5cGUuRz1mdW5jdGlvbigpe3JldHVybiExfTtQLnByb3RvdHlwZS5FZT1mdW5jdGlvbihhKXt0aGlzLkQ9CmF9O3koTCxQKTtMLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7dHJ5e3RoaXMuQj0iT25seUhPTUFEIj09PXRoaXMuRC5hYSgpJiZ3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygidC1vbmxpbmUuZGUiKTt2YXIgYT10aGlzLlcoKSxjPXRoaXMuaTt0aGlzLmxhKGEpO2EucHJlbG9hZD0iYXV0byI7Zy52LmIoInZpZGVvLnN0eWxlLnBvc2l0aW9uIikmJihhLnN0eWxlLnBvc2l0aW9uPWcudi5iKCJ2aWRlby5zdHlsZS5wb3NpdGlvbiIpKyIiKTtnLnYuYigidmlkZW8uc3R5bGUiKSYmKGEuc3R5bGU9Zy52LmIoInZpZGVvLnN0eWxlIikrIiIpO3ZhciBkPWcudi5iKCJ2aWRlby5hdHRyaWJ1dGVzIik7aWYoZClmb3IodmFyIGUgaW4gZClkLmhhc093blByb3BlcnR5KGUpJiZhLnNldEF0dHJpYnV0ZShlLGRbZV0pO3RoaXMucWEoKSYmKGEudm9sdW1lPXRoaXMuTik7dGhpcy5CfHxnLmouU2IoYSk7dGhpcy5vYSgpO3RoaXMubShhKT8oYS5sb2FkKCksdGhpcy5uYSgpLGMuZyh0aGlzLnJlc2l6ZS5iaW5kKHRoaXMpKSk6CnRoaXMuSih0aGlzLmV2ZW50LlBhLG5ldyBDKEMuaSkpO1AucHJvdG90eXBlLlYuY2FsbCh0aGlzKX1jYXRjaChmKXtyZXR1cm4hMX1yZXR1cm4hMH07TC5wcm90b3R5cGUueGM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SKCl9O0wucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuUigpO2EucGF1c2UoKTthLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSl9O0wucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5SKCkucGF1c2UoKX07TC5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SKCkucGF1c2VkfHx0aGlzLk99O0wucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlIoKS5wbGF5KCk7aWYoYSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5aP3RoaXMuSih0aGlzLmV2ZW50LlBhLCJwbGF5cHJvbWlzZUZhaWxlZCIpOih0aGlzLk89ITAsdGhpcy5wYXVzZSgpLHRoaXMuSih0aGlzLmV2ZW50LkljKSwKdGhpcy5aPSEwKX0uYmluZCh0aGlzKSk7c2M/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmIuYmluZCh0aGlzKSkpOk1iPWZ1bmN0aW9uKCl7dmFyIGM9dGhpcy5SKCk7dGhpcy5QfHwoYy5sb2FkKCksdGhpcy5wbGF5KCkpfS5iaW5kKHRoaXMpfTtMLnByb3RvdHlwZS5YYT1mdW5jdGlvbigpe3RoaXMuUigpLm11dGVkPSEwfTtMLnByb3RvdHlwZS4kYT1mdW5jdGlvbigpe3RoaXMuUigpLm11dGVkPSExfTtMLnByb3RvdHlwZS5lYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLlIoKS5tdXRlZH07TC5wcm90b3R5cGUuZ2V0Q3VycmVudFRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SKCkuY3VycmVudFRpbWV9O0wucHJvdG90eXBlLmdldER1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUigpLmR1cmF0aW9ufTsKTC5wcm90b3R5cGUubD1mdW5jdGlvbigpe3JldHVybiExfTtMLnByb3RvdHlwZS5uYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYz10aGlzLlIoKTtjLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oZCl7YS5GYShkKX0pO2MuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLGZ1bmN0aW9uKGQpe2EuaWEoZCl9KTtjLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGQpe2EuTz0hMTthLkthKGQpfSk7Yy5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsZnVuY3Rpb24oZCl7YS5nYShkKX0pO2MuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGQpe2EuaGEoZCl9KTtjLnN0eWxlJiYoYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihkKXt0cnl7ZC5jdXJyZW50VGFyZ2V0LnBhdXNlZD9hLnBsYXkoKTphLmZhKCl9Y2F0Y2goZSl7YS5mYSgpfX0pfTtMLnByb3RvdHlwZS5yZXNpemU9CmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuUigpO2Muc3R5bGUud2lkdGg9YS53aWR0aCsicHgiO2Muc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9O0wucHJvdG90eXBlLmdhPWZ1bmN0aW9uKGEpe3RoaXMucmVtb3ZlKCk7dGhpcy5KKHRoaXMuZXZlbnQuT2EsYSl9O0wucHJvdG90eXBlLkthPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuUigpO2MuY29udHJvbHM9ITE7dGhpcy5QPSEwO2EuY3VycmVudFRpbWU9Yy5jdXJyZW50VGltZTthLmRpc3BsYXk9dGhpczswPGMuZHVyYXRpb24mJnRoaXMuSih0aGlzLmV2ZW50LnBjLGEpfTtMLnByb3RvdHlwZS5GYT1mdW5jdGlvbihhKXt0aGlzLmZ8fCh0aGlzLlIoKS5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnx8dGhpcy5pYShhKX0uYmluZCh0aGlzKSx0aGlzLmthKSl9O0wucHJvdG90eXBlLmlhPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuQyxkPXRoaXMuUigpO3RoaXMuU3x8IXRoaXMubShkKXx8dGhpcy51fHwKdGhpcy5mfHwodGhpcy5TPSEwLCFnLmoucmEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKGMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pPyh0aGlzLnV8fCh0aGlzLnU9ITAsZy5ILmlifHxnLkguQWEoInZpZGVvLW5vb3AiKSksdGhpcy5KKHRoaXMuZXZlbnQuUGEsIk5PT1BWSURFTyIpKTooZC5jb250cm9scz0hMSx0aGlzLkoodGhpcy5ldmVudC5ZYikpKX07TC5wcm90b3R5cGUub2E9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlIoKSxjPXRoaXMubWEoKTtpZih0aGlzLkIpYS5zcmM9Y1swXS51cmw7ZWxzZSBmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKylhLmNhblBsYXlUeXBlKGNbZF0udHlwZSkmJnRoaXMuQShhLGNbZF0udXJsKyIiKX07TC5wcm90b3R5cGUubWE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkMuYSxjPU51bWJlcihnLnYuYigiYml0cmF0ZSIpKXx8MUUzO3RyeXt2YXIgZD1hLmZpbHRlcihmdW5jdGlvbihmKXtyZXR1cm4tMSE9CmYudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oZixoKXtyZXR1cm4gTWF0aC5hYnMoYy1mLmJpdHJhdGUpLU1hdGguYWJzKGMtaC5iaXRyYXRlKX0pLGU9YS5maWx0ZXIoZnVuY3Rpb24oZil7cmV0dXJuLTE9PWYudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oZixoKXtyZXR1cm4gTWF0aC5hYnMoYy1mLmJpdHJhdGUpLU1hdGguYWJzKGMtaC5iaXRyYXRlKX0pO2E9ZC5jb25jYXQoZSl9Y2F0Y2goZil7fXJldHVybiBhfTtMLnByb3RvdHlwZS5BPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7ZC5zcmM9YztkLm9uZXJyb3I9dGhpcy5HYS5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoZCl9O0wucHJvdG90eXBlLkdhPWZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3ZhciBjPXRoaXMuUigpO2MubmV0d29ya1N0YXRlJiZjLm5ldHdvcmtTdGF0ZT09PQpjLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmhhKGEpfTtMLnByb3RvdHlwZS5mYT1mdW5jdGlvbigpe3RoaXMuSih0aGlzLmV2ZW50Lm1jKX07TC5wcm90b3R5cGUuaGE9ZnVuY3Rpb24oYSl7dGhpcy5mPSEwO3ZhciBjPXt9O2lmKGEmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZSlzd2l0Y2goYS50YXJnZXQuZXJyb3IuY29kZSl7Y2FzZSBhLnRhcmdldC5lcnJvci5NRURJQV9FUlJfQUJPUlRFRDpjPUMuYS5uYzticmVhaztjYXNlIGEudGFyZ2V0LmVycm9yLk1FRElBX0VSUl9ORVRXT1JLOmM9Qy5hLm5jO2JyZWFrO2Nhc2UgYS50YXJnZXQuZXJyb3IuTUVESUFfRVJSX0RFQ09ERTpjPUMuYS5uYzticmVhaztjYXNlIGEudGFyZ2V0LmVycm9yLk1FRElBX0VSUl9TUkNfTk9UX1NVUFBPUlRFRDpjPUMuYS5uY31lbHNlIHRoaXMudmlkZW9UYWcubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvVGFnLk5FVFdPUktfTk9fU09VUkNFJiZnLkguSmIoKTt0aGlzLkoodGhpcy5ldmVudC5QYSwKbmV3IEMoQy5tLHtkZXRhaWxzOmMsZXJyb3I6YX0pKX07TC5wcm90b3R5cGUuc2I9ZnVuY3Rpb24oYSl7YS5hcHBlbmRDaGlsZCh0aGlzLlIoKSl9O0wucHJvdG90eXBlLm09ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofHx0aGlzLkImJmEuc3JjfTtMLnByb3RvdHlwZS5sYT1mdW5jdGlvbihhKXt0aGlzLnZpZGVvVGFnPWF9O0wucHJvdG90eXBlLlI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ307TC5wcm90b3R5cGUuVz1mdW5jdGlvbigpe3ZhciBhPWJiLnBvcCgpO2F8fChhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksYS5pZD1nLmouZygxMCksYS5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3JldHVybiBhfTtMLnByb3RvdHlwZS5iPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5SKCk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuYik7dGhpcy5QfHwoYS5sb2FkKCksYS5wbGF5KCkpfTtmb3IodmFyIGJiPVtdLHhjPTA7MTAwPnhjO3hjKyspe3ZhciBPYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO09iLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtPYi5pZD1nLmouZygxMCk7T2IuY29udHJvbHM9ITA7YmIucHVzaChPYil9dmFyIE1iPW51bGwsc2M9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixKYSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsSmEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixKYSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixKYSk7eShvYSxMKTtvYS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuYmE/dGhpcy5ZKCk6dGhpcy5EYSgpfTtvYS5wcm90b3R5cGUuWT1mdW5jdGlvbigpe3RoaXMuc2EoKTtMLnByb3RvdHlwZS5wbGF5LmNhbGwodGhpcyl9OwpvYS5wcm90b3R5cGUuRGE9ZnVuY3Rpb24oKXt0aGlzLmJhPSEwO3RoaXMuZGE9dGhpcy5jLnN0eWxlLnpJbmRleDt0aGlzLmMuc3R5bGUuekluZGV4PSIxMDAwIjt0aGlzLnBhKCl9O29hLnByb3RvdHlwZS5zYT1mdW5jdGlvbigpe2lmKHRoaXMuYSl0cnl7b2EuYSgpLHRoaXMuYy5zdHlsZS56SW5kZXg9dGhpcy5kYSx0aGlzLmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmEpfWNhdGNoKGEpe319O29hLnByb3RvdHlwZS5zYj1mdW5jdGlvbihhKXtMLnByb3RvdHlwZS5zYi5jYWxsKHRoaXMsYSk7dGhpcy5zPWF9O29hLnByb3RvdHlwZS56YT1mdW5jdGlvbihhKXt0aGlzLmEuc3R5bGUud2lkdGg9YS53aWR0aCsicHgiO3RoaXMuYS5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQrInB4In07b2EucHJvdG90eXBlLnBhPWZ1bmN0aW9uKCl7dGhpcy5pLmcodGhpcy56YS5iaW5kKHRoaXMpKTt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnN0eWxlLnpJbmRleD0xRTY7CmEuc3R5bGUud2lkdGg9IiI7YS5zdHlsZS5oZWlnaHQ9IiI7YS5zdHlsZS5sZWZ0PSIwcHgiO2Euc3R5bGUudG9wPSIwcHgiO2Euc3R5bGUucG9zaXRpb249ImFic29sdXRlIjthLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iI2ZmZiI7YS5pbm5lckhUTUw9dGhpcy5VO3RoaXMuYT1hO3RoaXMucy5hcHBlbmRDaGlsZCh0aGlzLmEpfTtvYS5wcm90b3R5cGUud2E9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO2ZldGNoKCJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3NwaWVnZWxTbmlwcGV0Lmh0bWwiKS50aGVuKGZ1bmN0aW9uKGMpe2MudGV4dCgpLnRoZW4oZnVuY3Rpb24oZCl7YS5VPWQ7YS50YSgpfSl9KX07b2EucHJvdG90eXBlLnRhPWZ1bmN0aW9uKCl7dmFyIGE9Zy5qLmcoMTApO3dpbmRvd1thXT1mdW5jdGlvbigpe3RoaXMuWSgpfS5iaW5kKHRoaXMpO3RoaXMuVT10aGlzLlUucmVwbGFjZSgiW09OQ0xJQ0tIQU5ETEVSXSIsIndpbmRvd1snIithKyInXSgpIil9O29hLlNhPQpmdW5jdGlvbigpe2cucWM9ITB9O29hLmE9ZnVuY3Rpb24oKXtnLnFjPSExfTswPD13aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCJzdm1wdXIiKSYmb2EuU2EoKTt5KE9hLEwpO09hLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7TC5wcm90b3R5cGUuVi5jYWxsKHRoaXMpO3JldHVybiEwfTtPYS5wcm90b3R5cGUuQT1mdW5jdGlvbihhLGMpe2EmJmEuYXBwZW5kQ2hpbGQ/TC5wcm90b3R5cGUuQS5jYWxsKHRoaXMsYSxjKTphLnNldEF0dHJpYnV0ZSgic3JjIixjKX07T2EucHJvdG90eXBlLm09ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/TC5wcm90b3R5cGUubS5jYWxsKHRoaXMsYSk6ITB9O09hLnByb3RvdHlwZS5XPWZ1bmN0aW9uKCl7dGhpcy5hLmxvYWQoKTtyZXR1cm4gdGhpcy5hfTtPYS5wcm90b3R5cGUucz1mdW5jdGlvbihhKXt0aGlzLmE9YX07T2EucHJvdG90eXBlLnNiPWZ1bmN0aW9uKCl7fTtPYS5wcm90b3R5cGUuZ2E9ZnVuY3Rpb24oYSl7dGhpcy5KKHRoaXMuZXZlbnQuT2EsCmEpfTtPYS5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKGEpe2lmKDAhPWEud2lkdGgmJjAhPWEuaGVpZ2h0KXt2YXIgYz10aGlzLlIoKTtjLnN0eWxlLndpZHRoPWEud2lkdGgrInB4IjtjLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifX07eShWLFApO1YucHJvdG90eXBlLlY9ZnVuY3Rpb24oKXtnLmouZ2EoKTt2YXIgYT0oZy5qLmwuZ2V0KCJjcmVhdGVFbGVtZW50Iil8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpKCJpZnJhbWUiKTt0aGlzLkEoYSk7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7YS5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTthLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt2YXIgYz0KZy52LmIoInZwYWlkSWZyYW1lLnN0eWxlIik7YyYmZy5qLnFhKGEsYysiIik7YS5vbmxvYWQ9dGhpcy5TLmJpbmQodGhpcyk7Yz1nLmouTigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLGcuSCwhMCk7YS5zcmM9YztnLmouWigidnBhaWRldmVudCIsdGhpcy51LmJpbmQodGhpcykpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KKHRoaXMuZXZlbnQuWWIpfS5iaW5kKHRoaXMpLDApO3RoaXMuWSgpO3JldHVybiEwfTtWLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmEsYz1hLnBhcmVudE5vZGU7YSYmYyYmZy5qLmNhKGEpJiZjLnJlbW92ZUNoaWxkKGEpO3RoaXMuQShudWxsKTtnLmouZ2EoKX07Vi5wcm90b3R5cGUueGM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hfTtWLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLkJ9OwpWLnByb3RvdHlwZS5nZXREdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN9O1YucHJvdG90eXBlLmw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tfTtWLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7Zy5qLmYodGhpcy5hLCJjb250cm9sIiwicGxheSIpO3RoaXMuYj0hMX07Vi5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbnRyb2wiLCJwYXVzZSIpO3RoaXMuYj0hMH07Vi5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ifTtWLnByb3RvdHlwZS5YYT1mdW5jdGlvbigpe2cuai5mKHRoaXMuYSwiY29udHJvbCIsIm11dGUiKTt0aGlzLmY9ITB9O1YucHJvdG90eXBlLiRhPWZ1bmN0aW9uKCl7Zy5qLmYodGhpcy5hLCJjb250cm9sIiwidW5tdXRlIik7dGhpcy5mPSExfTtWLnByb3RvdHlwZS5lYj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZ9O1YucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbihhKXtnLmouZih0aGlzLmEsCiJyZXNpemUiLHt3aWR0aDphLndpZHRoLGhlaWdodDphLmhlaWdodH0pfTtWLnByb3RvdHlwZS5TPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjLGQsZSxmLGgsbSxELE0sTztyZXR1cm4gRmMoZnVuY3Rpb24oTil7aWYoMT09Ti5hKXtjPWEuaTtkPSExO2MuVC5FYSYmYy5ULkVhKCkmJihkPSEwKTtlPWEuQy5zKCk7Zj1hLkMub2M7ZSYmZS51cmwmJjA8PWUudXJsLmluZGV4T2YoIndlbGVjdC5qcyIpJiYoZy5ILmdldENvbmZpZygpLChoPWcudi5iKCJhZF9mYWxsYmFja19jb25maWciKSkmJmgud2VsZWN0YWxpYXMmJihmPUpTT04uc3RyaW5naWZ5KGgpKSk7bT1hLlljKCk7aWYoIWcuai5CKGUudXJsKSl7RD1lLnVybDtOLmE9MjtyZXR1cm59cmV0dXJuIHFjKE4sZy5qLmthKGUudXJsKSwzKX0yIT1OLmEmJihEPU4uYik7TT1EO089e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZy5ILmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpNLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmUuZGVzaXJlZEJpdHJhdGV8fAplLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6ZixjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpmfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludChtLnN0eWxlLndpZHRoLDEwKSxoZWlnaHQ6cGFyc2VJbnQobS5zdHlsZS5oZWlnaHQsMTApfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6ZH19O2EuVyhPKTtnLmouWigiIixhLnUuYmluZChhKSk7Zy5qLlooInZwYWlkY29udGludWVjb250ZW50IixmdW5jdGlvbigpe3RoaXMuSih0aGlzLmV2ZW50Lk9hKX0uYmluZChhKSk7Zy5qLlooInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5KKHRoaXMuZXZlbnQuT2EpfS5iaW5kKGEpKTtjLmcoZnVuY3Rpb24obWEpe2cuai5mKHRoaXMuYSwicmVzaXplIixtYSl9LmJpbmQoYSkpO04uYT0wfSl9O1YucHJvdG90eXBlLnU9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5pO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpeyJBZFNpemVDaGFuZ2UiIT1hLmRhdGEubmFtZSYmIkFkUmVtYWluaW5nVGltZUNoYW5nZSIhPQphLmRhdGEubmFtZSYmYy5vKCEwKTt0aGlzLk89YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiZ0aGlzLkoodGhpcy5ldmVudC5HYyk7IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkoodGhpcy5ldmVudC5FYyk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkoodGhpcy5ldmVudC5LYyk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuSih0aGlzLmV2ZW50LkZjKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuSih0aGlzLmV2ZW50LkhjKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5KKHRoaXMuZXZlbnQuTGMpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5KKHRoaXMuZXZlbnQuT2EpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMucmVtb3ZlKCksdGhpcy5KKHRoaXMuZXZlbnQuT2EpKTsiQWRTa2lwcGVkIj09CmEuZGF0YS5uYW1lJiZ0aGlzLkoodGhpcy5ldmVudC5wZCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYodGhpcy5iYShhLmRhdGEudGltaW5nKSx0aGlzLkoodGhpcy5ldmVudC5xZCxhKSx0aGlzLmI9ITEpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXtjPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7dmFyIGQ9dGhpcy5DO2N8fChjPWQuVWIpO2lmKCFjKXJldHVybjt0aGlzLkoodGhpcy5ldmVudC5tYyl9IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJih0aGlzLmI9ITAsdGhpcy5KKHRoaXMuZXZlbnQuSWMpKTsiQWRQbGF5aW5nIj09YS5kYXRhLm5hbWUmJih0aGlzLmI9ITEsdGhpcy5KKHRoaXMuZXZlbnQub2QpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKDA9PWEuZGF0YS5vcmlnaW5hbGV2ZW50LnZvbHVtZT8odGhpcy5mPSEwLHRoaXMuSih0aGlzLmV2ZW50Lk5kKSk6KHRoaXMuZj0hMSx0aGlzLkoodGhpcy5ldmVudC5TZCkpKTsiQWRFcnJvciI9PQphLmRhdGEubmFtZSYmKGM9YS5tZXNzYWdlfHwiIixkPS9cZCsvZywhYyYmYS5kYXRhJiZhLmRhdGEub3JpZ2luYWxldmVudCYmYS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnJiYoYz1hLmRhdGEub3JpZ2luYWxldmVudC5tc2csKGQ9Yy5tYXRjaChkKSk/ZC5qb2luJiYoYz1kLmpvaW4oIi0iKSk6Yz1jLnN1YnN0cmluZygwLDIwKSksdGhpcy5yZW1vdmUoKSx0aGlzLkoodGhpcy5ldmVudC5QYSwidnBhaWRlcnJvciIsYykpOyJibG9ja0NvbnRyb2xzIj09YS5kYXRhLm5hbWUmJih0aGlzLm09ITApOyJ1bmJsb2NrQ29udHJvbHMiPT1hLmRhdGEubmFtZSYmKHRoaXMubT0hMSl9fTtWLnByb3RvdHlwZS5iYT1mdW5jdGlvbihhKXthJiYodGhpcy5zPWEuZHVyYXRpb24sdGhpcy5CPWEuY3VycmVudFRpbWUsdGhpcy5QPWEucmVtYWluaW5nVGltZSl9O1YucHJvdG90eXBlLlc9ZnVuY3Rpb24oYSl7Zy5qLmYodGhpcy5hLCJjb25maWciLGEpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5qLmYodGhpcy5hLAoiY29uZmlnIixhKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5qLmYodGhpcy5hLCJjb25maWciLGEpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbmZpZyIsYSl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2cuai5mKHRoaXMuYSwiY29uZmlnIixhKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zy5qLmYodGhpcy5hLCJjb25maWciLGEpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbmZpZyIsYSl9LmJpbmQodGhpcyksMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbmZpZyIsYSl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbmZpZyIsCmEpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLmouZih0aGlzLmEsImNvbmZpZyIsYSl9LmJpbmQodGhpcyksNUUzKX07Vi5wcm90b3R5cGUuc2I9ZnVuY3Rpb24oYSl7YS5hcHBlbmRDaGlsZCh0aGlzLmEpfTtWLnByb3RvdHlwZS5BPWZ1bmN0aW9uKGEpe3RoaXMuYT1hfTtWLnByb3RvdHlwZS5ZPWZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuVSl9O1YucHJvdG90eXBlLlU9ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmImludGVydmVudGlvbiI9PWEuZGF0YS5ldmVudCYmZy5qLnRyYWNrKCJzdGF0c19oZF9pbnRlcnZlbnRpb24iLGEuZGF0YS5pZCwhMCl9O3koUixQKTtSLnByb3RvdHlwZS5jb250aW51ZT1mdW5jdGlvbigpe3RoaXMubSYmKHRoaXMuUCgpLHRoaXMudSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BKCl9LmJpbmQodGhpcyksMCkpfTsKUi5wcm90b3R5cGUuWmE9ZnVuY3Rpb24oYSxjKXt2YXIgZD10aGlzLkQ7ZCYmZC53ZCYmZC53ZChhLGMpfTtSLnByb3RvdHlwZS5lYT1mdW5jdGlvbigpe2cuai50cmFjaygidnJ0Y2x6cl9za2lwZWQiLCIiLCEwKTt0aGlzLlphKCJza2lwIix7fSl9O1IucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt0cnl7aGlzdG9yeS5wdXNoU3RhdGUoe3ZlcnRpY2FsOiEwfSwiIiwiIyIrZy5qLmcoNSkpLGhpc3RvcnkucHVzaFN0YXRlKHt2ZXJ0aWNhbDohMH0sIiIsIiMiK2cuai5nKDUpKX1jYXRjaChhKXt9d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBvcHN0YXRlIixmdW5jdGlvbihhKXthJiZhLnN0YXRlJiZhLnN0YXRlLnZlcnRpY2FsJiZ0aGlzLmEuY2xvc2UoKX0uYmluZCh0aGlzKSl9O1IucHJvdG90eXBlLks9ZnVuY3Rpb24oKXtyZXR1cm4icG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiBjYWxjKDE4JSk7IGJvdHRvbTogOXB4OyB3aWR0aDogNjQlOyB0ZXh0LWFsaWduOiBjZW50ZXI7In07ClIucHJvdG90eXBlLkc9ZnVuY3Rpb24oYSl7YT1hLnJlcGxhY2UoIlNraXAgQWQiLCJXZXJidW5nICZ1dW1sO2JlcnNwcmluZ2VuIik7cmV0dXJuIGE9YS5yZXBsYWNlKC88ZGl2IHN0eWxlPSJbYS16QS1aMC05OjtcLlxzXChcKVwtLCNdKiIvZ2ksJzxkaXYgc3R5bGU9IndpZHRoOjEwMCU7IGhlaWdodDogMzBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtZmFtaWx5OiBSb2JvdG8sIGFyaWFsLCBzYW5zLXNlcmlmOyBvcGFjaXR5OiAwLjY7IGJhY2tncm91bmQtY29sb3I6IGJsYWNrOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGxpbmUtaGVpZ2h0OiAzMHB4OyInKX07Ui5wcm90b3R5cGUuQT1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTthLmhyZWY9dGhpcy5zLmNzc3x8Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3ZlcnRpY2FsaXpyL3ZlcnRpY2FsaXpyLmNzcyI7YS5yZWw9InN0eWxlc2hlZXQiO2EudHlwZT0idGV4dC9jc3MiOwpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGEpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3ZlcnRpY2FsaXpyL3N3aXBlLm1pbi5qcyI7YS50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Eub25sb2FkPWZ1bmN0aW9uKCl7dGhpcy5PPSEwO3RoaXMuVygpfS5iaW5kKHRoaXMpO2RvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYSl9O1IucHJvdG90eXBlLlM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGM7RmMoZnVuY3Rpb24oZCl7aWYoMT09ZC5hKXJldHVybiBnLnYuY2xpZW50LnRjZl9jb25maWc9ITAscWMoZCxnLmouZmIoZy5ILm1hKGEuVSkpLDIpO2M9ZC5iO2ZldGNoKGMse2NyZWRlbnRpYWxzOiJpbmNsdWRlIn0pLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIGUuanNvbigpfSkudGhlbihmdW5jdGlvbihlKXtlLmFkdmVydGlzZW1lbnRzJiYxPGUuYWR2ZXJ0aXNlbWVudHMubGVuZ3RoPyhhLkooYS5ldmVudC5ZYiksCmEuYj1lLmFkdmVydGlzZW1lbnRzLGcuai50cmFjaygidnJ0Y2x6cl9zdWNjZXNzIiwiIiwhMCksYS5tP2EubSgpOmEuQSgpKTooZS5yZWFzb24/Imluc3VmZmljaWVudF9hZHMiPT09ZS5yZWFzb24/Zy5qLnRyYWNrKCJ2cnRjbHpyX2Vycm9yIiwiaW5zdWZmaWNpZW50X2FkcyIsITApOiJvYmplY3QiPT09dHlwZW9mIGUucmVhc29uJiZlLnJlYXNvbi5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmcuai50cmFjaygidnJ0Y2x6cl9lcnJvciIsInVuYXZhaWxhYmxlIiwhMCk6Zy5qLnRyYWNrKCJ2cnRjbHpyX2Vycm9yIiwidW5rbm93biIsITApLGEuZigpLGEuSihhLmV2ZW50LlBhLCJ2ZXJ0aWNhbGl6ciIpLGEuWmEoImVycm9yIix7fSkpfSkuY2F0Y2goZnVuY3Rpb24oKXtnLmoudHJhY2soInZydGNsenJfZXJyb3IiLCJhcGkiLCEwKTthLmYoKTthLkooYS5ldmVudC5QYSwidmVydGljYWxpenIiKTthLlphKCJlcnJvciIse30pfSk7ZC5hPTB9KX07Ui5wcm90b3R5cGUuU2M9ZnVuY3Rpb24oKXt0aGlzLmEucGxheWVyLnRyYWNrKCJjbGlja3RyYWNraW5nIik7CndpbmRvdy5vcGVuKHRoaXMuYS5hLnhkLCJfYmxhbmsiKX07Ui5wcm90b3R5cGUuVz1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYz1bXTt0aGlzLmIuZm9yRWFjaChmdW5jdGlvbihkKXt2YXIgZT1uZXcgVygiIiwhMCk7ZC5jb250ZW50X3BpZWNlcz1kLmNvbnRlbnRfcGllY2VzLnNvcnQoZnVuY3Rpb24oZil7cmV0dXJuLTE9PT1mLnJhdGlvLmluZGV4T2YoIjk6MTYiKT8xOi0xfSk7ZC5zcmM9ZC5jb250ZW50X3BpZWNlc1swXS5yZXNvdXJjZTtjLnB1c2goZS5iYShkLnNyYysiJnByZWZldGNoPXRydWUiKSl9KTtQcm9taXNlLmFsbChjLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gZC5jYXRjaChmdW5jdGlvbihlKXtyZXR1cm4gZX0pfSkpLnRoZW4oZnVuY3Rpb24oZCl7YS5iLmZvckVhY2goZnVuY3Rpb24oaCxtKXtkW21daW5zdGFuY2VvZiBXJiYoaC52YXN0X2RhdGE9ZFttXSl9KTtpZihhLmIuZmlsdGVyKGZ1bmN0aW9uKGgpe3JldHVybiFoLmhhc093blByb3BlcnR5KCJ2YXN0X2RhdGEiKX0pKWZvcih2YXIgZT0KYS5iLmZpbHRlcihmdW5jdGlvbihoKXtyZXR1cm4haC5oYXNPd25Qcm9wZXJ0eSgidmFzdF9kYXRhIil9KSxmPTA7ZjxlLmxlbmd0aDtmKyspZy5qLnRyYWNrKCJ2cnRjbHpyX25vdmFzdCIsZVswXS5pZC50b1N0cmluZygpLCEwKTthLmIuZmlsdGVyKGZ1bmN0aW9uKGgpe3JldHVybiBoLnZhc3RfZGF0YX0pLmxlbmd0aD9hLmEuZ2EoYS5iLmZpbHRlcihmdW5jdGlvbihoKXtyZXR1cm4gaC52YXN0X2RhdGF9KSk6KGEuZigpLGEuSihhLmV2ZW50LlBhLCJ2ZXJ0aWNhbGl6ciIpLGEuWmEoImVycm9yIix7fSkpfSl9O1IucHJvdG90eXBlLlA9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuYS5wbGF5ZXIub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGMpe2EuQj0hMDtjLmRpc3BsYXk9YTthLkooYS5ldmVudC5wYyxjKTthLlphKCJ0aW1ldXBkYXRlIixjKX0pO3RoaXMuYS5wbGF5ZXIub24oImVuZGVkIixmdW5jdGlvbihjKXthLkooYS5ldmVudC5PYSxjKTthLlphKCJlbmRlZCIsYyl9KTsKdGhpcy5hLm9uKCJ2aWRlb3N0YXJ0IixmdW5jdGlvbigpe2EuSigidW5jbG9zZSIpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGM9dGhpczt0aGlzLnBhcmVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtjLkooYy5ldmVudC5tYyk7Yy5aYSgiY2xpY2t0aHJvdWdoIix7fSl9KX0uYmluZChhKSwwKX0pO3RoaXMuYS5vbigiY2xvc2UiLGZ1bmN0aW9uKCl7YS5KKCJjbG9zZSIpO2EuWmEoImNsb3NlIix7fSl9KX07Ui5wcm90b3R5cGUuVj1mdW5jdGlvbigpe3JldHVybiEwfTtSLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLmYoKX07Ui5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3RoaXMuYj1udWxsO3RoaXMuYSYmKHRoaXMuYT10aGlzLmEuWigpKX07Ui5wcm90b3R5cGUueGM9ZnVuY3Rpb24oKXt9O1IucHJvdG90eXBlLmdldEN1cnJlbnRUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYSYmdGhpcy5hLnBsYXllcj90aGlzLmEucGxheWVyLmdldEN1cnJlbnRUaW1lKCk6Ci0xfTtSLnByb3RvdHlwZS5nZXREdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmEmJnRoaXMuYS5wbGF5ZXI/dGhpcy5hLnBsYXllci5nZXREdXJhdGlvbigpOi0xfTtSLnByb3RvdHlwZS5sPWZ1bmN0aW9uKCl7fTtSLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLkI/KHRoaXMuYS5yZXN1bWUoKSx0aGlzLmEucGxheWVyLnBsYXkoKSk6dGhpcy5PP3RoaXMuYS5TYSgpOnNldFRpbWVvdXQoZnVuY3Rpb24oKXthLnBsYXkoKX0sNTApO3RoaXMuSigidW5jbG9zZSIpfTtSLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuYSYmdGhpcy5hLnBsYXllci5wYXVzZSgpfTtSLnByb3RvdHlwZS5pc1BhdXNlZD1mdW5jdGlvbigpe3ZhciBhPSEwO3RoaXMuYSYmKGE9dGhpcy5CP3RoaXMuYS5wbGF5ZXIuaXNQYXVzZWQoKTohMCk7cmV0dXJuIGF9O1IucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7dGhpcy5hLnBsYXllci5YYSgpfTtSLnByb3RvdHlwZS4kYT0KZnVuY3Rpb24oKXt0aGlzLmEucGxheWVyLiRhKCl9O1IucHJvdG90eXBlLmViPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5wbGF5ZXIuZWIoKX07Ui5wcm90b3R5cGUucmVzaXplPWZ1bmN0aW9uKGEpe3RoaXMuYSYmdGhpcy5hLnJlc2l6ZShhKX07Ui5wcm90b3R5cGUuc2I9ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQ9YTt0aGlzLmEud2I9YTt0aGlzLmEuYXBwZW5kKCk7dGhpcy5hLnNob3coKX07eShTLHZhKTtTLnByb3RvdHlwZS5sYT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5iLmlkPSJsaW1vIjt0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmIpO3RoaXMuQS5pZD0ibGltb19zd2lwZXIiO3RoaXMuQS5jbGFzc0xpc3QuYWRkKCJzd2lwZSIpO3RoaXMuYi5hcHBlbmRDaGlsZCh0aGlzLkEpO3RoaXMuRy5pZD0ibGltb19zd2lwZXJfY29udGVudCI7dGhpcy5BLmFwcGVuZENoaWxkKHRoaXMuRyk7dGhpcy5sLmlkPSJtZW51Ijt0aGlzLmwuY2xhc3NMaXN0LmFkZCgic3RhcnQiKTsKdGhpcy5sLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInVsIikpO3RoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMubCk7dGhpcy5PLmlkPSJoZWFkZXIiO3RoaXMubT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTt0aGlzLm0uaWQ9ImxvZ28iO3RoaXMubS5jbGFzc0xpc3QuYWRkKCJzdGFydCIpO3ZhciBjPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS92ZXJ0aWNhbGl6ci9sb2dvLXN2bS5wbmciO2cuai5iKCJzcGllZ2VsLmRlIikmJihjPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS92ZXJ0aWNhbGl6ci9sb2dvLXNwb24ucG5nIik7Zy5qLmIoIndlYi5kZSIpJiYoYz0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vdmVydGljYWxpenIvbG9nby13ZWJkZS5wbmciKTt0aGlzLm0uc3JjPShnLnYuYigidmVydGljYWxpenIiKXx8e30pLmxvZ298fGM7dGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5tKTsKdGhpcy5mPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuZi5pZD0iY2xvc2UiO3RoaXMuZi5jbGFzc0xpc3QuYWRkKCJzdGFydCIpO3RoaXMuZi5pbm5lckhUTUw9IjxpbWcgc3R5bGU9J21hcmdpbi10b3A6M3B4O21heC13aWR0aDoyMHB4Oycgc3JjPSdkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJrQUFBQVpDQVlBQUFERTZZVmpBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlWcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFl1TUMxak1EQXlJRGM1TGpFMk5EUTJNQ3dnTWpBeU1DOHdOUzh4TWkweE5qb3dORG94TnlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SURJeExqSWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2TVRZeE1qSkdSamxDTlRZd01URkZRVGc0TmtORE5UZENRVEU0TVRRMk9FUWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZNVFl4TWpKR1JrRkNOVFl3TVRGRlFUZzROa05ETlRkQ1FURTRNVFEyT0VRaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEb3hOakV5TWtaR04wSTFOakF4TVVWQk9EZzJRME0xTjBKQk1UZ3hORFk0UkNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRveE5qRXlNa1pHT0VJMU5qQXhNVVZCT0RnMlEwTTFOMEpCTVRneE5EWTRSQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGwwOEJJSUFBQVNmU1VSQlZIamFmRlpYUzZ4SkVHMFFVZlFmaUdCQVRCZ1FNK2FNK2lTWVhsWk02TDNxT041UnhDeGl3SUFpZ2lEK0FSOTJGNVpsUVphNyt5THVneTlteGF5WXMydFdETFZWamRYMnJISUgrcHR2cXJ2cjlLbXVVelhpNWVWRjNOM2RpZGpZMkY4dExTMlBhbXBxdmdLQXVMcTZFcHVibTJKaFlVSE16czdLTVRNekk3K1hscGJrV0ZsWkVSc2JHMkpuWjBkY1gxOEwydGZlM3A1allXRng1T25wT1VvK3lDWWZZV0ZodndsODVkSGIyMnNnKytIaG9aaWJtL3NoeU5yYW1qZzVPWkYraG9hRzh0bUhsWlVWQkFRRWZIOTlmUlVpT2pyNmR6TGlBa2hPVGxaQVhWMWQ1YlJ4ZlgxZFRFMU5mUXBDWTNkM1Z3SU1EQXdVOGQ3YTJsb1lHeHVUNzRHQmdYOEtuaWdxS29LbnB5ZEFWZ3FvdGJYVlNBN294TlBUMDJZZ2k0dUxZbXRyU3dMMDkvY1g4cDZ5c2pLNHZMd0ViMjl2NVVmMDlmVjk0UjhKQ1FudzhQQUE4Zkh4YWtGZFhWMGxBekVqQXFDN0lEc3lMdWExVlZWVmNIRnhBWFoyZG1wL1IwZUhTUzVFb0RJMnBxYW13dlB6TTBSR1J1cEFGYlNPR0V4T1R1b0Fpb0hCWUlDYm14dHdjSEJRKzVxYm0ydlV4ZFBvN093czUwbk1OTWtvTVRGUmJjQ3NrNHdZQUUrb0ltQXltZUQ4L0J6czdlMUJzOVd4YjBHM2ozZkI2YWVBa3BLU2dENTY2Qm9hR2tyZm1QL0V0cEtTRXJpL3Z3ZEhSOGNQQUxlM3QrOGdTRk1PTWpRMU5abDRjVnhjSEtDR0lDVWxSVG5BRFB5RjM4dkx5K1VkT0RrNWdXWnJKRDk3ZTN2aStQajRIWVFRS2RmUHpzNmtFV05wMUVOSEgyS21hNm00dUJnZUh4L0IyZGxaMlNvcUt1cHBQNG1UN3UvMDlOUWNoQUFvNTBtQU5GRmZYNjhZUlVWRlNVWnBhV255dDlGb2xBeDBBTFRWODUxUjlxMnVybjRPc3IrL0wwc0pDd3daR2F5dHJXL0pDV1ViQ1F3dkhNYkh4OEhGeFlXVmZWOVpXVm5EQUtRbEZxb0tGejJvZGhFSXhaRVVUdldLZ1RCTVAydmgrQkM2OFBEd1VWcEg2eW05YVMrVkdnb1ppdklkQkxORGhZdW8waUt5ZDNkMzU5bmEydjdMRldGaVlnSXlNek1CSGFuUTJkallYRGMyTnBiUit1WGxaVm5ycUJLUVAvTDdBV1I3ZTF2cEFOTlo2U0EvUDErV0NoOGZIL2s3SmlZR01NUUs2SzFlU2NIU0FTa2FGQ3FWd2d4QzJYVjBkTVJDVTBvdUxDeVVOYzNWMWRVc3U0S0NnZ0R2RXpJeU1uUWdXZXNPRGc1a0FwbUIwSjF3UDlDVm5KdWJDOWdUQUhzRGFKazJ5dThoSVNHU1VYcDZ1bDRaVE55UFdIdnl3WXBISlJmOG40Rzd1N3R5Z0ZsVVRldmEydHJVUWZ6OS9TV2o3T3hzdGE2bHBjV28rMVcxQzh1MTZnYzVPVG1Bek1ETHkrdUREaWhyNkJzdnU0TG5zR2ZJNHFnRDRVRytxZHBGaitIaDRUeWV6TXZMa3d6YzNOdytLSmtFUm4yRis0aGVHWHg5ZlFGYnVUeWcxbUZsMW9uQndjRWNObVpsWmNrWWN4YTlNV2prckNFZHpNL1BtelVzQkZLVndjL1BUMVlHblJHMmd5K3FNNWFXbHNvKzR1SGhvUlpVVjFmWGNRdm16a2dnM0JrNWRCZ2F4WWlTaEdvYTduM1B4dERRMEwvb3BhQ2dBSUtEZzlVRTFpNEpRR1dHQUVoa09nZ05FaCtsNjV1dXZ2RmUvQU1CSXlNakREb3VGeURONzdvR3VLTlJybE83SllEUFFPaU9pQ1gvVytucDZUSG9makF6LzBGV2xuS1Nha3hFUk1RZitML3JCS2xYa1EycnJIUkN0ZWhISU1TVTdvZnJGR1pwQ2ZvNXhvUC96ZUwrVDRBQkFMY2RPTE1lQmpGYkFBQUFBRWxGVGtTdVFtQ0MnPjwvaW1nPiI7CnRoaXMuZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXthLmNsb3NlKCk7YS5LfHwoZy5qLnRyYWNrKCJ2cnRjbHpyX2Nsb3NlZCIsIiIsITApLGEuSz0hMCl9KTt0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmYpO3RoaXMubGFiZWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5sYWJlbC5pZD0idGl0bGUiO3RoaXMubGFiZWwuaW5uZXJIVE1MPSJOdXIgZWluIFNwb3QgSWhyZXIgV2FobCI7dGhpcy5sYWJlbC5jbGFzc0xpc3QuYWRkKCJzdGFydCIpO3RoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMubGFiZWwpO3RoaXMucz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLnMuY2xhc3NMaXN0LmFkZCgibGltb19zcGlubmVyIik7dGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zKTt0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLk8pfTtTLnByb3RvdHlwZS5TYT1mdW5jdGlvbigpe3RoaXMuRD0hMX07ClMucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbigpe307Uy5wcm90b3R5cGUuYXBwZW5kPWZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJib2R5LW5vLXNjcm9sbCIpO3RoaXMud2IuZmlyc3RDaGlsZD90aGlzLndiLmluc2VydEJlZm9yZSh0aGlzLmNvbnRhaW5lcix0aGlzLndiLmZpcnN0Q2hpbGQpOnRoaXMud2IuYXBwZW5kQ2hpbGQodGhpcy5jb250YWluZXIpfTtTLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5jb250YWluZXIuc3R5bGUuZGlzcGxheT0iYmxvY2sifTtTLnByb3RvdHlwZS5rYT1mdW5jdGlvbigpe3RoaXMuY29udGFpbmVyLnN0eWxlLmRpc3BsYXk9Im5vbmUifTtTLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXtoaXN0b3J5LnB1c2hTdGF0ZSh7dmVydGljYWw6ITB9LCIiLCIjIitnLmouZyg1KSk7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJib2R5LW5vLXNjcm9sbCIpO0FycmF5LmZyb20odGhpcy5pKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2xhc3NMaXN0LnJlbW92ZSgiY2xvc2VkIil9KTsKdGhpcy5EPSExfTtTLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiYm9keS1uby1zY3JvbGwiKTtBcnJheS5mcm9tKHRoaXMuaSkuZm9yRWFjaChmdW5jdGlvbihhKXthLmNsYXNzTGlzdC5hZGQoImNsb3NlZCIpfSk7dGhpcy5wbGF5ZXIuaXNQbGF5aW5nfHx0aGlzLmthKCk7dGhpcy5EPSEwO3RoaXMuSigiY2xvc2UiKX07Uy5wcm90b3R5cGUucGE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGM9MzAsZDt0aGlzLk49c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtkPXBhcnNlSW50KGMlNjAsMTApO2Q9MTA+ZD8iMCIrZDpkO2EubGFiZWwuaW5uZXJIVE1MPSJOdXIgZWluIFNwb3QgSWhyZXIgV2FobDxicj5zdGFydGV0IGluICIrZCsiIFNla3VuZGVuIjtkb2N1bWVudC5oYXNGb2N1cygpJiYhYS5EJiYtMT49LS1jJiYoYz0zMCxjbGVhckludGVydmFsKGEuTiksYS5uYSgpKX0sMUUzKX07Uy5wcm90b3R5cGUuZ2E9ZnVuY3Rpb24oYSl7dmFyIGM9CnRoaXMsZDtGYyhmdW5jdGlvbihlKXtzd2l0Y2goZS5hKXtjYXNlIDE6aWYoIWEubGVuZ3RoKXJldHVybiBlLnJldHVybigpO2MuQj1hO2Q9MDtjYXNlIDI6aWYoIShkPGMuQi5sZW5ndGgpKXtlLmE9NDticmVha31yZXR1cm4gcWMoZSxjLmhhKGMuQltkXS52YXN0X2RhdGEpLDMpO2Nhc2UgMzpkKys7ZS5hPTI7YnJlYWs7Y2FzZSA0OmMuQi5mb3JFYWNoKGZ1bmN0aW9uKGYsaCl7Yy5pLnB1c2goYy5pYShmLGgpKTtjLmVhKGgpfSksZS5hPTB9fSl9O1MucHJvdG90eXBlLmhhPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMsZCxlLGYsaCxtO3JldHVybiBGYyhmdW5jdGlvbihEKXsxPT1ELmEmJihkPTApO2lmKDUhPUQuYSl7aWYoIShkPGEuYi5sZW5ndGgpKXtELmE9MDtyZXR1cm59ZT1hLmJbZF07Zj1lLmE9Yy5kYShlLmEpO3JldHVybiBxYyhELGcuai5rYShmWzBdLnVybCksNSl9aD1ELmI7bT1nLmouQShoKTtlLmFbMF0udXJsPSJodHRwczovL3d3dy52ZXJ0aWNhbGl6ci5jb20vYXBpL3ZlcnRpY2FsaXplci8/bWVkaWFmaWxlPSIrCm07ZCsrO0QuYT0yfSl9O1MucHJvdG90eXBlLmRhPWZ1bmN0aW9uKGEpe3ZhciBjPU51bWJlcihnLnYuYigiYml0cmF0ZSIpKXx8MUUzO3RyeXt2YXIgZD1hLmZpbHRlcihmdW5jdGlvbihmKXtyZXR1cm4tMSE9Zi50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihmLGgpe3JldHVybiBNYXRoLmFicyhjLWYuYml0cmF0ZSktTWF0aC5hYnMoYy1oLmJpdHJhdGUpfSksZT1hLmZpbHRlcihmdW5jdGlvbihmKXtyZXR1cm4tMT09Zi50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihmLGgpe3JldHVybiBNYXRoLmFicyhjLWYuYml0cmF0ZSktTWF0aC5hYnMoYy1oLmJpdHJhdGUpfSk7YT1kLmNvbmNhdChlKX1jYXRjaChmKXt9cmV0dXJuIGF9O1MucHJvdG90eXBlLm5hPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPXRoaXMuQlt0aGlzLnUuZ2V0UG9zKCldO2cuai50cmFjaygidnJ0Y2x6cl9jaG9zZW5fYXV0byIsdGhpcy51LmdldFBvcygpLCEwKTt0aGlzLlUoKTsKdGhpcy5KKCJ2aWRlb3N0YXJ0Iik7dmFyIGQ9Yy52YXN0X2RhdGEsZT1jLmlkO2ZldGNoKGcuai5vKGMuc3JjLCEwKSkudGhlbihmdW5jdGlvbigpe2EucGxheWVyLmMoe2lkOmUsYWxpYXM6YS5hLnJjfSk7dmFyIGY9ZC5aYygpO2EuYS54ZD1mLlViO2EuYS5KKCJTSE9XQ09OVFJPTFMiKTthLnBsYXllci5zdGFydChmKX0pfTtTLnByb3RvdHlwZS5VPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztBcnJheS5mcm9tKHRoaXMuY29udGFpbmVyLmNoaWxkcmVuKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2MhPWEucGxheWVyLmNvbnRhaW5lciYmYyE9YS5PJiZjIT1hLm0mJmMhPWEubGFiZWwmJihjLnN0eWxlLmRpc3BsYXk9Im5vbmUiKTtjPT1hLmxhYmVsJiYoYS5sYWJlbC5pbm5lckhUTUw9Ik51ciBlaW4gU3BvdCBpaHJlciBXYWhsIixhLmxhYmVsLnN0eWxlLm1hcmdpblRvcD0iN3B4Iil9KTt0aGlzLmYuc3R5bGUuZGlzcGxheT0iYmxvY2siO3RoaXMuYy5zdHlsZS56SW5kZXg9IjExMDAwIjt0aGlzLmMuc3R5bGUudG9wPQoiNzBweCI7dGhpcy5jLnN0eWxlLnJpZ2h0PSIwcHgiO3RoaXMuYy5zdHlsZS5jb2xvcj0id2hpdGUiO3RoaXMuYy5zdHlsZS5mb250RmFtaWx5PSJSb2JvdG8sIGFyaWFsLCBzYW5zLXNlcmlmIjt0aGlzLmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmMuaW5uZXJIVE1MPSc8ZGl2IHN0eWxlPSJmb250LXdlaWdodDogYm9sZDsgZm9udC1mYW1pbHk6IFJvYm90bywgYXJpYWwsIHNhbnMtc2VyaWY7IG9wYWNpdHk6IDAuNzsgcGFkZGluZzogNnB4OyBib3JkZXI6ICNGRkZGRkY7IGJhY2tncm91bmQtY29sb3I6IGJsYWNrOyI+TWVociBlcmZhaHJlbjwvZGl2Pic7dGhpcy5jLm9uY2xpY2s9dGhpcy5hLlNjLmJpbmQodGhpcy5hKTt0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmMpfTtTLnByb3RvdHlwZS5xYT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5XKys7dGhpcy5XPj10aGlzLmkubGVuZ3RoJiYoZy5qLnRyYWNrKCJ2cnRjbHpyX2FuaW1hdGlvbnN0YXJ0IiwKIiIsITApLHRoaXMuaS5yZXZlcnNlKCksdGhpcy5pLmZvckVhY2goZnVuY3Rpb24oYyxkKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5jbGFzc0xpc3QucmVtb3ZlKCJzdGFydCIpO2Eub2EoZCk7ZCE9PWEuaS5sZW5ndGgtMT9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5jbGFzc0xpc3QuYWRkKCJvdXQiKX0sNzUwKTpzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5zYSgpfSw3NTApfSw3NTAqZCl9KSx0aGlzLmkucmV2ZXJzZSgpKX07Uy5wcm90b3R5cGUuc2E9ZnVuY3Rpb24oKXt0aGlzLm0uY2xhc3NMaXN0LnJlbW92ZSgic3RhcnQiKTt0aGlzLmxhYmVsLmNsYXNzTGlzdC5yZW1vdmUoInN0YXJ0Iik7dGhpcy5sLmNsYXNzTGlzdC5yZW1vdmUoInN0YXJ0Iik7dGhpcy5mLmNsYXNzTGlzdC5yZW1vdmUoInN0YXJ0Iik7dGhpcy5HLmNsYXNzTGlzdC5hZGQoInN3aXBlLXdyYXAiKTt0aGlzLnMucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLnMpO3RoaXMubGFiZWwuaW5uZXJIVE1MPQoiTnVyIGVpbiBTcG90IElocmVyIFdhaGw8YnI+c3RhcnRldCBpbiAzMCBTZWt1bmRlbiI7Zm9yKHZhciBhPXRoaXMuaS5sZW5ndGgtMTswPD1hO2EtLSl0aGlzLmlbYV0uY2xhc3NMaXN0LnJlbW92ZSgib3V0Iik7dGhpcy5QKDApO3RoaXMucGEoKTt0aGlzLm1hKCl9O1MucHJvdG90eXBlLmlhPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9dGhpcyxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2UuY2xhc3NMaXN0LmFkZCgic3dpcGUtaXRlbSIpO2UuY2xhc3NMaXN0LmFkZCgic3RhcnQiKTtnLmouZmIoYS5wb3J0cmFpdF9pbWFnZV91cmx8fGEuaW1hZ2VfdXJsKS50aGVuKGZ1bmN0aW9uKGgpe2ZldGNoKGgpLnRoZW4oZnVuY3Rpb24obSl7cmV0dXJuIG0uYmxvYigpfSkudGhlbihmdW5jdGlvbihtKXtlLnN0eWxlLmJhY2tncm91bmRTaXplPSJjb3ZlciI7ZS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2U9InVybCgnIitVUkwuY3JlYXRlT2JqZWN0VVJMKG0pKyInKSJ9KS50aGVuKGZ1bmN0aW9uKCl7ZC5xYSgpfSl9KTsKdmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJpY29uLXBsYXkiKTtmLnNldEF0dHJpYnV0ZSgiZGF0YS1pZCIsYyk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTtjLnNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFFZ0FBQUJJQ0FZQUFBQlY3Yk5IQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5VnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFE0SURjNUxqRTJOREF6Tml3Z01qQXhPUzh3T0M4eE15MHdNVG93TmpvMU55QWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lESXhMakVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk1ERTJNamN4TjBRMU5qSkRNVEZGUVVJeFFUTkNRakF3UlROQk5rRTNPRVlpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2TURFMk1qY3hOMFUxTmpKRE1URkZRVUl4UVROQ1FqQXdSVE5CTmtFM09FWWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG93TVRZeU56RTNRalUyTWtNeE1VVkJRakZCTTBKQ01EQkZNMEUyUVRjNFJpSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEb3dNVFl5TnpFM1F6VTJNa014TVVWQlFqRkJNMEpDTURCRk0wRTJRVGM0UmlJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtZnUrdFVBQUFqM1NVUkJWSGphNUp4L2JGUFhGY2Z2czUvdCtFZU03V0R5eStGbjJnSWhJMkV0Q3hBZ0NTMVN0MElIU2xzMkNsM1hyWU9sWTZCTmRGSlZUV2hyWVdxNzBpRmFGR21NVG11blRtRmIxMEZhdWdGdGFFTGFORkJDQTA0Z0pIRmk0OWl4RXlja3NiR2QzVE5mc3pjclRtTDd2dWNmUGRMM0g0anY4L3Y0M0hQUHViOFlKS3lKc1BLd0RGaVpSTE93bEZneXJEVHlkMk5ZYnF4YldIMVlWcUllTEJPV1g2Z3Z6QWp3REMxV01kWkNyTHV3RkRHMk40TFZqblVWcXhscklCa0JTYkR1eFZxRmxjL2pjOENUcm1BMUVsaTNFeDJRSEtzQ3F4d3JYZUR1TzRSMUJ1czAxbWlpQVdJSmxHOVM2RUt4R3NTdFdnTExtd2lBN3NGNm5BVGJSRElJN24vQ01zWUxrQlNyRW11TlFNRStHaHZIK2hpckJzc2pKQ0FZbm5kZzVhRGtNRFBXRVpJcVJHVGlLQjYyR0dzM2xnNGxqOEdBc1FLckc4dkdKNkFTcktkSjkwbzJnNEZrT1phREpKelVBYTNHMms2eTRXUTFDQ2xMc1FhSk4xRUQ5SFdzSjVJY0RoZlNFaEtQekRRQUxTUUJXWXhTeDRLZTFJRmxqd1VRakZaN1NDR1phZ2E5b1FqckFra3V3LzdSWkhuT0RsSStwS3JKeVR0S28vR2dSN0VLVWVwYk9pbVBMa2ZpUVZDQnIwVmZIVnRMM25sYUhnVFFxckRVRkNNaU0wK24xMjhzcjdobmZtWldoZ3d4TXV2Z2dDdkJndlpjckRwU25rd0thQjFKQ0tuQmVmSFo1OHIrY3Vya3FvMWJIc3Q5N01udnpTNWJzeWJYMGRuRnlNYVJ6RExnSEV3UVNHb3lUZEl4R2FBcGcxYWt0bVBMMXVVdkhINnR3T3Yxb3ZIeGNlVDMrMUZHVnBha2N2czJRODRzdmRyZTJlWFh5dVZLaXpNaFFNMGp4YTAzSEtEMU5BUHozSmtaK2lQSGpxNU0xMmpaMFA4RFVIY3ZXYUo4OUludGN6MkRMcWJmYlBhYkhZNTRRNUtRcXI5OUlrQVMyblZXcmk1RCs5d0xMeTRDR0JQT1JXQ1BFb2xFYUVWRnVlN2h6WnZuK3V6OU10L29DSXRCRGNRUlVpNEtUTGI1UXdGOWd4UnoxQ3h2cGs3NzlLNmY1b2NEeEFVbFY2bEVEMjdlbkxsc1daSGVhVGFKTkNxNXltUzFPZU1BQ0J5a0wxalFjZ0Z0d2NxZ0NpaExyLzFCMVU4V1RBV0kyKzJ5REhteVI3WnVNNmlVS3NXbzB5YkdUV2k2elZhSHdKQlVXUFhjUEVnWExnK0l4Y1F5U2NUMUczaVRENE9xM0xvdDY1MzNha3UvOWRERHM5ZVdGTjh0TUtBRmhNa2REMXBCS2x5NlEwSjJac2FUUDlvNWI3b2VGQXBLekxLb3RLeGNWMUcrTG1mVVpaZktwU0tGUU43RWtIbWpHMEZBRzdIMHRKOWkwT3MwMzk5Wk5UOGFRRnhRYW8xV3ZHRlRaZGI4T2ZPMExzZE5jVmFHZGtabmo2VmZBRWlOTE9sbStYdzh3ZXYxVVZraUJraVFSNjFlOTRCbVpWbDV5VnZIanZhS0dKSG9kRVBUVlI0QkFSTXhlTkFjckRJK25wQ05mK2tmUHJNclB4WVBDZ1hGTUF3cXZ2Yys5WVp2YjhwRHQxd0s1UEZJVGRZK1Byb2RzTGtrSm9uaDEvZ0FOQ2R6bHU2cEh6K3pnQllnTGloWldocXovcUdOK21YRnhYcm56UjZ4UnBPdU5wbHYwdTUyWFFCb0pVbXhxVnZlekF6dFUxWDBBWEhUZ3N5Y1hHbmxkeC9QMWMxUUs4YUduSkxaaHB5WkhWMG1HNlZIOUFNZ1dETG1aVlZVcTFDb2R1N2VjeGRmZ0xnZXRiQ2dVTG1wOHBFOGw5UHA5N3BIcERlNmUrd1VtaDRHUUE4aW5qWWFxRmlKYk5mZXZZdjRCblNuYk1FaHRhUjB0ZWIrQjlibm90c2pTcVZVb3J4aGlnbVVWMFN5Um42NkFIeHJnYzNuODZITTdCejI1ZCs5c2ZqNWZmc0tWeTR0akdXRVRnZEFLVGNoSDB3TFZxMnQwQnc2Y21SNWZtNU90RXZrVWw0QlNTUnNYSmVLb0dzWExTOVJGU3hhR0cyTm1TWkNGUGJRaFBWUHBVS1dDTjVreURVb28vMDhBSEx6NWtGcGtyaXZ4RUppMmRYZE1SVGx4OTN3QW1OOGZUa3hLNDRySUppTSs3Uyt6bVc4MXVHTUJkQW9iKzZOaEIvRmdsN0RzaXc2VjNkbTRCYy8zOVBjYmpLYm8yeHFDSXBWbU40MDhJVklhQlBqWE1ocU5YdC8rOHIrOXBhV0ZzZEhqUmZhWW1qT0NZQnN2UDJTTENzU3NqdDVQRzVVWFgybys4US8vOUh6L2djZlg2YlFyQTBBOWZMMXBWbXBWQ3hFZHdJNHRiWHY5aDg3OXZ1T29TR1g1OVNwYzE5U2FyNFhBSmw0YzNjcHZ4NEVjYWExOWRMb2F3ZGZhdXMyZFE5VEJCTTBVeEFRckFWUjMxWW5ZbG1HcnpqamNnMk1Ienk0djcyaG9hSHZ3dy9yVzNsNGpDY0l5SWQxRFFVMlo5S09Dd3p0T09QemVkR2JmNmp1cWFsNXA2djJBK29ld3pWZzRndXVlTGJ3QVFpTjB3RUVjUWE4NXV5L1RqZ09IM3JWYUxQM2o5V2R2OVRPYzNqN2I1QVBBcnFJQXZ1QnFQN2lZamIyVEJyQWRGMXZjeC80OWZOZlhybHFIRGozMmVWclFsUW9LTER6N0E0Z21OTzlqaWhQM292RTBRT0M3dVFlRzBVSDl2K3k3ZVNKazEyTlh4aHZDSmhPWFNkTUVIZFR3VG5hZ0JnbThpNFdHTFlaOUxmamIxdXJYejlrZEEwT3VRV0dBL2JKblpHUzg0OU5LSEQyUW9YaVpEQnNYMnh1R1A3TmdWKzFXaXlXVzNYMXZNZVppV3dZNjdPSkFNRmhOTmpWc0lIYW83eis4ZW5HR2J2TjRuMTUvejVqdzZmbnJaK2NGeVRPaExNemlITXdMM1RmenI5UllJY1psVE5mN2pHUHorVWFSSEs1SW15YzhYcHZvK3JETDNVZXI2bnBQRnQvc1EzRjEwWUlnLy85ZUtHL09jbUxDbWc4VGFQR05pTTlyYWg0V1RwM2VqcFliYi8vWG8xOTc1NnE1cWFteisxMWpYSHBUcUgyTGdvNVh6WlJyZFNKQW9kd1k5N0VhZW16T29ZSEhheDZobEsrYUhHaEVqd0d1cFB4U3N2b3M3dDNmdkgzdng3dlBGMS9vYzFrN25Na0FCeW9TZDhNbllJSU44ckE2ZVNmMGNxTDF0OWZXcUNVU2tUWk9ka0t1ODAyMXRQYk8xemYxSG9kSlk0QmxGY1FaK3ZkVklEQXZvTjRXck5QUUR1TDllY0o0K1FrSHpvT3ZlUXJBTWRDM2hWRkNnaXEyVGNRajFPeUNXQ2o1QjNEbm1lZGFrTHJGZ25hOTZIVU9Dc1dPbUsvanRVMWFZNDJqWVpnYmJ1UGpHeE1pc0NCelFKSHNTNU5tY1JPczBGWUZZQ3pGWVVwQUFsR3JMZXh6azhyeTQrZzRXN2lUVXVUR0JKNHpoKzV4U2hOUUdDd3VSb3E2NklKeXBSRXR6RVNrSnNqK1ZBMHF3NndUQVNUU1hBbFJYcVN3SUVROFNyNWNSSGZnSUtqV3dNS1hJdzBCeVgrMVJUVkpJWkdiRFJlREU1RmIwV0plYm5KV3lod0VWUFVsb3JYNDhDVXhVbVVRTmZqY0EzZ1ZKQWFMaDRYTEgxRTVuTkdhRFhLNXhWZGtIMlhZczFIL0Y3UlpTVHhNQ211NkpySU1raGFzSVJNbzBoaWJPODJtWmFBZGF2UFVaSmU4amJacUFuWEJNS3BQdTQxZ2JCUUFGY0VTam1GTXVRdHcrai9yd21FU1MxWUt2Y0o5WVgvSThBQUpZdmZsdU9pK0pFQUFBQUFTVVZPUks1Q1lJST0iOwpmLmFwcGVuZENoaWxkKGMpO2UuZGF0YT1hO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD0ic3VibGluZSI7Yy5pbm5lckhUTUw9JzxkaXYgY2xhc3M9ImxhYmVsIj4nK2Euc3VibGluZSsiPC9kaXY+IjtlLmFwcGVuZENoaWxkKGMpO2UuYXBwZW5kQ2hpbGQoZik7dGhpcy5HLmFwcGVuZENoaWxkKGUpO3JldHVybiBlfTtTLnByb3RvdHlwZS5mYT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7QXJyYXkuZnJvbShkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJpY29uLXBsYXkiKSkuZm9yRWFjaChmdW5jdGlvbihjKXt2YXIgZD1jLmdldEF0dHJpYnV0ZSgiZGF0YS1pZCIpO2QmJmMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChhLk4pO2cuai50cmFjaygidnJ0Y2x6cl9jaG9zZW4iLGEudS5nZXRQb3MoKSwhMCk7YS5VKCk7YS5KKCJ2aWRlb3N0YXJ0Iik7dmFyIGU9YS5CW2RdLGY9ZS52YXN0X2RhdGEsaD1lLmlkO2ZldGNoKGcuai5vKGUuc3JjLAohMCkpLnRoZW4oZnVuY3Rpb24oKXthLnBsYXllci5jKHtpZDpoLGFsaWFzOmEuYS5yY30pO3ZhciBtPWYuWmMoKTthLmEueGQ9bS5VYjthLnBsYXllci5zdGFydChtKX0pfSl9KX07Uy5wcm90b3R5cGUubWE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMudT1uZXcgU3dpcGUodGhpcy5BLHtzdGFydFNsaWRlOjAsYXV0bzohMSxkcmFnZ2FibGU6ITEsYXV0b1Jlc3RhcnQ6ITEsY29udGludW91czohMCxkaXNhYmxlU2Nyb2xsOiEwLHN0b3BQcm9wYWdhdGlvbjohMCx0cmFuc2l0aW9uRW5kOmZ1bmN0aW9uKGMpe2EudGEoYyk7YS5ZfHwoYS5ZPSEwLGcuai50cmFjaygidnJ0Y2x6cl9hbmltYXRpb25maW5pc2hlZCIsIiIsITApKX19KTt0aGlzLmZhKCl9O1MucHJvdG90eXBlLnRhPWZ1bmN0aW9uKGEpe3RoaXMuUChhKX07Uy5wcm90b3R5cGUuUD1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibGltb2J1dHRvbiIpO2MubGVuZ3RoJiYoQXJyYXkuZnJvbShjKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2QuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIil9KSwKY1thXS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKSl9O1MucHJvdG90eXBlLm9hPWZ1bmN0aW9uKGEpe3RoaXMubC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJsaW1vYnV0dG9uIilbYV0ucGFyZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCJzdGFydCIpfTtTLnByb3RvdHlwZS5lYT1mdW5jdGlvbihhKXt2YXIgYz10aGlzLGQ9dGhpcy5sLmZpcnN0RWxlbWVudENoaWxkLGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKTtlLmNsYXNzTGlzdC5hZGQoInN0YXJ0Iik7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5jbGFzc0xpc3QuYWRkKCJsaW1vYnV0dG9uIik7ZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtjLnUuc2xpZGUoYSw1MCk7Yy5QKGEpfSk7ZS5hcHBlbmRDaGlsZChmKTtkLmFwcGVuZENoaWxkKGUpfTtTLnByb3RvdHlwZS5iYT1mdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiYm9keS1uby1zY3JvbGwiKTsKdGhpcy5KKCJjb21wbGV0ZSIpfTtTLnByb3RvdHlwZS5aPWZ1bmN0aW9uKCl7Zm9yKGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiYm9keS1uby1zY3JvbGwiKTt0aGlzLmIuZmlyc3RDaGlsZDspdGhpcy5iLnJlbW92ZUNoaWxkKHRoaXMuYi5sYXN0Q2hpbGQpO3RoaXMuYiYmdGhpcy5iLnBhcmVudEVsZW1lbnQmJnRoaXMuYi5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuYik7dGhpcy5jb250YWluZXImJnRoaXMuY29udGFpbmVyLnBhcmVudEVsZW1lbnQmJnRoaXMuY29udGFpbmVyLnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5jb250YWluZXIpO3JldHVybiBudWxsfTt5KGNhLHZhKTtjYS5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt0aGlzLk89YS5pZDt0aGlzLlA9YS5hbGlhc307Y2EucHJvdG90eXBlLnM9ZnVuY3Rpb24oKXt2YXIgYT1iYi5wb3AoKTthfHwoYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLGEuc3R5bGUuZGlzcGxheT0iYmxvY2siKTsKcmV0dXJuIGF9O2NhLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbihhKXt0aGlzLkEoYSl9O2NhLnByb3RvdHlwZS5BPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXM7RmMoZnVuY3Rpb24oZCl7Yy5hLnNyYz1hO2MuYS5sb2FkKCk7Yy5wbGF5KCk7ZC5hPTB9KX07Y2EucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuYS5zcmMmJnRoaXMuYS5wbGF5KCkuY2F0Y2goZnVuY3Rpb24oKXtnLmoudHJhY2soInZydGNsenJfcHJvbWlzZWZhaWx1cmUiLCIiLCEwKTthLnBhcmVudC5jbG9zZSgpO2EucGFyZW50LmEuSihhLnBhcmVudC5hLmV2ZW50Lk9hKX0pfTtjYS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLmEucGF1c2UoKX07Y2EucHJvdG90eXBlLmlzUGxheWluZz1mdW5jdGlvbigpe3JldHVybiAwPHRoaXMuYS5jdXJyZW50VGltZSYmIXRoaXMuYS5wYXVzZWR9O2NhLnByb3RvdHlwZS5pc1BhdXNlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmEucGF1c2VkfTsKY2EucHJvdG90eXBlLmViPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5tdXRlZH07Y2EucHJvdG90eXBlLlhhPWZ1bmN0aW9uKCl7dGhpcy5hLm11dGVkPSEwfTtjYS5wcm90b3R5cGUuJGE9ZnVuY3Rpb24oKXt0aGlzLmEubXV0ZWQ9ITF9O2NhLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmEuY3VycmVudFRpbWV9O2NhLnByb3RvdHlwZS5nZXREdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmEuZHVyYXRpb259O2NhLnByb3RvdHlwZS5HPWZ1bmN0aW9uKCl7dGhpcy5hLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWQpO3RoaXMuYS5zZXRBdHRyaWJ1dGUoIndpZHRoIix0aGlzLmIud2lkdGgpO3RoaXMuYS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsdGhpcy5iLmhlaWdodCk7dGhpcy5hLnNldEF0dHJpYnV0ZSgicHJlbG9hZCIsdGhpcy5iLnByZWxvYWQpO3RoaXMuYS5zZXRBdHRyaWJ1dGUoIndlYmtpdC1wbGF5c2lubGluZSIsInRydWUiKTsKdGhpcy5hLnNldEF0dHJpYnV0ZSgicGxheXNpbmxpbmUiLCJ0cnVlIik7dGhpcy53Yi5hcHBlbmRDaGlsZCh0aGlzLmEpO3RoaXMuYS5yZW1vdmVBdHRyaWJ1dGUoImNvbnRyb2xzIil9O2NhLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7fTtjYS5wcm90b3R5cGUuSz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5hLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt9KTt0aGlzLmEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLGZ1bmN0aW9uKCl7YS5pKCl9KTt0aGlzLmEuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYyl7dmFyIGQ9Yy5jdXJyZW50VGFyZ2V0O2MuY3VycmVudFRpbWU9ZC5jdXJyZW50VGltZTswPGQuZHVyYXRpb24mJmEuSigidGltZXVwZGF0ZSIsYyl9KTt0aGlzLmEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7YS5KKCJlcnJvciIpfSk7dGhpcy5hLmFkZEV2ZW50TGlzdGVuZXIoInBhdXNlIiwKZnVuY3Rpb24oKXt9KTt0aGlzLmEuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXthLkooInBsYXlpbmciKX0pfTt5KE5hLGNhKTtOYS5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oYSl7dGhpcy5qYT1hLmphO3RoaXMubD1hLmE7dGhpcy5mb3JtYXQ9YS5hWzBdLmZvcm1hdDtjYS5wcm90b3R5cGUuc3RhcnQuY2FsbCh0aGlzLGEuYVswXS51cmwpfTtOYS5wcm90b3R5cGUuaT1mdW5jdGlvbigpe3RoaXMuYS5zdHlsZS5vYmplY3RGaXQ9ImNvdmVyIjt2YXIgYT10aGlzLmEub2Zmc2V0V2lkdGgvdGhpcy5hLm9mZnNldEhlaWdodDtpZigibGFuZHNjYXBlIj09PXRoaXMuZm9ybWF0fHwic3F1YXJlIj09PXRoaXMuZm9ybWF0KXRoaXMuYS5zdHlsZS5vYmplY3RGaXQ9LjU2MjU+YT8iY29udGFpbiI6ImNvdmVyIjsicG9ydHJhaXQiPT09dGhpcy5mb3JtYXQmJih0aGlzLmEuc3R5bGUub2JqZWN0Rml0PSJjb250YWluIil9O05hLnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7dmFyIGE9CnRoaXM7dGhpcy5hLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7MDxhLmEuZHVyYXRpb24mJmEuTihhLmEuY3VycmVudFRpbWUpfSk7dGhpcy5hLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIixmdW5jdGlvbigpe2EudSgpfSl9O05hLnByb3RvdHlwZS5OPWZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTthIT09dGhpcy5mJiYoMD09PWEmJih0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSxnLmoudHJhY2soInZydGNsenJfaW1wcmVzc2lvbiIsIiIsITApKSxhPT09TWF0aC5mbG9vcih0aGlzLmEuZHVyYXRpb24vNCkmJnRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxhPT09TWF0aC5mbG9vcih0aGlzLmEuZHVyYXRpb24vMikmJnRoaXMudHJhY2soIm1pZHBvaW50IiksYT09PU1hdGguZmxvb3IoMyp0aGlzLmEuZHVyYXRpb24vNCkmJnRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSwKdGhpcy5mPWEpfTtOYS5wcm90b3R5cGUudT1mdW5jdGlvbigpe2cuai50cmFjaygidnJ0Y2x6cl9lbmRlZCIsIiIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7dGhpcy5KKCJlbmRlZCIpO3RoaXMucGFyZW50LmEuWmEoImVuZGVkIix7fSl9O05hLnByb3RvdHlwZS50cmFjaz1mdW5jdGlvbihhKXt0aGlzLkIoYSkuZm9yRWFjaChmdW5jdGlvbihjKXt2YXIgZD17fTsiaW1wcmVzc2lvbiI9PT1hJiZjLmlkLmluY2x1ZGVzKCJIT01BRF8iKSYmKGQ9e2hvbWFkX2ltcF9wcmVmaXg6InZlcnRpY2FsaXpyLSJ9KTtmZXRjaChnLmoubyhjLnVybCwhMSxkKSl9KTt0aGlzLmphPXRoaXMubShhKX07TmEucHJvdG90eXBlLkI9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuamEuZmlsdGVyKGZ1bmN0aW9uKGMpe3JldHVybiBjLnR5cGU9PT1hfSl9O05hLnByb3RvdHlwZS5tPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmphLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4gYy50eXBlIT09YX0pfTtUYS5wcm90b3R5cGUuYj0KZnVuY3Rpb24oYSl7dGhpcy5qYT10aGlzLmphLmNvbmNhdChhKX07SWEucHJvdG90eXBlLkI9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PXRoaXMuQy5xdWVyeVNlbGVjdG9yKCJWQVNUQWRUYWdVUkkiKX07SWEucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjO3JldHVybiBGYyhmdW5jdGlvbihkKXtpZigxPT1kLmEpe2EuamE9YS5vKCk7YS5nPWEuRigpO2lmKCFhLkIoKSlyZXR1cm4gYS5iPWEubSgpLGEudSgpP2QucmV0dXJuKG5ldyBqYShhLmphLGEuYixhLmcsYS5DKSk6ZC5yZXR1cm4obmV3IFRhKC0xIT1hLmdldER1cmF0aW9uKCk/bmV3IEMoQy5mKTpuZXcgQyhDLmwpLHtDOmEuQ30pKTthLnM9bmV3IG5iKGEuQy5xdWVyeVNlbGVjdG9yKCJWQVNUQWRUYWdVUkkiKS50ZXh0Q29udGVudCk7cmV0dXJuIHFjKGQsYS5zLmxvYWQoKSwzKX1jPWQuYjtjLmIoYS5qYSk7cmV0dXJuIGQucmV0dXJuKGMpfSl9O0lhLnByb3RvdHlwZS5vPWZ1bmN0aW9uKCl7dmFyIGE9CnRoaXM7WyJOb25MaW5lYXJBZHMiLCJDb21wYW5pb24iXS5mb3JFYWNoKGZ1bmN0aW9uKGQpe0FycmF5LmZyb20oYS5DLnF1ZXJ5U2VsZWN0b3JBbGwoZCkpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfSl9KTt2YXIgYz1bXTsiSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZCl7QXJyYXkuZnJvbShhLkMucXVlcnlTZWxlY3RvckFsbChkKSkuZm9yRWFjaChmdW5jdGlvbihlKXtpZihlKXt2YXIgZj1lLmdldEF0dHJpYnV0ZSgiaWQiKXx8ZC50b0xvd2VyQ2FzZSgpLGg9ZS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKSxtPWUuZ2V0QXR0cmlidXRlKCJvZmZzZXQiKXx8ZC50b0xvd2VyQ2FzZSgpO2MucHVzaCh7aWQ6Zix0eXBlOmgsdXJsOmUudGV4dENvbnRlbnQsCnJlcXVlc3Q6YS5pKGUudGV4dENvbnRlbnQpLG9mZnNldDptfSl9fSl9KTtyZXR1cm4gY307SWEucHJvdG90eXBlLkY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVmVyaWZpY2F0aW9ucyIpWzBdO3JldHVybltdLnNsaWNlLmNhbGwoYT9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb24iKTpbXSl9O0lhLnByb3RvdHlwZS5tPWZ1bmN0aW9uKCl7dmFyIGE9W107QXJyYXkuZnJvbSh0aGlzLkMucXVlcnlTZWxlY3RvckFsbCgiTWVkaWFGaWxlIikpLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9e307QXJyYXkuZnJvbShjLmF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24oZSl7ZFtlLmxvY2FsTmFtZV09ZS52YWx1ZX0pO2QuZm9ybWF0PTEqZC53aWR0aD4xKmQuaGVpZ2h0PyJsYW5kc2NhcGUiOjEqZC53aWR0aD09MSpkLmhlaWdodD8ic3F1YXJlIjoicG9ydHJhaXQiO2QudXJsPWMudGV4dENvbnRlbnQ7YS5wdXNoKGQpfSk7cmV0dXJuIGF9OwpJYS5wcm90b3R5cGUudT1mdW5jdGlvbigpe3JldHVybiAxPHRoaXMuZ2V0RHVyYXRpb24oKX07SWEucHJvdG90eXBlLmdldER1cmF0aW9uPWZ1bmN0aW9uKCl7dHJ5e3ZhciBhPUViKHRoaXMuQy5xdWVyeVNlbGVjdG9yKCJEdXJhdGlvbiIpLnRleHRDb250ZW50LnNwbGl0KCI6IikpLGM9YS5uZXh0KCkudmFsdWUsZD1hLm5leHQoKS52YWx1ZSxlPWEubmV4dCgpLnZhbHVlO3JldHVybiAzNjAwKitjKzYwKitkKyArZX1jYXRjaChmKXtyZXR1cm4tMX19O0lhLnByb3RvdHlwZS5pPWZ1bmN0aW9uKGEpe3JldHVybiBEYSYmImZ1bmN0aW9uIj09PXR5cGVvZiBEYS5vP0RhLm8oYSk6bmV3IFJlcXVlc3QoYSx7bWV0aG9kOiJHRVQifSl9O3kobmIsSWEpO25iLnByb3RvdHlwZS5sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjLGQsZSxmO3JldHVybiBGYyhmdW5jdGlvbihoKXtzd2l0Y2goaC5hKXtjYXNlIDE6cmV0dXJuIHFjKGgsYS5sKGEuc3JjKS5jYXRjaChmdW5jdGlvbihtKXt0aHJvdyBuZXcgVGEobmV3IEMoQy5iKSwKe2Vycm9yOm19KTt9KSwyKTtjYXNlIDI6cmV0dXJuIGM9aC5iLHFjKGgsYS5mKGMpLmNhdGNoKGZ1bmN0aW9uKG0pe3Rocm93IG5ldyBUYShuZXcgQyhDLmIpLHtlcnJvcjptLHJlc3BvbnNlOmN9KTt9KSwzKTtjYXNlIDM6cmV0dXJuIGQ9aC5iLGEuYT0obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGQsInRleHQveG1sIiksYS5DPWEuYS5xdWVyeVNlbGVjdG9yKCJBZCIpLGEuQz9xYyhoLGEucGFyc2UoKS5jYXRjaChmdW5jdGlvbihtKXt0aHJvdyBtO30pLDQpOihlPW5ldyBUYShuZXcgQyhDLmcpLGEuQyksZS5iKGEuYygpKSxoLnJldHVybihlKSk7Y2FzZSA0OnJldHVybiBmPWguYixoLnJldHVybihmKX19KX07bmIucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSl7cmV0dXJuIERhJiYiZnVuY3Rpb24iPT09dHlwZW9mIERhLmRhP0RhLmRhKGEpOmZldGNoKG5ldyBSZXF1ZXN0KGEse21ldGhvZDoiR0VUIn0pKX07bmIucHJvdG90eXBlLmY9ZnVuY3Rpb24oYSl7cmV0dXJuIEZjKGZ1bmN0aW9uKGMpe2lmKDEwPgpNYXRoLmFicyhhLnN0YXR1cy0yMDApJiZhLmJvZHkpcmV0dXJuIGMucmV0dXJuKGEudGV4dCgpLnRoZW4oZnVuY3Rpb24oZCl7cmV0dXJuIGR9KSk7bmV3IEMoQy5iLHtyZXNwb25zZTphfSk7Yy5hPTB9KX07bmIucHJvdG90eXBlLmM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGM9W107QXJyYXkuZnJvbSh0aGlzLmEucXVlcnlTZWxlY3RvckFsbCgiRXJyb3IiKSkuZm9yRWFjaChmdW5jdGlvbihkKXtpZihkKXt2YXIgZT1kLmdldEF0dHJpYnV0ZSgiaWQiKXx8ZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO2MucHVzaCh7aWQ6ZSx0eXBlOiJlcnJvciIsdXJsOmQudGV4dENvbnRlbnQscmVxdWVzdDphLmkoZC50ZXh0Q29udGVudCl9KX19KTtyZXR1cm4gY307eShXLHZhKTtXLnByb3RvdHlwZS5aYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmIuc2hpZnQoKX07Vy5wcm90b3R5cGUubG9hZD1mdW5jdGlvbihhKXt2YXIgYz10aGlzO3RoaXMuc3JjPWE7dGhpcy51KCkudGhlbihmdW5jdGlvbigpe2MuSigiY29tcGxldGUiLApjKX0pLmNhdGNoKGZ1bmN0aW9uKGQpe2MuSigiZXJyb3IiLGQpfSl9O1cucHJvdG90eXBlLmJhPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXM7cmV0dXJuIEZjKGZ1bmN0aW9uKGQpe3JldHVybiAxPT1kLmE/KGMuc3JjPWEscWMoZCxjLnUoKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIGN9KS5jYXRjaChmdW5jdGlvbihlKXtyZXR1cm4gbmV3IEMoQy5iLHtlcnJvcjplfSl9KSwyKSk6ZC5yZXR1cm4oZC5iKX0pfTtXLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihhKXt2YXIgYz10aGlzO3JldHVybiBGYyhmdW5jdGlvbihkKXtyZXR1cm4gcWMoZCxjLkcoYSksMCl9KX07Vy5wcm90b3R5cGUudT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYyxkO3JldHVybiBGYyhmdW5jdGlvbihlKXtzd2l0Y2goZS5hKXtjYXNlIDE6cmV0dXJuIHFjKGUsYS5QKGEuc3JjKS5jYXRjaChmdW5jdGlvbihmKXt0aHJvdyBuZXcgQyhDLmIsZik7fSksMik7Y2FzZSAyOnJldHVybiBjPWUuYixxYyhlLGEuTyhjKS5jYXRjaChmdW5jdGlvbigpe3Rocm93IG5ldyBDKEMuYiwKe3Jlc3BvbnNlOmN9KTt9KSwzKTtjYXNlIDM6cmV0dXJuIGQ9ZS5iLHFjKGUsYS5HKGQpLDQpO2Nhc2UgNDplLmE9MH19KX07Vy5wcm90b3R5cGUuVT1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5CKCkudGhlbihmdW5jdGlvbigpe2EuSigiY29tcGxldGUiLGEpfSkuY2F0Y2goZnVuY3Rpb24oYyl7YS5KKCJlcnJvciIsYyl9KX07Vy5wcm90b3R5cGUuUD1mdW5jdGlvbihhKXtyZXR1cm4gRGEmJiJmdW5jdGlvbiI9PT10eXBlb2YgRGEuZGE/RGEuZGEoYSx0aGlzLmRhKTpmZXRjaChuZXcgUmVxdWVzdChhLHttZXRob2Q6IkdFVCJ9KSl9O1cucHJvdG90eXBlLk89ZnVuY3Rpb24oYSl7aWYoMTA+TWF0aC5hYnMoYS5zdGF0dXMtMjAwKSlyZXR1cm4gYS50ZXh0KCkudGhlbihmdW5jdGlvbihjKXtyZXR1cm4gY30pO3Rocm93IG5ldyBDKEMuYix7cmVzcG9uc2U6YX0pO307Vy5wcm90b3R5cGUuRz1mdW5jdGlvbihhKXt2YXIgYz10aGlzLGQsZSxmO3JldHVybiBGYyhmdW5jdGlvbihoKXt0cnl7Yy5hPQoobmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIil9Y2F0Y2gobSl7dGhyb3cgbmV3IEMoQy5vLHtlcnJvcjptLHJlc3VsdDphfSk7fWQ9Yy5hLmZpcnN0Q2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtzd2l0Y2goZCl7Y2FzZSAidmFzdCI6Yy5NYT1BcnJheS5mcm9tKGMuYS5xdWVyeVNlbGVjdG9yQWxsKCJBZCIpKTtjLmM9MCE9PWMuYS5xdWVyeVNlbGVjdG9yQWxsKCJBZFtzZXF1ZW5jZV0iKS5sZW5ndGg7Yy5jJiYoYy5EPWMuYS5xdWVyeVNlbGVjdG9yQWxsKCJBZFtzZXF1ZW5jZV0iKS5sZW5ndGgpO2MubD0xPGMuTWEubGVuZ3RoJiYhYy5jO2JyZWFrO2Nhc2UgInZtYXA6dm1hcCI6Yy5ZPSEwO2MuZigicHJlcm9sbCIpO2MuZigibWlkcm9sbCIpO2MuZigicG9zdHJvbGwiKTtjLk1hLmxlbmd0aHx8Yy5mKCk7YnJlYWs7Y2FzZSAicGxheWxpc3QiOmMuVz0hMDtjLm0oIlByZXJvbGwiKTtjLm0oIk1pZHJvbGwiKTtjLm0oIlBvc3Ryb2xsIik7YnJlYWs7CmRlZmF1bHQ6dGhyb3cgZT1uZXcgQyhDLmcpLGMuaS5wdXNoKG5ldyBUYShlLHt2YXN0OmMuYX0pKSxlO31jLk1hLmxlbmd0aHx8KGY9bmV3IFRhKG5ldyBDKEMuZykse30pLGYuYihjLksoKSksYy5pLnB1c2goZikpO3JldHVybiBoLnJldHVybihjLkIoKSl9KX07Vy5wcm90b3R5cGUuQj1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYyxkLGU7cmV0dXJuIEZjKGZ1bmN0aW9uKGYpe2lmKDE9PWYuYSl7aWYoIShhLmIubGVuZ3RoPGEuRCYmYS5NYS5sZW5ndGgpKXtmLmE9MztyZXR1cm59Yz1hLlo7ZD1jLnB1c2g7cmV0dXJuIHFjKGYsYS5TKGEuTWEuc2hpZnQoKSksNCl9aWYoMyE9Zi5hKWQuY2FsbChjLGYuYiksZi5hPTE7ZWxzZXtpZihhLnljKXJldHVybiBmLnJldHVybihhKTtlPW5ldyBDKEMuYyx7ZGV0YWlsczpDLmEuT2R9KTthLiRjKCkmJihlPW5ldyBDKEMuYyx7ZGV0YWlsczpDLmEubmR9KSk7YS5pLnB1c2gobmV3IFRhKGUse3Zhc3Q6YS5hfSkpO3Rocm93IGU7fX0pfTtXLnByb3RvdHlwZS4kYz0KZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5iLmxlbmd0aDtjKyspdGhpcy5iW2NdLiRjKCkmJihhPSEwKTtyZXR1cm4gYX07Vy5wcm90b3R5cGUuUz1mdW5jdGlvbihhKXt2YXIgYz10aGlzLGQsZTtyZXR1cm4gRmMoZnVuY3Rpb24oZil7aWYoMT09Zi5hKXJldHVybiBkPW5ldyBJYShhLGEuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpKSxxYyhmLGQucGFyc2UoKS5jYXRjaChmdW5jdGlvbihoKXtyZXR1cm4gaH0pLDIpO2U9Zi5iO2UgaW5zdGFuY2VvZiBqYT9jLmIucHVzaChlKTplIGluc3RhbmNlb2YgVGEmJmMuaS5wdXNoKGUpO3JldHVybiBmLnJldHVybihkKX0pfTtXLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXM7KGE/QXJyYXkuZnJvbSh0aGlzLmEucXVlcnlTZWxlY3RvckFsbCgnQWRCcmVha1ticmVha0lkPSInK2ErJyJdJykpOkFycmF5LmZyb20odGhpcy5hLnF1ZXJ5U2VsZWN0b3JBbGwoIkFkQnJlYWsiKSkpLmZvckVhY2goZnVuY3Rpb24oZCwKZSl7dmFyIGY9ZC5xdWVyeVNlbGVjdG9yKCJWQVNUQWREYXRhIik7KGQ9ZC5xdWVyeVNlbGVjdG9yKCJBZFRhZ1VSSSIpKT8oZT1jLnMoZC50ZXh0Q29udGVudCxlKSxhJiZlLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLGEpLGMuTWEucHVzaChlKSk6ZiYmQXJyYXkuZnJvbShmLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKS5mb3JFYWNoKGZ1bmN0aW9uKGgpe2EmJmguc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsYSk7Yy5NYS5wdXNoKGgpfSl9KX07Vy5wcm90b3R5cGUubT1mdW5jdGlvbihhKXt2YXIgYz10aGlzO0FycmF5LmZyb20odGhpcy5hLnF1ZXJ5U2VsZWN0b3JBbGwoYSkpLmZvckVhY2goZnVuY3Rpb24oZCxlKXtpZihkPWQucXVlcnlTZWxlY3RvcigiQWQiKSllPWMucyhkLnRleHRDb250ZW50LGUpLGUuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsYSksYy5NYS5wdXNoKGUpfSl9O1cucHJvdG90eXBlLks9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGM9W107QXJyYXkuZnJvbSh0aGlzLmEucXVlcnlTZWxlY3RvckFsbCgiRXJyb3IiKSkuZm9yRWFjaChmdW5jdGlvbihkKXtpZihkKXt2YXIgZT0KZC5nZXRBdHRyaWJ1dGUoImlkIil8fGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtjLnB1c2goe2lkOmUsdHlwZToiZXJyb3IiLHVybDpkLnRleHRDb250ZW50LHJlcXVlc3Q6YS5OKGQudGV4dENvbnRlbnQpfSl9fSk7cmV0dXJuIGN9O1cucHJvdG90eXBlLk49ZnVuY3Rpb24oYSl7cmV0dXJuIERhJiYiZnVuY3Rpb24iPT09dHlwZW9mIERhLm8/RGEubyhhKTpuZXcgUmVxdWVzdChhLHttZXRob2Q6IkdFVCJ9KX07Vy5wcm90b3R5cGUucz1mdW5jdGlvbihhLGMpe2E9Jzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PFZBU1QgdmVyc2lvbj0iNC4wIj48QWQgc2VxdWVuY2U9IltTRVFVRU5DRV0iPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbW1VSSV1dXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD48L1ZBU1Q+Jy5yZXBsYWNlKCJbU0VRVUVOQ0VdIixjLnRvU3RyaW5nKCkpLnJlcGxhY2UoIltVUkldIixhKTtyZXR1cm4obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsCiJ0ZXh0L3htbCIpLmZpcnN0RWxlbWVudENoaWxkLmZpcnN0RWxlbWVudENoaWxkfTtRYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXLnByb3RvdHlwZSx7eWM6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuYi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIWEuZ2UoKX0pLmxlbmd0aH19LEE6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuTWEubGVuZ3RofX19KTtqYS5wcm90b3R5cGUuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuYS5sZW5ndGh9O2phLnByb3RvdHlwZS5mPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztyZXR1cm4gMDx0aGlzLmEuZmlsdGVyKGZ1bmN0aW9uKGMpe3JldHVybiBhLmMuaW5jbHVkZXMoYy50eXBlKX0pLmxlbmd0aH07amEucHJvdG90eXBlLnM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3JldHVybiB0aGlzLmEuZmlsdGVyKGZ1bmN0aW9uKGMpe3JldHVybiBhLmMuaW5jbHVkZXMoYy50eXBlKX0pWzBdfTsKamEucHJvdG90eXBlLmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub2N9O2phLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcztyZXR1cm4gdGhpcy5hLmZpbHRlcihmdW5jdGlvbihjKXtyZXR1cm4hYS5jLmluY2x1ZGVzKGMudHlwZSl9KVswXX07amEucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5qYT10aGlzLmphLmNvbmNhdChhKX07amEucHJvdG90eXBlLiRjPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5DLnF1ZXJ5U2VsZWN0b3JBbGwoIk1lenphbmluZSIpLGM9ITE7YSYmYS5sZW5ndGgmJihjPSEwKTtyZXR1cm4gY307amEucHJvdG90eXBlLm89ZnVuY3Rpb24oKXt0cnl7dmFyIGE9RWIodGhpcy5DLnF1ZXJ5U2VsZWN0b3IoIkR1cmF0aW9uIikudGV4dENvbnRlbnQuc3BsaXQoIjoiKSksYz1hLm5leHQoKS52YWx1ZSxkPWEubmV4dCgpLnZhbHVlLGU9YS5uZXh0KCkudmFsdWU7cmV0dXJuIDM2MDAqK2MrNjAqK2QrICtlfWNhdGNoKGYpe3JldHVybi0xfX07amEucHJvdG90eXBlLkY9CmZ1bmN0aW9uKCl7dmFyIGE9MCxjPSExO3RyeXtjPXRoaXMuQy5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxhPWcuai5aYihjLHRoaXMuZHVyYXRpb24pLDA+YSYmKGE9MCl9Y2F0Y2goZCl7YT0wfXJldHVybiBhfTtqYS5wcm90b3R5cGUubD1mdW5jdGlvbigpe3RyeXt2YXIgYT10aGlzLkMucXVlcnlTZWxlY3RvcigiQWRQYXJhbWV0ZXJzIik7cmV0dXJuIGE/YS50ZXh0Q29udGVudDoiIn1jYXRjaChjKXtyZXR1cm4iIn19O2phLnByb3RvdHlwZS5tPWZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMuQy5xdWVyeVNlbGVjdG9yKCJDbGlja1Rocm91Z2giKTtyZXR1cm4gYT9hLnRleHRDb250ZW50OiIifWNhdGNoKGMpe3JldHVybiIifX07amEucHJvdG90eXBlLkI9ZnVuY3Rpb24oKXt0cnl7aWYoIXRoaXMuZylmb3IodmFyIGE9dGhpcy5DLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYz0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGM9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYKMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5nPWFbZF0pO3JldHVybiB0aGlzLmd9Y2F0Y2goZSl7cmV0dXJuIiJ9fTtqYS5wcm90b3R5cGUuQWQ9ZnVuY3Rpb24oKXt0cnl7aWYodGhpcy5pKXJldHVybiB0aGlzLmk7dmFyIGE9IiIsYz10aGlzLkIoKTtjJiZjLmdldEF0dHJpYnV0ZT8oYT1jLmdldEF0dHJpYnV0ZSgiaWQiKSxhPWEucmVwbGFjZSgiSE9NQURfIiwiIiksKGE9YS5yZXBsYWNlKCJIT01BRCIsIiIpKXx8KGE9ImVtcHR5IikpOmE9Im5vX2ltcF9ub2RlIjtyZXR1cm4gdGhpcy5pPWF9Y2F0Y2goZCl7cmV0dXJuIiJ9fTt5KEMsRXJyb3IpO0Mubz17dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIix2YToiWE1MX1BBUlNFX0VSUk9SIn07Qy5sPXt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIix2YToiRFVSQVRJT05fRVJST1IifTtDLmc9e3R5cGU6ImVycm9yIiwKY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIix2YToiRU1QVFlfVkFTVCJ9O0MuQj17dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIix2YToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn07Qy5iPXt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLAp2YToiTE9BRF9FUlJPUiJ9O0MuaT17dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsdmE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifTtDLm09e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsdmE6Ik1FRElBRklMRV9FUlJPUiJ9O0MuZj17dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIix2YToiRFVNTVlfQUQifTtDLkY9e3R5cGU6ImVycm9yIixjb2RlOi0xLG1lc3NhZ2U6InVua25vd24iLHZhOiJ1bmtub3duIn07Qy5jPXt0eXBlOiJlcnJvciIsY29kZTo1NTUsbWVzc2FnZToibm8gcGxheWFibGUgYWRzIix2YToiTk9fUExBWUFCTEVfQURTIn07Qy5hPXtPZDp7dHlwZToiZXJyb3IiLApjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIix2YToiTk9fQURTIn0sUWQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHZhOiJOT19NRURJQUZJTEVTIn0sbmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsdmE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxUZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIix2YToiVlBBSURfSUdOT1JFRCJ9LG5kOnt0eXBlOiJlcnJvciIsY29kZTozMDM1LG1lc3NhZ2U6Im9ubHkgbWV6emFuaW5lIix2YToiT05MWV9NRVpaQU5JTkUifSxQZDp7dHlwZToiaGludCIsY29kZTotMSxtZXNzYWdlOiJubyBkZXRhaWwiLHZhOiJubyBkZXRhaWwifX07aWEucHJvdG90eXBlLnU9ZnVuY3Rpb24oYSl7dmFyIGM9ITEsZD0wLGU9MDthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKYz0iZml4ZWQiLGQ9YS5sZWZ0LGU9YS50b3ApO2Q9e3g6ZCx5OmV9O2QucG9zaXRpb249YztyZXR1cm4gZH07aWEucHJvdG90eXBlLmdldFBvc2l0aW9uPWZ1bmN0aW9uKGEpe2lmKHRoaXMubC51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMudShhKTtmb3IodmFyIGM9MCxkPTAsZT0hMSxmPXRoaXMuQShhKTthOyljKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7ZiYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCxjKz12b2lkIDAhPT13aW5kb3cucGFnZVhPZmZzZXQ/d2luZG93LnBhZ2VYT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCwKZCs9YSx0aGlzLmwucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmwucG9zaXRpb25JZkZpeGVkKSk7Yz17eDpjLHk6ZH07ZSYmKGMucG9zaXRpb249ZSk7cmV0dXJuIGN9O2lhLnByb3RvdHlwZS5LPWZ1bmN0aW9uKCl7dGhpcy5CPSEwfTtpYS5wcm90b3R5cGUuRD1mdW5jdGlvbigpe3RoaXMuVC5wYXVzZSgpO2wuYSh2LmIsdGhpcy5ULkNhKCkpfTtpYS5wcm90b3R5cGUuRz1mdW5jdGlvbigpe3RoaXMuQnx8KHRoaXMuVC5wbGF5KCksbC5hKHYuZyx0aGlzLlQuQ2EoKSkpfTtpYS5wcm90b3R5cGUuTT1mdW5jdGlvbigpe3ZhciBhPTIxNDc0ODM2NDc7Zy52LmIoInpJbmRleCIpJiYoYT1nLnYuYigiekluZGV4IikpO3RoaXMuVC5wYXVzZSgpO3RoaXMuYS5zdHlsZS56SW5kZXg9YTt0aGlzLmEuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5hLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLmEuc3R5bGUuYm94U2l6aW5nPXRoaXMuVmEuc3R5bGUuYm94U2l6aW5nO3RoaXMubT8KdGhpcy5hLnN0eWxlLmJhY2tncm91bmQ9InJnYmEoMCwgMCwgMCwgLjc1KSI6KHRoaXMuYS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiLHRoaXMuYS5zdHlsZS53aWR0aD10aGlzLlZhLm9mZnNldFdpZHRoKzArInB4Iix0aGlzLmEuc3R5bGUuaGVpZ2h0PXRoaXMuVmEub2Zmc2V0SGVpZ2h0KzArInB4Iix0aGlzLkYodGhpcy5WYS5vZmZzZXRXaWR0aCswLHRoaXMuVmEub2Zmc2V0SGVpZ2h0KzApKTt0aGlzLmdldFBvc2l0aW9uKHRoaXMuVmEpO3RoaXMuVC5XYiYmdGhpcy5ULldiKCk/dGhpcy5ULnhhKCkuYXBwZW5kQ2hpbGQodGhpcy5hKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuYSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5vLmJpbmQodGhpcyksMTApfTtpYS5wcm90b3R5cGUuZXhpdEZ1bGxzY3JlZW49ZnVuY3Rpb24oKXt0aGlzLlQuZXhpdEZ1bGxzY3JlZW4oKX07aWEucHJvdG90eXBlLkE9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLApkPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YyYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtkPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBkfTtpYS5wcm90b3R5cGUucz1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmdldFBvc2l0aW9uKGEpO2MucG9zaXRpb24/Yy5wb3NpdGlvbj1jLnBvc2l0aW9uOmMucG9zaXRpb249ImFic29sdXRlIjtjLndpZHRoPWEub2Zmc2V0V2lkdGg7Yy5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7aWYodGhpcy5tKXt2YXIgZD13aW5kb3c7Yz1kb2N1bWVudDt2YXIgZT1jLmRvY3VtZW50RWxlbWVudCxmPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXTthPWQuaW5uZXJXaWR0aHx8ZS5jbGllbnRXaWR0aHx8Zi5jbGllbnRXaWR0aDtkPWQuaW5uZXJIZWlnaHR8fGUuY2xpZW50SGVpZ2h0fHxmLmNsaWVudEhlaWdodDtjPWMuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKYz17cG9zaXRpb246ImFic29sdXRlIix4OjAseTpNYXRoLmFicyhjLnkpLHdpZHRoOmEsaGVpZ2h0OmR9fXJldHVybiBjfTtpYS5wcm90b3R5cGUubz1mdW5jdGlvbihhKXt0aGlzLlQuRWQmJmcuai5jYSh0aGlzLlQuY29udGFpbmVyKSYmKHRoaXMuVC5FZCgpLHRoaXMuVmE9dGhpcy5ULmNvbnRhaW5lcixhPSEwKTt2YXIgYz10aGlzLnModGhpcy5WYSk7aWYoYy54IT10aGlzLmIueHx8Yy55IT10aGlzLmIueXx8Yy5wb3NpdGlvbiE9dGhpcy5iLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLmIud2lkdGh8fGMuaGVpZ2h0IT10aGlzLmIuaGVpZ2h0fHxhfHxnLmouYigic3BpZWdlbCIpJiYuNT5NYXRoLnJhbmRvbSgpKXtpZigwPHRoaXMuYi53aWR0aCYmMDx0aGlzLmIuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5jKCk7cmV0dXJufXRoaXMuYj1jO3RoaXMuVC5XYigpPyh0aGlzLmEuc3R5bGUubGVmdD0iMHB4Iix0aGlzLmEuc3R5bGUudG9wPSIwcHgiKToodGhpcy5hLnN0eWxlLmxlZnQ9CmMueCsicHgiLHRoaXMuYS5zdHlsZS50b3A9Yy55KyJweCIpO3RoaXMuYS5zdHlsZS53aWR0aD1jLndpZHRoKyJweCI7dGhpcy5hLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO3RoaXMuYS5zdHlsZS5wb3NpdGlvbj1jLnBvc2l0aW9uO3RoaXMuRihjLndpZHRoLGMuaGVpZ2h0KX1sLmNhKHRoaXMuYSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuby5iaW5kKHRoaXMpLDEwKX07aWEucHJvdG90eXBlLlZjPWZ1bmN0aW9uKGEpe3RoaXMubT1hfTtpYS5wcm90b3R5cGUuRj1mdW5jdGlvbihhLGMpe2Zvcih2YXIgZD0wO2Q8dGhpcy5pLmxlbmd0aDtkKyspdGhpcy5pW2RdKHt3aWR0aDphLGhlaWdodDpjfSl9O2lhLnByb3RvdHlwZS5ZYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmF9O2lhLnByb3RvdHlwZS5nPWZ1bmN0aW9uKGEpe3RoaXMuaXx8KHRoaXMuaT1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuaS5wdXNoKGEpfTtpYS5wcm90b3R5cGUuYz1mdW5jdGlvbigpe3RoaXMuYSYmCnRoaXMuYS5wYXJlbnROb2RlJiZ0aGlzLmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5hLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5hKX07bWIucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLmk9ITA7Zm9yKHZhciBhIGluIHRoaXMuYyl7aWYodGhpcy5nKWJyZWFrO3ZhciBjPXRoaXMuY1thXTt0aGlzLmwoYykmJih0aGlzLmIucHVzaChjKSx0aGlzLmYoYykpfX07bWIucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiBGPyEwOiExfTttYi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXt0aGlzLmwoYSkmJmEudygpfTttYi5wcm90b3R5cGUubT1mdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgQSlmb3IoZy5UYz1hLHRoaXMuZz0hMCxhPTA7YTx0aGlzLmIubGVuZ3RoO2ErKyl0aGlzLmJbYV0mJnRoaXMuYlthXS5sYyYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmJbYV0ubGMpfTttYi5wcm90b3R5cGUuYT1mdW5jdGlvbihhLApjKXtpZighdGhpcy5nfHxjKXRoaXMuYi5wdXNoKGEpLHRoaXMuZihhKX07dmFyIFQ9bmV3IG1iO1QudygpO0YucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt9O0YucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXt0aGlzLkY8PXRoaXMubD8odGhpcy5GKyssdGhpcy5sYz13aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwxMDApKTowPnRoaXMubCYmKHRoaXMubGM9d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMTAwKSl9O0YucHJvdG90eXBlLk09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GPnRoaXMubD8hMDohMX07Ri5wcm90b3R5cGUudT1mdW5jdGlvbigpe3RoaXMuRj0wfTtGLnByb3RvdHlwZS5hYT1mdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9O0YucHJvdG90eXBlLks9ZnVuY3Rpb24oYSl7dGhpcy5hPWF9O0YucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSl7dGhpcy5mW2EueWEoKV09YTtUJiZULmkmJlQubShhKX07Ri5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXt2YXIgYz0KYS5SKCksZDtmb3IoZCBpbiB0aGlzLmYpaWYoYz09dGhpcy5mW2RdLlIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5mW2EueWEoKV0/ITA6ITF9O0YucHJvdG90eXBlLkc9ZnVuY3Rpb24oYSl7YT1hLnhhKCk7Zm9yKHZhciBjIGluIHRoaXMuZil0cnl7dmFyIGQ9dGhpcy5mW2NdLnhhKCk7aWYoYS5pZD09KGQ/ZC5pZDoiIikpcmV0dXJuITB9Y2F0Y2goZSl7Y29uc29sZS5sb2coZSl9cmV0dXJuITF9O0EucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In07QS5wcm90b3R5cGUuQ2E9ZnVuY3Rpb24oKXt2YXIgYT17fSxjPXRoaXMuUigpLGQ9dGhpcy54YSgpLGU9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWMpYS52aWRlb1RhZ0lkPWMuaWQ7aWYoYS5jb250YWluZXI9ZClhLmNvbnRhaW5lcklkPWQuaWQ7ZSYmKGEucGxheWVyPWUpO3JldHVybiBhfTtBLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7fTtBLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe307QS5wcm90b3R5cGUuSWU9CmZ1bmN0aW9uKGEpe3RoaXMuYz1hfTtBLnByb3RvdHlwZS5IZT1mdW5jdGlvbihhKXt0aGlzLkY9YX07QS5wcm90b3R5cGUuY2Q9ZnVuY3Rpb24oKXt9O0EucHJvdG90eXBlLmlzRnVsbHNjcmVlbj1mdW5jdGlvbigpe3JldHVybiExfTtBLnByb3RvdHlwZS5leGl0RnVsbHNjcmVlbj1mdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpLmNhdGNoKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGEpe319O0EucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9OwpBLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX07QS5wcm90b3R5cGUueWE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH07QS5wcm90b3R5cGUubz1mdW5jdGlvbihhKXt0aGlzLmlkPWF9O0EucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7YSYmKHRoaXMudmlkZW9UYWc9YSx0aGlzLkQoKXx8dGhpcy5BKCksdGhpcy5vKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKSl9O0EucHJvdG90eXBlLlI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ307QS5wcm90b3R5cGUuQT1mdW5jdGlvbigpe3ZhciBhPWwuZygxMCk7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixhKX07QS5wcm90b3R5cGUuRD1mdW5jdGlvbigpe3JldHVybiB0aGlzLlIoKS5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9O0EucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9YX07QS5wcm90b3R5cGUueGE9ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09CnR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfTtBLnByb3RvdHlwZS5nZXRSYXdQbGF5ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9O0EucHJvdG90eXBlLmFkPWZ1bmN0aW9uKCl7cmV0dXJuITB9O0EucHJvdG90eXBlLmlzUGxheWluZz1mdW5jdGlvbigpe3JldHVybiEwfTtBLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuUigpO3JldHVybiBhJiZhLmN1cnJlbnRUaW1lP2EuY3VycmVudFRpbWU6MH07QS5wcm90b3R5cGUuZ2V0RHVyYXRpb249ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlIoKTtyZXR1cm4gYSYmYS5kdXJhdGlvbj9hLmR1cmF0aW9uOjB9O0EucHJvdG90eXBlLkhhPWZ1bmN0aW9uKCl7cmV0dXJuITF9O0EucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXt0aGlzLmk9ITB9O0EucHJvdG90eXBlLldiPWZ1bmN0aW9uKCl7dmFyIGE9Zy52LmE7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPwohMDohMX07QS5wcm90b3R5cGUuRWE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlIoKTtyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfTtBLnByb3RvdHlwZS5zZT1mdW5jdGlvbigpe3JldHVybiExfTtBLnByb3RvdHlwZS5rZD1mdW5jdGlvbihhKXt0aGlzLmhjPWF9O0EucHJvdG90eXBlLmZkPWZ1bmN0aW9uKCl7dGhpcy5oYz1udWxsfTtBLnByb3RvdHlwZS5YYz1mdW5jdGlvbigpe3JldHVybiExfTtFLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7fTtFLnByb3RvdHlwZS5iPWZ1bmN0aW9uKCl7dGhpcy5mYXx8KHRoaXMuZmE9ITAsbC5tYSgpKX07RS5wcm90b3R5cGUubmE9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcixjPW5ldyBDYTt3aW5kb3dbYy5hKCldfHwod2luZG93W2MuYSgpXT17fSk7d2luZG93W2MuYSgpXVthLnlhKCldfHwod2luZG93W2MuYSgpXVthLnlhKCldPXt9LHdpbmRvd1tjLmEoKV1bYS55YSgpXS5pbml0aWF0b3I9bC5EKCkpO3dpbmRvd1tjLmEoKV1bYS55YSgpXVtsLkQoKV0/CndpbmRvd1tjLmEoKV1bYS55YSgpXVtsLkQoKV0rKzp3aW5kb3dbYy5hKCldW2EueWEoKV1bbC5EKCldPTF9O0UucHJvdG90eXBlLnBhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYz0hMCxkPW5ldyBDYTt3aW5kb3dbZC5hKCldJiZ3aW5kb3dbZC5hKCldW2EueWEoKV0mJndpbmRvd1tkLmEoKV1bYS55YSgpXS5pbml0aWF0b3IhPWwuRCgpJiYodGhpcy5VKCksYz0hMSk7cmV0dXJuIGN9O0UucHJvdG90eXBlLmE9ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMDthJiYoZD0hMSk7dGhpcy5pKCl8fCh0aGlzLm5hKCksdGhpcy5wYSgpPyh0aGlzLlUoKSx0aGlzLlcodGhpcy5wbGF5ZXIsZCksdGhpcy5oYSgpLGMmJiJmdW5jdGlvbiI9PXR5cGVvZiBjJiZjKCkpOihsLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCksdGhpcy5VKCkpKX07RS5wcm90b3R5cGUuST1mdW5jdGlvbihhLGMpe3RoaXMuaSgpfHwodGhpcy5tLnB1c2goYSksdGhpcy5sLnB1c2goe3JlYXNvbjphLApkZXRhaWw6Y30pKX07RS5wcm90b3R5cGUuaGE9ZnVuY3Rpb24oKXt2YXIgYT0idW5rbm93biIsYz1bXTt0aGlzLm0mJjA8dGhpcy5tLmxlbmd0aCYmKHRoaXMubT1sLnVuaXF1ZSh0aGlzLm0pLGwudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLm0uam9pbigiLCIpKSk7aWYodGhpcy5sKXtmb3IodmFyIGQ9MDtkPHRoaXMubC5sZW5ndGg7ZCsrKXRoaXMuQlt0aGlzLmxbZF0ucmVhc29uXT09dGhpcy5CW2FdJiZjLnB1c2godGhpcy5sW2RdLmRldGFpbCksdGhpcy5CW3RoaXMubFtkXS5yZWFzb25dPHRoaXMuQlthXSYmKGM9W10sYy5wdXNoKHRoaXMubFtkXS5kZXRhaWwpLGE9dGhpcy5sW2RdLnJlYXNvbik7dGhpcy5CW2FdfHwoYT0idW5rbm93biIsYz1bXSk7MDxjLmxlbmd0aCYmKGM9bC51bmlxdWUoYyksYT1hKyItIitjLmpvaW4oIi0iKSk7bC50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX19O0UucHJvdG90eXBlLkw9ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLll9OwpFLnByb3RvdHlwZS5VPWZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5pYX07RS5wcm90b3R5cGUuemE9ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmthfTtFLnByb3RvdHlwZS5nPWZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5GfTtFLnByb3RvdHlwZS5iYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5ZfTtFLnByb3RvdHlwZS5pPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLkZ9O0UucHJvdG90eXBlLmdhPWZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWF9O0UucHJvdG90eXBlLndhPWZ1bmN0aW9uKGEpe3RoaXMuVz1hfTt5KGxiLEEpO2xiLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLmIoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuZyhhKTt0aGlzLkxhPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkxhPQohMH0uYmluZCh0aGlzKSl9O2xiLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX07bGIucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX07bGIucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9O3koTGIsRSk7TGIucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSxjPWEubGY7Yz9jLklhP2MuSWEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oZCl7dmFyIGU9ITEsZj0iIjtkLmdldEVycm9yJiYoZT1kLmdldEVycm9yKCkpO2V8fGQuZGV0YWlsLmdldEVycm9yJiYoZT1kLmRldGFpbC5nZXRFcnJvcigpKTtlLmdldEVycm9yQ29kZSYmKGYrPWUuZ2V0RXJyb3JDb2RlKCkpO2UuZ2V0TWVzc2FnZSYmKGYrPWUuZ2V0TWVzc2FnZSgpKTtmLmluZGV4T2YmJigwPD1mLmluZGV4T2YoIjEwMDkiKXx8MDw9CmYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLkwoKSx0aGlzLmIoKSk6KHRoaXMuSSgiYWRlcnJvciIpLHRoaXMuYygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5JKCJmcmFtZXdvcmsiKSx0aGlzLmMoKSl9O0xiLnByb3RvdHlwZS5jPWZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuTGE/dGhpcy5hKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMCl9O3koaWMsRik7aWMucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbGIod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTsKdGhpcy5iKGEpfHwodGhpcy5pKGEpLChuZXcgTGIoYSx0aGlzLmEpKS53KCkpfXRoaXMuZygpfTt2YXIgTGM9bmV3IGljKFgpO1QuYShMYyk7eShsYSxBKTtsYS5wcm90b3R5cGUuVj1mdW5jdGlvbigpe3ZhciBhPWwuYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmMDw9YS5hdXRob3JpdHkuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYodGhpcy5mPSEwKTt0aGlzLlVjKCk7dGhpcy52YygpO2E9ITA7dGhpcy5wbGF5ZXIuZ2V0Q29uZmlnJiYoYT10aGlzLnBsYXllci5nZXRDb25maWcoKSk7YXx8KHRoaXMuVGE9ITApfTtsYS5wcm90b3R5cGUuVWM9ZnVuY3Rpb24oKXt0aGlzLlRhPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5UYT0hMCk7IWEubm9kZU5hbWV8fCJPQkpFQ1QiIT1hLm5vZGVOYW1lJiYiVklERU8iIT1hLm5vZGVOYW1lfHwoYT1hLnBhcmVudE5vZGUpO3RoaXMubD0KYTtpZih0aGlzLmYpe3RoaXMudmMoKTtpZih0aGlzLlRhKXJldHVybjthPXRoaXMuUigpLnBhcmVudE5vZGUucGFyZW50Tm9kZX10aGlzLmIoYSl9O2xhLnByb3RvdHlwZS52Yz1mdW5jdGlvbigpe2lmKCF0aGlzLlRhKXt2YXIgYT10aGlzLmwsYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjfHwodGhpcy5UYT0hMCk7dGhpcy5nKGMpO2cudi5iKCJ1c2VfdmlkZW90YWdfYXNfY29udGFpbmVyIikmJnRoaXMuYihjKX19O2xhLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO2lmKGcudi5iKCJwb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQiKSlhLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuYyYmKDAsdGhpcy5jKSgpfS5iaW5kKHRoaXMpfSk7ZWxzZSBpZihhLl9ldmVudHMmJgphLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihjKXtjLmR1cmF0aW9uJiZjLnBvc2l0aW9uJiYxPmMuZHVyYXRpb24tYy5wb3NpdGlvbiYmdGhpcy5jJiYoMCx0aGlzLmMpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihjKXtjLmR1cmF0aW9uJiZjLnBvc2l0aW9uJiYxPmMuZHVyYXRpb24tYy5wb3NpdGlvbiYmdGhpcy5jJiYoMCx0aGlzLmMpKCl9LmJpbmQodGhpcykpfTtsYS5wcm90b3R5cGUuRWQ9ZnVuY3Rpb24oKXt0aGlzLlVjKCk7dGhpcy52YygpfTtsYS5wcm90b3R5cGUuY2Q9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYyl7dGhpcy5tKGMpfS5iaW5kKHRoaXMpfSk7aWYoYS5vbkFkRXJyb3IpYS5vbkFkRXJyb3IoZnVuY3Rpb24oYyl7dGhpcy5tKGMpfS5iaW5kKHRoaXMpKX07CmxhLnByb3RvdHlwZS5tPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMucGxheWVyO2MuZ2V0UG9zaXRpb24oKTtjLmdldFBvc2l0aW9uKCk7Yy5nZXREdXJhdGlvbigpO2MuZ2V0UG9zaXRpb24oKTtjLmdldER1cmF0aW9uKCk7Yy5nZXRQb3NpdGlvbigpOyJtaWQiPT1hLmFkcG9zaXRpb24mJmMuZ2V0UG9zaXRpb24mJjMwPGMuZ2V0UG9zaXRpb24oKSYmMzA8Yy5nZXREdXJhdGlvbigpLWMuZ2V0UG9zaXRpb24oKSYmdGhpcy5GJiYoMCx0aGlzLkYpKCl9O2xhLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLlIoKS5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX07bGEucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7cmV0dXJuIGEuZ2V0U3RhdGUmJiJwYXVzZWQiPT1hLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfTsKbGEucHJvdG90eXBlLkhhPWZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH07bGEucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn07bGEucHJvdG90eXBlLmV4aXRGdWxsc2NyZWVuPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9O2xhLnByb3RvdHlwZS5FYT1mdW5jdGlvbigpe3ZhciBhPSExLGM9dGhpcy5wbGF5ZXI7Yy5nZXRNdXRlJiZjLmdldE11dGUoKSYmKGE9ITApO3JldHVybiBhfTtsYS5wcm90b3R5cGUuWGM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcixjPSExO2EuZ2V0Vm9sdW1lJiZhLmdldFZvbHVtZSgpJiYoYz1hLmdldFZvbHVtZSgpKTtyZXR1cm4gY307eShmYixFKTtmYi5wcm90b3R5cGUuVj1mdW5jdGlvbigpe3RoaXMuUz0iYWRDbGljayBhZENvbXBsZXRlIGFkRXJyb3IgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFJlcXVlc3QgYWRTa2lwcGVkIGFkVGltZSBiZWZvcmVDb21wbGV0ZSBiZWZvcmVQbGF5IGMgY2FzdCBjb21wbGV0ZSBlbSBmaXJzdEZyYW1lIGwgaWRsZSBsZXZlbHMgbWV0YSBwbGF5IHBsYXlsaXN0Q29tcGxldGUgcmVhZHkgcmVzaXplIHNlZWsgc2ggdGltZSIuc3BsaXQoIiAiKX07CmZiLnByb3RvdHlwZS5nPWZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5GO3RoaXMuaXNQbGF5aW5nPXRoaXMuSz10aGlzLmNhPSExO3RoaXMuRz0xO3RoaXMuTj0wO3RoaXMucz1bXTt0aGlzLmY9ITF9O2ZiLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpO2cuai5iKCJzcGllZ2VsLmRlIikmJmcuai5zYSgpLnRoZW4oZnVuY3Rpb24oZil7ZiYmKGEuUD0hMCxhLm98fGMucGx1Z2lucy52YXN0LmRlc3Ryb3koKSxsLnRyYWNrKCJzdGF0c19oZF90YWtlb3ZlciIsIWEubywhMCkpfSkuY2F0Y2goZnVuY3Rpb24oKXt9KTstMSE9PXdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoInZlcnRpY2FsaXpyIikmJi0xIT09d2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiJmZvcmNlIikmJmMucGx1Z2lucy52YXN0LmRlc3Ryb3koKTtpZihnLmouTWIoKSYmZy5qLk0oKSl7dmFyIGQ9ZnVuY3Rpb24oKXt0aGlzLm8/Zy5qLnRyYWNrKCJ2cnRjbHpyX3Rha2VvdmVyIiwKITEsITApOihnLmoudHJhY2soInZydGNsenJfdGFrZW92ZXIiLCEwLCEwKSxjLnBsdWdpbnMudmFzdC5kZXN0cm95KCksZy5DYz10aGlzLkNjLGMub24oInBsYXkiLGZ1bmN0aW9uKCl7Yy5tdXRlZEF1dG9zdGFydHx8dGhpcy5EfHwoZy5qLnRyYWNrKCJ2cnRjbHpyX2RlbGl2ZXIiLCJwbGF5IiwhMCksdGhpcy5jKCksdGhpcy5EPSEwKX0uYmluZCh0aGlzKSksYy5vbigibXV0ZSIsZnVuY3Rpb24oZil7IWMubXV0ZWRBdXRvc3RhcnR8fGYubXV0ZXx8dGhpcy5EfHwoZy5qLnRyYWNrKCJ2cnRjbHpyX2RlbGl2ZXIiLCJtdXRlIiwhMCksdGhpcy5jKCksdGhpcy5EPSEwKX0uYmluZCh0aGlzKSkpfS5iaW5kKHRoaXMpO3RoaXMuQ2M9bmV3IFIoZCl9ZWxzZXt2YXIgZT17fTtpZihjLmdldENvbmZpZylpZihlPWMuZ2V0Q29uZmlnKCksZS5hZHZlcnRpc2luZyl7aWYoZS5hZHZlcnRpc2luZy5zY2hlZHVsZSlpZihlLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcyllLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgplLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5HPWUuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5mPSEwKTtlbHNle2lmKGUuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IoZD0wO2Q8ZS5hZHZlcnRpc2luZy5zY2hlZHVsZS5sZW5ndGg7ZCsrKWlmKGUuYWR2ZXJ0aXNpbmcuc2NoZWR1bGVbZF0udGFnKXt0aGlzLmY9ITA7YnJlYWt9ZS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZlLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy5mPSEwKTtlLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmUuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmY9ITApfWUuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5mPSEwKX1lbHNlIHRoaXMuTCgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIik7ZT0iYWRQbGF5IGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIGFkQ29tcGxldGUiLnNwbGl0KCIgIik7CmZvcihkPTA7ZDxlLmxlbmd0aDtkKyspYy5vbihlW2RdLGZ1bmN0aW9uKGYpe3ZhciBoPXRoaXM7dGhpcy5vPSEwO3RoaXMuTChmLnR5cGUpOyJhZFBsYXkiPT09Zi50eXBlJiZnLmouYigic3BpZWdlbC5kZSIpJiZnLmouc2EoKS50aGVuKGZ1bmN0aW9uKG0pe20mJmcuai50cmFjaygic3RhdHNfaGRfdGFrZW92ZXJfY2MiLGguUCwhMCl9KS5jYXRjaChmdW5jdGlvbigpe30pOyJhZENvbXBsZXRlIj09PWYudHlwZSYmKHRoaXMuSz0hMCl9LmJpbmQodGhpcykpO2Mub24oImFkRXJyb3IiLGZ1bmN0aW9uKGYpe3RoaXMub25BZEVycm9yKGYpfS5iaW5kKHRoaXMpKTtjLm9uKCJ0aW1lIixmdW5jdGlvbihmKXt0aGlzLmlzUGxheWluZz0hMDszMDxmLmR1cmF0aW9uJiYhdGhpcy5pKCkmJiFjLm11dGVkQXV0b3N0YXJ0JiYodGhpcy5mPyh0aGlzLkkoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLmMoKSk6KHRoaXMuSSgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChldmVudC5kdXJhdGlvbi8KMUUzKSksdGhpcy5jKCEwKSkpfS5iaW5kKHRoaXMpKTtjLm9uKCJwbGF5bGlzdGl0ZW0iLGZ1bmN0aW9uKCl7aWYodGhpcy5pKCkmJih0aGlzLmcoKSx0aGlzLnBsYXllci55ZD0hMCxjb25mLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBmPXRoaXMucGxheWVyLmhjO2YmJihmLmtjKCksZi51YygpKX19LmJpbmQodGhpcykpfX07ZmIucHJvdG90eXBlLm9uQWRFcnJvcj1mdW5jdGlvbihhKXt0aGlzLk18fCh0aGlzLk09W10pO3RoaXMuTS5wdXNoKHtjb2RlOmEuY29kZSxtc2c6YS5tZXNzYWdlfSk7dGhpcy5OKys7dmFyIGM9YS50YWc7LTE9PXRoaXMucy5pbmRleE9mKGMpJiZ0aGlzLnMucHVzaChjKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT9sLlMoKT8obC51PSEwLHRoaXMuSSgiYWRlbXB0eSIsYS5jb2RlKSx0aGlzLmMoKSk6KHRoaXMuTCgpLHRoaXMuYigpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMuTCgiZW1wdHkiKToKMzAzPT1hLmNvZGUmJi0xIT1hLm1lc3NhZ2UuaW5kZXhPZigiZW1wdHkiKT90aGlzLkwoImVtcHR5Iik6KHRoaXMuSSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLnMubGVuZ3RoPj10aGlzLkcmJnRoaXMuYygpKX07ZmIucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7KGE9dm9pZCAwPT09YT8hMTphKT90aGlzLkE/dGhpcy5BKys6dGhpcy5BPTE6dGhpcy51P3RoaXMudSsrOnRoaXMudT0xO3ZhciBjPXRoaXMucGxheWVyO2lmKGwuY2EoYy5SKCkpKWlmKGMuVGEpdGhpcy5MKCJwbGF5ZXIgaXMgaW52YWxkIik7ZWxzZXt2YXIgZD1mdW5jdGlvbigpe3RoaXMudT50aGlzLkEmJihhPSExKTt0aGlzLmEoYSl9LmJpbmQodGhpcyk7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkub24oInRpbWUiLGZ1bmN0aW9uKGUpey41PmUucG9zaXRpb24mJiEoMD5lLnBvc2l0aW9uJiYwPmUuZHVyYXRpb24pfHx0aGlzLk98fCh0aGlzLk89ITAsZCgpKX0uYmluZCh0aGlzKSl9ZWxzZSBjLlVjKCksYy52YygpLApjLlRhfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYyhhKX0uYmluZCh0aGlzKSwyMCl9O3koQ2IsRik7Q2IucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dmFyIGM9Ri5wcm90b3R5cGUuYi5jYWxsKHRoaXMsYSk7YT1hLnBsYXllcjtpZighYyYmYSlmb3IodmFyIGQgaW4gdGhpcy5mKXRoaXMuZltkXS5wbGF5ZXI9PWEmJihjPSEwKTtyZXR1cm4gY307Q2IucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT1sLmMoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuYygpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpOwppZigoIXdpbmRvdy5qd3BsYXllcnx8IWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHwiQSIhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpLm5vZGVOYW1lKSYmd2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKSl7YT1bXTtpZigxPGMubGVuZ3RoKWZvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKWEucHVzaChjW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkPW5ldyBsYSh3aW5kb3cuandwbGF5ZXIoYVtjXSkpLG51bGw9PWQuaWQmJm51bGw9PWQuY29udGFpbmVyJiZudWxsPT1kLnZpZGVvVGFnfHxkLlRhfHx0aGlzLmIoZCl8fHRoaXMuRyhkKXx8KHRoaXMuaShkKSxkPW5ldyBmYihkLHRoaXMuYSksZC5WKCksZC53KCkpfXRoaXMuZygpfX07Q2IucHJvdG90eXBlLmM9ZnVuY3Rpb24oKXt2YXIgYT1sLmMoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7CnJldHVybiBsLkEoYS5hbmNob3IpfTt2YXIgTWM9bmV3IENiKFgpO1QuYShNYyk7eShCYSxBKTtCYS5wcm90b3R5cGUuVj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGM9YS5lbF87Y3x8KGM9YS5lbCgpKTtjPyh0aGlzLmIoYyksKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuZyhhKTp0aGlzLmEoKSk6dGhpcy5hKCl9ZWxzZSB0aGlzLmEoKX07QmEucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifTtCYS5wcm90b3R5cGUuTmE9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpKX07QmEucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGM9YS5jdXJyZW50VGltZSgpO2E9YS5kdXJhdGlvbigpOwpjJiYwPGMmJmEmJjA8YSYmYz49YS0yJiZ0aGlzLmMmJnRoaXMuYygpfTtCYS5wcm90b3R5cGUuYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlIoKS5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGEpdHJ5e3ZhciBjPUpTT04ucGFyc2UoYSk7aWYoYy5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhY1sieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGQpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX07QmEucHJvdG90eXBlLkVhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfTtCYS5wcm90b3R5cGUuSGE9ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9O0JhLnByb3RvdHlwZS5pc1BsYXlpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH07CkJhLnByb3RvdHlwZS5leGl0RnVsbHNjcmVlbj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYz1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYyl0cnl7Yz1jKCl9Y2F0Y2goZCl7Yz0hMX1jJiZhLmV4aXRGdWxsc2NyZWVuKCl9O0JhLnByb3RvdHlwZS5jdXJyZW50VGltZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfTt5KGZhLEUpO2ZhLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dGhpcy5YPXRoaXMuWHx8ITE7dGhpcy5zYSh0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSl8fCh0aGlzLmVhKCksdGhpcy5sYSgpLHRoaXMuQSgpKX07ZmEucHJvdG90eXBlLnNhPWZ1bmN0aW9uKGEpe3JldHVybiBsLmIoInQtb25saW5lLmRlIik/ITE9PT1hLm9wdGlvbnNfLmFkUHJlcm9sbDohMX07ZmEucHJvdG90eXBlLnM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTsKYS5pbWEzJiYodGhpcy5pbWE9YS5pbWEzKTtpZihhLmltYSl7dGhpcy5pbWE9YS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChjKXt9fXJldHVybiB0aGlzLmltYX07ZmEucHJvdG90eXBlLk89ZnVuY3Rpb24oKXtpZighdGhpcy5JYSl7dmFyIGE9dGhpcy5zKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5JYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5JYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5JYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYKKHRoaXMuSWE9YS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMuSWF9O2ZhLnByb3RvdHlwZS5aPWZ1bmN0aW9uKCl7aWYoIXRoaXMudSl7dmFyIGE9dGhpcy5zKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMudT1hLmFkc01hbmFnZXIpLGEuZ2V0QWRzTWFuYWdlciYmKHRoaXMudT1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLnV9O2ZhLnByb3RvdHlwZS5xYT1mdW5jdGlvbigpe2lmKCF0aGlzLlApe3ZhciBhPXRoaXMucygpLGM9dGhpcy5vYSgpO3dpbmRvdy5pbWEmJmEmJihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxjKSYmKHRoaXMuUD0hMCl9cmV0dXJuIHRoaXMuUH07ZmEucHJvdG90eXBlLm9hPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTSYmYS5hZHMmJihhLmFkcy5zdGF0ZXx8YS5hZHMuX3N0YXRlKSYmKHRoaXMuTT0hMCk7cmV0dXJuIHRoaXMuTX07ZmEucHJvdG90eXBlLkE9ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5PKCk7aWYoYSl7dmFyIGM9ImFkRXJyb3IiLGQ9ImFkc01hbmFnZXJMb2FkZWQiLGU9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGQ9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihlPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkEoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGYpe3RoaXMuZihmKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oKXt0aGlzLnRhKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uKGYpe3RoaXMuZihmKTt0aGlzLkkoImFkZXJyb3IiLHRoaXMuWCk7dGhpcy5jKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5pKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BKCl9LmJpbmQodGhpcyksMjApfTtmYS5wcm90b3R5cGUudGE9ZnVuY3Rpb24oKXt0aGlzLkc9ITA7dmFyIGE9dGhpcy5aKCk7aWYoYXx8dGhpcy5pKCkpe3ZhciBjPQoiYWRFcnJvciIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2EuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGYpe3RoaXMuZihmKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oZil7dGhpcy5mKGYpO3RoaXMuSSgiYWRlcnJvciIsdGhpcy5YKTt0aGlzLmMoITApfS5iaW5kKHRoaXMpKTt2YXIgZT0iIjtsLnJhKCkmJihlPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLApmdW5jdGlvbigpe2wuYigiY2hpcC5kZSIpJiZsLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubz0hMDtsLmIoImNoaXAuZGUiKSYmbC50cmFjaygic3RhdHNfY3VzdF8iK2UrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMubz0hMDtpZihsLmIoImNoaXAuZGUiKSl7dmFyIGY9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7bC50cmFjaygic3RhdHNfY3VzdF8iK2UrIm1pZHBvaW50IiwiIiwhMCk7bC50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwoIWYucGF1c2VkKCkpLnRvU3RyaW5nKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubz0hMDtsLmIoImNoaXAuZGUiKSYmCmwudHJhY2soInN0YXRzX2N1c3RfIitlKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5vPSEwO2wuYigiY2hpcC5kZSIpJiZsLnRyYWNrKCJzdGF0c19jdXN0XyIrZSsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMubz0hMDtsLmIoImNoaXAuZGUiKSYmbC50cmFjaygic3RhdHNfY3VzdF8iK2UrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5vfHwodGhpcy5JKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5jKCksdGhpcy5OKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BKCl9LmJpbmQodGhpcyksMjApfTtmYS5wcm90b3R5cGUubGE9CmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGMpe3RoaXMuZihjKTt0aGlzLmMoKTt0aGlzLkkoImFkZXJyb3IiLHRoaXMuWCl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmcoKTt0aGlzLmMoITApO3RoaXMuSSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYyl7dGhpcy5mKGMpO3RoaXMuYygpO3RoaXMuSSgiYWRlcnJvciIsdGhpcy5YKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGMpe3RoaXMuZihjKTt0aGlzLmMoKTt0aGlzLkkoImFkZXJyb3IiLHRoaXMuWCl9LmJpbmQodGhpcykpO2Eub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGMpe3RoaXMuZihjKTt0aGlzLmMoKTt0aGlzLkkoImFkZXJyb3IiLHRoaXMuWCl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsCmZ1bmN0aW9uKCl7dGhpcy5MKCl9LmJpbmQodGhpcykpfTtmYS5wcm90b3R5cGUuRD1mdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihnLkgmJmcuSC5iKWcuSC5KYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSw1MCk7cmV0dXJufX1jYXRjaChjKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YSYmKChhPXRoaXMuWigpKSYmYS5kZXN0cm95P2EuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcyksNTApKX07ZmEucHJvdG90eXBlLmVhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoYS5pc1BsYXlpbmcoKSYmMDxhLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5xYSgpKXt2YXIgYz10aGlzLnMoKSxkPXRoaXMuTygpO2MmJmQmJih0aGlzLkd8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HPwp0aGlzLkwoKToodGhpcy5jKCEwKSx0aGlzLkkoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSl9ZWxzZSB0aGlzLmRhP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zKCksZj10aGlzLk8oKTtlJiYhZj8odGhpcy5JKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmMoKSk6KHRoaXMuYyghMCksdGhpcy5JKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuZGE9ITA7YS5pc1BsYXlpbmcoKSYmMTA8YS5jdXJyZW50VGltZSgpfHx0aGlzLmkoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNTApfTtmYS5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtmdW5jdGlvbiBjKGYsaCl7dmFyIG09ITE7aWYoZil7aWYoMTAwOT09Znx8MzAzPT1mfHw0MDM9PWYpbT0hMDttfHwhZi5pbmRleE9mfHwtMT09PWYuaW5kZXhPZigiMTAwOSIpJiYtMT09PQpmLmluZGV4T2YoIjMwMyIpJiYtMT09PWYuaW5kZXhPZigiNDAzIil8fChtPSEwKTsibnVtYmVyIj09dHlwZW9mIGYmJihoLlg9ZixoLkkoImFkZXJyb3IiLGYpKX1yZXR1cm4gbX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZjKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuY2EoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmMoYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLmNhKCk7YnJlYWt9fTtmYS5wcm90b3R5cGUuY2E9CmZ1bmN0aW9uKCl7dGhpcy5tYSgpPyh0aGlzLks9ITAsbC51PWwuUygpLHRoaXMuUz0hbC51LHRoaXMuTighMCkpOih0aGlzLks9ITAsdGhpcy5MKCJlbXB0eSB2YXN0IikpfTtmYS5wcm90b3R5cGUubWE9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9bC5HKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlg/ITA6bC5TKCl9O2ZhLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe2E9dm9pZCAwPT09YT8hMTphO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LPyhsLnV8fHRoaXMuTCgpLHRoaXMuYigpKTp0aGlzLk4oYSl9LmJpbmQodGhpcyksMTAwKX07ZmEucHJvdG90eXBlLk49ZnVuY3Rpb24oYSl7dGhpcy5pKCl8fCh2b2lkIDAhPT1hJiZhfHwodGhpcy5TPSExKSx0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmEodGhpcy5TLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9Owp5KEJiLEYpO0JiLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIik7dmFyIGM9dGhpcy5jKHdpbmRvdyk7Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspdHJ5e2M9Y3x8dGhpcy5jKGFbZF0pfWNhdGNoKGUpe310aGlzLmcoKX19O0JiLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBjPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yz1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihjPWEudmlkZW9qcy5wbGF5ZXJzKTswPT1jLmxlbmd0aCYmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZpZGVvanMtcGxheWVyIikpJiZhLnBsYXllciYmYS5wbGF5ZXIucGxheWVyJiYoYT1hLnBsYXllci5wbGF5ZXIoKSxjLnB1c2goYSkpO2lmKDA8bC56YShjKSl7Zm9yKHZhciBkIGluIGMpYy5oYXNPd25Qcm9wZXJ0eShkKSYmCihhPW5ldyBCYShjW2RdKSxhLml8fHRoaXMuYihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5pKGEpLChuZXcgZmEoYSx0aGlzLmEpKS53KCkpKTtyZXR1cm4hMH1yZXR1cm4hMX07QmIucHJvdG90eXBlLmc9ZnVuY3Rpb24oKXt0aGlzLmxjPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDEwMCl9O3ZhciBOYz1uZXcgQmIoWCk7VC5hKE5jKTt5KEFhLEEpO0FhLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnVpJiZhLnVpLnRhZ0F0dHJpYnV0ZXM/YS51aS50YWdBdHRyaWJ1dGVzLmlkPyhhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEudWkudGFnQXR0cmlidXRlcy5pZCkpPyh0aGlzLmIoYSksKGE9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5nKGEpOnRoaXMuYSgpKTp0aGlzLmEoKTp0aGlzLmEoKTp0aGlzLmEoKX07QWEucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSl7dGhpcy5mPQphfTtBYS5wcm90b3R5cGUuRWE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZD8hMDohMX07QWEucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfTtBYS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfTtBYS5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWR9O0FhLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZD8hMToodGhpcy5wYXVzZSgpLCEwKX07QWEucHJvdG90eXBlLmdldEN1cnJlbnRUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9O0FhLnByb3RvdHlwZS5nZXREdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufTtBYS5wcm90b3R5cGUuYWE9CmZ1bmN0aW9uKCl7cmV0dXJuIlRIRU9wbGF5ZXIifTt5KEFiLEUpO0FiLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7YS5hZHMmJmEuYWRzLmFkZEV2ZW50TGlzdGVuZXImJmEuYWRzLmFkZEV2ZW50TGlzdGVuZXIoImFkZXJyb3IiLGZ1bmN0aW9uKGMpe2M9Yy5lcnJvckNvZGU7MTAwOT09Y3x8MzAzPT1jfHw0MDM9PWM/dGhpcy5iKCk6KHRoaXMuSSgiYWRlcnJvciIsYyksdGhpcy5jKCkpfS5iaW5kKHRoaXMpKTt0aGlzLmYoKX07QWIucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTthLmFkcyYmYS5hZHMuY3VycmVudEFkcyYmMDxhLmFkcy5jdXJyZW50QWRzLmxlbmd0aCYmYS5hZHMucGxheWluZz90aGlzLkwoKTohdGhpcy5wbGF5ZXIuaXNQYXVzZWQoKSYmLjI8dGhpcy5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLmMoITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfTtBYi5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/ITE6YTt0aGlzLnBsYXllci5pc1BhdXNlZCgpP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKGEpfS5iaW5kKHRoaXMpLDUwKTp0aGlzLmEoYSl9O3koaGMsRik7aGMucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXtpZih3aW5kb3cuVEhFT3BsYXllciYmd2luZG93LlRIRU9wbGF5ZXIucGxheWVycylmb3IodmFyIGEgaW4gd2luZG93LlRIRU9wbGF5ZXIucGxheWVycyl7dmFyIGM9d2luZG93LlRIRU9wbGF5ZXIucGxheWVyc1thXTtjLnBsYXkmJihjPW5ldyBBYShjKSxjLml8fHRoaXMuYihjKXx8KHRoaXMuaShjKSxjLmwodGhpcy5hKSwobmV3IEFiKGMsdGhpcy5hKSkudygpKSl9dGhpcy51KCk7dGhpcy5nKCl9O3ZhciBPYz1uZXcgaGMoWCk7VC5hKE9jKTt5KGFiLEEpO2FiLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7Zy5UYz8odGhpcy5mPWcuVGMsdGhpcy5iKHRoaXMuZi54YSgpKSx0aGlzLmcodGhpcy5mLlIoKSkpOgp0aGlzLmEoKX07YWIucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5mLnBhdXNlKCl9O2FiLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5mLnBsYXkoKX07YWIucHJvdG90eXBlLndkPWZ1bmN0aW9uKGEsYyl7aWYoInRpbWV1cGRhdGUiPT1hKXthPWMudGFyZ2V0LmhlaWdodDt2YXIgZD1jLnRhcmdldC5jdXJyZW50VGltZSxlPWMudGFyZ2V0LmR1cmF0aW9uLGY9TWF0aC5mbG9vcihkKSxoPXt9O2gud2lkdGg9Yy50YXJnZXQud2lkdGg7aC5oZWlnaHQ9YTtoLmN1cnJlbnRUaW1lPWQ7aC5kdXJhdGlvbj1lO2gucmVtYWluaW5nVGltZT1lLWQ7aC5ldmVudD0iQWRSZW1haW5pbmdUaW1lQ2hhbmdlIjtmIT10aGlzLmwmJigwPT1mJiYoaC5ldmVudD0iaW1wcmVzc2lvbiIpLGY9PU1hdGguZmxvb3IoZS80KSYmKGguZXZlbnQ9ImZpcnN0cXVhcnRpbGUiKSxmPT1NYXRoLmZsb29yKGUvMikmJihoLmV2ZW50PSJtaWRwb2ludCIpLGY9PU1hdGguZmxvb3IoMyplLzQpJiYKKGguZXZlbnQ9InRoaXJkcXVhcnRpbGUiKSx0aGlzLm0oaCksdGhpcy5sPWYpfWVsc2UiZW5kZWQiPT1hJiZ0aGlzLm0oe2V2ZW50OiJlbmRlZCJ9KX07YWIucHJvdG90eXBlLm09ZnVuY3Rpb24oYSl7YS52ZXJ0aWNhbGl6ZXI9ITA7dGhpcy5hYiYmdGhpcy5hYi5wb3N0TWVzc2FnZShhLCIqIil9O2FiLnByb3RvdHlwZS5hYT1mdW5jdGlvbigpe3JldHVybiJWZXJ0aWNhbGl6clBsYXllciJ9O3koZ2MsRSk7Z2MucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudmVydGljYWxpemVyJiYodGhpcy5hYj1hLnNvdXJjZSx0aGlzLnBsYXllci5hYj1hLnNvdXJjZSx0aGlzLmEoKSl9LmJpbmQodGhpcykpfTt5KGZjLEYpO2ZjLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IGFiKHt9KTt0aGlzLmIoYSl8fGEuaXx8KHRoaXMuaShhKSwobmV3IGdjKGEsdGhpcy5hKSkudygpKTsKdGhpcy5nKCl9O3ZhciBQYz1uZXcgZmMoZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIucGF1c2UoKTtsLmEodi5iLHRoaXMucGxheWVyLkNhKCkpO3ZhciBjPWcudi5hO2E9bmV3IGlhKGEsYyk7YS5leGl0RnVsbHNjcmVlbigpO2cuSC5KYT0hMDthPW5ldyB1KGEsZy5ILGMpO2EuTmIoYyk7YS5lYSgidmVydGljYWxpenIiKTt0aGlzLnBsYXllci5rZChhKX0pO1QuYShQYywhMCk7eSh1YSxBKTt1YS5wcm90b3R5cGUuVj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYz1hLnBsYXllckNvbnRhaW5lcjtpZighYyYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmKGM9YS5wYXJlbnROb2RlKSwhYykpe3RoaXMuYSgpO3JldHVybn10aGlzLmIoYyk7YT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdLAp0aGlzLmw9ITApO2E/dGhpcy5nKGEpOnRoaXMuYSgpfTt1YS5wcm90b3R5cGUueWU9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5oYyxkPXRoaXMueWEoKSxlPSIiO2EubWVtbyYmKGU9YS5tZW1vLnZpZGVvaWQpO2UmJmMmJmMuVmImJigwPD1kLmluZGV4T2YoZSl8fGMua2MoKSl9O3VhLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbihhKXthfHwodGhpcy5mPTApO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX07dWEucHJvdG90eXBlLkhhPWZ1bmN0aW9uKCl7dGhpcy5mKys7aWYoMTA8dGhpcy5mKXJldHVybiExOwp0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfTt1YS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9O3VhLnByb3RvdHlwZS5pc1BsYXlpbmc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMTphLmlzUGxheWluZ307dWEucHJvdG90eXBlLmdldEN1cnJlbnRUaW1lPWZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU/YS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWU/d2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKTowfTt1YS5wcm90b3R5cGUuZ2V0RHVyYXRpb249ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uP2EucGxheWVySW5zdGFuY2UuZHVyYXRpb246d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uP3dpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCk6MH07dWEucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifTt1YS5wcm90b3R5cGUuTmE9ZnVuY3Rpb24oKXt9O3koZWIsRSk7ZWIucHJvdG90eXBlLm89ZnVuY3Rpb24oKXtpZighdGhpcy51KWlmKHRoaXMuY3x8Cih0aGlzLmM9MCksdGhpcy5wbGF5ZXIuaXNQbGF5aW5nKCkmJnRoaXMuYysrLDE1PHRoaXMuYyl0aGlzLkkoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5mKCEwKTtlbHNle3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy51PSEwO3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oZCl7dGhpcy5HKGQpO3RoaXMuc3x8KHRoaXMuSSgiYWRlcnJvciIsdGhpcy5YKSx0aGlzLmYoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fTtlYi5wcm90b3R5cGUuQT1mdW5jdGlvbigpe3RoaXMucz0hMDt0aGlzLkwoImVtcHR5IHZhc3QiKX07ZWIucHJvdG90eXBlLkc9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhmLGgpe3ZhciBtPSExO2lmKGYpe2lmKDEwMDk9PWZ8fDMwMz09Znx8NDAzPT1mKW09ITA7bXx8IWYuaW5kZXhPZnx8LTE9PT1mLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1mLmluZGV4T2YoIjMwMyIpJiYtMT09PWYuaW5kZXhPZigiNDAzIil8fChtPSEwKTsibnVtYmVyIj09dHlwZW9mIGYmJihoLlg9ZixoLkkoImFkZXJyb3IiLGYpKX1yZXR1cm4gbX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiYKYyhkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkEoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmMoYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkEoKTticmVha319O2ViLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7dGhpcy5YPXRoaXMuWHx8ITE7dGhpcy5vKCk7dmFyIGM9d2luZG93Lm92VmlkZW87Y3x8KGM9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YyYmYy5yZWdpc3RlckV2ZW50JiYhdGhpcy5EPyhjLnJlZ2lzdGVyRXZlbnQoYy5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcykpLGMucmVnaXN0ZXJFdmVudChjLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSksCmMucmVnaXN0ZXJFdmVudChjLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSksYy5yZWdpc3RlckV2ZW50KGMuT05fUExBWUVSX0FERVJST1IsZnVuY3Rpb24oKXt0aGlzLkkoImFkZXJyb3IiLHRoaXMuWCk7dGhpcy5mKCl9LmJpbmQodGhpcykpLHRoaXMuRD0hMCxjLnJlZ2lzdGVyRXZlbnQoYy5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihkKXthLnllKGQpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSwxMDApfTtlYi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/ITE6YTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYKKHRoaXMucGxheWVyPW5ldyB1YSh3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5hY3RpdmVQbGF5ZXIpKTt0aGlzLmEoYSl9O3koZWMsRik7ZWMucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihhPXdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvLlBsYXllciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJgooYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZD1uZXcgdWEoYVtjXSk7ZC5pfHx0aGlzLmIoZCl8fCh0aGlzLmkoZCksKG5ldyBlYihkLHRoaXMuYSkpLncoKSl9dGhpcy5nKCl9O3ZhciBRYz1uZXcgZWMoWCk7VC5hKFFjKTt5KHphLEEpO3phLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtjfHwoYT10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSkpO3RoaXMuYihjKTt0aGlzLm8oYSk7dGhpcy5mKCl9O3phLnByb3RvdHlwZS5vPWZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfTt6YS5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3ZhciBhPXRoaXMueGEoKSxjPXRoaXMuUigpOwpjfHwoKGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxjP3RoaXMuZyhjKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCkpfTt6YS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9O3phLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9O3phLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfTt6YS5wcm90b3R5cGUuYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfTsKemEucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9O3phLnByb3RvdHlwZS5FYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuUigpO3JldHVybiBhP2EubXV0ZWQ6ITB9O3phLnByb3RvdHlwZS5DYT1mdW5jdGlvbigpe3ZhciBhPXt9LGM9dGhpcy5SKCksZD10aGlzLnhhKCk7aWYoYS52aWRlb1RhZz1jKWEudmlkZW9UYWdJZD1jLmlkO2lmKGEuY29udGFpbmVyPWQpYS5jb250YWluZXJJZD1kLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9O3koTWEsRSk7TWEucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT10YygpO3RoaXMuYz10aGlzLmN8fCExO3ZhciBjPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpO2MubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oZCxlKXt0aGlzLk8oZSl9LmJpbmQodGhpcykpO2MubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5zPQohMDt0aGlzLk4mJnRoaXMuTSgpfS5iaW5kKHRoaXMpKTtjLm1iLnN1YnNjcmliZShhLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZD10aGlzLnBsYXllci5oYztkJiZkLlZiJiZ0aGlzLnBsYXllci5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2MubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLmYoKTt0aGlzLk49ITA7dGhpcy5NKCl9LmJpbmQodGhpcykpO3RoaXMuRygpfTtNYS5wcm90b3R5cGUuTT1mdW5jdGlvbigpe3RoaXMuY3x8KGhiKCJpbWE6ICIrdGhpcy5mKCksIk9veWFsYSIpLHRoaXMuc3x8dGhpcy5mKCk/dGhpcy5zJiZ0aGlzLkQmJiF0aGlzLnUmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMDApKX07TWEucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLksoKTtyZXR1cm4gYSYmYS5hZE1hbmFnZXJzJiZhLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX07TWEucHJvdG90eXBlLks9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZigiYWRNYW5hZ2VyQ29udHJvbGxlciI9PT1kLm5hbWUpcmV0dXJuIGQuaW5zdGFuY2V9fTtNYS5wcm90b3R5cGUuRz1mdW5jdGlvbigpe2lmKHRoaXMuZigpKXt2YXIgYT10aGlzLksoKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy51PTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuRD1hLnBmfXRoaXMuaSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpLDEwMCl9O01hLnByb3RvdHlwZS5QPWZ1bmN0aW9uKGEpe3JldHVybiBhLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfTtNYS5wcm90b3R5cGUuTz1mdW5jdGlvbihhKXt0aGlzLmM9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0sMTApOjA7MTAwOT09dGhpcy5jfHwzMDI9PXRoaXMuYz90aGlzLkE9ITA6dGhpcy5JKCJhZGVycm9yIix0aGlzLmMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKX07TWEucHJvdG90eXBlLm89ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjt0aGlzLkE/KHRoaXMuTCgpLHRoaXMuYigpKTphLmFkKCk/KHRoaXMuYSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5QKGEpPyh0aGlzLmEoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwMCl9O3koZGMsRik7ZGMucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLmw9MTUwMDt2YXIgYT10YygpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8bC56YShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBjIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGMpKXt2YXIgZD1uZXcgemEoYS5fX2ludGVybmFsLnBsYXllcnNbY10pO3RoaXMuYihkKXx8KHRoaXMuaShkKSwobmV3IE1hKGQsdGhpcy5hKSkudygpKX10aGlzLmcoKX07dmFyIFJjPW5ldyBkYyhYKTtULmEoUmMpO3koSGEsQSk7SGEucHJvdG90eXBlLlY9ZnVuY3Rpb24oKXt0aGlzLmk9ITE7dGhpcy5mKCl9O0hhLnByb3RvdHlwZS5mPWZ1bmN0aW9uKCl7dmFyIGE9ITEsYz0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTsKYXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudHx8dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnRFbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihjPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYyYmKGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYz8odGhpcy5iKGEpLHRoaXMuZyhjKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApfTtIYS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfTtIYS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX07SGEucHJvdG90eXBlLmdldEN1cnJlbnRUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9OwpIYS5wcm90b3R5cGUuZ2V0RHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX07SGEucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7dGhpcy5sKCl9O0hhLnByb3RvdHlwZS5sPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5jJiYoMCx0aGlzLmMpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoKX0uYmluZCh0aGlzKSwxMDApfTtIYS5wcm90b3R5cGUuYWE9ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifTt5KHpiLEUpO3piLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBjPWEuY29kZSxkPWEubWVzc2FnZTthLmRhdGEmJihjPWEuZGF0YS5jb2RlLGQ9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWMmJig5MDA9PWMmJjA8ZC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMuTCgiZW1wdHkiKSx0aGlzLmIoKSk6CjEwMDk9PWN8fDMwMz09Y3x8NDAzPT1jP3RoaXMuYigpOnRoaXMuZigpKX07emIucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBjPTA7YzxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2MrKyl0aGlzLmMoYS5hZEVycm9yRXZlbnRzW2NdKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oZCl7dGhpcy5jKGQpfS5iaW5kKHRoaXMpKTthLnBsYXllci5vbigicGxheWluZyIsZnVuY3Rpb24oKXt2YXIgZD10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTtpZihkLmFkRXJyb3JFdmVudHMpZm9yKHZhciBlPTA7ZTxkLmFkRXJyb3JFdmVudHMubGVuZ3RoO2UrKyl0aGlzLmMoZC5hZEVycm9yRXZlbnRzW2VdKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5MKCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfTt6Yi5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3RoaXMucGxheWVyLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT8KdGhpcy5hKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMCl9O3koS2IsRik7S2IucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7YT1uZXcgSGEoYSk7YS5pP3RoaXMuZygpOnRoaXMuYihhKXx8KGEubyhNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5pKGEpLChuZXcgemIoYSx0aGlzLmEpKS53KCkpfTtLYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3RoaXMubXx8KHRoaXMubT0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGMpe3RoaXMuYyhjLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4pe2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGE9MDthPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuYyh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pfWVsc2UgaWYoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiYml0bW92aW5wbGF5ZXItY29udGFpbmVyIikpZm9yKGE9CjA7YTxkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJiaXRtb3ZpbnBsYXllci1jb250YWluZXIiKS5sZW5ndGg7YSsrKXRoaXMuYyhkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJiaXRtb3ZpbnBsYXllci1jb250YWluZXIiKVthXSk7dGhpcy5nKCl9O3ZhciBTYz1uZXcgS2IoWCk7VC5hKFNjKTt5KGRiLEEpO2RiLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxjPWEuY29udGFpbmVyO2EuZ2V0Q29uZmlnPWZ1bmN0aW9uKCl7cmV0dXJue2FkdmVydGlzaW5nOntwcmVyb2xsQWRUYWc6InZlcnRpY2FsaXpyIn19fTtpZihjKXt0cnl7Yy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jYXRjaChkKXt9dGhpcy5iKGMpO3RoaXMuZyhjKX1lbHNlIHRoaXMuYSgpfTtkYi5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt3aW5kb3cuYj1nO2lmKCF0aGlzLmlzUGF1c2VkKXt0aGlzLmlzUGF1c2VkPSEwO2Zvcih2YXIgYT10aGlzLnBsYXllci5jb250YWluZXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpLApjPTA7YzxhLmxlbmd0aDtjKyspYVtjXS5zdHlsZS5maWx0ZXI9ImJsdXIoOHB4KSI7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7YS5zdHlsZS53aWR0aD0iMTAwJSI7YS5zdHlsZS5oZWlnaHQ9IjEwMCUiO2Euc3R5bGUudG9wPSIwIjthLnN0eWxlLmxlZnQ9IjAiO2Euc3R5bGUuZm9udEZhbWlseT0iU3BpZWdlbFNlcmlmVUksQXJpYWwsc2Fucy1zZXJpZiI7YS5zdHlsZS5mb250U2l6ZT0iMjBweCI7YS5pbm5lckhUTUw9IjxiPkxpdmVUaWNrZXI8L2I+Ijt0aGlzLmw9YTt0aGlzLnBsYXllci5jb250YWluZXIuYXBwZW5kQ2hpbGQoYSk7dGhpcy5wbGF5ZXIuY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSI7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLnN0eWxlLmJhY2tncm91bmRDb2xvcj0icmVkIjtjLnN0eWxlLmZvbnRGYW1pbHk9IlNwaWVnZWxTZXJpZlVJLEFyaWFsLHNhbnMtc2VyaWYiOwpjLnN0eWxlLmNvbG9yPSJ3aGl0ZSI7Yy5zdHlsZS5mb250U2l6ZT0iMTVweCI7Yy5zdHlsZS5wYWRkaW5nTGVmdD0iMTVweCI7Yy5zdHlsZS5tYXJnaW5Ub3A9IjIwcHgiO2MuaW5uZXJIVE1MPSJOdXIgZWluIFZpZGVvIHp1bSBMYWRlbiBkZXMgVGlja2VycyA+IjtjLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yy5vbmNsaWNrPWZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKTtjPS41NjI1KnRoaXMucGxheWVyLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDt2YXIgZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7ZC5zdHlsZS53aWR0aD0iMTAwJSI7ZC5zdHlsZS5oZWlnaHQ9IiIrYysicHgiO2Quc3R5bGUubWF4SGVpZ2h0PSI1MDBweCI7ZC5zdHlsZS50b3A9IjAiO2Quc3R5bGUubGVmdD0iMCI7ZC5vbmNsaWNrPWZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyk7CmEuYXBwZW5kQ2hpbGQoZCk7dGhpcy5iKGQpfX07ZGIucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXtpZih0aGlzLmlzUGF1c2VkKXt0aGlzLmlzUGF1c2VkPSExO3RoaXMubC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubCk7Zm9yKHZhciBhPXRoaXMucGxheWVyLmNvbnRhaW5lci5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2IiksYz0wO2M8YS5sZW5ndGg7YysrKWFbY10uc3R5bGUuZmlsdGVyPSIifX07ZGIucHJvdG90eXBlLkRlPWZ1bmN0aW9uKGEpe3RoaXMuZj1hfTtkYi5wcm90b3R5cGUuYWE9ZnVuY3Rpb24oKXtyZXR1cm4iY2xvYWtlciJ9O3koY2MsRSk7Y2MucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcixjPWEuZ2V0UmF3UGxheWVyKCkuY29uZi5hZEJyZWFrVGltZTthLkRlKGZ1bmN0aW9uKCl7Zy52LmkudmVydGljYWxpenI9ITE7dGhpcy5hKCl9LmJpbmQodGhpcykpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YS5wYXVzZSgpfSwKYyl9O3koYmMsRik7YmMucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT1nLmouYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZihhJiZhLnF1ZXJ5S2V5JiZhLnF1ZXJ5S2V5LmFkYnJlYWtlcil7Zy5WZD0hMDt2YXIgYz1nLnYuYigiY2xvYWtlciIpfHxUYzthLnF1ZXJ5S2V5LmFkQnJlYWtUaW1lJiYoYy5hZEJyZWFrVGltZT1hLnF1ZXJ5S2V5LmFkQnJlYWtUaW1lKTthLnF1ZXJ5S2V5Lm1pbkhlaWdodCYmKGMubWluSGVpZ2h0PWEucXVlcnlLZXkubWluSGVpZ2h0KTthLnF1ZXJ5S2V5LnF1ZXJ5U2VsZWN0b3JBbGwmJihjLnF1ZXJ5U2VsZWN0b3JBbGw9YS5xdWVyeUtleS5xdWVyeVNlbGVjdG9yQWxsKTtpZihjKXthPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYy5xdWVyeVNlbGVjdG9yQWxsKTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXTsiRElWIj09ZS5ub2RlTmFtZSYmKGU9bmV3IGRiKHtjb250YWluZXI6ZSxjb25mOmN9KSxlLml8fHRoaXMuYihlKXx8Cih0aGlzLmkoZSksKG5ldyBjYyhlLHRoaXMuYSkpLncoKSkpfXRoaXMuZygpfX19O3ZhciBUYz17cXVlcnlTZWxlY3RvckFsbDoiLm91dGJyYWluLWNvbnRhaW5lciIsYWRCcmVha1RpbWU6IjUwMCJ9LFVjPW5ldyBiYyhYKTtULmEoVWMpO3koJGEsQSk7JGEucHJvdG90eXBlLlY9ZnVuY3Rpb24oKXtpZih0aGlzLmdldFJhd1BsYXllcigpLnRvU3RyaW5nKCkpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudG9TdHJpbmcoKSk7dGhpcy5iKGEpO2lmKGEpe3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuZyhjKX1lbHNlIHRoaXMuYSgpfWVsc2UgdGhpcy5hKCl9OyRhLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9Y2F0Y2goYSl7fX07CiRhLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fTskYS5wcm90b3R5cGUuV2I9ZnVuY3Rpb24oKXt2YXIgYT1nLnYuYTtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9OyRhLnByb3RvdHlwZS5hYT1mdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9O3koeWIsRSk7eWIucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTt0YS5CKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5MLmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7dGEuQigiIyIrYSwib2JqZWN0IixmdW5jdGlvbihjKXt0aGlzLmMoYyl9LmJpbmQodGhpcykpO3RhLkIoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsCmZ1bmN0aW9uKCl7dGhpcy5JKCJhZGVycm9yIiwiYWRzTG9hZGVyRmFpbGVkIik7dGhpcy5hKCl9LmJpbmQodGhpcykpO3RhLkIoIiMiK2EsInJlcXVlc3RBZHNGYWlsZWQiLGZ1bmN0aW9uKCl7dGhpcy5JKCJhZGVycm9yIiwicmVxdWVzdEFkc0ZhaWxlZCIpO3RoaXMuYSgpfS5iaW5kKHRoaXMpKTt0YS5EKCl9O3liLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBjPSIiLGQ7Zm9yKGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpKXtjPWlzTmFOKGFbZF0pPyExOmFbZF07aWYoMTAwOT09YVtkXXx8MTAwMT09YVtkXXx8MzAzPT1hW2RdfHw0MDM9PWFbZF0pe3RoaXMuTCgpO3RoaXMuYigpO3JldHVybn1mb3IodmFyIGUgaW4gYVtkXSlpZihhW2RdLmhhc093blByb3BlcnR5KGUpJiYoYz1pc05hTihhW2RdW2VdKT8hMTphW2RdW2VdLDEwMDk9PWFbZF1bZV18fDEwMDE9PWFbZF1bZV18fDMwMz09YVtkXVtlXXx8NDAzPT1hW2RdW2VdKSl7dGhpcy5MKCk7dGhpcy5iKCk7cmV0dXJufX10aGlzLkkoImFkZXJyb3IiLApjKTt0aGlzLmEoKX07eShjYixGKTtjYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGM9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksZD0wO2Q8Yy5sZW5ndGg7ZCsrKWEucHVzaChjW2RdKTtjPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKWEucHVzaChjW2RdKTt0aGlzLm8mJihhPWwuRGIoYSx0aGlzLm8pKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZT1hW2NdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIik7ZT1uZXcgJGEoZSk7aWYoIXRoaXMuYihlKSYmIWUuaSl7dGhpcy5pKGUpO3ZhciBmPW5ldyB5YihlLHRoaXMuYSk7Zi53KCl9fWZvcihjPTA7YzxhLmxlbmd0aDtjKyspZm9yKGQ9YVtjXTtkLnBhcmVudEVsZW1lbnQ7KXtkPWQucGFyZW50RWxlbWVudDt2YXIgaD1kLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIrCmgpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLm98fCh0aGlzLm89W10pLHRoaXMuby5wdXNoKGFbY10pLGU9bmV3ICRhKGgpLHRoaXMuYihlKXx8ZS5pfHwodGhpcy5pKGUpLGY9bmV3IHliKGUsdGhpcy5hKSxmLncoKSl9Y2F0Y2gobSl7fX19dGhpcy5nKCl9O2NiLnByb3RvdHlwZS5CPWZ1bmN0aW9uKGEsYyxkKXt0aGlzLmN8fCh0aGlzLmM9e30pO3RoaXMuY1thXXx8KHRoaXMuY1thXT17fSk7dGhpcy5jW2FdW2NdfHwodGhpcy5jW2FdW2NdPVtdKTt0aGlzLmNbYV1bY10ucHVzaChkKX07Y2IucHJvdG90eXBlLk49ZnVuY3Rpb24oYSl7dmFyIGM9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5jfHx0aGlzLmMmJiF0aGlzLmNbY10pdGhpcy5tfHwodGhpcy5tPVtdKSx0aGlzLm0ucHVzaChhKSx0aGlzLk0oKSYmKHRoaXMudSgpLHRoaXMudygpKTtlbHNle3ZhciBkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmNbY11bZF0mJgowPHRoaXMuY1tjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmNbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLmNbY11bZF1bZV0oYSl9fTtjYi5wcm90b3R5cGUuRD1mdW5jdGlvbigpe2lmKHRoaXMubSlmb3IodmFyIGE9MDthPHRoaXMubS5sZW5ndGg7YSsrKXt2YXIgYz10aGlzLm1bYV0sZD1jLnNQbGF5ZXJTZWxlY3RvcixlPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGMub0V2ZW50VHlwZSYmKGU9Yy5vRXZlbnRUeXBlKTtpZih0aGlzLmNbZF1bZV0mJjA8dGhpcy5jW2RdW2VdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuY1tkXVtlXS5sZW5ndGg7ZisrKXRoaXMuY1tkXVtlXVtmXShjKX19O2NiLnByb3RvdHlwZS5BPWZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBkPTE7ZDxhcmd1bWVudHMubGVuZ3RoOysrZCk7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdGEuTihhKX07CnZhciB0YT1uZXcgY2IoWCk7VC5hKHRhKTtyYygpO3koWmEsQSk7WmEucHJvdG90eXBlLlY9ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnRvU3RyaW5nKCkpO3RoaXMuYihhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLmcoYyl9O1phLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXthLnBhdXNlKCl9KX07WmEucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX07WmEucHJvdG90eXBlLkhhPWZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJgphLnBhdXNlKCl9KX07WmEucHJvdG90eXBlLkVhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9O1phLnByb3RvdHlwZS5hYT1mdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifTt5KGFjLEUpO2FjLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7bC5nKDMpO3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpOyQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihjKXtsLk8ucHVzaCh7Ilt3aWR0aF0iOnRoaXMucGxheWVyLmNvbnRhaW5lci5vZmZzZXRXaWR0aH0pO2wuTy5wdXNoKHsiW2hlaWdodF0iOnRoaXMucGxheWVyLmNvbnRhaW5lci5vZmZzZXRIZWlnaHR9KTt0aGlzLnBsYXllci5tdXRlZD1jLmRhdGEubXV0ZWQ7Yy5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Mub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWMuaXNQbGF5aW5nfHxjLmlzUGxheWluZygpKWMuaXNBZCYmCmMuaXNBZCgpP3RoaXMuTCgpOmMuZGF0YSYmYy5kYXRhLmFkcyYmYy5kYXRhLmFkcy52YXN0JiZjLmRhdGEuYWRzLnZhc3Quc3JjZXM/KHRoaXMuSSgibm9BZCIsInBsYXllZCIpLHRoaXMuYSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSSgibm9BZCIsInBsYXllZCIpO3RoaXMuYSghMCl9LmJpbmQodGhpcyksMjUwKX0uYmluZCh0aGlzKSk7Yy5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yy5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmEoKX0uYmluZCh0aGlzKSk7Yy5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmEoKX0uYmluZCh0aGlzKSk7Yy5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtjLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5MKCl9LmJpbmQodGhpcykpO2Mub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLkwoKX0uYmluZCh0aGlzKSk7CmMub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLkwoKX0uYmluZCh0aGlzKSk7Yy5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5MKCl9LmJpbmQodGhpcykpO2Mub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkwoKX0uYmluZCh0aGlzKSk7Yy5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5MKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX07eShKYixGKTtKYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSl7dmFyIGQ9YVtjXSxlPSIiO3RyeXtlPWQuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGgpe2U9ZC5pZH1pZihlJiYKJCgiIyIrZSkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IFphKGUpO3RoaXMuYihmKXx8KHRoaXMuaShmKSwobmV3IGFjKGYsdGhpcy5hKSkudygpKX1jYXRjaChoKXt9fXRoaXMuZygpfTtKYi5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXt2YXIgYz1hLmdldFJhd1BsYXllcigpOyQoIiMiK2MpO2Zvcih2YXIgZCBpbiB0aGlzLmYpaWYoYz09dGhpcy5mW2RdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLmZbYS55YSgpXT8hMDohMX07dmFyIFZjPW5ldyBKYihYKTtULmEoVmMpO3kocWEsQSk7cWEucHJvdG90eXBlLlY9ZnVuY3Rpb24oKXt2YXIgYT0hMSxjPSExO3RoaXMuYWI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGQpe3RyeXtpZihkJiZkLnNvdXJjZSYmZC5zb3VyY2UuX2VudnZhcnMpe3RoaXMuc3x8KGQudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMuU2MoKX0uYmluZCh0aGlzKSksCnRoaXMucz0hMCk7dmFyIGU9dGhpcy51KGQuc291cmNlLl9lbnZ2YXJzKTtlJiYodGhpcy5tPWUpO2lmKCF0aGlzLkImJihkLnNvdXJjZS5DSE9PU0VSX1RJTUV8fGQuc291cmNlLkNIT09TRVJfQUIpKXt2YXIgZj1kLnNvdXJjZS5DSE9PU0VSX0FCfHwiIixoPWQuc291cmNlLkNIT09TRVJfVElNRXx8IiI7bC50cmFjaygic3RhdHNfY2hvb3Nlcl9hYiIsZiwhMCk7bC50cmFjaygic3RhdHNfY2hvb3Nlcl9pbnRlcmFjdGlvbiIsZisocGFyc2VJbnQoaCwxMCk9PWg/IiI6Il9hdXRvcGxheSIpLCEwKTtsLnRyYWNrKCJzdGF0c19jaG9vc2VyX3RpbWUiLGgsITApO3RoaXMuQj0hMDt0aGlzLmFiPWQuc291cmNlfX19Y2F0Y2gobSl7fX0uYmluZCh0aGlzKSk7dGhpcy53YygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYz1hKTt0aGlzLmIoYSk7dGhpcy5nKGMpOwp0aGlzLkcodGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTtoYigic2V0IHVwIHBsYXllciBET05FIix0aGlzLmdldFJhd1BsYXllcigpLGEsIk9ubHlIT01BRCIpfTtxYS5wcm90b3R5cGUudWQ9ZnVuY3Rpb24oYSl7dGhpcy5sfHwodGhpcy5sPVtdKTt0aGlzLmwucHVzaChhKX07cWEucHJvdG90eXBlLnpkPWZ1bmN0aW9uKCl7dGhpcy5hYiYmdGhpcy5hYi5wb3N0TWVzc2FnZSgiY2xpY2t0aHJvdWdoX2V2ZW50Iil9O3FhLnByb3RvdHlwZS5TYz1mdW5jdGlvbigpe2lmKHRoaXMubCYmdGhpcy5sLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMubC5sZW5ndGg7YSsrKXRyeXt0aGlzLmxbYV0oKX1jYXRjaChjKXt9fTtxYS5wcm90b3R5cGUuZXhpdEZ1bGxzY3JlZW49ZnVuY3Rpb24oKXtyZXR1cm4hMH07cWEucHJvdG90eXBlLndjPWZ1bmN0aW9uKCl7aWYodGhpcy5tKXJldHVybiB0aGlzLm07aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTsKaWYoYT10aGlzLnUoYSkpcmV0dXJuIHRoaXMubT1hfX07cWEucHJvdG90eXBlLnU9ZnVuY3Rpb24oYSl7dmFyIGM9ITE7YSYmYS52aWRlb1Nsb3QmJihjPWEpO2EmJmEuaGR2cGFpZCYmKGM9YS5oZHZwYWlkKTtyZXR1cm4gY307cWEucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7fTtxYS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe307cWEucHJvdG90eXBlLkc9ZnVuY3Rpb24oYSxjKXthJiZhLnBhdXNlRXZlbnQmJmMuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmYmJnRoaXMuZi5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZi5wYXVzZSYmdGhpcy5mLnBhdXNlKCl9LmJpbmQodGhpcykpO2EmJmEucmVzdW1lRXZlbnQmJmMuYWRkRXZlbnRMaXN0ZW5lcihhLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mJiZ0aGlzLmYucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mLnJlc3VtZSYmdGhpcy5mLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTsKYSYmYS5tdXRlRXZlbnQmJmMuYWRkRXZlbnRMaXN0ZW5lcihhLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZiYmdGhpcy5mLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmYubXV0ZSYmdGhpcy5mLm11dGUoKX0uYmluZCh0aGlzKSk7YSYmYS51bm11dGVFdmVudCYmYy5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmYmJnRoaXMuZi51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmYudW5tdXRlJiZ0aGlzLmYudW5tdXRlKCl9LmJpbmQodGhpcykpfTtxYS5wcm90b3R5cGUuQ2Q9ZnVuY3Rpb24oYSl7dGhpcy5mPWF9O3FhLnByb3RvdHlwZS5hYT1mdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifTt5KEliLEUpO0liLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCksYz10aGlzLnBsYXllcjthLmF1dG9zdGFydCYmIXRoaXMubyYmKHRoaXMuZigpLHRoaXMubz0hMCx0aGlzLmcoKSk7CmMueGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcykpfTtJYi5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3RoaXMucGxheWVyLndjKCk/dGhpcy5hKCk6KHRoaXMuY3x8KHRoaXMuYz0xKSx0aGlzLmMrKywxMDx0aGlzLmM/dGhpcy5hKCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTApKX07eSgkYixGKTskYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe2lmKGcudi5nKXtpZihnLnYuYS5wbGF5ZXIpe3ZhciBhPWcudi5hLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goZSl7bC50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYyxkPTA7ZDxhLmxlbmd0aDtkKyspYz1uZXcgcWEoYVtkXSksdGhpcy5iKGMpfHwodGhpcy5pKGMpLChuZXcgSWIoYyx0aGlzLmEpKS53KCkpfX1lbHNlIHRoaXMuZygpfTt2YXIgV2M9bmV3ICRiKFgpO1QuYShXYyk7CnkoTGEsQSk7TGEucHJvdG90eXBlLlY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5iKGEpO2E9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmcoYSk7dGhpcy5MYT0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5MYT0hMH0uYmluZCh0aGlzKSl9O0xhLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX07TGEucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX07TGEucHJvdG90eXBlLkVhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5SKCk7cmV0dXJuIGE/YS5tdXRlZDohMH07TGEucHJvdG90eXBlLmdldEN1cnJlbnRUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9O0xhLnByb3RvdHlwZS5nZXREdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufTsKTGEucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5jPygwLHRoaXMuYykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfTtMYS5wcm90b3R5cGUuYWE9ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9O3koa2IsRSk7a2IucHJvdG90eXBlLnU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfTtrYi5wcm90b3R5cGUuQT1mdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihjKXtjPWMuZ2V0RXJyb3IoKTtjLmdldEVycm9yQ29kZSgpO3RoaXMuY3x8KHRoaXMuYz1bXSk7dGhpcy5jLnB1c2goYy5nZXRFcnJvckNvZGUoKSk7CjEwMDk9PWMuZ2V0RXJyb3JDb2RlKCl8fDMwMz09Yy5nZXRFcnJvckNvZGUoKXx8NDAzPT1jLmdldEVycm9yQ29kZSgpP3RoaXMuYigpOnRoaXMuSSgiYWRlcnJvciIsYy5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm89ITA7dGhpcy5MKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9O2tiLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5mP3RoaXMuQSh0aGlzLmYpOih0aGlzLmY9dGhpcy51KCksd2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMTAwKSl9O2tiLnByb3RvdHlwZS5zPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoYS5MYSYmMTxhLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLmYpe3RoaXMuYSgpO3JldHVybn1pZighdGhpcy5vKXt0aGlzLmEoKTtyZXR1cm59YT0KITA7aWYodGhpcy5jJiZ0aGlzLmMubGVuZ3RoJiYxPHRoaXMuYy5sZW5ndGgpZm9yKHZhciBjPTA7Yzx0aGlzLmMubGVuZ3RoLTE7YysrKTEwMDkhPXRoaXMuY1tjXSYmMzAzIT10aGlzLmNbY10mJjQwMyE9dGhpcy5jW2NdJiYoYT0hMSk7aWYoYSl0aGlzLkwoImVtcHR5IiksdGhpcy5iKCk7ZWxzZXt0aGlzLmEoKTtyZXR1cm59fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksNTAwKX07eShaYixGKTtaYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe3RoaXMubD0tMTt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8YS5sZW5ndGgpZm9yKHZhciBjIGluIGEpe3ZhciBkPW5ldyBMYShhLml0ZW0oK2MpKTt0aGlzLmIoZCl8fC0xPT1kLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLmkoZCksKG5ldyBrYihkLHRoaXMuYSkpLncoKSl9dGhpcy5nKCl9O3ZhciBYYz0KbmV3IFpiKFgpO1QuYShYYyk7eSh5YSxBKTt5YS5wcm90b3R5cGUuVj1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5iKGEpO3RoaXMuZyhhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKX07eWEucHJvdG90eXBlLk5hPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmwoKX0uYmluZCh0aGlzKSw1MDApfTt5YS5wcm90b3R5cGUubD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UG9zaXRpb24oKSxjPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmMmJjA8YyYmYT49Yy0xJiZ0aGlzLmMmJnRoaXMuYygpfTt5YS5wcm90b3R5cGUuZ2V0RHVyYXRpb249ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGM9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYz1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpOwpyZXR1cm4gY307eWEucHJvdG90eXBlLmdldFBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxjPTA7YS5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGM9YS5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gY307eWEucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfTt5YS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMuZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5mKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX07eWEucHJvdG90eXBlLmlzUGxheWluZz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGxheWJhY2smJmEucGxheWJhY2suZ2V0UGxheVN0YXRlPyhhLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09YS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9O3lhLnByb3RvdHlwZS5KZT1mdW5jdGlvbigpe3RoaXMuZj0Kd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX07eWEucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifTt5KEhiLEUpO0hiLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dGhpcy5vPTEwO3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpO3RoaXMuZnx8KHRoaXMuZj0wLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkkoImFkZXJyb3IiKTt0aGlzLmMoKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMuSSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5jKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5JKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSwKdGhpcy5jKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMuSSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5jKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLkkoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuYygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5JKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5JKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmMoKSkpOih0aGlzLkkoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuYygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5JKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmMoKSkpOih0aGlzLmZ8fHRoaXMuZisrLHRoaXMuZjw9dGhpcy5vPyh0aGlzLmYrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5JKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmMoKSkpfTtIYi5wcm90b3R5cGUuYz1mdW5jdGlvbigpe3RoaXMucGxheWVyLmlzUGxheWluZygpPyh0aGlzLnBsYXllci5KZSgpLHRoaXMuYSgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9O3koWWIsRik7WWIucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGM7YSYmYVswXSYmKGM9YVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmNbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmEmJihhPW5ldyB5YSh3aW5kb3cucGxheWVyQXBpKSx0aGlzLmIoYSl8fCh0aGlzLmkoYSksKG5ldyBIYihhLHRoaXMuYSkpLncoKSkpO3RoaXMuZygpfTt2YXIgWWM9bmV3IFliKFgpO1QuYShZYyk7eShTYSwKQSk7U2EucHJvdG90eXBlLlY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2E/YS5wYXJlbnROb2RlPyhhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlKT8odGhpcy5iKGEpLChhPXRoaXMuZ2V0UmF3UGxheWVyKCkpPyh0aGlzLmcoYSksdGhpcy5MYT0hMSxhLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5MYT0hMH0uYmluZCh0aGlzKSkpOnRoaXMuZj0hMCk6dGhpcy5mPSEwOnRoaXMuZj0hMDp0aGlzLmY9ITB9O1NhLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX07U2EucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX07U2EucHJvdG90eXBlLmdldEN1cnJlbnRUaW1lPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxjPSIiO2EuY3VycmVudFRpbWUmJihjPWEuY3VycmVudFRpbWUpOwpyZXR1cm4gY307U2EucHJvdG90eXBlLmdldER1cmF0aW9uPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxjPTA7YS5kdXJhdGlvbiYmKGM9YS5kdXJhdGlvbik7cmV0dXJuIGN9O1NhLnByb3RvdHlwZS5OYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxjPXRoaXMuZ2V0RHVyYXRpb24oKTthJiZjJiYxPmMtYT90aGlzLmMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfTtTYS5wcm90b3R5cGUuYWE9ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn07eShZYSxFKTtZYS5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLnhhKCksYz10aGlzLnBsYXllci5SKCk7YyYmYy5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5nKCk7dGhpcy5wbGF5ZXIuTGE9ITF9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsCmZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5MKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMuTCgpfS5iaW5kKHRoaXMpKTthPXRoaXMuZigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuQSgpOnRoaXMucygpO2EuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYSgpfHwodGhpcy5JKCJjb250ZW50cGxheSIpLHRoaXMuYyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9O1lhLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7dGhpcy5iYSgpfHx0aGlzLmMoITApfTtZYS5wcm90b3R5cGUuQT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZigpOyFhLklhJiZhLk1hJiZhLm1mJiZhLm5mJiYodGhpcy5JKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuYygpKX07WWEucHJvdG90eXBlLnM9ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5mKCk7YS5hZHNMb2FkZXI/YS5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGMpe2E6e2M9Yy5nZXRFcnJvcigpO2ZvcihkIGluIGMpaWYoIm51bWJlciI9PXR5cGVvZiBjW2RdKXt2YXIgZD1jW2RdO2JyZWFrIGF9ZD12b2lkIDB9MTAwOT09ZHx8MzAzPT1kfHw0MDM9PWQ/KHRoaXMuTCgpLHRoaXMuYigpKToodGhpcy5JKCJhZGVycm9yIixkKSx0aGlzLmMoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTAwKX07WWEucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtpZighdGhpcy5vKWZvcih2YXIgYT1rYy5jKCksYz10aGlzLnBsYXllci54YSgpLmlkLGQ9MDtkPGEubGVuZ3RoO2QrKylhW2RdLmlkPT1jJiYodGhpcy5vPWFbZF0pO3JldHVybiB0aGlzLm99O1lhLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe2E9dm9pZCAwPT09CmE/ITE6YTt0aGlzLnBsYXllci5MYT9hP3RoaXMuZigpLmFkc0xvYWRlcj90aGlzLmEoITApOnRoaXMuYSgpOnRoaXMuYSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKGEpfS5iaW5kKHRoaXMpLDEwKX07eSh4YixGKTt4Yi5wcm90b3R5cGUubT1mdW5jdGlvbihhKXthPW5ldyBTYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5iKGEpfHxhLmZ8fCh0aGlzLmkoYSksKG5ldyBZYShhLHRoaXMuYSkpLncoKSl9O3hiLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE9a2MuYygpO2lmKGEmJmEubGVuZ3RoKWZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKXRoaXMubShhW2NdKTt0aGlzLmcoKX07eGIucHJvdG90eXBlLmM9ZnVuY3Rpb24oKXt2YXIgYTtpZihnLnYuZyYmZy52LmEucGxheWVyYXBpJiYoYT1nLnYuYS5wbGF5ZXJhcGkoKSkmJmEubGVuZ3RoKXJldHVybiBhO2E9W107dmFyIGM9CmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5ybXAtY29udGFpbmVyIik7aWYoYyYmYy5sZW5ndGgpe2Zvcih2YXIgZD0wO2Q8Yy5sZW5ndGg7ZCsrKXt2YXIgZT1jW2RdLmZlcm1vZDtlJiZhLnB1c2goZSl9aWYoYSYmYS5sZW5ndGgpcmV0dXJuIGF9YT1bXTtpZigoYz1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmMubGVuZ3RoKXtmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKWNbZF0mJmNbZF0uZmVybW9kJiZhLnB1c2goY1tkXS5mZXJtb2QpLGNbZF0mJmNbZF0ucGFyZW50RWxlbWVudCYmY1tkXS5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGNbZF0ucGFyZW50RWxlbWVudC5mZXJtb2QpLGNbZF0mJmNbZF0ucGFyZW50RWxlbWVudCYmY1tkXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQmJmNbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCYmYS5wdXNoKGNbZF0ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmZlcm1vZCk7CmlmKGEmJmEubGVuZ3RoKXJldHVybiBhfXJldHVybltdfTt2YXIga2M9bmV3IHhiKFgpO1QuYShrYyk7eShLYSxBKTtLYS5wcm90b3R5cGUuVj1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTt0Yi5jJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuYihhKTtpZihhLnRhZ05hbWUpe3ZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWM/dGhpcy5nKGMpOnRoaXMuYSgpfWVsc2UgdGhpcy5hKCl9O0thLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe2lmKHRiLmMpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYS5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX07CkthLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7aWYodGIuYyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX07S2EucHJvdG90eXBlLkhhPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5SKCk7cmV0dXJuIGEmJiFhLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX07S2EucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifTtLYS5wcm90b3R5cGUuV2I9ZnVuY3Rpb24oKXtyZXR1cm4hMH07S2EucHJvdG90eXBlLnhhPWZ1bmN0aW9uKCl7aWYodGIuYyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGR9ZWxzZSBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTthIT0KdGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1hKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9O3koR2IsRSk7R2IucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTthJiYodGhpcy5jPWEuaWQpO3RiLmM/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGMpe3ZhciBkPWMucGxheWVyQ29udGFpbmVyO2QmJnRoaXMuYyYmZCE9dGhpcy5jfHwiYWRlcnJvciIhPWMuZXZlbnR8fGwuYigidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09Yy5hZFR5cGV8fChjLmFkVVJMJiYoY29uZi5hZFRhZz1jLmFkVVJMKSx0aGlzLkkoImFkZXJyb3IiLGMudWYpLHRoaXMuYSgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGMpeyJhZGVycm9yIj09YyYmCih0aGlzLkkoImFkZXJyb3IiKSx0aGlzLmEoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX07eShYYixGKTtYYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe3RoaXMuYz0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBhO2lmKHRoaXMuYylmb3IodmFyIGM9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksZD1jLmxlbmd0aCxlPTA7ZTxkO2UrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChjW2VdKSlhPW5ldyBLYShhKSxhLml8fHRoaXMuYihhKXx8KHRoaXMuaShhKSxhPW5ldyBHYihhLHRoaXMuYSksYS53KCkpfWVsc2UgaWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYT0KbmV3IEthKGEpLGEuaT90aGlzLnUoKTp0aGlzLmIoYSl8fCh0aGlzLmkoYSksYT1uZXcgR2IoYSx0aGlzLmEpLGEudygpKX10aGlzLmcoKX07dmFyIHRiPW5ldyBYYihYKTtULmEodGIpO3koUmEsQSk7UmEucHJvdG90eXBlLlY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEpaWYoYS5HZXRWaWRlb0VsKWlmKGEuR2V0RWwpe3ZhciBjPWEuR2V0VmlkZW9FbCgpO2E9YS5HZXRFbCgpO2MmJmE/KHRoaXMuYihhKSx0aGlzLmcoYykpOnRoaXMuYSgpfWVsc2UgdGhpcy5hKCk7ZWxzZSB0aGlzLmEoKTtlbHNlIHRoaXMuYSgpfTtSYS5wcm90b3R5cGUuRWE9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLklzTXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfTtSYS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9O1JhLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKGEpe2E9dm9pZCAwPT09YT8hMTphOwp2YXIgYz10aGlzLmdldFJhd1BsYXllcigpO2E/Yy5Jc1BhdXNlZCgpJiZjLlBsYXkoKTooYy5QbGF5KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXkoITApfS5iaW5kKHRoaXMpLDEwKSl9O1JhLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLklzUGF1c2VkKCk/ITE6KHRoaXMucGF1c2UoKSwhMCl9O1JhLnByb3RvdHlwZS5XYj1mdW5jdGlvbigpe2lmKGcuai5NKCkmJmcuai5iKCJ0LW9ubGluZS5kZSIpKXJldHVybiExO3ZhciBhPWcudi5hO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX07UmEucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9O3koWGEsRSk7WGEucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLlg9dGhpcy5YfHwhMTt2YXIgYT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTtnLmouYigidC1vbmxpbmUuZGUiKSYmZy5qLk0oKSYmIWcuai5LYSgpJiYKKGEuU2V0VkFTVFByZXJvbGxUYWcoImh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3ZlcnRpY2FsaXpyL3Zhc3Q0LWVtcHR5LnhtbCIpLGcudi5hLnJ1bkluc2lkZUNvbnRhaW5lcj0hMSk7dGhpcy5vKCk7Zy5qLmIoInQtb25saW5lLmRlIikmJmcuai5NKCkmJmcuai5LYSgpJiYobmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oYyl7Yy5mb3JFYWNoKGZ1bmN0aW9uKGQpeyJhdHRyaWJ1dGVzIj09PWQudHlwZSYmInNyYyI9PT1kLmF0dHJpYnV0ZU5hbWUmJihkPW5ldyBkYSh0aGlzLnBsYXllci52aWRlb1RhZy5zcmMpLGQuaG9zdC5pbmNsdWRlcygidmVydGljYWxpenIuY29tIil8fChkLmhvc3QuaW5jbHVkZXMoImRsYzIudC1vbmxpbmUuZGUiKT9udWxsIT10aGlzLnBhcmVudCYmdGhpcy51KCk6KHRoaXMucGxheWVyLnZpZGVvVGFnLnNyYz0iaHR0cHM6Ly93d3cudmVydGljYWxpenIuY29tL2FwaS92ZXJ0aWNhbGl6ZXIvP21lZGlhZmlsZT0iK2cuai5BKHRoaXMucGxheWVyLnZpZGVvVGFnLnNyYykrCiImYz0iK2cuai5zKDEwKSx0aGlzLnBsYXllci52aWRlb1RhZy5sb2FkKCksdGhpcy5wbGF5ZXIudmlkZW9UYWcucGxheSgpLHRoaXMuQSgpKSkpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpLm9ic2VydmUodGhpcy5wbGF5ZXIudmlkZW9UYWcse2F0dHJpYnV0ZXM6ITAsY2hpbGRMaXN0OiEwLGNoYXJhY3RlckRhdGE6ITB9KTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihjKXt0aGlzLmYoYyl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLkwoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLkwoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuTCgpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYyl7Yy5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWMuZGV0YWlsLm5hbWUmJnRoaXMuZygpfS5iaW5kKHRoaXMpKX07ClhhLnByb3RvdHlwZS5BPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIueGEoKTt0aGlzLnBhcmVudD1hLnBhcmVudEVsZW1lbnQ7dGhpcy5jPWEuc3R5bGU7YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Euc3R5bGUudG9wPSIwcHgiO2Euc3R5bGUubGVmdD0iMHB4IjthLnN0eWxlLndpZHRoPSIxMDAlIjthLnN0eWxlLmhlaWdodD0iMTAwJSI7YS5zdHlsZS56SW5kZXg9IjIwMDAwIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfTtYYS5wcm90b3R5cGUudT1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLnhhKCk7YS5zdHlsZT10aGlzLmM7dGhpcy5wYXJlbnQuYXBwZW5kQ2hpbGQoYSk7dGhpcy5wYXJlbnQ9bnVsbDt0aGlzLmM9e319O1hhLnByb3RvdHlwZS5vPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLGM9YS5HZXRBZEVycm9yc0NhY2hlKCksZD0wO2Q8Yy5sZW5ndGg7ZCsrKXRoaXMuZihjW2RdKTthLkNsZWFyQWRFcnJvcnNDYWNoZSgpfTsKWGEucHJvdG90eXBlLmY9ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLm8oKTtlbHNle2lmKCJvYmplY3QiPT10eXBlb2YgYSlpZihhJiZhLmxlbmd0aClmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylhW2NdJiZhW2NdLnZhc3RFcnJvckNvZGUmJihhPWFbY10udmFzdEVycm9yQ29kZSk7ZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7YSYmYS5pbmRleE9mJiYwPD1hLmluZGV4T2YoIkFkRXJyb3IgMTAwOSAoVGhlIFZBU1QgcmVzcG9uc2UgZG9jdW1lbnQgaXMgZW1wdHkiKSYmKGE9MTAwOSk7bC51PWwuUygpJiYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpO2wudXx8MTAwOSE9YSYmMzAzIT1hJiY0MDMhPWE/KHRoaXMuSSgiYWRlcnJvciIsYSksdGhpcy5zKCkpOih0aGlzLkwoKSx0aGlzLmIoKSl9fTtYYS5wcm90b3R5cGUucz1mdW5jdGlvbigpe3RoaXMuYSghMSl9O3koV2IsRik7V2IucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrOwphfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9bmV3IFJhKGFbY10pO2QuaXx8dGhpcy5iKGQpfHwodGhpcy5pKGQpLChuZXcgWGEoZCx0aGlzLmEpKS53KCkpfXRoaXMuZygpfTt2YXIgWmM9bmV3IFdiKFgpO1QuYShaYyk7eShXYSxBKTtXYS5wcm90b3R5cGUuVj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYSl7dmFyIGM9YS5lbDsoYT1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5iKGMpLHRoaXMuZyhhKSk6dGhpcy5hKCl9ZWxzZSB0aGlzLmEoKX07V2EucHJvdG90eXBlLkVhPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5wbGF5ZXIubXV0ZWQoKSYmKGE9ITApO3JldHVybiBhfTtXYS5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wYXVzZSgpfTsKV2EucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9O1dhLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX07V2EucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifTt5KHdiLEUpO3diLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dGhpcy5YPXRoaXMuWHx8ITE7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7YS5hZGQoImFkRXJyb3IiLHRoaXMuZi5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLkwuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMuTC5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLkwuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy5MLmJpbmQodGhpcykpfTt3Yi5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXtpZihudWxsIT1hKXtpZigib2JqZWN0Ij09CnR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWFbY10mJmFbY10udmFzdEVycm9yQ29kZSYmKGE9YVtjXS52YXN0RXJyb3JDb2RlKTtlbHNlIGEmJmEudmFzdEVycm9yQ29kZSYmKGE9YS52YXN0RXJyb3JDb2RlKTsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5MKCksdGhpcy5iKCkpOih0aGlzLkkoImFkZXJyb3IiLGEpLHRoaXMuYygpKX19O3diLnByb3RvdHlwZS5jPWZ1bmN0aW9uKCl7dGhpcy5hKCExKX07eShWYixGKTtWYi5wcm90b3R5cGUudz1mdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycyxjO2ZvcihjIGluIGEpe3ZhciBkPW5ldyBXYShhW2NdKTtkLml8fHRoaXMuYihkKXx8KHRoaXMuaShkKSx3aW5kb3cuYnJpZHBsYXllcj1kLChuZXcgd2IoZCx0aGlzLmEpKS53KCkpfX10aGlzLmcoKX07CnZhciAkYz1uZXcgVmIoWCk7VC5hKCRjKTt5KHNhLEEpO3NhLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYSYmYVswXSlpZigoYT1hWzBdKSYmIkFkdmVydGlzZW1lbnQiPT1hLmdldEF0dHJpYnV0ZSgidGl0bGUiKSl0aGlzLmEoKTtlbHNle2Zvcih2YXIgYz1hO2MmJmMucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yy5wYXJlbnROb2RlLm5vZGVOYW1lKXtjPWMucGFyZW50Tm9kZTticmVha31jPWMucGFyZW50Tm9kZX10aGlzLmcoYSk7dGhpcy5iKGMpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihkKXtpZihkJiZkLmRhdGEmJiJ3ZWxlY3RyZWFkeSI9PWQuZGF0YSl7dmFyIGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFkTG9hZGluZ1NjcmVlbiIpO2UmJihlLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX1kJiZkLmRhdGEmJiJ3ZWxlY3Rkb25lIj09ZC5kYXRhJiYoZD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibGFzdEZyYW1lRmFkZXJDYW52YXMiKSkmJgooZC5wYXJlbnROb2RlLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0pfWVsc2UgdGhpcy5hKCl9O3NhLnByb3RvdHlwZS5sPWZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50KXZhciBjPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6e319KTtlbHNlIGM9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYy5pbml0Q3VzdG9tRXZlbnQoYSwhMSwhMSx7fSk7YyYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYyl9O3NhLnByb3RvdHlwZS5tPWZ1bmN0aW9uKCl7dGhpcy5mPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkU3RhcnQiPT1hLmRldGFpbC5uYW1lKXRyeXt0aGlzLmZ8fCh0aGlzLmY9ITAsdGhpcy5sKCJ4LWRsOC1oZC1jb250ZW50LWFkLXN0YXJ0ZWQiKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSl9O3NhLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RyeXt0aGlzLmwoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYSl7dGhpcy5SKCkucGF1c2UoKX19OwpzYS5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RyeXt0aGlzLmYmJih0aGlzLmwoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5mPSExKSx0aGlzLmwoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMuUigpLnBsYXkoKX19O3NhLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpe2lmKCF0aGlzLlIoKS5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH07c2EucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifTt5KHJhLEUpO3JhLnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7dmFyIGE9d2luZG93Ll9fZGw4X2Fkc0xvYWRlcjthPyhhJiZhLmFkZEV2ZW50TGlzdGVuZXImJihhLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5MKCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5MKCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLkwoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLkwoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGMpe3RoaXMuYyhjKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihjKXt0aGlzLmMoYyl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYyl7dGhpcy5jKGMpfS5iaW5kKHRoaXMpKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5ELmJpbmQodGhpcyksMTApfTtyYS5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXt2YXIgYz17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGM9YS5nZXRFcnJvcigpKTtjLmdldEVycm9yQ29kZT8oYy5nZXRFcnJvckNvZGUoKSx0aGlzLkkoImFkZXJyb3IiLGMuZ2V0RXJyb3JDb2RlKCkpLHRoaXMucz0hMCwxMDA5PT1jLmdldEVycm9yQ29kZSgpfHwKMzAzPT1jLmdldEVycm9yQ29kZSgpfHw0MDM9PWMuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuTT0hMCx0aGlzLkwoKSk6dGhpcy5mKCkpOih0aGlzLnN8fHRoaXMuSSgibm9mcmFtZXdvcmsiKSx0aGlzLmYoKSl9O3JhLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGE9MDthPHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQubGVuZ3RoO2ErKyl0aGlzLmMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFthXSk7dGhpcy5pKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudS5iaW5kKHRoaXMpLDEwMCl9O3JhLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dGhpcy5EKCk7dGhpcy51KCk7dGhpcy5HKCl9O3JhLnByb3RvdHlwZS5HPWZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIix0aGlzLm8uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IiwKZnVuY3Rpb24oYSl7dGhpcy5jKGEpfS5iaW5kKHRoaXMpKX07cmEucHJvdG90eXBlLmY9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hPyExOmE7dGhpcy5BP3RoaXMuYShhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZihhKX0uYmluZCh0aGlzKSwxMDApfTtyYS5wcm90b3R5cGUubz1mdW5jdGlvbihhKXt0aGlzLkE9ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBjIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWMmJihhLmRldGFpbFtjXXx8dGhpcy5jKGEpKX07eShHYSxGKTtHYS5wcm90b3R5cGUudz1mdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IHNhKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5pfHx0aGlzLmIoYSl8fCh0aGlzLmkoYSksYS5tKCksYT1uZXcgcmEoYSx0aGlzLmEpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9YS5vLmJpbmQoYSkpLGEudygpKX10aGlzLmcoKX07CnZhciBhZD1uZXcgR2EoWCk7VC5hKGFkKTt5KFUsQSk7VS5wcm90b3R5cGUuVj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYz1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYyl7dGhpcy5iKGMpO3ZhciBkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2Q/KHRoaXMuZyhkKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGUsZil7dGhpcy5sPWU7dGhpcy51PWZ9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oZSl7dGhpcy5kdXJhdGlvbj1lfS5iaW5kKHRoaXMpKSk6dGhpcy5hKCl9ZWxzZSB0aGlzLmEoKX1lbHNlIHRoaXMuYSgpfTtVLnByb3RvdHlwZS5CPWZ1bmN0aW9uKGEpe3RoaXMubT1hfTtVLnByb3RvdHlwZS5FYT1mdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihhPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9O1UucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9O1UucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfTtVLnByb3RvdHlwZS5IYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPyExOih0aGlzLnBhdXNlKCksITApfTtVLnByb3RvdHlwZS5nZXRDdXJyZW50VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmx9O1UucHJvdG90eXBlLmdldER1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259O1UucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9O1UucHJvdG90eXBlLk5hPQpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5zKGEpfS5iaW5kKHRoaXMpKX07VS5wcm90b3R5cGUucz1mdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBjPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmMmJjA8YyYmYT49Yy0xJiYhdGhpcy5mJiYodGhpcy5mPSEwLHRoaXMuYyYmdGhpcy5jKCkpfTt5KGJhLEUpO2JhLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMucylpZih0aGlzLmZ8fCh0aGlzLmY9MCksdGhpcy5mKyssMTU8dGhpcy5mKXdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhP3dpbmRvdy5jYW5SdW5BZHM/CnRoaXMuemEoKTp0aGlzLmMoITApOih0aGlzLkkoIm5vZnJhbWV3b3JrIiwiSU1BIiksYS52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLmMoKTp0aGlzLmMoITApKTtlbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMucz0hMDt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGQpe3RoaXMuRChkKTt0aGlzLm98fCh0aGlzLkkoImFkZXJyb3IiLHRoaXMuWCksdGhpcy5jKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksMTApfTtiYS5wcm90b3R5cGUuQT0KZnVuY3Rpb24oKXt0aGlzLm89ITA7dGhpcy5MKCJlbXB0eSB2YXN0Iil9O2JhLnByb3RvdHlwZS5EPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoZixoKXt2YXIgbT0hMTtpZihmKXtpZigxMDA5PT1mfHwzMDM9PWZ8fDQwMz09ZiltPSEwO218fCFmLmluZGV4T2Z8fC0xPT09Zi5pbmRleE9mKCIxMDA5IikmJi0xPT09Zi5pbmRleE9mKCIzMDMiKSYmLTE9PT1mLmluZGV4T2YoIjQwMyIpfHwobT0hMCk7Im51bWJlciI9PXR5cGVvZiBmPyhoLlg9ZixoLkkoImFkZXJyb3IiLGYpKTpoLkkoImFkZXJyb3IiKX1yZXR1cm4gbX1hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBkPWEuZ2V0RXJyb3IoKTtpZihkLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGQuZ2V0RXJyb3JDb2RlJiZjKGQuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQSgpO3JldHVybn19Zm9yKHZhciBlIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShlKSYmCmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmMoYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkEoKTticmVha319O2JhLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dGhpcy5YPXRoaXMuWHx8ITE7dmFyIGE9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCk7dGhpcy51KCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYyl7InBsYXlpbmciPT1jJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfTtiYS5wcm90b3R5cGUuYz1mdW5jdGlvbihhKXthPXZvaWQgMD09PWE/ITE6YTt0aGlzLmlzUGxheWluZz90aGlzLmEoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoYSl9LmJpbmQodGhpcyksMTApfTt5KEksRik7SS5wcm90b3R5cGUudz1mdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IFUod2luZG93Lmluc2VydGVkUGxheWVyKTthLml8fHRoaXMuYihhKXx8KHRoaXMuaShhKSxhPW5ldyBiYShhLHRoaXMuYSksYS53KCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiYKd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYz0wO2M8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2MrKylhPW5ldyBVKHdpbmRvdy5UVjJQbGF5ZXJzW2NdKSxhLml8fHRoaXMuYihhKXx8KHRoaXMuaShhKSxhPW5ldyBiYShhLHRoaXMuYSksYS53KCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGMgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYykmJndpbmRvdy5UVjJQbGF5ZXJzW2NdLnZpZGVvTW9kZWwmJihhPW5ldyBVKHdpbmRvdy5UVjJQbGF5ZXJzW2NdKSxhLml8fHRoaXMuYihhKXx8KHRoaXMuaShhKSxhLkIodGhpcy5hKSxhPW5ldyBiYShhLHRoaXMuYSksYS53KCkpKTt0aGlzLnUoKTt0aGlzLmcoKX07dmFyIGJkPW5ldyBJKFgpO1QuYShiZCk7eSh3LEEpO3cucHJvdG90eXBlLlY9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmdldFdyYXBwZXIoKTt0aGlzLmIoYSk7dmFyIGM9CmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuZyhjKTt0aGlzLmYoKX07dy5wcm90b3R5cGUuZj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheVN0YXRlKCk7YSE9dGhpcy5sJiYodGhpcy5sPWEpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDIpfTt3LnByb3RvdHlwZS5hYT1mdW5jdGlvbigpe3JldHVybiJsYW9sYTEifTt3LnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX07dy5wcm90b3R5cGUucGF1c2U9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX07eShyLEUpO3IucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLnM9MDt0aGlzLlg9dGhpcy5YfHwhMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKTt0aGlzLkcoKX07ci5wcm90b3R5cGUuRz0KZnVuY3Rpb24oKXtpZigodGhpcy5jPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZ0aGlzLmMuYWRzTG9hZGVyKXJldHVybiB0aGlzLklhPXRoaXMuYy5hZHNMb2FkZXIsdGhpcy5vKCksITA7dGhpcy5zKys7aWYodGhpcy5zPnRoaXMuSyl0aGlzLkkoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5mKCEwKTp0aGlzLmYoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkcuYmluZCh0aGlzKSwxMDApLCExfTtyLnByb3RvdHlwZS5vPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JYTtpZihhKXt2YXIgYz0iYWRFcnJvciIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmCihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oZSl7dGhpcy5BKGUpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihlKXt0aGlzLkEoZSk7dGhpcy5JKCJhZGVycm9yIix0aGlzLlgpO3RoaXMuTSgpfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmkoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwyMCl9O3IucHJvdG90eXBlLkE9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhmLApoKXt2YXIgbT0hMTtpZihmKXtpZigxMDA5PT1mfHwzMDM9PWZ8fDQwMz09ZiltPSEwO218fCFmLmluZGV4T2Z8fC0xPT09Zi5pbmRleE9mKCIxMDA5IikmJi0xPT09Zi5pbmRleE9mKCIzMDMiKSYmLTE9PT1mLmluZGV4T2YoIjQwMyIpfHwobT0hMCk7Im51bWJlciI9PXR5cGVvZiBmJiYoaC5YPWYsaC5JKCJhZGVycm9yIixmKSl9cmV0dXJuIG19YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZD1hLmdldEVycm9yKCk7aWYoZC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBkLmdldEVycm9yQ29kZSYmYyhkLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkQoKTtyZXR1cm59fWZvcih2YXIgZSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZSkmJmFbZV0mJmFbZV0uYWRFcnJvciYmYVtlXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgpjKGFbZV0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5EKCk7YnJlYWt9fTtyLnByb3RvdHlwZS5EPWZ1bmN0aW9uKCl7dGhpcy51PSEwfTtyLnByb3RvdHlwZS5NPWZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnU/KHRoaXMuTCgpLHRoaXMuYigpKTp0aGlzLmYoITApfS5iaW5kKHRoaXMpLDEwMCl9O3IucHJvdG90eXBlLmY9ZnVuY3Rpb24oYSl7dGhpcy5hKHZvaWQgMD09PWE/ITE6YSl9O3kocSxGKTtxLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7dmFyIGE7aWYoKGE9ZXZhbCgidHJ5IHtzcmF2dnBsUGxheWVySW5zdGFuY2VzfWNhdGNoKGUpe2ZhbHNlfSIpKXx8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMmJndpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aCYmMDx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGgpZm9yKHZhciBjPWF8fHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLGQ9CjA7ZDxjLmxlbmd0aDtkKyspYT1uZXcgdyhjW2RdKSx0aGlzLmIoYSl8fCh0aGlzLmkoYSksKG5ldyByKGEsdGhpcy5hKSkudygpKTt0aGlzLmcoKX07dmFyIGNkPW5ldyBxKFgpO1QuYShjZCk7eSh0LEEpO3QucHJvdG90eXBlLlY9ZnVuY3Rpb24oKXt2YXIgYT0hMSxjPSExO3RyeXthPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxjPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goZCl7fWEmJmM/KHRoaXMuYihhKSx0aGlzLmcoYyksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5hKCl9O3QucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJub25lIil9O3QucHJvdG90eXBlLnBsYXk9ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9O3QucHJvdG90eXBlLmFhPWZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn07eShRLEUpO1EucHJvdG90eXBlLnc9ZnVuY3Rpb24oKXt0aGlzLmMoKX07ClEucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KCh2b2lkIDA9PT1hPzA6YSk/KHRoaXMuSSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLmEoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoITApfS5iaW5kKHRoaXMpLDEwMCkpfTt5KEssRik7Sy5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJnYW1lIik7aWYoYSYmIkRJViI9PWEubm9kZU5hbWUmJndpbmRvdy52aWRlb2FkX2dhbl9zdGFydCYmd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXthPW5ldyB0KHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmkpe3RoaXMuZygpO3JldHVybn1pZighdGhpcy5iKGEpKXt0aGlzLmkoYSk7KG5ldyBRKGEsdGhpcy5hKSkudygpO3RoaXMuZygpO3JldHVybn19dGhpcy5nKCl9O3ZhciBkZD1uZXcgSyhYKTtULmEoZGQpO3koRyxBKTtHLnByb3RvdHlwZS5WPWZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuYihhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLmcoYSk6dGhpcy5hKCkpOnRoaXMuYSgpfTtHLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfTtHLnByb3RvdHlwZS5wbGF5PWZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX07Ry5wcm90b3R5cGUuYWE9ZnVuY3Rpb24oKXtyZXR1cm4iQVYifTt5KHgsRSk7eC5wcm90b3R5cGUudz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5jLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcykpO3RoaXMuZigpO3RoaXMubygpfTsKeC5wcm90b3R5cGUubz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBjPTA7YzxhLmFkc0xvYWRlci5sZW5ndGg7YysrKXt2YXIgZD0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihkPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2EuYWRzTG9hZGVyW2NdLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihlKXtlLmdldEVycm9yJiYoZT1lLmdldEVycm9yKCkpO3ZhciBmPSExO2lmKDEwMDk9PWV8fDMwMz09ZXx8NDAzPT1lKWY9ITA7aWYoIWYpZm9yKHZhciBoIGluIGUpe2lmKGVbaF0mJmVbaF0uaW5kZXhPZiYmCigtMSE9ZVtoXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1lW2hdLmluZGV4T2YoIjMwMyIpfHwtMSE9ZVtoXS5pbmRleE9mKCI0MDMiKSkpe2Y9ITA7YnJlYWt9aWYoZVtoXSYmKDEwMDk9PWVbaF18fDMwMz09ZVtoXXx8NDAzPT1lW2hdKSl7Zj0hMDticmVha319Zj8odGhpcy5MKCksdGhpcy5iKCkpOnRoaXMuYygpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuby5iaW5kKHRoaXMpLDUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9O3gucHJvdG90eXBlLmY9ZnVuY3Rpb24oKXtpZighdGhpcy5pKCkpe3ZhciBhPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09YS5nZXRQbGF5U3RhdGUoKT9hLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMCksdGhpcy5MKCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHwKYS5fYWRSZWdpc3RlcmVkP3RoaXMuYygpOnRoaXMuYyghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKX19O3gucHJvdG90eXBlLmM9ZnVuY3Rpb24oYSl7YT12b2lkIDA9PT1hPyExOmE7d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksMUU0KTt0aGlzLmEoYSl9O3kobixGKTtuLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe2E9bmV3IEcoYSk7YS5pP3RoaXMuZygpOnRoaXMuYihhKXx8KHRoaXMuaShhKSwobmV3IHgoYSx0aGlzLmEpKS53KCkpfTtuLnByb3RvdHlwZS53PWZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuYyh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1thXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuYyh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLmcoKX07CnZhciBlZD1uZXcgbihYKTtULmEoZWQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYSl7aWYoYS5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYz1hLmZpbGVuYW1lP2EuZmlsZW5hbWU6IiI7aWYoLTEhPWMuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWMuaW5kZXhPZigiaGQtbWFpbiIpKWM9YS5tZXNzYWdlP2EubWVzc2FnZToiIixhPWEuZXJyb3Iuc3RhY2s/YS5lcnJvci5zdGFjazoiIiwtMSE9Yy5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhhPWMuc3Vic3RyaW5nKGMuaW5kZXhPZigiOiIpKzEsYy5pbmRleE9mKCJpcyBub3QiKS0xKSxsLlAodi5ZKSxsLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixhLCEwKSk6LTEhPWEuaW5kZXhPZigic2V0QCIpJiYobC5QKHYuUyksbC50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBJYz1nLmoubC5nZXQoInNldEludGVydmFsIiksSmM9Zy5qLmwuZ2V0KCJzZXRUaW1lb3V0Iik7Cmcudj1uZXcgcWI7dHJ5e3ZhciBsYz1kb2N1bWVudC5jdXJyZW50U2NyaXB0fHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdzY3JpcHRbc3JjKj0iaGQtbWFpbi5qcyJdJyk7bGMmJmxjLnNldEF0dHJpYnV0ZSgiaWQiLGcuai5sYigpKTt2YXIgeWM9bGMuZ2V0QXR0cmlidXRlKCJkYXRhLWluZm8iKTt5YyYmKGcudi5hPXdpbmRvd1t5Y10pfWNhdGNoKGEpe312YXIgTmI9bmV3IENhO2hiKCJjaGFubmVsTmFtZTogIitOYi5hKCksIkhvbWFkSW5pdCIpO2hiKCJjaGFubmVsTmFtZURlcHJlY2F0ZWQ6ICIrTmIuZigpLCJIb21hZEluaXQiKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihOYi5hKCksZnVuY3Rpb24oYSl7Zy52Lmd8fChnLnYuYT1hLmRldGFpbCl9LCExKTtsLmhhKHdpbmRvdyxsLmcoMTApLHt9KTt2YXIgdmM9bC5nKDEwKTt1YygpO2sucHJvdG90eXBlLk09ZnVuY3Rpb24oKXt0aGlzLm89ITB9O2sucHJvdG90eXBlLkI9ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmM9CnRoaXMucGxheWVyLmFhKCk7Zy5wbGF5ZXI9YX07ay5wcm90b3R5cGUuRz1mdW5jdGlvbihhKXt0aGlzLmI9YX07ay5wcm90b3R5cGUuRj1mdW5jdGlvbihhKXt0aGlzLmc9YX07ay5wcm90b3R5cGUuYT1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmdbYV07dGhpcy5nW3RoaXMuY10mJnRoaXMuZ1t0aGlzLmNdW2FdJiYoYz10aGlzLmdbdGhpcy5jXVthXSk7cmV0dXJuIGN9O2sucHJvdG90eXBlLmk9ZnVuY3Rpb24oYSxjKXtjPXZvaWQgMD09PWM/ITE6YztnLlVhLmcoKTt2YXIgZD0hMTtpZih0aGlzLnUoKSl0aGlzLmIuU2EodGhpcy5iLmZjLHRoaXMuYi5CYSx0aGlzLmIuZWQsZnVuY3Rpb24oKXt0aGlzLmkoYSxjKX0uYmluZCh0aGlzKSx0aGlzLmIudGIpO2Vsc2UgaWYobC51JiYtMT09PXdhLlFhLmluZGV4T2YoInN2bV9kcm9wIikmJih3YS5RYSs9IiZzdm1fZHJvcD0xIiksd2Eua2ImJiF3YS5IZCl3YS51ZShmdW5jdGlvbigpe3RoaXMuaShhLGMpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7CmwuYSh2LmIsdGhpcy5wbGF5ZXIuQ2EoKSk7dmFyIGU9dGhpcy5nLGY9bmV3IGlhKHRoaXMucGxheWVyLGUpO2MmJmYuSygpO2YuZXhpdEZ1bGxzY3JlZW4oKTt2YXIgaD1uZXcgdShmLHRoaXMuYixlKTtoLk5iKHRoaXMuZyk7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoZT0hMSx0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihlPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKSxhPWEoZSkpO2F8fGwudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLnNlJiYoZD0hMSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtoLmVhKGEsZCk7dGhpcy5wbGF5ZXIua2QoaCl9LmJpbmQodGhpcyksMCl9fTtrLnByb3RvdHlwZS51PWZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGU7aWYodGhpcy5mKXt2YXIgYz1hLmdldFRpbWUoKS10aGlzLmYuZ2V0VGltZSgpO3RoaXMuZj1hO3JldHVybiAzRTU8Yz8hMDohMX10aGlzLmY9YTsKcmV0dXJuITF9O2sucHJvdG90eXBlLk49ZnVuY3Rpb24oKXtsLnBhKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5hKCJhZFRhZyIpO3RoaXMuYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMubShhKSk/dGhpcy5pKGEpOihsLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksbC5hKHYuZyx0aGlzLnBsYXllci5DYSgpKSl9O2sucHJvdG90eXBlLks9ZnVuY3Rpb24oYSl7aWYoIXRoaXMubyl7bC5wYSgicG9zdHJvbGwiKTt0aGlzLk0oKTt2YXIgYz10aGlzLmEoImFkVGFnIik7dGhpcy5hKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLm0oYykpP3RoaXMuaShjLGcudi5iKCJwb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQiKT8hMDphKToobC50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsCiJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGwuYSh2LmcsdGhpcy5wbGF5ZXIuQ2EoKSkpfX07ay5wcm90b3R5cGUubT1mdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX07ay5wcm90b3R5cGUuRD1mdW5jdGlvbigpe3RoaXMucGxheWVyLkllKHRoaXMuSy5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OYSgpfTtrLnByb3RvdHlwZS5zPWZ1bmN0aW9uKGEpe2wucGEoIm1pZHJvbGwiKTtpZighdGhpcy5sKXt0aGlzLmw9ITA7dmFyIGM9dGhpcy5hKCJhZFRhZyIpO3RoaXMuYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuaShjLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sPSExfS5iaW5kKHRoaXMpLDFFMykpOihsLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxsLmEodi5nLHRoaXMucGxheWVyLkNhKCkpKX19O2sucHJvdG90eXBlLkE9ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5IZSh0aGlzLnMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuY2QoKX07ay5wcm90b3R5cGUudz1mdW5jdGlvbigpe3RoaXMuTigpO3RoaXMucGxheWVyLmNkJiZ0aGlzLkEoKTt0aGlzLkQoKX19KSgpO30pKCk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
78.46.33.212
Nuremberg, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.212.33.46.78.clients.your-server.de
- Software
-
openresty/1.19.3.1 /
- Resource Hash
- ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame 656D
|
241 B
0
|
|
Script
text/javascript |
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.2.damoh.tvtoday.de/99ecb2e91da14b1cd6c33d1d6e51be4ea2e2d2e1/
|
112 B
680 B
|
127ms
40ms
|
XHR
application/json |
148.251.3.103
HETZNER-AS
|
|
|
GET
H2
|
200
|
546a818fe4b03c03eae5f0fb_245.webp
images.tvtoday.de/itv/2021-01-31/
|
3 KB
3 KB
|
35ms
34ms
|
Image
image/webp |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
5645143cea60e556a32f3945_245.webp
images.tvtoday.de/itv/2021-01-31/
|
2 KB
2 KB
|
34ms
34ms
|
Image
image/webp |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
600afc6c8189651233c40cf0_245.webp
images.tvtoday.de/itv/2021-01-31/
|
7 KB
8 KB
|
35ms
34ms
|
Image
image/webp |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
5645143cea60e556a32f3945_245.webp
images.tvtoday.de/itv/2021-01-31/
|
2 KB
2 KB
|
34ms
33ms
|
Image
image/webp |
151.106.72.75
PLUSSERVER-ASN1
|
|
General
- Full URL
- https://images.tvtoday.de/itv/2021-01-31/5645143cea60e556a32f3945_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
- bcc1736fd29d39bf5d51b8d2abe1b44bc9ff9d0a92173fab01b4fec6c3da2177
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
600af9138189651233c3da99_245.webp
images.tvtoday.de/itv/2021-01-31/
|
5 KB
6 KB
|
35ms
34ms
|
Image
image/webp |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
568266ffd945a6a268005d9010160416_245.webp
images.tvtoday.de/itv/2021-01-31/
|
12 KB
12 KB
|
35ms
34ms
|
Image
image/webp |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.2.damoh.tvtoday.de/33085e8071300a849312b4e716d9f21b2b7a75db/
|
108 B
676 B
|
44ms
43ms
|
XHR
application/json |
148.251.3.103
HETZNER-AS
|
|
|
GET
H2
|
200
|
548870ade4b0c01470685993_245.webp
images.tvtoday.de/itv/2021-01-31/
|
6 KB
6 KB
|
35ms
34ms
|
Image
image/webp |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
5645143cea60e556a32f3945_780.jpg
images.tvtoday.de/itv/2021-01-31/
|
16 KB
16 KB
|
35ms
34ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
568266ffd945a6a268005d9010160416_780.jpg
images.tvtoday.de/itv/2021-01-31/
|
69 KB
69 KB
|
35ms
35ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
600b30868189651233c618b7_780.jpg
images.tvtoday.de/itv/2021-01-31/
|
27 KB
28 KB
|
34ms
33ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
|
GET
H2
|
200
|
600b230c8189651233c5938e_780.jpg
images.tvtoday.de/itv/2021-01-31/
|
30 KB
30 KB
|
33ms
33ms
|
Image
image/jpeg |
151.106.72.75
PLUSSERVER-ASN1
|
|
|