-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.html
3263 lines (2993 loc) · 847 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang xml:lang>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />
<meta name="generator" content="radix" />
<style type="text/css">
/* Hide doc at startup (prevent jankiness while JS renders/transforms) */
body {
visibility: hidden;
}
</style>
<!--radix_placeholder_import_source-->
<!--/radix_placeholder_import_source-->
<!--radix_placeholder_meta_tags-->
<title>Apêndice 2</title>
<meta property="description" itemprop="description" content="Modelos populacionais matriciais aplicados à ecologia:
Uma introdução à teoria e a prática - Em preparação" />
<!-- https://schema.org/Article -->
<meta property="article:published" itemprop="datePublished" content="2021-05-24" />
<meta property="article:created" itemprop="dateCreated" content="2021-05-24" />
<meta name="article:author" content="Gabriel S. Santos & Maja Kajin" />
<!-- https://developers.facebook.com/docs/sharing/webmasters#markup -->
<meta property="og:title" content="Apêndice 2" />
<meta property="og:type" content="article" />
<meta property="og:description" content="Modelos populacionais matriciais aplicados à ecologia:
Uma introdução à teoria e a prática - Em preparação" />
<meta property="og:locale" content="en_US" />
<!-- https://dev.twitter.com/cards/types/summary -->
<meta property="twitter:card" content="summary" />
<meta property="twitter:title" content="Apêndice 2" />
<meta property="twitter:description" content="Modelos populacionais matriciais aplicados à ecologia:
Uma introdução à teoria e a prática - Em preparação" />
<!--/radix_placeholder_meta_tags-->
<!--radix_placeholder_rmarkdown_metadata-->
<script type="text/json" id="radix-rmarkdown-metadata">
{"type":"list","attributes":{"names":{"type":"character","attributes":{},"value":["title","description","date","author","output"]}},"value":[{"type":"character","attributes":{},"value":["Apêndice 2"]},{"type":"character","attributes":{},"value":["Modelos populacionais matriciais aplicados à ecologia:\nUma introdução à teoria e a prática - Em preparação\n"]},{"type":"character","attributes":{},"value":["2021-05-24"]},{"type":"list","attributes":{},"value":[{"type":"list","attributes":{"names":{"type":"character","attributes":{},"value":["name","url","affiliation","email_url"]}},"value":[{"type":"character","attributes":{},"value":["Gabriel S. Santos & Maja Kajin"]},{"type":"character","attributes":{},"value":["https://gabeco.wixsite.com/home"]},{"type":"character","attributes":{},"value":["Universidade do Estado do Rio de Janeiro"]},{"type":"character","attributes":{},"value":["ssantos.gabriel@gmail.com"]}]}]},{"type":"character","attributes":{},"value":["radix::radix_article"]}]}
</script>
<!--/radix_placeholder_rmarkdown_metadata-->
<script type="text/json" id="radix-resource-manifest">
{"type":"list","attributes":{},"value":[]}
</script>
<!--radix_placeholder_navigation_in_header-->
<!--/radix_placeholder_navigation_in_header-->
<!--radix_placeholder_distill-->
<style type="text/css">
body {
background-color: white;
}
.pandoc-table {
width: 100%;
}
.pandoc-table>caption {
margin-bottom: 10px;
}
.pandoc-table th:not([align]) {
text-align: left;
}
.pagedtable-footer {
font-size: 15px;
}
.html-widget {
margin-bottom: 2.0em;
}
.l-screen-inset {
padding-right: 16px;
}
.l-screen .caption {
margin-left: 10px;
}
.shaded {
background: rgb(247, 247, 247);
padding-top: 20px;
padding-bottom: 20px;
border-top: 1px solid rgba(0, 0, 0, 0.1);
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
}
.shaded .html-widget {
margin-bottom: 0;
border: 1px solid rgba(0, 0, 0, 0.1);
}
.shaded .shaded-content {
background: white;
}
.text-output {
margin-top: 0;
line-height: 1.5em;
}
.hidden {
display: none !important;
}
d-article {
padding-bottom: 30px;
}
d-appendix {
padding-top: 30px;
}
d-article>p>img {
width: 100%;
}
d-article iframe {
border: 1px solid rgba(0, 0, 0, 0.1);
margin-bottom: 2.0em;
width: 100%;
}
figure img.external {
background: white;
border: 1px solid rgba(0, 0, 0, 0.1);
box-shadow: 0 1px 8px rgba(0, 0, 0, 0.1);
padding: 18px;
box-sizing: border-box;
}
/* CSS for table of contents */
.d-toc {
color: rgba(0,0,0,0.8);
font-size: 0.8em;
line-height: 1em;
}
.d-toc-header {
font-size: 0.6rem;
font-weight: 400;
color: rgba(0, 0, 0, 0.5);
text-transform: uppercase;
margin-top: 0;
margin-bottom: 1.3em;
}
.d-toc a {
border-bottom: none;
}
.d-toc ul {
padding-left: 0;
}
.d-toc li>ul {
padding-top: 0.8em;
padding-left: 16px;
margin-bottom: 0.6em;
}
.d-toc ul,
.d-toc li {
list-style-type: none;
}
.d-toc li {
margin-bottom: 0.9em;
}
.d-toc-separator {
margin-top: 20px;
margin-bottom: 2em;
}
.d-article-with-toc {
border-top: none;
padding-top: 0;
}
/* Tweak code blocks (note that this CSS is repeated above in an injection
into the d-code shadow dom) */
d-code {
overflow-x: auto !important;
}
pre.d-code code.d-code {
padding-left: 10px;
font-size: 12px;
border-left: 2px solid rgba(0,0,0,0.1);
}
pre.text-output {
font-size: 12px;
color: black;
background: none;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
@media(min-width: 768px) {
d-code {
overflow-x: visible !important;
}
pre.d-code code.d-code {
padding-left: 18px;
font-size: 14px;
}
pre.text-output {
font-size: 14px;
}
}
/* Figure */
.figure {
position: relative;
margin-bottom: 2.5em;
margin-top: 1.5em;
}
.figure img {
width: 100%;
}
.figure .caption {
color: rgba(0, 0, 0, 0.6);
font-size: 12px;
line-height: 1.5em;
}
.figure img.external {
background: white;
border: 1px solid rgba(0, 0, 0, 0.1);
box-shadow: 0 1px 8px rgba(0, 0, 0, 0.1);
padding: 18px;
box-sizing: border-box;
}
.figure .caption a {
color: rgba(0, 0, 0, 0.6);
}
.figure .caption b,
.figure .caption strong, {
font-weight: 600;
color: rgba(0, 0, 0, 1.0);
}
/* Tweak 1000px media break to show more text */
@media(min-width: 1000px) {
.base-grid,
distill-header,
d-title,
d-abstract,
d-article,
d-appendix,
distill-appendix,
d-byline,
d-footnote-list,
d-citation-list,
distill-footer {
grid-template-columns: [screen-start] 1fr [page-start kicker-start] 80px [middle-start] 50px [text-start kicker-end] 65px 65px 65px 65px 65px 65px 65px 65px [text-end gutter-start] 65px [middle-end] 65px [page-end gutter-end] 1fr [screen-end];
grid-column-gap: 16px;
}
.grid {
grid-column-gap: 16px;
}
d-article {
font-size: 1.06rem;
line-height: 1.7em;
}
figure .caption, .figure .caption, figure figcaption {
font-size: 13px;
}
}
@media(min-width: 1180px) {
.base-grid,
distill-header,
d-title,
d-abstract,
d-article,
d-appendix,
distill-appendix,
d-byline,
d-footnote-list,
d-citation-list,
distill-footer {
grid-template-columns: [screen-start] 1fr [page-start kicker-start] 60px [middle-start] 60px [text-start kicker-end] 60px 60px 60px 60px 60px 60px 60px 60px [text-end gutter-start] 60px [middle-end] 60px [page-end gutter-end] 1fr [screen-end];
grid-column-gap: 32px;
}
.grid {
grid-column-gap: 32px;
}
}
/* Get the citation styles for the appendix (not auto-injected on render since
we do our own rendering of the citation appendix) */
d-appendix .citation-appendix,
.d-appendix .citation-appendix {
font-size: 11px;
line-height: 15px;
border-left: 1px solid rgba(0, 0, 0, 0.1);
padding-left: 18px;
border: 1px solid rgba(0,0,0,0.1);
background: rgba(0, 0, 0, 0.02);
padding: 10px 18px;
border-radius: 3px;
color: rgba(150, 150, 150, 1);
overflow: hidden;
margin-top: -12px;
white-space: pre-wrap;
word-wrap: break-word;
}
/* Social footer */
.social_footer {
margin-top: 30px;
margin-bottom: 0;
color: rgba(0,0,0,0.67);
}
.disqus-comments {
margin-right: 30px;
}
.disqus-comment-count {
border-bottom: 1px solid rgba(0, 0, 0, 0.4);
cursor: pointer;
}
#disqus_thread {
margin-top: 30px;
}
.article-sharing a {
border-bottom: none;
margin-right: 8px;
}
.article-sharing a:hover {
border-bottom: none;
}
.sidebar-section.subscribe {
font-size: 12px;
line-height: 1.6em;
}
.subscribe p {
margin-bottom: 0.5em;
}
.article-footer .subscribe {
font-size: 15px;
margin-top: 45px;
}
/* Improve display for browsers without grid (IE/Edge <= 15) */
.downlevel {
line-height: 1.6em;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", Arial, sans-serif;
margin: 0;
}
.downlevel .d-title {
padding-top: 6rem;
padding-bottom: 1.5rem;
}
.downlevel .d-title h1 {
font-size: 50px;
font-weight: 700;
line-height: 1.1em;
margin: 0 0 0.5rem;
}
.downlevel .d-title p {
font-weight: 300;
font-size: 1.2rem;
line-height: 1.55em;
margin-top: 0;
}
.downlevel .d-byline {
padding-top: 0.8em;
padding-bottom: 0.8em;
font-size: 0.8rem;
line-height: 1.8em;
}
.downlevel .section-separator {
border: none;
border-top: 1px solid rgba(0, 0, 0, 0.1);
}
.downlevel .d-article {
font-size: 1.06rem;
line-height: 1.7em;
padding-top: 1rem;
padding-bottom: 2rem;
}
.downlevel .d-appendix {
padding-left: 0;
padding-right: 0;
max-width: none;
font-size: 0.8em;
line-height: 1.7em;
margin-bottom: 0;
color: rgba(0,0,0,0.5);
padding-top: 40px;
padding-bottom: 48px;
}
.downlevel .footnotes ol {
padding-left: 13px;
}
.downlevel .base-grid,
.downlevel .distill-header,
.downlevel .d-title,
.downlevel .d-abstract,
.downlevel .d-article,
.downlevel .d-appendix,
.downlevel .distill-appendix,
.downlevel .d-byline,
.downlevel .d-footnote-list,
.downlevel .d-citation-list,
.downlevel .distill-footer,
.downlevel .appendix-bottom,
.downlevel .posts-container {
padding-left: 40px;
padding-right: 40px;
}
@media(min-width: 768px) {
.downlevel .base-grid,
.downlevel .distill-header,
.downlevel .d-title,
.downlevel .d-abstract,
.downlevel .d-article,
.downlevel .d-appendix,
.downlevel .distill-appendix,
.downlevel .d-byline,
.downlevel .d-footnote-list,
.downlevel .d-citation-list,
.downlevel .distill-footer,
.downlevel .appendix-bottom,
.downlevel .posts-container {
padding-left: 150px;
padding-right: 150px;
max-width: 900px;
}
}
.downlevel pre code {
display: block;
border-left: 2px solid rgba(0, 0, 0, .1);
padding: 0 0 0 20px;
font-size: 14px;
}
.downlevel code, .downlevel pre {
color: black;
background: none;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
</style>
<script type="application/javascript">
function is_downlevel_browser() {
if (bowser.isUnsupportedBrowser({ msie: "12", msedge: "16"},
window.navigator.userAgent)) {
return true;
} else {
return window.load_distill_framework === undefined;
}
}
// show body when load is complete
function on_load_complete() {
// set body to visible
document.body.style.visibility = 'visible';
// force redraw for leaflet widgets
if (window.HTMLWidgets) {
var maps = window.HTMLWidgets.findAll(".leaflet");
$.each(maps, function(i, el) {
var map = this.getMap();
map.invalidateSize();
map.eachLayer(function(layer) {
if (layer instanceof L.TileLayer)
layer.redraw();
});
});
}
// trigger 'shown' so htmlwidgets resize
$('d-article').trigger('shown');
}
function init_distill() {
init_common();
// create front matter
var front_matter = $('<d-front-matter></d-front-matter>');
$('#distill-front-matter').wrap(front_matter);
// create d-title
$('.d-title').changeElementType('d-title');
// create d-byline
var byline = $('<d-byline></d-byline>');
$('.d-byline').replaceWith(byline);
// create d-article
var article = $('<d-article></d-article>');
$('.d-article').wrap(article).children().unwrap();
// move posts container into article
$('.posts-container').appendTo($('d-article'));
// create d-appendix
$('.d-appendix').changeElementType('d-appendix');
// create d-bibliography
var bibliography = $('<d-bibliography></d-bibliography>');
$('#distill-bibliography').wrap(bibliography);
// flag indicating that we have appendix items
var appendix = $('.appendix-bottom').children('h3').length > 0;
// replace citations with <d-cite>
$('.citation').each(function(i, val) {
appendix = true;
var cites = $(this).attr('data-cites').split(" ");
var dt_cite = $('<d-cite></d-cite>');
dt_cite.attr('key', cites.join());
$(this).replaceWith(dt_cite);
});
// remove refs
$('#refs').remove();
// replace footnotes with <d-footnote>
$('.footnote-ref').each(function(i, val) {
appendix = true;
var href = $(this).attr('href');
var id = href.replace('#', '');
var fn = $('#' + id);
var fn_p = $('#' + id + '>p');
fn_p.find('.footnote-back').remove();
var text = fn_p.html();
var dtfn = $('<d-footnote></d-footnote>');
dtfn.html(text);
$(this).replaceWith(dtfn);
});
// remove footnotes
$('.footnotes').remove();
$('h1.appendix, h2.appendix').each(function(i, val) {
$(this).changeElementType('h3');
});
$('h3.appendix').each(function(i, val) {
var id = $(this).attr('id');
$('.d-toc a[href="#' + id + '"]').parent().remove();
appendix = true;
$(this).nextUntil($('h1, h2, h3')).addBack().appendTo($('d-appendix'));
});
// show d-appendix if we have appendix content
$("d-appendix").css('display', appendix ? 'grid' : 'none');
// replace code blocks with d-code
$('pre>code').each(function(i, val) {
var code = $(this);
var pre = code.parent();
var clz = "";
var language = pre.attr('class');
if (language) {
// map unknown languages to "clike" (without this they just dissapear)
if ($.inArray(language, ["bash", "clike", "css", "go", "html",
"javascript", "js", "julia", "lua", "markdown",
"markup", "mathml", "python", "svg", "xml"]) == -1)
language = "clike";
language = ' language="' + language + '"';
var dt_code = $('<d-code block' + language + clz + '></d-code>');
dt_code.text(code.text());
pre.replaceWith(dt_code);
} else {
code.addClass('text-output').unwrap().changeElementType('pre');
}
});
// localize layout chunks to just output
$('.layout-chunk').each(function(i, val) {
// capture layout
var layout = $(this).attr('data-layout');
// apply layout to markdown level block elements
var elements = $(this).children().not('d-code, pre.text-output, script');
elements.each(function(i, el) {
var layout_div = $('<div class="' + layout + '"></div>');
if (layout_div.hasClass('shaded')) {
var shaded_content = $('<div class="shaded-content"></div>');
$(this).wrap(shaded_content);
$(this).parent().wrap(layout_div);
} else {
$(this).wrap(layout_div);
}
});
// unwrap the layout-chunk div
$(this).children().unwrap();
});
// load distill framework
load_distill_framework();
// wait for window.distillRunlevel == 4 to do post processing
function distill_post_process() {
if (!window.distillRunlevel || window.distillRunlevel < 4)
return;
// hide author/affiliations entirely if we have no authors
var front_matter = JSON.parse($("#distill-front-matter").html());
var have_authors = front_matter.authors && front_matter.authors.length > 0;
if (!have_authors)
$('d-byline').addClass('hidden');
// table of contents
if (have_authors) // adjust border if we are in authors
$('.d-toc').parent().addClass('d-article-with-toc');
// strip links that point to #
$('.authors-affiliations').find('a[href="#"]').removeAttr('href');
// hide elements of author/affiliations grid that have no value
function hide_byline_column(caption) {
$('d-byline').find('h3:contains("' + caption + '")').parent().css('visibility', 'hidden');
}
// affiliations
var have_affiliations = false;
for (var i = 0; i<front_matter.authors.length; ++i) {
var author = front_matter.authors[i];
if (author.affiliation !== " ") {
have_affiliations = true;
break;
}
}
if (!have_affiliations)
$('d-byline').find('h3:contains("Affiliations")').css('visibility', 'hidden');
// published date
if (!front_matter.publishedDate)
hide_byline_column("Published");
// document object identifier
var doi = $('d-byline').find('h3:contains("DOI")');
var doi_p = doi.next().empty();
if (!front_matter.doi) {
// if we have a citation and valid citationText then link to that
if ($('#citation').length > 0 && front_matter.citationText) {
doi.html('Citation');
$('<a href="#citation"></a>')
.text(front_matter.citationText)
.appendTo(doi_p);
} else {
hide_byline_column("DOI");
}
} else {
$('<a></a>')
.attr('href', "https://doi.org/" + front_matter.doi)
.html(front_matter.doi)
.appendTo(doi_p);
}
// change plural form of authors/affiliations
if (front_matter.authors.length === 1) {
var grid = $('.authors-affiliations');
grid.children('h3:contains("Authors")').text('Author');
grid.children('h3:contains("Affiliations")').text('Affiliation');
}
// inject pre code styles (can't do this with a global stylesheet b/c a shadow root is used)
$('d-code').each(function(i, val) {
var style = document.createElement('style');
style.innerHTML = 'pre code { padding-left: 10px; font-size: 12px; border-left: 2px solid rgba(0,0,0,0.1); } ' +
'@media(min-width: 768px) { pre code { padding-left: 18px; font-size: 14px; } }';
if (this.shadowRoot)
this.shadowRoot.appendChild(style);
});
// move appendix-bottom entries to the bottom
$('.appendix-bottom').appendTo('d-appendix').children().unwrap();
$('.appendix-bottom').remove();
// clear polling timer
clearInterval(tid);
// show body now that everything is ready
on_load_complete();
}
var tid = setInterval(distill_post_process, 50);
distill_post_process();
}
function init_downlevel() {
init_common();
// insert hr after d-title
$('.d-title').after($('<hr class="section-separator"/>'));
// check if we have authors
var front_matter = JSON.parse($("#distill-front-matter").html());
var have_authors = front_matter.authors && front_matter.authors.length > 0;
// manage byline/border
if (!have_authors)
$('.d-byline').remove();
$('.d-byline').after($('<hr class="section-separator"/>'));
$('.d-byline a').remove();
// remove toc
$('.d-toc-header').remove();
$('.d-toc').remove();
$('.d-toc-separator').remove();
// move appendix elements
$('h1.appendix, h2.appendix').each(function(i, val) {
$(this).changeElementType('h3');
});
$('h3.appendix').each(function(i, val) {
$(this).nextUntil($('h1, h2, h3')).addBack().appendTo($('.d-appendix'));
});
// inject headers into references and footnotes
var refs_header = $('<h3></h3>');
refs_header.text('References');
$('#refs').prepend(refs_header);
var footnotes_header = $('<h3></h3');
footnotes_header.text('Footnotes');
$('.footnotes').children('hr').first().replaceWith(footnotes_header);
// move appendix-bottom entries to the bottom
$('.appendix-bottom').appendTo('.d-appendix').children().unwrap();
$('.appendix-bottom').remove();
// remove appendix if it's empty
if ($('.d-appendix').children().length === 0)
$('.d-appendix').remove();
// prepend separator above appendix
$('.d-appendix').before($('<hr class="section-separator" style="clear: both"/>'));
// trim code
$('pre>code').each(function(i, val) {
$(this).html($.trim($(this).html()));
});
// move posts-container right before article
$('.posts-container').insertBefore($('.d-article'));
$('body').addClass('downlevel');
on_load_complete();
}
function init_common() {
// jquery plugin to change element types
(function($) {
$.fn.changeElementType = function(newType) {
var attrs = {};
$.each(this[0].attributes, function(idx, attr) {
attrs[attr.nodeName] = attr.nodeValue;
});
this.replaceWith(function() {
return $("<" + newType + "/>", attrs).append($(this).contents());
});
};
})(jQuery);
// prevent underline for linked images
$('a > img').parent().css({'border-bottom' : 'none'});
// mark non-body figures created by knitr chunks as 100% width
$('.layout-chunk').each(function(i, val) {
var figures = $(this).find('img, .html-widget');
if ($(this).attr('data-layout') !== "l-body") {
figures.css('width', '100%');
} else {
figures.css('max-width', '100%');
figures.filter("[width]").each(function(i, val) {
var fig = $(this);
fig.css('width', fig.attr('width') + 'px');
});
}
});
// auto-append index.html to post-preview links in file: protocol
// and in rstudio ide preview
$('.post-preview').each(function(i, val) {
if (window.location.protocol === "file:")
$(this).attr('href', $(this).attr('href') + "index.html");
});
// get rid of index.html references in header
if (window.location.protocol !== "file:") {
$('.radix-site-header a[href]').each(function(i,val) {
$(this).attr('href', $(this).attr('href').replace("index.html", "./"));
});
}
// add class to pandoc style tables
$('tr.header').parent('thead').parent('table').addClass('pandoc-table');
$('.kable-table').children('table').addClass('pandoc-table');
// add figcaption style to table captions
$('caption').parent('table').addClass("figcaption");
// initialize posts list
if (window.init_posts_list)
window.init_posts_list();
// implmement disqus comment link
$('.disqus-comment-count').click(function() {
window.headroom_prevent_pin = true;
$('#disqus_thread').toggleClass('hidden');
if (!$('#disqus_thread').hasClass('hidden')) {
var offset = $(this).offset();
$(window).resize();
$('html, body').animate({
scrollTop: offset.top - 35
});
}
});
}
document.addEventListener('DOMContentLoaded', function() {
if (is_downlevel_browser())
init_downlevel();
else
window.addEventListener('WebComponentsReady', init_distill);
});
</script>
<!--/radix_placeholder_distill-->
<script src="data:application/javascript;base64,Ly8gUGFuZG9jIDIuOSBhZGRzIGF0dHJpYnV0ZXMgb24gYm90aCBoZWFkZXIgYW5kIGRpdi4gV2UgcmVtb3ZlIHRoZSBmb3JtZXIgKHRvCi8vIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgYmVoYXZpb3Igb2YgUGFuZG9jIDwgMi44KS4KZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKGUpIHsKICB2YXIgaHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJkaXYuc2VjdGlvbltjbGFzcyo9J2xldmVsJ10gPiA6Zmlyc3QtY2hpbGQiKTsKICB2YXIgaSwgaCwgYTsKICBmb3IgKGkgPSAwOyBpIDwgaHMubGVuZ3RoOyBpKyspIHsKICAgIGggPSBoc1tpXTsKICAgIGlmICghL15oWzEtNl0kL2kudGVzdChoLnRhZ05hbWUpKSBjb250aW51ZTsgIC8vIGl0IHNob3VsZCBiZSBhIGhlYWRlciBoMS1oNgogICAgYSA9IGguYXR0cmlidXRlczsKICAgIHdoaWxlIChhLmxlbmd0aCA+IDApIGgucmVtb3ZlQXR0cmlidXRlKGFbMF0ubmFtZSk7CiAgfQp9KTsK"></script>
<script src="data:application/javascript;base64,LyohIGpRdWVyeSB2MS4xMS4zIHwgKGMpIDIwMDUsIDIwMTUgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KIWZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YS5kb2N1bWVudD9iKGEsITApOmZ1bmN0aW9uKGEpe2lmKCFhLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiBiKGEpfTpiKGEpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQ9Yy5zbGljZSxlPWMuY29uY2F0LGY9Yy5wdXNoLGc9Yy5pbmRleE9mLGg9e30saT1oLnRvU3RyaW5nLGo9aC5oYXNPd25Qcm9wZXJ0eSxrPXt9LGw9IjEuMTEuMyIsbT1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgbS5mbi5pbml0KGEsYil9LG49L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLG89L14tbXMtLyxwPS8tKFtcZGEtel0pL2dpLHE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfTttLmZuPW0ucHJvdG90eXBlPXtqcXVlcnk6bCxjb25zdHJ1Y3RvcjptLHNlbGVjdG9yOiIiLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gZC5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/MD5hP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXTpkLmNhbGwodGhpcyl9LHB1c2hTdGFjazpmdW5jdGlvbihhKXt2YXIgYj1tLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxhKTtyZXR1cm4gYi5wcmV2T2JqZWN0PXRoaXMsYi5jb250ZXh0PXRoaXMuY29udGV4dCxifSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uZWFjaCh0aGlzLGEsYil9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGVxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubGVuZ3RoLGM9K2ErKDA+YT9iOjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhjPj0wJiZiPmM/W3RoaXNbY11dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpmLHNvcnQ6Yy5zb3J0LHNwbGljZTpjLnNwbGljZX0sbS5leHRlbmQ9bS5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZz1hcmd1bWVudHNbMF18fHt9LGg9MSxpPWFyZ3VtZW50cy5sZW5ndGgsaj0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgZyYmKGo9ZyxnPWFyZ3VtZW50c1toXXx8e30saCsrKSwib2JqZWN0Ij09dHlwZW9mIGd8fG0uaXNGdW5jdGlvbihnKXx8KGc9e30pLGg9PT1pJiYoZz10aGlzLGgtLSk7aT5oO2grKylpZihudWxsIT0oZT1hcmd1bWVudHNbaF0pKWZvcihkIGluIGUpYT1nW2RdLGM9ZVtkXSxnIT09YyYmKGomJmMmJihtLmlzUGxhaW5PYmplY3QoYyl8fChiPW0uaXNBcnJheShjKSkpPyhiPyhiPSExLGY9YSYmbS5pc0FycmF5KGEpP2E6W10pOmY9YSYmbS5pc1BsYWluT2JqZWN0KGEpP2E6e30sZ1tkXT1tLmV4dGVuZChqLGYsYykpOnZvaWQgMCE9PWMmJihnW2RdPWMpKTtyZXR1cm4gZ30sbS5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKGwrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PW0udHlwZShhKX0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4iYXJyYXkiPT09bS50eXBlKGEpfSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXtyZXR1cm4hbS5pc0FycmF5KGEpJiZhLXBhcnNlRmxvYXQoYSkrMT49MH0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBiO2lmKCFhfHwib2JqZWN0IiE9PW0udHlwZShhKXx8YS5ub2RlVHlwZXx8bS5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIWouY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhai5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2goYyl7cmV0dXJuITF9aWYoay5vd25MYXN0KWZvcihiIGluIGEpcmV0dXJuIGouY2FsbChhLGIpO2ZvcihiIGluIGEpO3JldHVybiB2b2lkIDA9PT1ifHxqLmNhbGwoYSxiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aFtpLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZtLnRyaW0oYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UobywibXMtIikucmVwbGFjZShwLHEpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU9MCxmPWEubGVuZ3RoLGc9cihhKTtpZihjKXtpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmFwcGx5KGFbZV0sYyksZD09PSExKWJyZWFrfWVsc2UgZm9yKGUgaW4gYSlpZihkPWIuYXBwbHkoYVtlXSxjKSxkPT09ITEpYnJlYWt9ZWxzZSBpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVha31lbHNlIGZvcihlIGluIGEpaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjooYSsiIikucmVwbGFjZShuLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihyKE9iamVjdChhKSk/bS5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zi5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGIpe2lmKGcpcmV0dXJuIGcuY2FsbChiLGEsYyk7Zm9yKGQ9Yi5sZW5ndGgsYz1jPzA+Yz9NYXRoLm1heCgwLGQrYyk6YzowO2Q+YztjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz0rYi5sZW5ndGgsZD0wLGU9YS5sZW5ndGg7d2hpbGUoYz5kKWFbZSsrXT1iW2QrK107aWYoYyE9PWMpd2hpbGUodm9pZCAwIT09YltkXSlhW2UrK109YltkKytdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxmPTAsZz1hLmxlbmd0aCxoPXIoYSksaT1bXTtpZihoKWZvcig7Zz5mO2YrKylkPWIoYVtmXSxmLGMpLG51bGwhPWQmJmkucHVzaChkKTtlbHNlIGZvcihmIGluIGEpZD1iKGFbZl0sZixjKSxudWxsIT1kJiZpLnB1c2goZCk7cmV0dXJuIGUuYXBwbHkoW10saSl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGUsZjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGImJihmPWFbYl0sYj1hLGE9ZiksbS5pc0Z1bmN0aW9uKGEpPyhjPWQuY2FsbChhcmd1bWVudHMsMiksZT1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsYy5jb25jYXQoZC5jYWxsKGFyZ3VtZW50cykpKX0sZS5ndWlkPWEuZ3VpZD1hLmd1aWR8fG0uZ3VpZCsrLGUpOnZvaWQgMH0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSxzdXBwb3J0Omt9KSxtLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtoWyJbb2JqZWN0ICIrYisiXSJdPWIudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIHIoYSl7dmFyIGI9Imxlbmd0aCJpbiBhJiZhLmxlbmd0aCxjPW0udHlwZShhKTtyZXR1cm4iZnVuY3Rpb24iPT09Y3x8bS5pc1dpbmRvdyhhKT8hMToxPT09YS5ub2RlVHlwZSYmYj8hMDoiYXJyYXkiPT09Y3x8MD09PWJ8fCJudW1iZXIiPT10eXBlb2YgYiYmYj4wJiZiLTEgaW4gYX12YXIgcz1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1PSJzaXp6bGUiKzEqbmV3IERhdGUsdj1hLmRvY3VtZW50LHc9MCx4PTAseT1oYSgpLHo9aGEoKSxBPWhhKCksQj1mdW5jdGlvbihhLGIpe3JldHVybiBhPT09YiYmKGw9ITApLDB9LEM9MTw8MzEsRD17fS5oYXNPd25Qcm9wZXJ0eSxFPVtdLEY9RS5wb3AsRz1FLnB1c2gsSD1FLnB1c2gsST1FLnNsaWNlLEo9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2Q+YztjKyspaWYoYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LEs9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixMPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixNPSIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0pKyIsTj1NLnJlcGxhY2UoInciLCJ3IyIpLE89IlxcWyIrTCsiKigiK00rIikoPzoiK0wrIiooWypeJHwhfl0/PSkiK0wrIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitOKyIpKXwpIitMKyIqXFxdIixQPSI6KCIrTSsiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrTysiKSopfC4qKVxcKXwpIixRPW5ldyBSZWdFeHAoTCsiKyIsImciKSxSPW5ldyBSZWdFeHAoIl4iK0wrIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTCsiKyQiLCJnIiksUz1uZXcgUmVnRXhwKCJeIitMKyIqLCIrTCsiKiIpLFQ9bmV3IFJlZ0V4cCgiXiIrTCsiKihbPit+XXwiK0wrIikiK0wrIioiKSxVPW5ldyBSZWdFeHAoIj0iK0wrIiooW15cXF0nXCJdKj8pIitMKyIqXFxdIiwiZyIpLFY9bmV3IFJlZ0V4cChQKSxXPW5ldyBSZWdFeHAoIl4iK04rIiQiKSxYPXtJRDpuZXcgUmVnRXhwKCJeIygiK00rIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrTSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrTS5yZXBsYWNlKCJ3IiwidyoiKSsiKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrTyksUFNFVURPOm5ldyBSZWdFeHAoIl4iK1ApLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTCsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTCsiKig/OihbKy1dfCkiK0wrIiooXFxkKyl8KSkiK0wrIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK0srIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitMKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK0wrIiooKD86LVxcZCk/XFxkKikiK0wrIipcXCl8KSg/PVteLV18JCkiLCJpIil9LFk9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxaPS9eaFxkJC9pLCQ9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLF89L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxhYT0vWyt+XS8sYmE9Lyd8XFwvZyxjYT1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK0wrIj98KCIrTCsiKXwuKSIsImlnIiksZGE9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIweCIrYi02NTUzNjtyZXR1cm4gZCE9PWR8fGM/YjowPmQ/U3RyaW5nLmZyb21DaGFyQ29kZShkKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGQ+PjEwfDU1Mjk2LDEwMjMmZHw1NjMyMCl9LGVhPWZ1bmN0aW9uKCl7bSgpfTt0cnl7SC5hcHBseShFPUkuY2FsbCh2LmNoaWxkTm9kZXMpLHYuY2hpbGROb2RlcyksRVt2LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChmYSl7SD17YXBwbHk6RS5sZW5ndGg/ZnVuY3Rpb24oYSxiKXtHLmFwcGx5KGEsSS5jYWxsKGIpKX06ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxkPTA7d2hpbGUoYVtjKytdPWJbZCsrXSk7YS5sZW5ndGg9Yy0xfX19ZnVuY3Rpb24gZ2EoYSxiLGQsZSl7dmFyIGYsaCxqLGssbCxvLHIscyx3LHg7aWYoKGI/Yi5vd25lckRvY3VtZW50fHxiOnYpIT09biYmbShiKSxiPWJ8fG4sZD1kfHxbXSxrPWIubm9kZVR5cGUsInN0cmluZyIhPXR5cGVvZiBhfHwhYXx8MSE9PWsmJjkhPT1rJiYxMSE9PWspcmV0dXJuIGQ7aWYoIWUmJnApe2lmKDExIT09ayYmKGY9Xy5leGVjKGEpKSlpZihqPWZbMV0pe2lmKDk9PT1rKXtpZihoPWIuZ2V0RWxlbWVudEJ5SWQoaiksIWh8fCFoLnBhcmVudE5vZGUpcmV0dXJuIGQ7aWYoaC5pZD09PWopcmV0dXJuIGQucHVzaChoKSxkfWVsc2UgaWYoYi5vd25lckRvY3VtZW50JiYoaD1iLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaikpJiZ0KGIsaCkmJmguaWQ9PT1qKXJldHVybiBkLnB1c2goaCksZH1lbHNle2lmKGZbMl0pcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpKSxkO2lmKChqPWZbM10pJiZjLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaikpLGR9aWYoYy5xc2EmJighcXx8IXEudGVzdChhKSkpe2lmKHM9cj11LHc9Yix4PTEhPT1rJiZhLDE9PT1rJiYib2JqZWN0IiE9PWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7bz1nKGEpLChyPWIuZ2V0QXR0cmlidXRlKCJpZCIpKT9zPXIucmVwbGFjZShiYSwiXFwkJiIpOmIuc2V0QXR0cmlidXRlKCJpZCIscykscz0iW2lkPSciK3MrIiddICIsbD1vLmxlbmd0aDt3aGlsZShsLS0pb1tsXT1zK3JhKG9bbF0pO3c9YWEudGVzdChhKSYmcGEoYi5wYXJlbnROb2RlKXx8Yix4PW8uam9pbigiLCIpfWlmKHgpdHJ5e3JldHVybiBILmFwcGx5KGQsdy5xdWVyeVNlbGVjdG9yQWxsKHgpKSxkfWNhdGNoKHkpe31maW5hbGx5e3J8fGIucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGkoYS5yZXBsYWNlKFIsIiQxIiksYixkLGUpfWZ1bmN0aW9uIGhhKCl7dmFyIGE9W107ZnVuY3Rpb24gYihjLGUpe3JldHVybiBhLnB1c2goYysiICIpPmQuY2FjaGVMZW5ndGgmJmRlbGV0ZSBiW2Euc2hpZnQoKV0sYltjKyIgIl09ZX1yZXR1cm4gYn1mdW5jdGlvbiBpYShhKXtyZXR1cm4gYVt1XT0hMCxhfWZ1bmN0aW9uIGphKGEpe3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiEhYShiKX1jYXRjaChjKXtyZXR1cm4hMX1maW5hbGx5e2IucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbH19ZnVuY3Rpb24ga2EoYSxiKXt2YXIgYz1hLnNwbGl0KCJ8IiksZT1hLmxlbmd0aDt3aGlsZShlLS0pZC5hdHRySGFuZGxlW2NbZV1dPWJ9ZnVuY3Rpb24gbGEoYSxiKXt2YXIgYz1iJiZhLGQ9YyYmMT09PWEubm9kZVR5cGUmJjE9PT1iLm5vZGVUeXBlJiYofmIuc291cmNlSW5kZXh8fEMpLSh+YS5zb3VyY2VJbmRleHx8Qyk7aWYoZClyZXR1cm4gZDtpZihjKXdoaWxlKGM9Yy5uZXh0U2libGluZylpZihjPT09YilyZXR1cm4tMTtyZXR1cm4gYT8xOi0xfWZ1bmN0aW9uIG1hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWMmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG5hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1jfHwiYnV0dG9uIj09PWMpJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBvYShhKXtyZXR1cm4gaWEoZnVuY3Rpb24oYil7cmV0dXJuIGI9K2IsaWEoZnVuY3Rpb24oYyxkKXt2YXIgZSxmPWEoW10sYy5sZW5ndGgsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pY1tlPWZbZ11dJiYoY1tlXT0hKGRbZV09Y1tlXSkpfSl9KX1mdW5jdGlvbiBwYShhKXtyZXR1cm4gYSYmInVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lJiZhfWM9Z2Euc3VwcG9ydD17fSxmPWdhLmlzWE1MPWZ1bmN0aW9uKGEpe3ZhciBiPWEmJihhLm93bmVyRG9jdW1lbnR8fGEpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj8iSFRNTCIhPT1iLm5vZGVOYW1lOiExfSxtPWdhLnNldERvY3VtZW50PWZ1bmN0aW9uKGEpe3ZhciBiLGUsZz1hP2Eub3duZXJEb2N1bWVudHx8YTp2O3JldHVybiBnIT09biYmOT09PWcubm9kZVR5cGUmJmcuZG9jdW1lbnRFbGVtZW50PyhuPWcsbz1nLmRvY3VtZW50RWxlbWVudCxlPWcuZGVmYXVsdFZpZXcsZSYmZSE9PWUudG9wJiYoZS5hZGRFdmVudExpc3RlbmVyP2UuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixlYSwhMSk6ZS5hdHRhY2hFdmVudCYmZS5hdHRhY2hFdmVudCgib251bmxvYWQiLGVhKSkscD0hZihnKSxjLmF0dHJpYnV0ZXM9amEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2xhc3NOYW1lPSJpIiwhYS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksYy5nZXRFbGVtZW50c0J5VGFnTmFtZT1qYShmdW5jdGlvbihhKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChnLmNyZWF0ZUNvbW1lbnQoIiIpKSwhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLGMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT0kLnRlc3QoZy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxjLmdldEJ5SWQ9amEoZnVuY3Rpb24oYSl7cmV0dXJuIG8uYXBwZW5kQ2hpbGQoYSkuaWQ9dSwhZy5nZXRFbGVtZW50c0J5TmFtZXx8IWcuZ2V0RWxlbWVudHNCeU5hbWUodSkubGVuZ3RofSksYy5nZXRCeUlkPyhkLmZpbmQuSUQ9ZnVuY3Rpb24oYSxiKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQmJnApe3ZhciBjPWIuZ2V0RWxlbWVudEJ5SWQoYSk7cmV0dXJuIGMmJmMucGFyZW50Tm9kZT9bY106W119fSxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2EsZGEpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifX0pOihkZWxldGUgZC5maW5kLklELGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShjYSxkYSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjPSJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGVOb2RlJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGMmJmMudmFsdWU9PT1ifX0pLGQuZmluZC5UQUc9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihhLGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOmMucXNhP2IucXVlcnlTZWxlY3RvckFsbChhKTp2b2lkIDB9OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPTAsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKCIqIj09PWEpe3doaWxlKGM9ZltlKytdKTE9PT1jLm5vZGVUeXBlJiZkLnB1c2goYyk7cmV0dXJuIGR9cmV0dXJuIGZ9LGQuZmluZC5DTEFTUz1jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGEsYil7cmV0dXJuIHA/Yi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpOnZvaWQgMH0scj1bXSxxPVtdLChjLnFzYT0kLnRlc3QoZy5xdWVyeVNlbGVjdG9yQWxsKSkmJihqYShmdW5jdGlvbihhKXtvLmFwcGVuZENoaWxkKGEpLmlubmVySFRNTD0iPGEgaWQ9JyIrdSsiJz48L2E+PHNlbGVjdCBpZD0nIit1KyItXGZdJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsYS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmcS5wdXNoKCJbKl4kXT0iK0wrIiooPzonJ3xcIlwiKSIpLGEucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8cS5wdXNoKCJcXFsiK0wrIiooPzp2YWx1ZXwiK0srIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49Iit1KyItXSIpLmxlbmd0aHx8cS5wdXNoKCJ+PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHEucHVzaCgiOmNoZWNrZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIit1KyIrKiIpLmxlbmd0aHx8cS5wdXNoKCIuIy4rWyt+XSIpfSksamEoZnVuY3Rpb24oYSl7dmFyIGI9Zy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Iuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksYS5hcHBlbmRDaGlsZChiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmcS5wdXNoKCJuYW1lIitMKyIqWypeJHwhfl0/PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fHEucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSxxLnB1c2goIiwuKjoiKX0pKSwoYy5tYXRjaGVzU2VsZWN0b3I9JC50ZXN0KHM9by5tYXRjaGVzfHxvLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8by5tb3pNYXRjaGVzU2VsZWN0b3J8fG8ub01hdGNoZXNTZWxlY3Rvcnx8by5tc01hdGNoZXNTZWxlY3RvcikpJiZqYShmdW5jdGlvbihhKXtjLmRpc2Nvbm5lY3RlZE1hdGNoPXMuY2FsbChhLCJkaXYiKSxzLmNhbGwoYSwiW3MhPScnXTp4Iiksci5wdXNoKCIhPSIsUCl9KSxxPXEubGVuZ3RoJiZuZXcgUmVnRXhwKHEuam9pbigifCIpKSxyPXIubGVuZ3RoJiZuZXcgUmVnRXhwKHIuam9pbigifCIpKSxiPSQudGVzdChvLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSx0PWJ8fCQudGVzdChvLmNvbnRhaW5zKT9mdW5jdGlvbihhLGIpe3ZhciBjPTk9PT1hLm5vZGVUeXBlP2EuZG9jdW1lbnRFbGVtZW50OmEsZD1iJiZiLnBhcmVudE5vZGU7cmV0dXJuIGE9PT1kfHwhKCFkfHwxIT09ZC5ub2RlVHlwZXx8IShjLmNvbnRhaW5zP2MuY29udGFpbnMoZCk6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkKSkpfTpmdW5jdGlvbihhLGIpe2lmKGIpd2hpbGUoYj1iLnBhcmVudE5vZGUpaWYoYj09PWEpcmV0dXJuITA7cmV0dXJuITF9LEI9Yj9mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGQ9IWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247cmV0dXJuIGQ/ZDooZD0oYS5vd25lckRvY3VtZW50fHxhKT09PShiLm93bmVyRG9jdW1lbnR8fGIpP2EuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYik6MSwxJmR8fCFjLnNvcnREZXRhY2hlZCYmYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhKT09PWQ/YT09PWd8fGEub3duZXJEb2N1bWVudD09PXYmJnQodixhKT8tMTpiPT09Z3x8Yi5vd25lckRvY3VtZW50PT09diYmdCh2LGIpPzE6az9KKGssYSktSihrLGIpOjA6NCZkPy0xOjEpfTpmdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGMsZD0wLGU9YS5wYXJlbnROb2RlLGY9Yi5wYXJlbnROb2RlLGg9W2FdLGk9W2JdO2lmKCFlfHwhZilyZXR1cm4gYT09PWc/LTE6Yj09PWc/MTplPy0xOmY/MTprP0ooayxhKS1KKGssYik6MDtpZihlPT09ZilyZXR1cm4gbGEoYSxiKTtjPWE7d2hpbGUoYz1jLnBhcmVudE5vZGUpaC51bnNoaWZ0KGMpO2M9Yjt3aGlsZShjPWMucGFyZW50Tm9kZSlpLnVuc2hpZnQoYyk7d2hpbGUoaFtkXT09PWlbZF0pZCsrO3JldHVybiBkP2xhKGhbZF0saVtkXSk6aFtkXT09PXY/LTE6aVtkXT09PXY/MTowfSxnKTpufSxnYS5tYXRjaGVzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdhKGEsbnVsbCxudWxsLGIpfSxnYS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtpZigoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSksYj1iLnJlcGxhY2UoVSwiPSckMSddIiksISghYy5tYXRjaGVzU2VsZWN0b3J8fCFwfHxyJiZyLnRlc3QoYil8fHEmJnEudGVzdChiKSkpdHJ5e3ZhciBkPXMuY2FsbChhLGIpO2lmKGR8fGMuZGlzY29ubmVjdGVkTWF0Y2h8fGEuZG9jdW1lbnQmJjExIT09YS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gZH1jYXRjaChlKXt9cmV0dXJuIGdhKGIsbixudWxsLFthXSkubGVuZ3RoPjB9LGdhLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLHQoYSxiKX0sZ2EuYXR0cj1mdW5jdGlvbihhLGIpeyhhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKTt2YXIgZT1kLmF0dHJIYW5kbGVbYi50b0xvd2VyQ2FzZSgpXSxmPWUmJkQuY2FsbChkLmF0dHJIYW5kbGUsYi50b0xvd2VyQ2FzZSgpKT9lKGEsYiwhcCk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1mP2Y6Yy5hdHRyaWJ1dGVzfHwhcD9hLmdldEF0dHJpYnV0ZShiKTooZj1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZmLnNwZWNpZmllZD9mLnZhbHVlOm51bGx9LGdhLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIithKX0sZ2EudW5pcXVlU29ydD1mdW5jdGlvbihhKXt2YXIgYixkPVtdLGU9MCxmPTA7aWYobD0hYy5kZXRlY3REdXBsaWNhdGVzLGs9IWMuc29ydFN0YWJsZSYmYS5zbGljZSgwKSxhLnNvcnQoQiksbCl7d2hpbGUoYj1hW2YrK10pYj09PWFbZl0mJihlPWQucHVzaChmKSk7d2hpbGUoZS0tKWEuc3BsaWNlKGRbZV0sMSl9cmV0dXJuIGs9bnVsbCxhfSxlPWdhLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz0iIixkPTAsZj1hLm5vZGVUeXBlO2lmKGYpe2lmKDE9PT1mfHw5PT09Znx8MTE9PT1mKXtpZigic3RyaW5nIj09dHlwZW9mIGEudGV4dENvbnRlbnQpcmV0dXJuIGEudGV4dENvbnRlbnQ7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWMrPWUoYSl9ZWxzZSBpZigzPT09Znx8ND09PWYpcmV0dXJuIGEubm9kZVZhbHVlfWVsc2Ugd2hpbGUoYj1hW2QrK10pYys9ZShiKTtyZXR1cm4gY30sZD1nYS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzppYSxtYXRjaDpYLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnJlcGxhY2UoY2EsZGEpLGFbM109KGFbM118fGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGNhLGRhKSwifj0iPT09YVsyXSYmKGFbM109IiAiK2FbM10rIiAiKSxhLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdPWFbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWFbMV0uc2xpY2UoMCwzKT8oYVszXXx8Z2EuZXJyb3IoYVswXSksYVs0XT0rKGFbNF0/YVs1XSsoYVs2XXx8MSk6MiooImV2ZW4iPT09YVszXXx8Im9kZCI9PT1hWzNdKSksYVs1XT0rKGFbN10rYVs4XXx8Im9kZCI9PT1hWzNdKSk6YVszXSYmZ2EuZXJyb3IoYVswXSksYX0sUFNFVURPOmZ1bmN0aW9uKGEpe3ZhciBiLGM9IWFbNl0mJmFbMl07cmV0dXJuIFguQ0hJTEQudGVzdChhWzBdKT9udWxsOihhWzNdP2FbMl09YVs0XXx8YVs1XXx8IiI6YyYmVi50ZXN0KGMpJiYoYj1nKGMsITApKSYmKGI9Yy5pbmRleE9mKCIpIixjLmxlbmd0aC1iKS1jLmxlbmd0aCkmJihhWzBdPWFbMF0uc2xpY2UoMCxiKSxhWzJdPWMuc2xpY2UoMCxiKSksYS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShjYSxkYSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1hP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifX0sQ0xBU1M6ZnVuY3Rpb24oYSl7dmFyIGI9eVthKyIgIl07cmV0dXJuIGJ8fChiPW5ldyBSZWdFeHAoIihefCIrTCsiKSIrYSsiKCIrTCsifCQpIikpJiZ5KGEsZnVuY3Rpb24oYSl7cmV0dXJuIGIudGVzdCgic3RyaW5nIj09dHlwZW9mIGEuY2xhc3NOYW1lJiZhLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGU9Z2EuYXR0cihkLGEpO3JldHVybiBudWxsPT1lPyIhPSI9PT1iOmI/KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UucmVwbGFjZShRLCIgIikrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iP2U9PT1jfHxlLnNsaWNlKDAsYy5sZW5ndGgrMSk9PT1jKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHM9IWkmJiFoO2lmKHEpe2lmKGYpe3doaWxlKHApe2w9Yjt3aGlsZShsPWxbcF0paWYoaD9sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1sLm5vZGVUeXBlKXJldHVybiExO289cD0ib25seSI9PT1hJiYhbyYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihvPVtnP3EuZmlyc3RDaGlsZDpxLmxhc3RDaGlsZF0sZyYmcyl7az1xW3VdfHwocVt1XT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLG09alswXT09PXcmJmpbMl0sbD1uJiZxLmNoaWxkTm9kZXNbbl07d2hpbGUobD0rK24mJmwmJmxbcF18fChtPW49MCl8fG8ucG9wKCkpaWYoMT09PWwubm9kZVR5cGUmJisrbSYmbD09PWIpe2tbYV09W3csbixtXTticmVha319ZWxzZSBpZihzJiYoaj0oYlt1XXx8KGJbdV09e30pKVthXSkmJmpbMF09PT13KW09alsxXTtlbHNlIHdoaWxlKGw9KytuJiZsJiZsW3BdfHwobT1uPTApfHxvLnBvcCgpKWlmKChoP2wubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PWwubm9kZVR5cGUpJiYrK20mJihzJiYoKGxbdV18fChsW3VdPXt9KSlbYV09W3csbV0pLGw9PT1iKSlicmVhaztyZXR1cm4gbS09ZSxtPT09ZHx8bSVkPT09MCYmbS9kPj0wfX19LFBTRVVETzpmdW5jdGlvbihhLGIpe3ZhciBjLGU9ZC5wc2V1ZG9zW2FdfHxkLnNldEZpbHRlcnNbYS50b0xvd2VyQ2FzZSgpXXx8Z2EuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIithKTtyZXR1cm4gZVt1XT9lKGIpOmUubGVuZ3RoPjE/KGM9W2EsYSwiIixiXSxkLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoYS50b0xvd2VyQ2FzZSgpKT9pYShmdW5jdGlvbihhLGMpe3ZhciBkLGY9ZShhLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWQ9SihhLGZbZ10pLGFbZF09IShjW2RdPWZbZ10pfSk6ZnVuY3Rpb24oYSl7cmV0dXJuIGUoYSwwLGMpfSk6ZX19LHBzZXVkb3M6e25vdDppYShmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGQ9aChhLnJlcGxhY2UoUiwiJDEiKSk7cmV0dXJuIGRbdV0/aWEoZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGYsZz1kKGEsbnVsbCxlLFtdKSxoPWEubGVuZ3RoO3doaWxlKGgtLSkoZj1nW2hdKSYmKGFbaF09IShiW2hdPWYpKX0pOmZ1bmN0aW9uKGEsZSxmKXtyZXR1cm4gYlswXT1hLGQoYixudWxsLGYsYyksYlswXT1udWxsLCFjLnBvcCgpfX0pLGhhczppYShmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGdhKGEsYikubGVuZ3RoPjB9fSksY29udGFpbnM6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIGE9YS5yZXBsYWNlKGNhLGRhKSxmdW5jdGlvbihiKXtyZXR1cm4oYi50ZXh0Q29udGVudHx8Yi5pbm5lclRleHR8fGUoYikpLmluZGV4T2YoYSk+LTF9fSksbGFuZzppYShmdW5jdGlvbihhKXtyZXR1cm4gVy50ZXN0KGF8fCIiKXx8Z2EuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrYSksYT1hLnJlcGxhY2UoY2EsZGEpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oYil7dmFyIGM7ZG8gaWYoYz1wP2IubGFuZzpiLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8Yi5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4gYz1jLnRvTG93ZXJDYXNlKCksYz09PWF8fDA9PT1jLmluZGV4T2YoYSsiLSIpO3doaWxlKChiPWIucGFyZW50Tm9kZSkmJjE9PT1iLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oYil7dmFyIGM9YS5sb2NhdGlvbiYmYS5sb2NhdGlvbi5oYXNoO3JldHVybiBjJiZjLnNsaWNlKDEpPT09Yi5pZH0scm9vdDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW99LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09bi5hY3RpdmVFbGVtZW50JiYoIW4uaGFzRm9jdXN8fG4uaGFzRm9jdXMoKSkmJiEhKGEudHlwZXx8YS5ocmVmfHx+YS50YWJJbmRleCl9LGVuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMX0sZGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMH0sY2hlY2tlZDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiEhYS5jaGVja2VkfHwib3B0aW9uIj09PWImJiEhYS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsYS5zZWxlY3RlZD09PSEwfSxlbXB0eTpmdW5jdGlvbihhKXtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpaWYoYS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIWQucHNldWRvcy5lbXB0eShhKX0saGVhZGVyOmZ1bmN0aW9uKGEpe3JldHVybiBaLnRlc3QoYS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybiBZLnRlc3QoYS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiJidXR0b24iPT09YS50eXBlfHwiYnV0dG9uIj09PWJ9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuImlucHV0Ij09PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09YS50eXBlJiYobnVsbD09KGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PWIudG9Mb3dlckNhc2UoKSl9LGZpcnN0Om9hKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpvYShmdW5jdGlvbihhLGIpe3JldHVybltiLTFdfSksZXE6b2EoZnVuY3Rpb24oYSxiLGMpe3JldHVyblswPmM/YytiOmNdfSksZXZlbjpvYShmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLG9kZDpvYShmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0xO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLGx0Om9hKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOy0tZD49MDspYS5wdXNoKGQpO3JldHVybiBhfSksZ3Q6b2EoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD0wPmM/YytiOmM7KytkPGI7KWEucHVzaChkKTtyZXR1cm4gYX0pfX0sZC5wc2V1ZG9zLm50aD1kLnBzZXVkb3MuZXE7Zm9yKGIgaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pZC5wc2V1ZG9zW2JdPW1hKGIpO2ZvcihiIGlue3N1Ym1pdDohMCxyZXNldDohMH0pZC5wc2V1ZG9zW2JdPW5hKGIpO2Z1bmN0aW9uIHFhKCl7fXFhLnByb3RvdHlwZT1kLmZpbHRlcnM9ZC5wc2V1ZG9zLGQuc2V0RmlsdGVycz1uZXcgcWEsZz1nYS50b2tlbml6ZT1mdW5jdGlvbihhLGIpe3ZhciBjLGUsZixnLGgsaSxqLGs9elthKyIgIl07aWYoaylyZXR1cm4gYj8wOmsuc2xpY2UoMCk7aD1hLGk9W10saj1kLnByZUZpbHRlcjt3aGlsZShoKXsoIWN8fChlPVMuZXhlYyhoKSkpJiYoZSYmKGg9aC5zbGljZShlWzBdLmxlbmd0aCl8fGgpLGkucHVzaChmPVtdKSksYz0hMSwoZT1ULmV4ZWMoaCkpJiYoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZVswXS5yZXBsYWNlKFIsIiAiKX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2ZvcihnIGluIGQuZmlsdGVyKSEoZT1YW2ddLmV4ZWMoaCkpfHxqW2ddJiYhKGU9altnXShlKSl8fChjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTpnLG1hdGNoZXM6ZX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2lmKCFjKWJyZWFrfXJldHVybiBiP2gubGVuZ3RoOmg/Z2EuZXJyb3IoYSk6eihhLGkpLnNsaWNlKDApfTtmdW5jdGlvbiByYShhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7Yz5iO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHNhKGEsYixjKXt2YXIgZD1iLmRpcixlPWMmJiJwYXJlbnROb2RlIj09PWQsZj14Kys7cmV0dXJuIGIuZmlyc3Q/ZnVuY3Rpb24oYixjLGYpe3doaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSlyZXR1cm4gYShiLGMsZil9OmZ1bmN0aW9uKGIsYyxnKXt2YXIgaCxpLGo9W3csZl07aWYoZyl7d2hpbGUoYj1iW2RdKWlmKCgxPT09Yi5ub2RlVHlwZXx8ZSkmJmEoYixjLGcpKXJldHVybiEwfWVsc2Ugd2hpbGUoYj1iW2RdKWlmKDE9PT1iLm5vZGVUeXBlfHxlKXtpZihpPWJbdV18fChiW3VdPXt9KSwoaD1pW2RdKSYmaFswXT09PXcmJmhbMV09PT1mKXJldHVybiBqWzJdPWhbMl07aWYoaVtkXT1qLGpbMl09YShiLGMsZykpcmV0dXJuITB9fX1mdW5jdGlvbiB0YShhKXtyZXR1cm4gYS5sZW5ndGg+MT9mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWlmKCFhW2VdKGIsYyxkKSlyZXR1cm4hMTtyZXR1cm4hMH06YVswXX1mdW5jdGlvbiB1YShhLGIsYyl7Zm9yKHZhciBkPTAsZT1iLmxlbmd0aDtlPmQ7ZCsrKWdhKGEsYltkXSxjKTtyZXR1cm4gY31mdW5jdGlvbiB2YShhLGIsYyxkLGUpe2Zvcih2YXIgZixnPVtdLGg9MCxpPWEubGVuZ3RoLGo9bnVsbCE9YjtpPmg7aCsrKShmPWFbaF0pJiYoIWN8fGMoZixkLGUpKSYmKGcucHVzaChmKSxqJiZiLnB1c2goaCkpO3JldHVybiBnfWZ1bmN0aW9uIHdhKGEsYixjLGQsZSxmKXtyZXR1cm4gZCYmIWRbdV0mJihkPXdhKGQpKSxlJiYhZVt1XSYmKGU9d2EoZSxmKSksaWEoZnVuY3Rpb24oZixnLGgsaSl7dmFyIGosayxsLG09W10sbj1bXSxvPWcubGVuZ3RoLHA9Znx8dWEoYnx8IioiLGgubm9kZVR5cGU/W2hdOmgsW10pLHE9IWF8fCFmJiZiP3A6dmEocCxtLGEsaCxpKSxyPWM/ZXx8KGY/YTpvfHxkKT9bXTpnOnE7aWYoYyYmYyhxLHIsaCxpKSxkKXtqPXZhKHIsbiksZChqLFtdLGgsaSksaz1qLmxlbmd0aDt3aGlsZShrLS0pKGw9altrXSkmJihyW25ba11dPSEocVtuW2tdXT1sKSl9aWYoZil7aWYoZXx8YSl7aWYoZSl7aj1bXSxrPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmai5wdXNoKHFba109bCk7ZShudWxsLHI9W10saixpKX1rPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmKGo9ZT9KKGYsbCk6bVtrXSk+LTEmJihmW2pdPSEoZ1tqXT1sKSl9fWVsc2Ugcj12YShyPT09Zz9yLnNwbGljZShvLHIubGVuZ3RoKTpyKSxlP2UobnVsbCxnLHIsaSk6SC5hcHBseShnLHIpfSl9ZnVuY3Rpb24geGEoYSl7Zm9yKHZhciBiLGMsZSxmPWEubGVuZ3RoLGc9ZC5yZWxhdGl2ZVthWzBdLnR5cGVdLGg9Z3x8ZC5yZWxhdGl2ZVsiICJdLGk9Zz8xOjAsaz1zYShmdW5jdGlvbihhKXtyZXR1cm4gYT09PWJ9LGgsITApLGw9c2EoZnVuY3Rpb24oYSl7cmV0dXJuIEooYixhKT4tMX0saCwhMCksbT1bZnVuY3Rpb24oYSxjLGQpe3ZhciBlPSFnJiYoZHx8YyE9PWopfHwoKGI9Yykubm9kZVR5cGU/ayhhLGMsZCk6bChhLGMsZCkpO3JldHVybiBiPW51bGwsZX1dO2Y+aTtpKyspaWYoYz1kLnJlbGF0aXZlW2FbaV0udHlwZV0pbT1bc2EodGEobSksYyldO2Vsc2V7aWYoYz1kLmZpbHRlclthW2ldLnR5cGVdLmFwcGx5KG51bGwsYVtpXS5tYXRjaGVzKSxjW3VdKXtmb3IoZT0rK2k7Zj5lO2UrKylpZihkLnJlbGF0aXZlW2FbZV0udHlwZV0pYnJlYWs7cmV0dXJuIHdhKGk+MSYmdGEobSksaT4xJiZyYShhLnNsaWNlKDAsaS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWFbaS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKFIsIiQxIiksYyxlPmkmJnhhKGEuc2xpY2UoaSxlKSksZj5lJiZ4YShhPWEuc2xpY2UoZSkpLGY+ZSYmcmEoYSkpfW0ucHVzaChjKX1yZXR1cm4gdGEobSl9ZnVuY3Rpb24geWEoYSxiKXt2YXIgYz1iLmxlbmd0aD4wLGU9YS5sZW5ndGg+MCxmPWZ1bmN0aW9uKGYsZyxoLGksayl7dmFyIGwsbSxvLHA9MCxxPSIwIixyPWYmJltdLHM9W10sdD1qLHU9Znx8ZSYmZC5maW5kLlRBRygiKiIsayksdj13Kz1udWxsPT10PzE6TWF0aC5yYW5kb20oKXx8LjEseD11Lmxlbmd0aDtmb3IoayYmKGo9ZyE9PW4mJmcpO3EhPT14JiZudWxsIT0obD11W3FdKTtxKyspe2lmKGUmJmwpe209MDt3aGlsZShvPWFbbSsrXSlpZihvKGwsZyxoKSl7aS5wdXNoKGwpO2JyZWFrfWsmJih3PXYpfWMmJigobD0hbyYmbCkmJnAtLSxmJiZyLnB1c2gobCkpfWlmKHArPXEsYyYmcSE9PXApe209MDt3aGlsZShvPWJbbSsrXSlvKHIscyxnLGgpO2lmKGYpe2lmKHA+MCl3aGlsZShxLS0pcltxXXx8c1txXXx8KHNbcV09Ri5jYWxsKGkpKTtzPXZhKHMpfUguYXBwbHkoaSxzKSxrJiYhZiYmcy5sZW5ndGg+MCYmcCtiLmxlbmd0aD4xJiZnYS51bmlxdWVTb3J0KGkpfXJldHVybiBrJiYodz12LGo9dCkscn07cmV0dXJuIGM/aWEoZik6Zn1yZXR1cm4gaD1nYS5jb21waWxlPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPVtdLGY9QVthKyIgIl07aWYoIWYpe2J8fChiPWcoYSkpLGM9Yi5sZW5ndGg7d2hpbGUoYy0tKWY9eGEoYltjXSksZlt1XT9kLnB1c2goZik6ZS5wdXNoKGYpO2Y9QShhLHlhKGUsZCkpLGYuc2VsZWN0b3I9YX1yZXR1cm4gZn0saT1nYS5zZWxlY3Q9ZnVuY3Rpb24oYSxiLGUsZil7dmFyIGksaixrLGwsbSxuPSJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhLG89IWYmJmcoYT1uLnNlbGVjdG9yfHxhKTtpZihlPWV8fFtdLDE9PT1vLmxlbmd0aCl7aWYoaj1vWzBdPW9bMF0uc2xpY2UoMCksai5sZW5ndGg+MiYmIklEIj09PShrPWpbMF0pLnR5cGUmJmMuZ2V0QnlJZCYmOT09PWIubm9kZVR5cGUmJnAmJmQucmVsYXRpdmVbalsxXS50eXBlXSl7aWYoYj0oZC5maW5kLklEKGsubWF0Y2hlc1swXS5yZXBsYWNlKGNhLGRhKSxiKXx8W10pWzBdLCFiKXJldHVybiBlO24mJihiPWIucGFyZW50Tm9kZSksYT1hLnNsaWNlKGouc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWk9WC5uZWVkc0NvbnRleHQudGVzdChhKT8wOmoubGVuZ3RoO3doaWxlKGktLSl7aWYoaz1qW2ldLGQucmVsYXRpdmVbbD1rLnR5cGVdKWJyZWFrO2lmKChtPWQuZmluZFtsXSkmJihmPW0oay5tYXRjaGVzWzBdLnJlcGxhY2UoY2EsZGEpLGFhLnRlc3QoalswXS50eXBlKSYmcGEoYi5wYXJlbnROb2RlKXx8YikpKXtpZihqLnNwbGljZShpLDEpLGE9Zi5sZW5ndGgmJnJhKGopLCFhKXJldHVybiBILmFwcGx5KGUsZiksZTticmVha319fXJldHVybihufHxoKGEsbykpKGYsYiwhcCxlLGFhLnRlc3QoYSkmJnBhKGIucGFyZW50Tm9kZSl8fGIpLGV9LGMuc29ydFN0YWJsZT11LnNwbGl0KCIiKS5zb3J0KEIpLmpvaW4oIiIpPT09dSxjLmRldGVjdER1cGxpY2F0ZXM9ISFsLG0oKSxjLnNvcnREZXRhY2hlZD1qYShmdW5jdGlvbihhKXtyZXR1cm4gMSZhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG4uY3JlYXRlRWxlbWVudCgiZGl2IikpfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8a2EoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYz92b2lkIDA6YS5nZXRBdHRyaWJ1dGUoYiwidHlwZSI9PT1iLnRvTG93ZXJDYXNlKCk/MToyKX0pLGMuYXR0cmlidXRlcyYmamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8aW5wdXQvPiIsYS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8a2EoInZhbHVlIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGN8fCJpbnB1dCIhPT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/dm9pZCAwOmEuZGVmYXVsdFZhbHVlfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWEuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGthKEssZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBjP3ZvaWQgMDphW2JdPT09ITA/Yi50b0xvd2VyQ2FzZSgpOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJmQuc3BlY2lmaWVkP2QudmFsdWU6bnVsbH0pLGdhfShhKTttLmZpbmQ9cyxtLmV4cHI9cy5zZWxlY3RvcnMsbS5leHByWyI6Il09bS5leHByLnBzZXVkb3MsbS51bmlxdWU9cy51bmlxdWVTb3J0LG0udGV4dD1zLmdldFRleHQsbS5pc1hNTERvYz1zLmlzWE1MLG0uY29udGFpbnM9cy5jb250YWluczt2YXIgdD1tLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LHU9L148KFx3KylccypcLz8+KD86PFwvXDE+fCkkLyx2PS9eLlteOiNcW1wuLF0qJC87ZnVuY3Rpb24gdyhhLGIsYyl7aWYobS5pc0Z1bmN0aW9uKGIpKXJldHVybiBtLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiEhYi5jYWxsKGEsZCxhKSE9PWN9KTtpZihiLm5vZGVUeXBlKXJldHVybiBtLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWIhPT1jfSk7aWYoInN0cmluZyI9PXR5cGVvZiBiKXtpZih2LnRlc3QoYikpcmV0dXJuIG0uZmlsdGVyKGIsYSxjKTtiPW0uZmlsdGVyKGIsYSl9cmV0dXJuIG0uZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBtLmluQXJyYXkoYSxiKT49MCE9PWN9KX1tLmZpbHRlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YlswXTtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksMT09PWIubGVuZ3RoJiYxPT09ZC5ub2RlVHlwZT9tLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGQsYSk/W2RdOltdOm0uZmluZC5tYXRjaGVzKGEsbS5ncmVwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLm5vZGVUeXBlfSkpfSxtLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYixjPVtdLGQ9dGhpcyxlPWQubGVuZ3RoO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gdGhpcy5wdXNoU3RhY2sobShhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2U+YjtiKyspaWYobS5jb250YWlucyhkW2JdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihiPTA7ZT5iO2IrKyltLmZpbmQoYSxkW2JdLGMpO3JldHVybiBjPXRoaXMucHVzaFN0YWNrKGU+MT9tLnVuaXF1ZShjKTpjKSxjLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3I/dGhpcy5zZWxlY3RvcisiICIrYTphLGN9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodyh0aGlzLGF8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodyh0aGlzLGF8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEhdyh0aGlzLCJzdHJpbmciPT10eXBlb2YgYSYmdC50ZXN0KGEpP20oYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgeCx5PWEuZG9jdW1lbnQsej0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSopKSQvLEE9bS5mbi5pbml0PWZ1bmN0aW9uKGEsYil7dmFyIGMsZDtpZighYSlyZXR1cm4gdGhpcztpZigic3RyaW5nIj09dHlwZW9mIGEpe2lmKGM9IjwiPT09YS5jaGFyQXQoMCkmJiI+Ij09PWEuY2hhckF0KGEubGVuZ3RoLTEpJiZhLmxlbmd0aD49Mz9bbnVsbCxhLG51bGxdOnouZXhlYyhhKSwhY3x8IWNbMV0mJmIpcmV0dXJuIWJ8fGIuanF1ZXJ5PyhifHx4KS5maW5kKGEpOnRoaXMuY29uc3RydWN0b3IoYikuZmluZChhKTtpZihjWzFdKXtpZihiPWIgaW5zdGFuY2VvZiBtP2JbMF06YixtLm1lcmdlKHRoaXMsbS5wYXJzZUhUTUwoY1sxXSxiJiZiLm5vZGVUeXBlP2Iub3duZXJEb2N1bWVudHx8Yjp5LCEwKSksdS50ZXN0KGNbMV0pJiZtLmlzUGxhaW5PYmplY3QoYikpZm9yKGMgaW4gYiltLmlzRnVuY3Rpb24odGhpc1tjXSk/dGhpc1tjXShiW2NdKTp0aGlzLmF0dHIoYyxiW2NdKTtyZXR1cm4gdGhpc31pZihkPXkuZ2V0RWxlbWVudEJ5SWQoY1syXSksZCYmZC5wYXJlbnROb2RlKXtpZihkLmlkIT09Y1syXSlyZXR1cm4geC5maW5kKGEpO3RoaXMubGVuZ3RoPTEsdGhpc1swXT1kfXJldHVybiB0aGlzLmNvbnRleHQ9eSx0aGlzLnNlbGVjdG9yPWEsdGhpc31yZXR1cm4gYS5ub2RlVHlwZT8odGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xLHRoaXMpOm0uaXNGdW5jdGlvbihhKT8idW5kZWZpbmVkIiE9dHlwZW9mIHgucmVhZHk/eC5yZWFkeShhKTphKG0pOih2b2lkIDAhPT1hLnNlbGVjdG9yJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpLG0ubWFrZUFycmF5KGEsdGhpcykpfTtBLnByb3RvdHlwZT1tLmZuLHg9bSh5KTt2YXIgQj0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxDPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O20uZXh0ZW5kKHtkaXI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVtdLGU9YVtiXTt3aGlsZShlJiY5IT09ZS5ub2RlVHlwZSYmKHZvaWQgMD09PWN8fDEhPT1lLm5vZGVUeXBlfHwhbShlKS5pcyhjKSkpMT09PWUubm9kZVR5cGUmJmQucHVzaChlKSxlPWVbYl07cmV0dXJuIGR9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9W107YTthPWEubmV4dFNpYmxpbmcpMT09PWEubm9kZVR5cGUmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9fSksbS5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihhKXt2YXIgYixjPW0oYSx0aGlzKSxkPWMubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2ZvcihiPTA7ZD5iO2IrKylpZihtLmNvbnRhaW5zKHRoaXMsY1tiXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPTAsZT10aGlzLmxlbmd0aCxmPVtdLGc9dC50ZXN0KGEpfHwic3RyaW5nIiE9dHlwZW9mIGE/bShhLGJ8fHRoaXMuY29udGV4dCk6MDtlPmQ7ZCsrKWZvcihjPXRoaXNbZF07YyYmYyE9PWI7Yz1jLnBhcmVudE5vZGUpaWYoYy5ub2RlVHlwZTwxMSYmKGc/Zy5pbmRleChjKT4tMToxPT09Yy5ub2RlVHlwZSYmbS5maW5kLm1hdGNoZXNTZWxlY3RvcihjLGEpKSl7Zi5wdXNoKGMpO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhmLmxlbmd0aD4xP20udW5pcXVlKGYpOmYpfSxpbmRleDpmdW5jdGlvbihhKXtyZXR1cm4gYT8ic3RyaW5nIj09dHlwZW9mIGE/bS5pbkFycmF5KHRoaXNbMF0sbShhKSk6bS5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnB1c2hTdGFjayhtLnVuaXF1ZShtLm1lcmdlKHRoaXMuZ2V0KCksbShhLGIpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFkZChudWxsPT1hP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGEpKX19KTtmdW5jdGlvbiBEKGEsYil7ZG8gYT1hW2JdO3doaWxlKGEmJjEhPT1hLm5vZGVUeXBlKTtyZXR1cm4gYX1tLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJjExIT09Yi5ub2RlVHlwZT9iOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZGlyKGEsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5kaXIoYSwicGFyZW50Tm9kZSIsYyl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEQoYSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gRChhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gbS5kaXIoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gbS5kaXIoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZGlyKGEsIm5leHRTaWJsaW5nIixjKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5kaXIoYSwicHJldmlvdXNTaWJsaW5nIixjKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uc2libGluZygoYS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIG0uc2libGluZyhhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gbS5ub2RlTmFtZShhLCJpZnJhbWUiKT9hLmNvbnRlbnREb2N1bWVudHx8YS5jb250ZW50V2luZG93LmRvY3VtZW50Om0ubWVyZ2UoW10sYS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGEsYil7bS5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPW0ubWFwKHRoaXMsYixjKTtyZXR1cm4iVW50aWwiIT09YS5zbGljZSgtNSkmJihkPWMpLGQmJiJzdHJpbmciPT10eXBlb2YgZCYmKGU9bS5maWx0ZXIoZCxlKSksdGhpcy5sZW5ndGg+MSYmKENbYV18fChlPW0udW5pcXVlKGUpKSxCLnRlc3QoYSkmJihlPWUucmV2ZXJzZSgpKSksdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIEU9L1xTKy9nLEY9e307ZnVuY3Rpb24gRyhhKXt2YXIgYj1GW2FdPXt9O3JldHVybiBtLmVhY2goYS5tYXRjaChFKXx8W10sZnVuY3Rpb24oYSxjKXtiW2NdPSEwfSksYn1tLkNhbGxiYWNrcz1mdW5jdGlvbihhKXthPSJzdHJpbmciPT10eXBlb2YgYT9GW2FdfHxHKGEpOm0uZXh0ZW5kKHt9LGEpO3ZhciBiLGMsZCxlLGYsZyxoPVtdLGk9IWEub25jZSYmW10saj1mdW5jdGlvbihsKXtmb3IoYz1hLm1lbW9yeSYmbCxkPSEwLGY9Z3x8MCxnPTAsZT1oLmxlbmd0aCxiPSEwO2gmJmU+ZjtmKyspaWYoaFtmXS5hcHBseShsWzBdLGxbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2Upe2M9ITE7YnJlYWt9Yj0hMSxoJiYoaT9pLmxlbmd0aCYmaihpLnNoaWZ0KCkpOmM/aD1bXTprLmRpc2FibGUoKSl9LGs9e2FkZDpmdW5jdGlvbigpe2lmKGgpe3ZhciBkPWgubGVuZ3RoOyFmdW5jdGlvbiBmKGIpe20uZWFjaChiLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9bS50eXBlKGMpOyJmdW5jdGlvbiI9PT1kP2EudW5pcXVlJiZrLmhhcyhjKXx8aC5wdXNoKGMpOmMmJmMubGVuZ3RoJiYic3RyaW5nIiE9PWQmJmYoYyl9KX0oYXJndW1lbnRzKSxiP2U9aC5sZW5ndGg6YyYmKGc9ZCxqKGMpKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGgmJm0uZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oYSxjKXt2YXIgZDt3aGlsZSgoZD1tLmluQXJyYXkoYyxoLGQpKT4tMSloLnNwbGljZShkLDEpLGImJihlPj1kJiZlLS0sZj49ZCYmZi0tKX0pLHRoaXN9LGhhczpmdW5jdGlvbihhKXtyZXR1cm4gYT9tLmluQXJyYXkoYSxoKT4tMTohKCFofHwhaC5sZW5ndGgpfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBoPVtdLGU9MCx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGg9aT1jPXZvaWQgMCx0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFofSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGk9dm9pZCAwLGN8fGsuZGlzYWJsZSgpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiFpfSxmaXJlV2l0aDpmdW5jdGlvbihhLGMpe3JldHVybiFofHxkJiYhaXx8KGM9Y3x8W10sYz1bYSxjLnNsaWNlP2Muc2xpY2UoKTpjXSxiP2kucHVzaChjKTpqKGMpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGsuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFkfX07cmV0dXJuIGt9LG0uZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihhKXt2YXIgYj1bWyJyZXNvbHZlIiwiZG9uZSIsbS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixtLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwicmVqZWN0ZWQiXSxbIm5vdGlmeSIsInByb2dyZXNzIixtLkNhbGxiYWNrcygibWVtb3J5IildXSxjPSJwZW5kaW5nIixkPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBjfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gZS5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LHRoZW46ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHM7cmV0dXJuIG0uRGVmZXJyZWQoZnVuY3Rpb24oYyl7bS5lYWNoKGIsZnVuY3Rpb24oYixmKXt2YXIgZz1tLmlzRnVuY3Rpb24oYVtiXSkmJmFbYl07ZVtmWzFdXShmdW5jdGlvbigpe3ZhciBhPWcmJmcuYXBwbHkodGhpcyxhcmd1bWVudHMpO2EmJm0uaXNGdW5jdGlvbihhLnByb21pc2UpP2EucHJvbWlzZSgpLmRvbmUoYy5yZXNvbHZlKS5mYWlsKGMucmVqZWN0KS5wcm9ncmVzcyhjLm5vdGlmeSk6Y1tmWzBdKyJXaXRoIl0odGhpcz09PWQ/Yy5wcm9taXNlKCk6dGhpcyxnP1thXTphcmd1bWVudHMpfSl9KSxhPW51bGx9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/bS5leHRlbmQoYSxkKTpkfX0sZT17fTtyZXR1cm4gZC5waXBlPWQudGhlbixtLmVhY2goYixmdW5jdGlvbihhLGYpe3ZhciBnPWZbMl0saD1mWzNdO2RbZlsxXV09Zy5hZGQsaCYmZy5hZGQoZnVuY3Rpb24oKXtjPWh9LGJbMV5hXVsyXS5kaXNhYmxlLGJbMl1bMl0ubG9jayksZVtmWzBdXT1mdW5jdGlvbigpe3JldHVybiBlW2ZbMF0rIldpdGgiXSh0aGlzPT09ZT9kOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxlW2ZbMF0rIldpdGgiXT1nLmZpcmVXaXRofSksZC5wcm9taXNlKGUpLGEmJmEuY2FsbChlLGUpLGV9LHdoZW46ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPWQuY2FsbChhcmd1bWVudHMpLGU9Yy5sZW5ndGgsZj0xIT09ZXx8YSYmbS5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/ZTowLGc9MT09PWY/YTptLkRlZmVycmVkKCksaD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGUpe2JbYV09dGhpcyxjW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9kLmNhbGwoYXJndW1lbnRzKTplLGM9PT1pP2cubm90aWZ5V2l0aChiLGMpOi0tZnx8Zy5yZXNvbHZlV2l0aChiLGMpfX0saSxqLGs7aWYoZT4xKWZvcihpPW5ldyBBcnJheShlKSxqPW5ldyBBcnJheShlKSxrPW5ldyBBcnJheShlKTtlPmI7YisrKWNbYl0mJm0uaXNGdW5jdGlvbihjW2JdLnByb21pc2UpP2NbYl0ucHJvbWlzZSgpLmRvbmUoaChiLGssYykpLmZhaWwoZy5yZWplY3QpLnByb2dyZXNzKGgoYixqLGkpKTotLWY7cmV0dXJuIGZ8fGcucmVzb2x2ZVdpdGgoayxjKSxnLnByb21pc2UoKX19KTt2YXIgSDttLmZuLnJlYWR5PWZ1bmN0aW9uKGEpe3JldHVybiBtLnJlYWR5LnByb21pc2UoKS5kb25lKGEpLHRoaXN9LG0uZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihhKXthP20ucmVhZHlXYWl0Kys6bS5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGEpe2lmKGE9PT0hMD8hLS1tLnJlYWR5V2FpdDohbS5pc1JlYWR5KXtpZigheS5ib2R5KXJldHVybiBzZXRUaW1lb3V0KG0ucmVhZHkpO20uaXNSZWFkeT0hMCxhIT09ITAmJi0tbS5yZWFkeVdhaXQ+MHx8KEgucmVzb2x2ZVdpdGgoeSxbbV0pLG0uZm4udHJpZ2dlckhhbmRsZXImJihtKHkpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpLG0oeSkub2ZmKCJyZWFkeSIpKSl9fX0pO2Z1bmN0aW9uIEkoKXt5LmFkZEV2ZW50TGlzdGVuZXI/KHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSiwhMSksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixKLCExKSk6KHkuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsSiksYS5kZXRhY2hFdmVudCgib25sb2FkIixKKSl9ZnVuY3Rpb24gSigpeyh5LmFkZEV2ZW50TGlzdGVuZXJ8fCJsb2FkIj09PWV2ZW50LnR5cGV8fCJjb21wbGV0ZSI9PT15LnJlYWR5U3RhdGUpJiYoSSgpLG0ucmVhZHkoKSl9bS5yZWFkeS5wcm9taXNlPWZ1bmN0aW9uKGIpe2lmKCFIKWlmKEg9bS5EZWZlcnJlZCgpLCJjb21wbGV0ZSI9PT15LnJlYWR5U3RhdGUpc2V0VGltZW91dChtLnJlYWR5KTtlbHNlIGlmKHkuYWRkRXZlbnRMaXN0ZW5lcil5LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEosITEpLGEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsSiwhMSk7ZWxzZXt5LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEopLGEuYXR0YWNoRXZlbnQoIm9ubG9hZCIsSik7dmFyIGM9ITE7dHJ5e2M9bnVsbD09YS5mcmFtZUVsZW1lbnQmJnkuZG9jdW1lbnRFbGVtZW50fWNhdGNoKGQpe31jJiZjLmRvU2Nyb2xsJiYhZnVuY3Rpb24gZSgpe2lmKCFtLmlzUmVhZHkpe3RyeXtjLmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7cmV0dXJuIHNldFRpbWVvdXQoZSw1MCl9SSgpLG0ucmVhZHkoKX19KCl9cmV0dXJuIEgucHJvbWlzZShiKX07dmFyIEs9InVuZGVmaW5lZCIsTDtmb3IoTCBpbiBtKGspKWJyZWFrO2sub3duTGFzdD0iMCIhPT1MLGsuaW5saW5lQmxvY2tOZWVkc0xheW91dD0hMSxtKGZ1bmN0aW9uKCl7dmFyIGEsYixjLGQ7Yz15LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0sYyYmYy5zdHlsZSYmKGI9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZC5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweCIsYy5hcHBlbmRDaGlsZChkKS5hcHBlbmRDaGlsZChiKSx0eXBlb2YgYi5zdHlsZS56b29tIT09SyYmKGIuc3R5bGUuY3NzVGV4dD0iZGlzcGxheTppbmxpbmU7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzoxcHg7d2lkdGg6MXB4O3pvb206MSIsay5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PWE9Mz09PWIub2Zmc2V0V2lkdGgsYSYmKGMuc3R5bGUuem9vbT0xKSksYy5yZW1vdmVDaGlsZChkKSl9KSxmdW5jdGlvbigpe3ZhciBhPXkuY3JlYXRlRWxlbWVudCgiZGl2Iik7aWYobnVsbD09ay5kZWxldGVFeHBhbmRvKXtrLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBhLnRlc3R9Y2F0Y2goYil7ay5kZWxldGVFeHBhbmRvPSExfX1hPW51bGx9KCksbS5hY2NlcHREYXRhPWZ1bmN0aW9uKGEpe3ZhciBiPW0ubm9EYXRhWyhhLm5vZGVOYW1lKyIgIikudG9Mb3dlckNhc2UoKV0sYz0rYS5ub2RlVHlwZXx8MTtyZXR1cm4gMSE9PWMmJjkhPT1jPyExOiFifHxiIT09ITAmJmEuZ2V0QXR0cmlidXRlKCJjbGFzc2lkIik9PT1ifTt2YXIgTT0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLE49LyhbQS1aXSkvZztmdW5jdGlvbiBPKGEsYixjKXtpZih2b2lkIDA9PT1jJiYxPT09YS5ub2RlVHlwZSl7dmFyIGQ9ImRhdGEtIitiLnJlcGxhY2UoTiwiLSQxIikudG9Mb3dlckNhc2UoKTtpZihjPWEuZ2V0QXR0cmlidXRlKGQpLCJzdHJpbmciPT10eXBlb2YgYyl7dHJ5e2M9InRydWUiPT09Yz8hMDoiZmFsc2UiPT09Yz8hMToibnVsbCI9PT1jP251bGw6K2MrIiI9PT1jPytjOk0udGVzdChjKT9tLnBhcnNlSlNPTihjKTpjfWNhdGNoKGUpe31tLmRhdGEoYSxiLGMpfWVsc2UgYz12b2lkIDB9cmV0dXJuIGN9ZnVuY3Rpb24gUChhKXt2YXIgYjtmb3IoYiBpbiBhKWlmKCgiZGF0YSIhPT1ifHwhbS5pc0VtcHR5T2JqZWN0KGFbYl0pKSYmInRvSlNPTiIhPT1iKXJldHVybiExOwoKcmV0dXJuITB9ZnVuY3Rpb24gUShhLGIsZCxlKXtpZihtLmFjY2VwdERhdGEoYSkpe3ZhciBmLGcsaD1tLmV4cGFuZG8saT1hLm5vZGVUeXBlLGo9aT9tLmNhY2hlOmEsaz1pP2FbaF06YVtoXSYmaDtpZihrJiZqW2tdJiYoZXx8altrXS5kYXRhKXx8dm9pZCAwIT09ZHx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBrfHwoaz1pP2FbaF09Yy5wb3AoKXx8bS5ndWlkKys6aCksaltrXXx8KGpba109aT97fTp7dG9KU09OOm0ubm9vcH0pLCgib2JqZWN0Ij09dHlwZW9mIGJ8fCJmdW5jdGlvbiI9PXR5cGVvZiBiKSYmKGU/altrXT1tLmV4dGVuZChqW2tdLGIpOmpba10uZGF0YT1tLmV4dGVuZChqW2tdLmRhdGEsYikpLGc9altrXSxlfHwoZy5kYXRhfHwoZy5kYXRhPXt9KSxnPWcuZGF0YSksdm9pZCAwIT09ZCYmKGdbbS5jYW1lbENhc2UoYildPWQpLCJzdHJpbmciPT10eXBlb2YgYj8oZj1nW2JdLG51bGw9PWYmJihmPWdbbS5jYW1lbENhc2UoYildKSk6Zj1nLGZ9fWZ1bmN0aW9uIFIoYSxiLGMpe2lmKG0uYWNjZXB0RGF0YShhKSl7dmFyIGQsZSxmPWEubm9kZVR5cGUsZz1mP20uY2FjaGU6YSxoPWY/YVttLmV4cGFuZG9dOm0uZXhwYW5kbztpZihnW2hdKXtpZihiJiYoZD1jP2dbaF06Z1toXS5kYXRhKSl7bS5pc0FycmF5KGIpP2I9Yi5jb25jYXQobS5tYXAoYixtLmNhbWVsQ2FzZSkpOmIgaW4gZD9iPVtiXTooYj1tLmNhbWVsQ2FzZShiKSxiPWIgaW4gZD9bYl06Yi5zcGxpdCgiICIpKSxlPWIubGVuZ3RoO3doaWxlKGUtLSlkZWxldGUgZFtiW2VdXTtpZihjPyFQKGQpOiFtLmlzRW1wdHlPYmplY3QoZCkpcmV0dXJufShjfHwoZGVsZXRlIGdbaF0uZGF0YSxQKGdbaF0pKSkmJihmP20uY2xlYW5EYXRhKFthXSwhMCk6ay5kZWxldGVFeHBhbmRvfHxnIT1nLndpbmRvdz9kZWxldGUgZ1toXTpnW2hdPW51bGwpfX19bS5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7ImFwcGxldCAiOiEwLCJlbWJlZCAiOiEwLCJvYmplY3QgIjoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP20uY2FjaGVbYVttLmV4cGFuZG9dXTphW20uZXhwYW5kb10sISFhJiYhUChhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFEoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFIoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBRKGEsYixjLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUihhLGIsITApfX0pLG0uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9bS5kYXRhKGYpLDE9PT1mLm5vZGVUeXBlJiYhbS5fZGF0YShmLCJwYXJzZWRBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPW0uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLE8oZixkLGVbZF0pKSk7bS5fZGF0YShmLCJwYXJzZWRBdHRycyIsITApfXJldHVybiBlfXJldHVybiJvYmplY3QiPT10eXBlb2YgYT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhKX0pOmFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhLGIpfSk6Zj9PKGYsYSxtLmRhdGEoZixhKSk6dm9pZCAwfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXttLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLG0uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGE/KGI9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1tLl9kYXRhKGEsYiksYyYmKCFkfHxtLmlzQXJyYXkoYyk/ZD1tLl9kYXRhKGEsYixtLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKSxkfHxbXSk6dm9pZCAwfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPW0ucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9bS5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXttLmRlcXVldWUoYSxiKX07ImlucHJvZ3Jlc3MiPT09ZSYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKCJmeCI9PT1iJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gbS5fZGF0YShhLGMpfHxtLl9kYXRhKGEsYyx7ZW1wdHk6bS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7bS5fcmVtb3ZlRGF0YShhLGIrInF1ZXVlIiksbS5fcmVtb3ZlRGF0YShhLGMpfSl9KX19KSxtLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPSJmeCIsYy0tKSxhcmd1bWVudHMubGVuZ3RoPGM/bS5xdWV1ZSh0aGlzWzBdLGEpOnZvaWQgMD09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1tLnF1ZXVlKHRoaXMsYSxiKTttLl9xdWV1ZUhvb2tzKHRoaXMsYSksImZ4Ij09PWEmJiJpbnByb2dyZXNzIiE9PWNbMF0mJm0uZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZGVxdWV1ZSh0aGlzLGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTEsZT1tLkRlZmVycmVkKCksZj10aGlzLGc9dGhpcy5sZW5ndGgsaD1mdW5jdGlvbigpey0tZHx8ZS5yZXNvbHZlV2l0aChmLFtmXSl9OyJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiZngiO3doaWxlKGctLSljPW0uX2RhdGEoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSk7dmFyIFM9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsVD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLFU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1ifHxhLCJub25lIj09PW0uY3NzKGEsImRpc3BsYXkiKXx8IW0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfSxWPW0uYWNjZXNzPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPTAsaT1hLmxlbmd0aCxqPW51bGw9PWM7aWYoIm9iamVjdCI9PT1tLnR5cGUoYykpe2U9ITA7Zm9yKGggaW4gYyltLmFjY2VzcyhhLGIsaCxjW2hdLCEwLGYsZyl9ZWxzZSBpZih2b2lkIDAhPT1kJiYoZT0hMCxtLmlzRnVuY3Rpb24oZCl8fChnPSEwKSxqJiYoZz8oYi5jYWxsKGEsZCksYj1udWxsKTooaj1iLGI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqLmNhbGwobShhKSxjKX0pKSxiKSlmb3IoO2k+aDtoKyspYihhW2hdLGMsZz9kOmQuY2FsbChhW2hdLGgsYihhW2hdLGMpKSk7cmV0dXJuIGU/YTpqP2IuY2FsbChhKTppP2IoYVswXSxjKTpmfSxXPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pOyFmdW5jdGlvbigpe3ZhciBhPXkuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYz15LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixrLmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1iLmZpcnN0Q2hpbGQubm9kZVR5cGUsay50Ym9keT0hYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsay5odG1sU2VyaWFsaXplPSEhYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxrLmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09eS5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxhLnR5cGU9ImNoZWNrYm94IixhLmNoZWNrZWQ9ITAsYy5hcHBlbmRDaGlsZChhKSxrLmFwcGVuZENoZWNrZWQ9YS5jaGVja2VkLGIuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixrLm5vQ2xvbmVDaGVja2VkPSEhYi5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsYy5hcHBlbmRDaGlsZChiKSxiLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J3JhZGlvJyBjaGVja2VkPSdjaGVja2VkJyBuYW1lPSd0Jy8+IixrLmNoZWNrQ2xvbmU9Yi5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsay5ub0Nsb25lRXZlbnQ9ITAsYi5hdHRhY2hFdmVudCYmKGIuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7ay5ub0Nsb25lRXZlbnQ9ITF9KSxiLmNsb25lTm9kZSghMCkuY2xpY2soKSksbnVsbD09ay5kZWxldGVFeHBhbmRvKXtrLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBiLnRlc3R9Y2F0Y2goZCl7ay5kZWxldGVFeHBhbmRvPSExfX19KCksZnVuY3Rpb24oKXt2YXIgYixjLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKTtmb3IoYiBpbntzdWJtaXQ6ITAsY2hhbmdlOiEwLGZvY3VzaW46ITB9KWM9Im9uIitiLChrW2IrIkJ1YmJsZXMiXT1jIGluIGEpfHwoZC5zZXRBdHRyaWJ1dGUoYywidCIpLGtbYisiQnViYmxlcyJdPWQuYXR0cmlidXRlc1tjXS5leHBhbmRvPT09ITEpO2Q9bnVsbH0oKTt2YXIgWD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksWT0vXmtleS8sWj0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnUpfGNsaWNrLywkPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxfPS9eKFteLl0qKSg/OlwuKC4rKXwpJC87ZnVuY3Rpb24gYWEoKXtyZXR1cm4hMH1mdW5jdGlvbiBiYSgpe3JldHVybiExfWZ1bmN0aW9uIGNhKCl7dHJ5e3JldHVybiB5LmFjdGl2ZUVsZW1lbnR9Y2F0Y2goYSl7fX1tLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbixvLHAscSxyPW0uX2RhdGEoYSk7aWYocil7Yy5oYW5kbGVyJiYoaT1jLGM9aS5oYW5kbGVyLGU9aS5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW0uZ3VpZCsrKSwoZz1yLmV2ZW50cyl8fChnPXIuZXZlbnRzPXt9KSwoaz1yLmhhbmRsZSl8fChrPXIuaGFuZGxlPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgbT09PUt8fGEmJm0uZXZlbnQudHJpZ2dlcmVkPT09YS50eXBlP3ZvaWQgMDptLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGsuZWxlbSxhcmd1bWVudHMpfSxrLmVsZW09YSksYj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGg9Yi5sZW5ndGg7d2hpbGUoaC0tKWY9Xy5leGVjKGJbaF0pfHxbXSxvPXE9ZlsxXSxwPShmWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyYmKGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShlP2ouZGVsZWdhdGVUeXBlOmouYmluZFR5cGUpfHxvLGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxsPW0uZXh0ZW5kKHt0eXBlOm8sb3JpZ1R5cGU6cSxkYXRhOmQsaGFuZGxlcjpjLGd1aWQ6Yy5ndWlkLHNlbGVjdG9yOmUsbmVlZHNDb250ZXh0OmUmJm0uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChlKSxuYW1lc3BhY2U6cC5qb2luKCIuIil9LGkpLChuPWdbb10pfHwobj1nW29dPVtdLG4uZGVsZWdhdGVDb3VudD0wLGouc2V0dXAmJmouc2V0dXAuY2FsbChhLGQscCxrKSE9PSExfHwoYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihvLGssITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitvLGspKSksai5hZGQmJihqLmFkZC5jYWxsKGEsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1jLmd1aWQpKSxlP24uc3BsaWNlKG4uZGVsZWdhdGVDb3VudCsrLDAsbCk6bi5wdXNoKGwpLG0uZXZlbnQuZ2xvYmFsW29dPSEwKTthPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxuLG8scCxxLHI9bS5oYXNEYXRhKGEpJiZtLl9kYXRhKGEpO2lmKHImJihrPXIuZXZlbnRzKSl7Yj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9Xy5leGVjKGJbal0pfHxbXSxvPXE9aFsxXSxwPShoWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyl7bD1tLmV2ZW50LnNwZWNpYWxbb118fHt9LG89KGQ/bC5kZWxlZ2F0ZVR5cGU6bC5iaW5kVHlwZSl8fG8sbj1rW29dfHxbXSxoPWhbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK3Auam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksaT1mPW4ubGVuZ3RoO3doaWxlKGYtLSlnPW5bZl0sIWUmJnEhPT1nLm9yaWdUeXBlfHxjJiZjLmd1aWQhPT1nLmd1aWR8fGgmJiFoLnRlc3QoZy5uYW1lc3BhY2UpfHxkJiZkIT09Zy5zZWxlY3RvciYmKCIqKiIhPT1kfHwhZy5zZWxlY3Rvcil8fChuLnNwbGljZShmLDEpLGcuc2VsZWN0b3ImJm4uZGVsZWdhdGVDb3VudC0tLGwucmVtb3ZlJiZsLnJlbW92ZS5jYWxsKGEsZykpO2kmJiFuLmxlbmd0aCYmKGwudGVhcmRvd24mJmwudGVhcmRvd24uY2FsbChhLHAsci5oYW5kbGUpIT09ITF8fG0ucmVtb3ZlRXZlbnQoYSxvLHIuaGFuZGxlKSxkZWxldGUga1tvXSl9ZWxzZSBmb3IobyBpbiBrKW0uZXZlbnQucmVtb3ZlKGEsbytiW2pdLGMsZCwhMCk7bS5pc0VtcHR5T2JqZWN0KGspJiYoZGVsZXRlIHIuaGFuZGxlLG0uX3JlbW92ZURhdGEoYSwiZXZlbnRzIikpfX0sdHJpZ2dlcjpmdW5jdGlvbihiLGMsZCxlKXt2YXIgZixnLGgsaSxrLGwsbixvPVtkfHx5XSxwPWouY2FsbChiLCJ0eXBlIik/Yi50eXBlOmIscT1qLmNhbGwoYiwibmFtZXNwYWNlIik/Yi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihoPWw9ZD1kfHx5LDMhPT1kLm5vZGVUeXBlJiY4IT09ZC5ub2RlVHlwZSYmISQudGVzdChwK20uZXZlbnQudHJpZ2dlcmVkKSYmKHAuaW5kZXhPZigiLiIpPj0wJiYocT1wLnNwbGl0KCIuIikscD1xLnNoaWZ0KCkscS5zb3J0KCkpLGc9cC5pbmRleE9mKCI6Iik8MCYmIm9uIitwLGI9YlttLmV4cGFuZG9dP2I6bmV3IG0uRXZlbnQocCwib2JqZWN0Ij09dHlwZW9mIGImJmIpLGIuaXNUcmlnZ2VyPWU/MjozLGIubmFtZXNwYWNlPXEuam9pbigiLiIpLGIubmFtZXNwYWNlX3JlPWIubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Euam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1kKSxjPW51bGw9PWM/W2JdOm0ubWFrZUFycmF5KGMsW2JdKSxrPW0uZXZlbnQuc3BlY2lhbFtwXXx8e30sZXx8IWsudHJpZ2dlcnx8ay50cmlnZ2VyLmFwcGx5KGQsYykhPT0hMSkpe2lmKCFlJiYhay5ub0J1YmJsZSYmIW0uaXNXaW5kb3coZCkpe2ZvcihpPWsuZGVsZWdhdGVUeXBlfHxwLCQudGVzdChpK3ApfHwoaD1oLnBhcmVudE5vZGUpO2g7aD1oLnBhcmVudE5vZGUpby5wdXNoKGgpLGw9aDtsPT09KGQub3duZXJEb2N1bWVudHx8eSkmJm8ucHVzaChsLmRlZmF1bHRWaWV3fHxsLnBhcmVudFdpbmRvd3x8YSl9bj0wO3doaWxlKChoPW9bbisrXSkmJiFiLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYi50eXBlPW4+MT9pOmsuYmluZFR5cGV8fHAsZj0obS5fZGF0YShoLCJldmVudHMiKXx8e30pW2IudHlwZV0mJm0uX2RhdGEoaCwiaGFuZGxlIiksZiYmZi5hcHBseShoLGMpLGY9ZyYmaFtnXSxmJiZmLmFwcGx5JiZtLmFjY2VwdERhdGEoaCkmJihiLnJlc3VsdD1mLmFwcGx5KGgsYyksYi5yZXN1bHQ9PT0hMSYmYi5wcmV2ZW50RGVmYXVsdCgpKTtpZihiLnR5cGU9cCwhZSYmIWIuaXNEZWZhdWx0UHJldmVudGVkKCkmJighay5fZGVmYXVsdHx8ay5fZGVmYXVsdC5hcHBseShvLnBvcCgpLGMpPT09ITEpJiZtLmFjY2VwdERhdGEoZCkmJmcmJmRbcF0mJiFtLmlzV2luZG93KGQpKXtsPWRbZ10sbCYmKGRbZ109bnVsbCksbS5ldmVudC50cmlnZ2VyZWQ9cDt0cnl7ZFtwXSgpfWNhdGNoKHIpe31tLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsbCYmKGRbZ109bCl9cmV0dXJuIGIucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1tLmV2ZW50LmZpeChhKTt2YXIgYixjLGUsZixnLGg9W10saT1kLmNhbGwoYXJndW1lbnRzKSxqPShtLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W10saz1tLmV2ZW50LnNwZWNpYWxbYS50eXBlXXx8e307aWYoaVswXT1hLGEuZGVsZWdhdGVUYXJnZXQ9dGhpcywhay5wcmVEaXNwYXRjaHx8ay5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkhPT0hMSl7aD1tLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxhLGopLGI9MDt3aGlsZSgoZj1oW2IrK10pJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtLGc9MDt3aGlsZSgoZT1mLmhhbmRsZXJzW2crK10pJiYhYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSghYS5uYW1lc3BhY2VfcmV8fGEubmFtZXNwYWNlX3JlLnRlc3QoZS5uYW1lc3BhY2UpKSYmKGEuaGFuZGxlT2JqPWUsYS5kYXRhPWUuZGF0YSxjPSgobS5ldmVudC5zcGVjaWFsW2Uub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxlLmhhbmRsZXIpLmFwcGx5KGYuZWxlbSxpKSx2b2lkIDAhPT1jJiYoYS5yZXN1bHQ9Yyk9PT0hMSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGsucG9zdERpc3BhdGNoJiZrLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYSksYS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9W10saD1iLmRlbGVnYXRlQ291bnQsaT1hLnRhcmdldDtpZihoJiZpLm5vZGVUeXBlJiYoIWEuYnV0dG9ufHwiY2xpY2siIT09YS50eXBlKSlmb3IoO2khPXRoaXM7aT1pLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWkubm9kZVR5cGUmJihpLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1hLnR5cGUpKXtmb3IoZT1bXSxmPTA7aD5mO2YrKylkPWJbZl0sYz1kLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1lW2NdJiYoZVtjXT1kLm5lZWRzQ29udGV4dD9tKGMsdGhpcykuaW5kZXgoaSk+PTA6bS5maW5kKGMsdGhpcyxudWxsLFtpXSkubGVuZ3RoKSxlW2NdJiZlLnB1c2goZCk7ZS5sZW5ndGgmJmcucHVzaCh7ZWxlbTppLGhhbmRsZXJzOmV9KX1yZXR1cm4gaDxiLmxlbmd0aCYmZy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6Yi5zbGljZShoKX0pLGd9LGZpeDpmdW5jdGlvbihhKXtpZihhW20uZXhwYW5kb10pcmV0dXJuIGE7dmFyIGIsYyxkLGU9YS50eXBlLGY9YSxnPXRoaXMuZml4SG9va3NbZV07Z3x8KHRoaXMuZml4SG9va3NbZV09Zz1aLnRlc3QoZSk/dGhpcy5tb3VzZUhvb2tzOlkudGVzdChlKT90aGlzLmtleUhvb2tzOnt9KSxkPWcucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoZy5wcm9wcyk6dGhpcy5wcm9wcyxhPW5ldyBtLkV2ZW50KGYpLGI9ZC5sZW5ndGg7d2hpbGUoYi0tKWM9ZFtiXSxhW2NdPWZbY107cmV0dXJuIGEudGFyZ2V0fHwoYS50YXJnZXQ9Zi5zcmNFbGVtZW50fHx5KSwzPT09YS50YXJnZXQubm9kZVR5cGUmJihhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlKSxhLm1ldGFLZXk9ISFhLm1ldGFLZXksZy5maWx0ZXI/Zy5maWx0ZXIoYSxmKTphfSxwcm9wczoiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YS53aGljaCYmKGEud2hpY2g9bnVsbCE9Yi5jaGFyQ29kZT9iLmNoYXJDb2RlOmIua2V5Q29kZSksYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9Yi5idXR0b24sZz1iLmZyb21FbGVtZW50O3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihkPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fHksZT1kLmRvY3VtZW50RWxlbWVudCxjPWQuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZSYmZS5zY3JvbGxMZWZ0fHxjJiZjLnNjcm9sbExlZnR8fDApLShlJiZlLmNsaWVudExlZnR8fGMmJmMuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGUmJmUuc2Nyb2xsVG9wfHxjJiZjLnNjcm9sbFRvcHx8MCktKGUmJmUuY2xpZW50VG9wfHxjJiZjLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmcmJihhLnJlbGF0ZWRUYXJnZXQ9Zz09PWEudGFyZ2V0P2IudG9FbGVtZW50OmcpLGEud2hpY2h8fHZvaWQgMD09PWZ8fChhLndoaWNoPTEmZj8xOjImZj8zOjQmZj8yOjApLGF9fSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09Y2EoKSYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChhKXt9fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1jYSgpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImlucHV0IikmJiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2s/KHRoaXMuY2xpY2soKSwhMSk6dm9pZCAwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtyZXR1cm4gbS5ub2RlTmFtZShhLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7dm9pZCAwIT09YS5yZXN1bHQmJmEub3JpZ2luYWxFdmVudCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bS5leHRlbmQobmV3IG0uRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP20uZXZlbnQudHJpZ2dlcihlLG51bGwsYik6bS5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbS5yZW1vdmVFdmVudD15LnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKHR5cGVvZiBhW2RdPT09SyYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0sbS5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgbS5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiZhLnJldHVyblZhbHVlPT09ITE/YWE6YmEpOnRoaXMudHlwZT1hLGImJm0uZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fG0ubm93KCksdm9pZCh0aGlzW20uZXhwYW5kb109ITApKTpuZXcgbS5FdmVudChhLGIpfSxtLkV2ZW50LnByb3RvdHlwZT17aXNEZWZhdWx0UHJldmVudGVkOmJhLGlzUHJvcGFnYXRpb25TdG9wcGVkOmJhLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOmJhLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWFhLGEmJihhLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTphLnJldHVyblZhbHVlPSExKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9YWEsYSYmKGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9YWEsYSYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG0uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXttLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybighZXx8ZSE9PWQmJiFtLmNvbnRhaW5zKGQsZSkpJiYoYS50eXBlPWYub3JpZ1R5cGUsYz1mLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1iKSxjfX19KSxrLnN1Ym1pdEJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImZvcm0iKT8hMTp2b2lkIG0uZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsYz1tLm5vZGVOYW1lKGIsImlucHV0Iil8fG0ubm9kZU5hbWUoYiwiYnV0dG9uIik/Yi5mb3JtOnZvaWQgMDtjJiYhbS5fZGF0YShjLCJzdWJtaXRCdWJibGVzIikmJihtLmV2ZW50LmFkZChjLCJzdWJtaXQuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZT0hMH0pLG0uX2RhdGEoYywic3VibWl0QnViYmxlcyIsITApKX0pfSxwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZSYmKGRlbGV0ZSBhLl9zdWJtaXRfYnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWEuaXNUcmlnZ2VyJiZtLmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxhLCEwKSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIG0ubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOnZvaWQgbS5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSxrLmNoYW5nZUJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBYLnRlc3QodGhpcy5ub2RlTmFtZSk/KCgiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlKSYmKG0uZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpeyJjaGVja2VkIj09PWEub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUmJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITApfSksbS5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5fanVzdF9jaGFuZ2VkJiYhYS5pc1RyaWdnZXImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITEpLG0uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxhLCEwKX0pKSwhMSk6dm9pZCBtLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtYLnRlc3QoYi5ub2RlTmFtZSkmJiFtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiKSYmKG0uZXZlbnQuYWRkKGIsImNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXshdGhpcy5wYXJlbnROb2RlfHxhLmlzU2ltdWxhdGVkfHxhLmlzVHJpZ2dlcnx8bS5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLnBhcmVudE5vZGUsYSwhMCl9KSxtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiLCEwKSl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O3JldHVybiB0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fCJyYWRpbyIhPT1iLnR5cGUmJiJjaGVja2JveCIhPT1iLnR5cGU/YS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBtLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFYLnRlc3QodGhpcy5ub2RlTmFtZSl9fSksay5mb2N1c2luQnViYmxlc3x8bS5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe20uZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxtLmV2ZW50LmZpeChhKSwhMCl9O20uZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1tLl9kYXRhKGQsYik7ZXx8ZC5hZGRFdmVudExpc3RlbmVyKGEsYywhMCksbS5fZGF0YShkLGIsKGV8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPW0uX2RhdGEoZCxiKS0xO2U/bS5fZGF0YShkLGIsZSk6KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGMsITApLG0uX3JlbW92ZURhdGEoZCxiKSl9fX0pLG0uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGc7aWYoIm9iamVjdCI9PXR5cGVvZiBhKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWN8fGIsYj12b2lkIDApO2ZvcihmIGluIGEpdGhpcy5vbihmLGIsYyxhW2ZdLGUpO3JldHVybiB0aGlzfWlmKG51bGw9PWMmJm51bGw9PWQ/KGQ9YixjPWI9dm9pZCAwKTpudWxsPT1kJiYoInN0cmluZyI9PXR5cGVvZiBiPyhkPWMsYz12b2lkIDApOihkPWMsYz1iLGI9dm9pZCAwKSksZD09PSExKWQ9YmE7ZWxzZSBpZighZClyZXR1cm4gdGhpcztyZXR1cm4gMT09PWUmJihnPWQsZD1mdW5jdGlvbihhKXtyZXR1cm4gbSgpLm9mZihhKSxnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZC5ndWlkPWcuZ3VpZHx8KGcuZ3VpZD1tLmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQuYWRkKHRoaXMsYSxkLGMsYil9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixtKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuKGI9PT0hMXx8ImZ1bmN0aW9uIj09dHlwZW9mIGIpJiYoYz1iLGI9dm9pZCAwKSxjPT09ITEmJihjPWJhKSx0aGlzLmVhY2goZnVuY3Rpb24oKXttLmV2ZW50LnJlbW92ZSh0aGlzLGEsYyxiKX0pfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQudHJpZ2dlcihhLGIsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzWzBdO3JldHVybiBjP20uZXZlbnQudHJpZ2dlcihhLGIsYywhMCk6dm9pZCAwfX0pO2Z1bmN0aW9uIGRhKGEpe3ZhciBiPWVhLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfXZhciBlYT0iYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxjYW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsZmE9LyBqUXVlcnlcZCs9Iig/Om51bGx8XGQrKSIvZyxnYT1uZXcgUmVnRXhwKCI8KD86IitlYSsiKVtcXHMvPl0iLCJpIiksaGE9L15ccysvLGlhPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksamE9LzwoW1x3Ol0rKS8sa2E9Lzx0Ym9keS9pLGxhPS88fCYjP1x3KzsvLG1hPS88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksbmE9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksb2E9L14kfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLHBhPS9edHJ1ZVwvKC4qKS8scWE9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLHJhPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0scGFyYW06WzEsIjxvYmplY3Q+IiwiPC9vYmplY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDprLmh0bWxTZXJpYWxpemU/WzAsIiIsIiJdOlsxLCJYPGRpdj4iLCI8L2Rpdj4iXX0sc2E9ZGEoeSksdGE9c2EuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7cmEub3B0Z3JvdXA9cmEub3B0aW9uLHJhLnRib2R5PXJhLnRmb290PXJhLmNvbGdyb3VwPXJhLmNhcHRpb249cmEudGhlYWQscmEudGg9cmEudGQ7ZnVuY3Rpb24gdWEoYSxiKXt2YXIgYyxkLGU9MCxmPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09Sz9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKGJ8fCIqIik6dHlwZW9mIGEucXVlcnlTZWxlY3RvckFsbCE9PUs/YS5xdWVyeVNlbGVjdG9yQWxsKGJ8fCIqIik6dm9pZCAwO2lmKCFmKWZvcihmPVtdLGM9YS5jaGlsZE5vZGVzfHxhO251bGwhPShkPWNbZV0pO2UrKykhYnx8bS5ub2RlTmFtZShkLGIpP2YucHVzaChkKTptLm1lcmdlKGYsdWEoZCxiKSk7cmV0dXJuIHZvaWQgMD09PWJ8fGImJm0ubm9kZU5hbWUoYSxiKT9tLm1lcmdlKFthXSxmKTpmfWZ1bmN0aW9uIHZhKGEpe1cudGVzdChhLnR5cGUpJiYoYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWQpfWZ1bmN0aW9uIHdhKGEsYil7cmV0dXJuIG0ubm9kZU5hbWUoYSwidGFibGUiKSYmbS5ub2RlTmFtZSgxMSE9PWIubm9kZVR5cGU/YjpiLmZpcnN0Q2hpbGQsInRyIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiB4YShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09bS5maW5kLmF0dHIoYSwidHlwZSIpKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24geWEoYSl7dmFyIGI9cGEuZXhlYyhhLnR5cGUpO3JldHVybiBiP2EudHlwZT1iWzFdOmEucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksYX1mdW5jdGlvbiB6YShhLGIpe2Zvcih2YXIgYyxkPTA7bnVsbCE9KGM9YVtkXSk7ZCsrKW0uX2RhdGEoYywiZ2xvYmFsRXZhbCIsIWJ8fG0uX2RhdGEoYltkXSwiZ2xvYmFsRXZhbCIpKX1mdW5jdGlvbiBBYShhLGIpe2lmKDE9PT1iLm5vZGVUeXBlJiZtLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxmPW0uX2RhdGEoYSksZz1tLl9kYXRhKGIsZiksaD1mLmV2ZW50cztpZihoKXtkZWxldGUgZy5oYW5kbGUsZy5ldmVudHM9e307Zm9yKGMgaW4gaClmb3IoZD0wLGU9aFtjXS5sZW5ndGg7ZT5kO2QrKyltLmV2ZW50LmFkZChiLGMsaFtjXVtkXSl9Zy5kYXRhJiYoZy5kYXRhPW0uZXh0ZW5kKHt9LGcuZGF0YSkpfX1mdW5jdGlvbiBCYShhLGIpe3ZhciBjLGQsZTtpZigxPT09Yi5ub2RlVHlwZSl7aWYoYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIWsubm9DbG9uZUV2ZW50JiZiW20uZXhwYW5kb10pe2U9bS5fZGF0YShiKTtmb3IoZCBpbiBlLmV2ZW50cyltLnJlbW92ZUV2ZW50KGIsZCxlLmhhbmRsZSk7Yi5yZW1vdmVBdHRyaWJ1dGUobS5leHBhbmRvKX0ic2NyaXB0Ij09PWMmJmIudGV4dCE9PWEudGV4dD8oeGEoYikudGV4dD1hLnRleHQseWEoYikpOiJvYmplY3QiPT09Yz8oYi5wYXJlbnROb2RlJiYoYi5vdXRlckhUTUw9YS5vdXRlckhUTUwpLGsuaHRtbDVDbG9uZSYmYS5pbm5lckhUTUwmJiFtLnRyaW0oYi5pbm5lckhUTUwpJiYoYi5pbm5lckhUTUw9YS5pbm5lckhUTUwpKToiaW5wdXQiPT09YyYmVy50ZXN0KGEudHlwZSk/KGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpOiJvcHRpb24iPT09Yz9iLmRlZmF1bHRTZWxlY3RlZD1iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOigiaW5wdXQiPT09Y3x8InRleHRhcmVhIj09PWMpJiYoYi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWUpfX1tLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaT1tLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKTtpZihrLmh0bWw1Q2xvbmV8fG0uaXNYTUxEb2MoYSl8fCFnYS50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/Zj1hLmNsb25lTm9kZSghMCk6KHRhLmlubmVySFRNTD1hLm91dGVySFRNTCx0YS5yZW1vdmVDaGlsZChmPXRhLmZpcnN0Q2hpbGQpKSwhKGsubm9DbG9uZUV2ZW50JiZrLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxtLmlzWE1MRG9jKGEpKSlmb3IoZD11YShmKSxoPXVhKGEpLGc9MDtudWxsIT0oZT1oW2ddKTsrK2cpZFtnXSYmQmEoZSxkW2ddKTtpZihiKWlmKGMpZm9yKGg9aHx8dWEoYSksZD1kfHx1YShmKSxnPTA7bnVsbCE9KGU9aFtnXSk7ZysrKUFhKGUsZFtnXSk7ZWxzZSBBYShhLGYpO3JldHVybiBkPXVhKGYsInNjcmlwdCIpLGQubGVuZ3RoPjAmJnphKGQsIWkmJnVhKGEsInNjcmlwdCIpKSxkPWg9ZT1udWxsLGZ9LGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlLGYsZyxoLGksaixsLG49YS5sZW5ndGgsbz1kYShiKSxwPVtdLHE9MDtuPnE7cSsrKWlmKGY9YVtxXSxmfHwwPT09ZilpZigib2JqZWN0Ij09PW0udHlwZShmKSltLm1lcmdlKHAsZi5ub2RlVHlwZT9bZl06Zik7ZWxzZSBpZihsYS50ZXN0KGYpKXtoPWh8fG8uYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KCJkaXYiKSksaT0oamEuZXhlYyhmKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxsPXJhW2ldfHxyYS5fZGVmYXVsdCxoLmlubmVySFRNTD1sWzFdK2YucmVwbGFjZShpYSwiPCQxPjwvJDI+IikrbFsyXSxlPWxbMF07d2hpbGUoZS0tKWg9aC5sYXN0Q2hpbGQ7aWYoIWsubGVhZGluZ1doaXRlc3BhY2UmJmhhLnRlc3QoZikmJnAucHVzaChiLmNyZWF0ZVRleHROb2RlKGhhLmV4ZWMoZilbMF0pKSwhay50Ym9keSl7Zj0idGFibGUiIT09aXx8a2EudGVzdChmKT8iPHRhYmxlPiIhPT1sWzFdfHxrYS50ZXN0KGYpPzA6aDpoLmZpcnN0Q2hpbGQsZT1mJiZmLmNoaWxkTm9kZXMubGVuZ3RoO3doaWxlKGUtLSltLm5vZGVOYW1lKGo9Zi5jaGlsZE5vZGVzW2VdLCJ0Ym9keSIpJiYhai5jaGlsZE5vZGVzLmxlbmd0aCYmZi5yZW1vdmVDaGlsZChqKX1tLm1lcmdlKHAsaC5jaGlsZE5vZGVzKSxoLnRleHRDb250ZW50PSIiO3doaWxlKGguZmlyc3RDaGlsZCloLnJlbW92ZUNoaWxkKGguZmlyc3RDaGlsZCk7aD1vLmxhc3RDaGlsZH1lbHNlIHAucHVzaChiLmNyZWF0ZVRleHROb2RlKGYpKTtoJiZvLnJlbW92ZUNoaWxkKGgpLGsuYXBwZW5kQ2hlY2tlZHx8bS5ncmVwKHVhKHAsImlucHV0IiksdmEpLHE9MDt3aGlsZShmPXBbcSsrXSlpZigoIWR8fC0xPT09bS5pbkFycmF5KGYsZCkpJiYoZz1tLmNvbnRhaW5zKGYub3duZXJEb2N1bWVudCxmKSxoPXVhKG8uYXBwZW5kQ2hpbGQoZiksInNjcmlwdCIpLGcmJnphKGgpLGMpKXtlPTA7d2hpbGUoZj1oW2UrK10pb2EudGVzdChmLnR5cGV8fCIiKSYmYy5wdXNoKGYpfXJldHVybiBoPW51bGwsb30sY2xlYW5EYXRhOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkLGUsZixnLGg9MCxpPW0uZXhwYW5kbyxqPW0uY2FjaGUsbD1rLmRlbGV0ZUV4cGFuZG8sbj1tLmV2ZW50LnNwZWNpYWw7bnVsbCE9KGQ9YVtoXSk7aCsrKWlmKChifHxtLmFjY2VwdERhdGEoZCkpJiYoZj1kW2ldLGc9ZiYmaltmXSkpe2lmKGcuZXZlbnRzKWZvcihlIGluIGcuZXZlbnRzKW5bZV0/bS5ldmVudC5yZW1vdmUoZCxlKTptLnJlbW92ZUV2ZW50KGQsZSxnLmhhbmRsZSk7altmXSYmKGRlbGV0ZSBqW2ZdLGw/ZGVsZXRlIGRbaV06dHlwZW9mIGQucmVtb3ZlQXR0cmlidXRlIT09Sz9kLnJlbW92ZUF0dHJpYnV0ZShpKTpkW2ldPW51bGwsYy5wdXNoKGYpKX19fSksbS5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9tLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHx5KS5jcmVhdGVUZXh0Tm9kZShhKSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj13YSh0aGlzLGEpO2IuYXBwZW5kQ2hpbGQoYSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPXdhKHRoaXMsYSk7Yi5pbnNlcnRCZWZvcmUoYSxiLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQ9YT9tLmZpbHRlcihhLHRoaXMpOnRoaXMsZT0wO251bGwhPShjPWRbZV0pO2UrKylifHwxIT09Yy5ub2RlVHlwZXx8bS5jbGVhbkRhdGEodWEoYykpLGMucGFyZW50Tm9kZSYmKGImJm0uY29udGFpbnMoYy5vd25lckRvY3VtZW50LGMpJiZ6YSh1YShjLCJzY3JpcHQiKSksYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO251bGwhPShhPXRoaXNbYl0pO2IrKyl7MT09PWEubm9kZVR5cGUmJm0uY2xlYW5EYXRhKHVhKGEsITEpKTt3aGlsZShhLmZpcnN0Q2hpbGQpYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2Eub3B0aW9ucyYmbS5ub2RlTmFtZShhLCJzZWxlY3QiKSYmKGEub3B0aW9ucy5sZW5ndGg9MCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bnVsbD09YT8hMTphLGI9bnVsbD09Yj9hOmIsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gbS5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF18fHt9LGM9MCxkPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWEpcmV0dXJuIDE9PT1iLm5vZGVUeXBlP2IuaW5uZXJIVE1MLnJlcGxhY2UoZmEsIiIpOnZvaWQgMDtpZighKCJzdHJpbmciIT10eXBlb2YgYXx8bWEudGVzdChhKXx8IWsuaHRtbFNlcmlhbGl6ZSYmZ2EudGVzdChhKXx8IWsubGVhZGluZ1doaXRlc3BhY2UmJmhhLnRlc3QoYSl8fHJhWyhqYS5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSkpe2E9YS5yZXBsYWNlKGlhLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtkPmM7YysrKWI9dGhpc1tjXXx8e30sMT09PWIubm9kZVR5cGUmJihtLmNsZWFuRGF0YSh1YShiLCExKSksYi5pbm5lckhUTUw9YSk7Yj0wfWNhdGNoKGUpe319YiYmdGhpcy5lbXB0eSgpLmFwcGVuZChhKX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYil7YT10aGlzLnBhcmVudE5vZGUsbS5jbGVhbkRhdGEodWEodGhpcykpLGEmJmEucmVwbGFjZUNoaWxkKGIsdGhpcyl9KSxhJiYoYS5sZW5ndGh8fGEubm9kZVR5cGUpP3RoaXM6dGhpcy5yZW1vdmUoKX0sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxiKXthPWUuYXBwbHkoW10sYSk7dmFyIGMsZCxmLGcsaCxpLGo9MCxsPXRoaXMubGVuZ3RoLG49dGhpcyxvPWwtMSxwPWFbMF0scT1tLmlzRnVuY3Rpb24ocCk7aWYocXx8bD4xJiYic3RyaW5nIj09dHlwZW9mIHAmJiFrLmNoZWNrQ2xvbmUmJm5hLnRlc3QocCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZD1uLmVxKGMpO3EmJihhWzBdPXAuY2FsbCh0aGlzLGMsZC5odG1sKCkpKSxkLmRvbU1hbmlwKGEsYil9KTtpZihsJiYoaT1tLmJ1aWxkRnJhZ21lbnQoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQsITEsdGhpcyksYz1pLmZpcnN0Q2hpbGQsMT09PWkuY2hpbGROb2Rlcy5sZW5ndGgmJihpPWMpLGMpKXtmb3IoZz1tLm1hcCh1YShpLCJzY3JpcHQiKSx4YSksZj1nLmxlbmd0aDtsPmo7aisrKWQ9aSxqIT09byYmKGQ9bS5jbG9uZShkLCEwLCEwKSxmJiZtLm1lcmdlKGcsdWEoZCwic2NyaXB0IikpKSxiLmNhbGwodGhpc1tqXSxkLGopO2lmKGYpZm9yKGg9Z1tnLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LG0ubWFwKGcseWEpLGo9MDtmPmo7aisrKWQ9Z1tqXSxvYS50ZXN0KGQudHlwZXx8IiIpJiYhbS5fZGF0YShkLCJnbG9iYWxFdmFsIikmJm0uY29udGFpbnMoaCxkKSYmKGQuc3JjP20uX2V2YWxVcmwmJm0uX2V2YWxVcmwoZC5zcmMpOm0uZ2xvYmFsRXZhbCgoZC50ZXh0fHxkLnRleHRDb250ZW50fHxkLmlubmVySFRNTHx8IiIpLnJlcGxhY2UocWEsIiIpKSk7aT1jPW51bGx9cmV0dXJuIHRoaXN9fSksbS5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXttLmZuW2FdPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPTAsZT1bXSxnPW0oYSksaD1nLmxlbmd0aC0xO2g+PWQ7ZCsrKWM9ZD09PWg/dGhpczp0aGlzLmNsb25lKCEwKSxtKGdbZF0pW2JdKGMpLGYuYXBwbHkoZSxjLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIENhLERhPXt9O2Z1bmN0aW9uIEVhKGIsYyl7dmFyIGQsZT1tKGMuY3JlYXRlRWxlbWVudChiKSkuYXBwZW5kVG8oYy5ib2R5KSxmPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUmJihkPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUoZVswXSkpP2QuZGlzcGxheTptLmNzcyhlWzBdLCJkaXNwbGF5Iik7cmV0dXJuIGUuZGV0YWNoKCksZn1mdW5jdGlvbiBGYShhKXt2YXIgYj15LGM9RGFbYV07cmV0dXJuIGN8fChjPUVhKGEsYiksIm5vbmUiIT09YyYmY3x8KENhPShDYXx8bSgiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPiIpKS5hcHBlbmRUbyhiLmRvY3VtZW50RWxlbWVudCksYj0oQ2FbMF0uY29udGVudFdpbmRvd3x8Q2FbMF0uY29udGVudERvY3VtZW50KS5kb2N1bWVudCxiLndyaXRlKCksYi5jbG9zZSgpLGM9RWEoYSxiKSxDYS5kZXRhY2goKSksRGFbYV09YyksY30hZnVuY3Rpb24oKXt2YXIgYTtrLnNocmlua1dyYXBCbG9ja3M9ZnVuY3Rpb24oKXtpZihudWxsIT1hKXJldHVybiBhO2E9ITE7dmFyIGIsYyxkO3JldHVybiBjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlPyhiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZD15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZCkuYXBwZW5kQ2hpbGQoYiksdHlwZW9mIGIuc3R5bGUuem9vbSE9PUsmJihiLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSkuc3R5bGUud2lkdGg9IjVweCIsYT0zIT09Yi5vZmZzZXRXaWR0aCksYy5yZW1vdmVDaGlsZChkKSxhKTp2b2lkIDB9fSgpO3ZhciBHYT0vXm1hcmdpbi8sSGE9bmV3IFJlZ0V4cCgiXigiK1MrIikoPyFweClbYS16JV0rJCIsImkiKSxJYSxKYSxLYT0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87YS5nZXRDb21wdXRlZFN0eWxlPyhJYT1mdW5jdGlvbihiKXtyZXR1cm4gYi5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Lm9wZW5lcj9iLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfSxKYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fElhKGEpLGc9Yz9jLmdldFByb3BlcnR5VmFsdWUoYil8fGNbYl06dm9pZCAwLGMmJigiIiE9PWd8fG0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfHwoZz1tLnN0eWxlKGEsYikpLEhhLnRlc3QoZykmJkdhLnRlc3QoYikmJihkPWgud2lkdGgsZT1oLm1pbldpZHRoLGY9aC5tYXhXaWR0aCxoLm1pbldpZHRoPWgubWF4V2lkdGg9aC53aWR0aD1nLGc9Yy53aWR0aCxoLndpZHRoPWQsaC5taW5XaWR0aD1lLGgubWF4V2lkdGg9ZikpLHZvaWQgMD09PWc/ZzpnKyIifSk6eS5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlJiYoSWE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3VycmVudFN0eWxlfSxKYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fElhKGEpLGc9Yz9jW2JdOnZvaWQgMCxudWxsPT1nJiZoJiZoW2JdJiYoZz1oW2JdKSxIYS50ZXN0KGcpJiYhS2EudGVzdChiKSYmKGQ9aC5sZWZ0LGU9YS5ydW50aW1lU3R5bGUsZj1lJiZlLmxlZnQsZiYmKGUubGVmdD1hLmN1cnJlbnRTdHlsZS5sZWZ0KSxoLmxlZnQ9ImZvbnRTaXplIj09PWI/IjFlbSI6ZyxnPWgucGl4ZWxMZWZ0KyJweCIsaC5sZWZ0PWQsZiYmKGUubGVmdD1mKSksdm9pZCAwPT09Zz9nOmcrIiJ8fCJhdXRvIn0pO2Z1bmN0aW9uIExhKGEsYil7cmV0dXJue2dldDpmdW5jdGlvbigpe3ZhciBjPWEoKTtpZihudWxsIT1jKXJldHVybiBjP3ZvaWQgZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD1iKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0hZnVuY3Rpb24oKXt2YXIgYixjLGQsZSxmLGcsaDtpZihiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYi5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0sYz1kJiZkLnN0eWxlKXtjLmNzc1RleHQ9ImZsb2F0OmxlZnQ7b3BhY2l0eTouNSIsay5vcGFjaXR5PSIwLjUiPT09Yy5vcGFjaXR5LGsuY3NzRmxvYXQ9ISFjLmNzc0Zsb2F0LGIuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixiLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsay5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWIuc3R5bGUuYmFja2dyb3VuZENsaXAsay5ib3hTaXppbmc9IiI9PT1jLmJveFNpemluZ3x8IiI9PT1jLk1vekJveFNpemluZ3x8IiI9PT1jLldlYmtpdEJveFNpemluZyxtLmV4dGVuZChrLHtyZWxpYWJsZUhpZGRlbk9mZnNldHM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09ZyYmaSgpLGd9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWYmJmkoKSxmfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWUmJmkoKSxlfSxyZWxpYWJsZU1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWgmJmkoKSxofX0pO2Z1bmN0aW9uIGkoKXt2YXIgYixjLGQsaTtjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlJiYoYj15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxkLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2JvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7dG9wOjA7bGVmdDotOTk5OXB4IixjLmFwcGVuZENoaWxkKGQpLmFwcGVuZENoaWxkKGIpLGIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDoxJTt0b3A6MSU7Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo0cHg7cG9zaXRpb246YWJzb2x1dGUiLGU9Zj0hMSxoPSEwLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKGU9IjElIiE9PShhLmdldENvbXB1dGVkU3R5bGUoYixudWxsKXx8e30pLnRvcCxmPSI0cHgiPT09KGEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfHx7d2lkdGg6IjRweCJ9KS53aWR0aCxpPWIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSksaS5zdHlsZS5jc3NUZXh0PWIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowIixpLnN0eWxlLm1hcmdpblJpZ2h0PWkuc3R5bGUud2lkdGg9IjAiLGIuc3R5bGUud2lkdGg9IjFweCIsaD0hcGFyc2VGbG9hdCgoYS5nZXRDb21wdXRlZFN0eWxlKGksbnVsbCl8fHt9KS5tYXJnaW5SaWdodCksYi5yZW1vdmVDaGlsZChpKSksYi5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGk9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxpWzBdLnN0eWxlLmNzc1RleHQ9Im1hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtkaXNwbGF5Om5vbmUiLGc9MD09PWlbMF0ub2Zmc2V0SGVpZ2h0LGcmJihpWzBdLnN0eWxlLmRpc3BsYXk9IiIsaVsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixnPTA9PT1pWzBdLm9mZnNldEhlaWdodCksYy5yZW1vdmVDaGlsZChkKSl9fX0oKSxtLnN3YXA9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPXt9O2ZvcihmIGluIGIpZ1tmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuYXBwbHkoYSxkfHxbXSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWdbZl07cmV0dXJuIGV9O3ZhciBNYT0vYWxwaGFcKFteKV0qXCkvaSxOYT0vb3BhY2l0eVxzKj1ccyooW14pXSopLyxPYT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sUGE9bmV3IFJlZ0V4cCgiXigiK1MrIikoLiopJCIsImkiKSxRYT1uZXcgUmVnRXhwKCJeKFsrLV0pPSgiK1MrIikiLCJpIiksUmE9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LFNhPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifSxUYT1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2Z1bmN0aW9uIFVhKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKSxkPWIsZT1UYS5sZW5ndGg7d2hpbGUoZS0tKWlmKGI9VGFbZV0rYyxiIGluIGEpcmV0dXJuIGI7cmV0dXJuIGR9ZnVuY3Rpb24gVmEoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109bS5fZGF0YShkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlUoZCkmJihmW2ddPW0uX2RhdGEoZCwib2xkZGlzcGxheSIsRmEoZC5ub2RlTmFtZSkpKSk6KGU9VShkKSwoYyYmIm5vbmUiIT09Y3x8IWUpJiZtLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGU/YzptLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfWZ1bmN0aW9uIFdhKGEsYixjKXt2YXIgZD1QYS5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIFhhKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1tLmNzcyhhLGMrVFtmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gWWEoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPUlhKGEpLGc9ay5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PW0uY3NzKGEsImJveFNpemluZyIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT1KYShhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLEhhLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYoay5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK1hhKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZikrInB4In1tLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPUphKGEsIm9wYWNpdHkiKTtyZXR1cm4iIj09PWM/IjEiOmN9fX19LGNzc051bWJlcjp7Y29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6ay5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1tLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7aWYoYj1tLmNzc1Byb3BzW2hdfHwobS5jc3NQcm9wc1toXT1VYShpLGgpKSxnPW0uY3NzSG9va3NbYl18fG0uY3NzSG9va3NbaF0sdm9pZCAwPT09YylyZXR1cm4gZyYmImdldCJpbiBnJiZ2b2lkIDAhPT0oZT1nLmdldChhLCExLGQpKT9lOmlbYl07aWYoZj10eXBlb2YgYywic3RyaW5nIj09PWYmJihlPVFhLmV4ZWMoYykpJiYoYz0oZVsxXSsxKSplWzJdK3BhcnNlRmxvYXQobS5jc3MoYSxiKSksZj0ibnVtYmVyIiksbnVsbCE9YyYmYz09PWMmJigibnVtYmVyIiE9PWZ8fG0uY3NzTnVtYmVyW2hdfHwoYys9InB4Iiksay5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLCEoZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpKSkpdHJ5e2lbYl09Y31jYXRjaChqKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoPW0uY2FtZWxDYXNlKGIpO3JldHVybiBiPW0uY3NzUHJvcHNbaF18fChtLmNzc1Byb3BzW2hdPVVhKGEuc3R5bGUsaCkpLGc9bS5jc3NIb29rc1tiXXx8bS5jc3NIb29rc1toXSxnJiYiZ2V0ImluIGcmJihmPWcuZ2V0KGEsITAsYykpLHZvaWQgMD09PWYmJihmPUphKGEsYixkKSksIm5vcm1hbCI9PT1mJiZiIGluIFNhJiYoZj1TYVtiXSksIiI9PT1jfHxjPyhlPXBhcnNlRmxvYXQoZiksYz09PSEwfHxtLmlzTnVtZXJpYyhlKT9lfHwwOmYpOmZ9fSksbS5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGM/T2EudGVzdChtLmNzcyhhLCJkaXNwbGF5IikpJiYwPT09YS5vZmZzZXRXaWR0aD9tLnN3YXAoYSxSYSxmdW5jdGlvbigpe3JldHVybiBZYShhLGIsZCl9KTpZYShhLGIsZCk6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWQmJklhKGEpO3JldHVybiBXYShhLGMsZD9YYShhLGIsZCxrLmJveFNpemluZyYmImJvcmRlci1ib3giPT09bS5jc3MoYSwiYm94U2l6aW5nIiwhMSxlKSxlKTowKX19fSksay5vcGFjaXR5fHwobS5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gTmEudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPW0uaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrMTAwKmIrIikiOiIiLGY9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MSwoYj49MXx8IiI9PT1iKSYmIiI9PT1tLnRyaW0oZi5yZXBsYWNlKE1hLCIiKSkmJmMucmVtb3ZlQXR0cmlidXRlJiYoYy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09Ynx8ZCYmIWQuZmlsdGVyKXx8KGMuZmlsdGVyPU1hLnRlc3QoZik/Zi5yZXBsYWNlKE1hLGUpOmYrIiAiK2UpfX0pLG0uY3NzSG9va3MubWFyZ2luUmlnaHQ9TGEoay5yZWxpYWJsZU1hcmdpblJpZ2h0LGZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/bS5zd2FwKGEse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LEphLFthLCJtYXJnaW5SaWdodCJdKTp2b2lkIDB9KSxtLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYStiXT17ZXhwYW5kOmZ1bmN0aW9uKGMpe2Zvcih2YXIgZD0wLGU9e30sZj0ic3RyaW5nIj09dHlwZW9mIGM/Yy5zcGxpdCgiICIpOltjXTs0PmQ7ZCsrKWVbYStUW2RdK2JdPWZbZF18fGZbZC0yXXx8ZlswXTtyZXR1cm4gZX19LEdhLnRlc3QoYSl8fChtLmNzc0hvb2tzW2ErYl0uc2V0PVdhKX0pLG0uZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9e30sZz0wO2lmKG0uaXNBcnJheShiKSl7Zm9yKGQ9SWEoYSksZT1iLmxlbmd0aDtlPmc7ZysrKWZbYltnXV09bS5jc3MoYSxiW2ddLCExLGQpO3JldHVybiBmfXJldHVybiB2b2lkIDAhPT1jP20uc3R5bGUoYSxiLGMpOm0uY3NzKGEsYil9LGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oYSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYT9hP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe1UodGhpcyk/bSh0aGlzKS5zaG93KCk6bSh0aGlzKS5oaWRlKCl9KX19KTtmdW5jdGlvbiBaYShhLGIsYyxkLGUpewpyZXR1cm4gbmV3IFphLnByb3RvdHlwZS5pbml0KGEsYixjLGQsZSl9bS5Ud2Vlbj1aYSxaYS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlphLGluaXQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3RoaXMuZWxlbT1hLHRoaXMucHJvcD1jLHRoaXMuZWFzaW5nPWV8fCJzd2luZyIsdGhpcy5vcHRpb25zPWIsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPWQsdGhpcy51bml0PWZ8fChtLmNzc051bWJlcltjXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGEmJmEuZ2V0P2EuZ2V0KHRoaXMpOlphLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihhKXt2YXIgYixjPVphLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9Yj1tLmVhc2luZ1t0aGlzLmVhc2luZ10oYSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qYSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz1iPWEsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKmIrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksYyYmYy5zZXQ/Yy5zZXQodGhpcyk6WmEucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0sWmEucHJvdG90eXBlLmluaXQucHJvdG90eXBlPVphLnByb3RvdHlwZSxaYS5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIG51bGw9PWEuZWxlbVthLnByb3BdfHxhLmVsZW0uc3R5bGUmJm51bGwhPWEuZWxlbS5zdHlsZVthLnByb3BdPyhiPW0uY3NzKGEuZWxlbSxhLnByb3AsIiIpLGImJiJhdXRvIiE9PWI/YjowKTphLmVsZW1bYS5wcm9wXX0sc2V0OmZ1bmN0aW9uKGEpe20uZnguc3RlcFthLnByb3BdP20uZnguc3RlcFthLnByb3BdKGEpOmEuZWxlbS5zdHlsZSYmKG51bGwhPWEuZWxlbS5zdHlsZVttLmNzc1Byb3BzW2EucHJvcF1dfHxtLmNzc0hvb2tzW2EucHJvcF0pP20uc3R5bGUoYS5lbGVtLGEucHJvcCxhLm5vdythLnVuaXQpOmEuZWxlbVthLnByb3BdPWEubm93fX19LFphLnByb3BIb29rcy5zY3JvbGxUb3A9WmEucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihhKXthLmVsZW0ubm9kZVR5cGUmJmEuZWxlbS5wYXJlbnROb2RlJiYoYS5lbGVtW2EucHJvcF09YS5ub3cpfX0sbS5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sc3dpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuLjUtTWF0aC5jb3MoYSpNYXRoLlBJKS8yfX0sbS5meD1aYS5wcm90b3R5cGUuaW5pdCxtLmZ4LnN0ZXA9e307dmFyICRhLF9hLGFiPS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxiYj1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrUysiKShbYS16JV0qKSQiLCJpIiksY2I9L3F1ZXVlSG9va3MkLyxkYj1baWJdLGViPXsiKiI6W2Z1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5jcmVhdGVUd2VlbihhLGIpLGQ9Yy5jdXIoKSxlPWJiLmV4ZWMoYiksZj1lJiZlWzNdfHwobS5jc3NOdW1iZXJbYV0/IiI6InB4IiksZz0obS5jc3NOdW1iZXJbYV18fCJweCIhPT1mJiYrZCkmJmJiLmV4ZWMobS5jc3MoYy5lbGVtLGEpKSxoPTEsaT0yMDtpZihnJiZnWzNdIT09Zil7Zj1mfHxnWzNdLGU9ZXx8W10sZz0rZHx8MTtkbyBoPWh8fCIuNSIsZy89aCxtLnN0eWxlKGMuZWxlbSxhLGcrZik7d2hpbGUoaCE9PShoPWMuY3VyKCkvZCkmJjEhPT1oJiYtLWkpfXJldHVybiBlJiYoZz1jLnN0YXJ0PStnfHwrZHx8MCxjLnVuaXQ9ZixjLmVuZD1lWzFdP2crKGVbMV0rMSkqZVsyXTorZVsyXSksY31dfTtmdW5jdGlvbiBmYigpe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7JGE9dm9pZCAwfSksJGE9bS5ub3coKX1mdW5jdGlvbiBnYihhLGIpe3ZhciBjLGQ9e2hlaWdodDphfSxlPTA7Zm9yKGI9Yj8xOjA7ND5lO2UrPTItYiljPVRbZV0sZFsibWFyZ2luIitjXT1kWyJwYWRkaW5nIitjXT1hO3JldHVybiBiJiYoZC5vcGFjaXR5PWQud2lkdGg9YSksZH1mdW5jdGlvbiBoYihhLGIsYyl7Zm9yKHZhciBkLGU9KGViW2JdfHxbXSkuY29uY2F0KGViWyIqIl0pLGY9MCxnPWUubGVuZ3RoO2c+ZjtmKyspaWYoZD1lW2ZdLmNhbGwoYyxiLGEpKXJldHVybiBkfWZ1bmN0aW9uIGliKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixsLG49dGhpcyxvPXt9LHA9YS5zdHlsZSxxPWEubm9kZVR5cGUmJlUoYSkscj1tLl9kYXRhKGEsImZ4c2hvdyIpO2MucXVldWV8fChoPW0uX3F1ZXVlSG9va3MoYSwiZngiKSxudWxsPT1oLnVucXVldWVkJiYoaC51bnF1ZXVlZD0wLGk9aC5lbXB0eS5maXJlLGguZW1wdHkuZmlyZT1mdW5jdGlvbigpe2gudW5xdWV1ZWR8fGkoKX0pLGgudW5xdWV1ZWQrKyxuLmFsd2F5cyhmdW5jdGlvbigpe24uYWx3YXlzKGZ1bmN0aW9uKCl7aC51bnF1ZXVlZC0tLG0ucXVldWUoYSwiZngiKS5sZW5ndGh8fGguZW1wdHkuZmlyZSgpfSl9KSksMT09PWEubm9kZVR5cGUmJigiaGVpZ2h0ImluIGJ8fCJ3aWR0aCJpbiBiKSYmKGMub3ZlcmZsb3c9W3Aub3ZlcmZsb3cscC5vdmVyZmxvd1gscC5vdmVyZmxvd1ldLGo9bS5jc3MoYSwiZGlzcGxheSIpLGw9Im5vbmUiPT09aj9tLl9kYXRhKGEsIm9sZGRpc3BsYXkiKXx8RmEoYS5ub2RlTmFtZSk6aiwiaW5saW5lIj09PWwmJiJub25lIj09PW0uY3NzKGEsImZsb2F0IikmJihrLmlubGluZUJsb2NrTmVlZHNMYXlvdXQmJiJpbmxpbmUiIT09RmEoYS5ub2RlTmFtZSk/cC56b29tPTE6cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksYy5vdmVyZmxvdyYmKHAub3ZlcmZsb3c9ImhpZGRlbiIsay5zaHJpbmtXcmFwQmxvY2tzKCl8fG4uYWx3YXlzKGZ1bmN0aW9uKCl7cC5vdmVyZmxvdz1jLm92ZXJmbG93WzBdLHAub3ZlcmZsb3dYPWMub3ZlcmZsb3dbMV0scC5vdmVyZmxvd1k9Yy5vdmVyZmxvd1syXX0pKTtmb3IoZCBpbiBiKWlmKGU9YltkXSxhYi5leGVjKGUpKXtpZihkZWxldGUgYltkXSxmPWZ8fCJ0b2dnbGUiPT09ZSxlPT09KHE/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PWV8fCFyfHx2b2lkIDA9PT1yW2RdKWNvbnRpbnVlO3E9ITB9b1tkXT1yJiZyW2RdfHxtLnN0eWxlKGEsZCl9ZWxzZSBqPXZvaWQgMDtpZihtLmlzRW1wdHlPYmplY3QobykpImlubGluZSI9PT0oIm5vbmUiPT09aj9GYShhLm5vZGVOYW1lKTpqKSYmKHAuZGlzcGxheT1qKTtlbHNle3I/ImhpZGRlbiJpbiByJiYocT1yLmhpZGRlbik6cj1tLl9kYXRhKGEsImZ4c2hvdyIse30pLGYmJihyLmhpZGRlbj0hcSkscT9tKGEpLnNob3coKTpuLmRvbmUoZnVuY3Rpb24oKXttKGEpLmhpZGUoKX0pLG4uZG9uZShmdW5jdGlvbigpe3ZhciBiO20uX3JlbW92ZURhdGEoYSwiZnhzaG93Iik7Zm9yKGIgaW4gbyltLnN0eWxlKGEsYixvW2JdKX0pO2ZvcihkIGluIG8pZz1oYihxP3JbZF06MCxkLG4pLGQgaW4gcnx8KHJbZF09Zy5zdGFydCxxJiYoZy5lbmQ9Zy5zdGFydCxnLnN0YXJ0PSJ3aWR0aCI9PT1kfHwiaGVpZ2h0Ij09PWQ/MTowKSl9fWZ1bmN0aW9uIGpiKGEsYil7dmFyIGMsZCxlLGYsZztmb3IoYyBpbiBhKWlmKGQ9bS5jYW1lbENhc2UoYyksZT1iW2RdLGY9YVtjXSxtLmlzQXJyYXkoZikmJihlPWZbMV0sZj1hW2NdPWZbMF0pLGMhPT1kJiYoYVtkXT1mLGRlbGV0ZSBhW2NdKSxnPW0uY3NzSG9va3NbZF0sZyYmImV4cGFuZCJpbiBnKXtmPWcuZXhwYW5kKGYpLGRlbGV0ZSBhW2RdO2ZvcihjIGluIGYpYyBpbiBhfHwoYVtjXT1mW2NdLGJbY109ZSl9ZWxzZSBiW2RdPWV9ZnVuY3Rpb24ga2IoYSxiLGMpe3ZhciBkLGUsZj0wLGc9ZGIubGVuZ3RoLGg9bS5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSBpLmVsZW19KSxpPWZ1bmN0aW9uKCl7aWYoZSlyZXR1cm4hMTtmb3IodmFyIGI9JGF8fGZiKCksYz1NYXRoLm1heCgwLGouc3RhcnRUaW1lK2ouZHVyYXRpb24tYiksZD1jL2ouZHVyYXRpb258fDAsZj0xLWQsZz0wLGk9ai50d2VlbnMubGVuZ3RoO2k+ZztnKyspai50d2VlbnNbZ10ucnVuKGYpO3JldHVybiBoLm5vdGlmeVdpdGgoYSxbaixmLGNdKSwxPmYmJmk/YzooaC5yZXNvbHZlV2l0aChhLFtqXSksITEpfSxqPWgucHJvbWlzZSh7ZWxlbTphLHByb3BzOm0uZXh0ZW5kKHt9LGIpLG9wdHM6bS5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e319LGMpLG9yaWdpbmFsUHJvcGVydGllczpiLG9yaWdpbmFsT3B0aW9uczpjLHN0YXJ0VGltZTokYXx8ZmIoKSxkdXJhdGlvbjpjLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihiLGMpe3ZhciBkPW0uVHdlZW4oYSxqLm9wdHMsYixjLGoub3B0cy5zcGVjaWFsRWFzaW5nW2JdfHxqLm9wdHMuZWFzaW5nKTtyZXR1cm4gai50d2VlbnMucHVzaChkKSxkfSxzdG9wOmZ1bmN0aW9uKGIpe3ZhciBjPTAsZD1iP2oudHdlZW5zLmxlbmd0aDowO2lmKGUpcmV0dXJuIHRoaXM7Zm9yKGU9ITA7ZD5jO2MrKylqLnR3ZWVuc1tjXS5ydW4oMSk7cmV0dXJuIGI/aC5yZXNvbHZlV2l0aChhLFtqLGJdKTpoLnJlamVjdFdpdGgoYSxbaixiXSksdGhpc319KSxrPWoucHJvcHM7Zm9yKGpiKGssai5vcHRzLnNwZWNpYWxFYXNpbmcpO2c+ZjtmKyspaWYoZD1kYltmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIGQ7cmV0dXJuIG0ubWFwKGssaGIsaiksbS5pc0Z1bmN0aW9uKGoub3B0cy5zdGFydCkmJmoub3B0cy5zdGFydC5jYWxsKGEsaiksbS5meC50aW1lcihtLmV4dGVuZChpLHtlbGVtOmEsYW5pbTpqLHF1ZXVlOmoub3B0cy5xdWV1ZX0pKSxqLnByb2dyZXNzKGoub3B0cy5wcm9ncmVzcykuZG9uZShqLm9wdHMuZG9uZSxqLm9wdHMuY29tcGxldGUpLmZhaWwoai5vcHRzLmZhaWwpLmFsd2F5cyhqLm9wdHMuYWx3YXlzKX1tLkFuaW1hdGlvbj1tLmV4dGVuZChrYix7dHdlZW5lcjpmdW5jdGlvbihhLGIpe20uaXNGdW5jdGlvbihhKT8oYj1hLGE9WyIqIl0pOmE9YS5zcGxpdCgiICIpO2Zvcih2YXIgYyxkPTAsZT1hLmxlbmd0aDtlPmQ7ZCsrKWM9YVtkXSxlYltjXT1lYltjXXx8W10sZWJbY10udW5zaGlmdChiKX0scHJlZmlsdGVyOmZ1bmN0aW9uKGEsYil7Yj9kYi51bnNoaWZ0KGEpOmRiLnB1c2goYSl9fSksbS5zcGVlZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmIm9iamVjdCI9PXR5cGVvZiBhP20uZXh0ZW5kKHt9LGEpOntjb21wbGV0ZTpjfHwhYyYmYnx8bS5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmMmJmJ8fGImJiFtLmlzRnVuY3Rpb24oYikmJmJ9O3JldHVybiBkLmR1cmF0aW9uPW0uZngub2ZmPzA6Im51bWJlciI9PXR5cGVvZiBkLmR1cmF0aW9uP2QuZHVyYXRpb246ZC5kdXJhdGlvbiBpbiBtLmZ4LnNwZWVkcz9tLmZ4LnNwZWVkc1tkLmR1cmF0aW9uXTptLmZ4LnNwZWVkcy5fZGVmYXVsdCwobnVsbD09ZC5xdWV1ZXx8ZC5xdWV1ZT09PSEwKSYmKGQucXVldWU9ImZ4IiksZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKCl7bS5pc0Z1bmN0aW9uKGQub2xkKSYmZC5vbGQuY2FsbCh0aGlzKSxkLnF1ZXVlJiZtLmRlcXVldWUodGhpcyxkLnF1ZXVlKX0sZH0sbS5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5maWx0ZXIoVSkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpifSxhLGMsZCl9LGFuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bS5pc0VtcHR5T2JqZWN0KGEpLGY9bS5zcGVlZChiLGMsZCksZz1mdW5jdGlvbigpe3ZhciBiPWtiKHRoaXMsbS5leHRlbmQoe30sYSksZik7KGV8fG0uX2RhdGEodGhpcywiZmluaXNoIikpJiZiLnN0b3AoITApfTtyZXR1cm4gZy5maW5pc2g9ZyxlfHxmLnF1ZXVlPT09ITE/dGhpcy5lYWNoKGcpOnRoaXMucXVldWUoZi5xdWV1ZSxnKX0sc3RvcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5zdG9wO2RlbGV0ZSBhLnN0b3AsYihjKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBhJiYoYz1iLGI9YSxhPXZvaWQgMCksYiYmYSE9PSExJiZ0aGlzLnF1ZXVlKGF8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPSEwLGU9bnVsbCE9YSYmYSsicXVldWVIb29rcyIsZj1tLnRpbWVycyxnPW0uX2RhdGEodGhpcyk7aWYoZSlnW2VdJiZnW2VdLnN0b3AmJmQoZ1tlXSk7ZWxzZSBmb3IoZSBpbiBnKWdbZV0mJmdbZV0uc3RvcCYmY2IudGVzdChlKSYmZChnW2VdKTtmb3IoZT1mLmxlbmd0aDtlLS07KWZbZV0uZWxlbSE9PXRoaXN8fG51bGwhPWEmJmZbZV0ucXVldWUhPT1hfHwoZltlXS5hbmltLnN0b3AoYyksYj0hMSxmLnNwbGljZShlLDEpKTsoYnx8IWMpJiZtLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1tLl9kYXRhKHRoaXMpLGQ9Y1thKyJxdWV1ZSJdLGU9Y1thKyJxdWV1ZUhvb2tzIl0sZj1tLnRpbWVycyxnPWQ/ZC5sZW5ndGg6MDtmb3IoYy5maW5pc2g9ITAsbS5xdWV1ZSh0aGlzLGEsW10pLGUmJmUuc3RvcCYmZS5zdG9wLmNhbGwodGhpcywhMCksYj1mLmxlbmd0aDtiLS07KWZbYl0uZWxlbT09PXRoaXMmJmZbYl0ucXVldWU9PT1hJiYoZltiXS5hbmltLnN0b3AoITApLGYuc3BsaWNlKGIsMSkpO2ZvcihiPTA7Zz5iO2IrKylkW2JdJiZkW2JdLmZpbmlzaCYmZFtiXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgYy5maW5pc2h9KX19KSxtLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGEsYil7dmFyIGM9bS5mbltiXTttLmZuW2JdPWZ1bmN0aW9uKGEsZCxlKXtyZXR1cm4gbnVsbD09YXx8ImJvb2xlYW4iPT10eXBlb2YgYT9jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoZ2IoYiwhMCksYSxkLGUpfX0pLG0uZWFjaCh7c2xpZGVEb3duOmdiKCJzaG93Iiksc2xpZGVVcDpnYigiaGlkZSIpLHNsaWRlVG9nZ2xlOmdiKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7bS5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxtLnRpbWVycz1bXSxtLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgYSxiPW0udGltZXJzLGM9MDtmb3IoJGE9bS5ub3coKTtjPGIubGVuZ3RoO2MrKylhPWJbY10sYSgpfHxiW2NdIT09YXx8Yi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxtLmZ4LnN0b3AoKSwkYT12b2lkIDB9LG0uZngudGltZXI9ZnVuY3Rpb24oYSl7bS50aW1lcnMucHVzaChhKSxhKCk/bS5meC5zdGFydCgpOm0udGltZXJzLnBvcCgpfSxtLmZ4LmludGVydmFsPTEzLG0uZnguc3RhcnQ9ZnVuY3Rpb24oKXtfYXx8KF9hPXNldEludGVydmFsKG0uZngudGljayxtLmZ4LmludGVydmFsKSl9LG0uZnguc3RvcD1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoX2EpLF9hPW51bGx9LG0uZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LG0uZm4uZGVsYXk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1tLmZ4P20uZnguc3BlZWRzW2FdfHxhOmEsYj1ifHwiZngiLHRoaXMucXVldWUoYixmdW5jdGlvbihiLGMpe3ZhciBkPXNldFRpbWVvdXQoYixhKTtjLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZCl9fSl9LGZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZTtiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYi5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxjPXkuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksZT1jLmFwcGVuZENoaWxkKHkuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSxkLnN0eWxlLmNzc1RleHQ9InRvcDoxcHgiLGsuZ2V0U2V0QXR0cmlidXRlPSJ0IiE9PWIuY2xhc3NOYW1lLGsuc3R5bGU9L3RvcC8udGVzdChkLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksay5ocmVmTm9ybWFsaXplZD0iL2EiPT09ZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSxrLmNoZWNrT249ISFhLnZhbHVlLGsub3B0U2VsZWN0ZWQ9ZS5zZWxlY3RlZCxrLmVuY3R5cGU9ISF5LmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGMuZGlzYWJsZWQ9ITAsay5vcHREaXNhYmxlZD0hZS5kaXNhYmxlZCxhPXkuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxhLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSxrLmlucHV0PSIiPT09YS5nZXRBdHRyaWJ1dGUoInZhbHVlIiksYS52YWx1ZT0idCIsYS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGsucmFkaW9WYWx1ZT0idCI9PT1hLnZhbHVlfSgpO3ZhciBsYj0vXHIvZzttLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlPXRoaXNbMF07e2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGQ9bS5pc0Z1bmN0aW9uKGEpLHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZTsxPT09dGhpcy5ub2RlVHlwZSYmKGU9ZD9hLmNhbGwodGhpcyxjLG0odGhpcykudmFsKCkpOmEsbnVsbD09ZT9lPSIiOiJudW1iZXIiPT10eXBlb2YgZT9lKz0iIjptLmlzQXJyYXkoZSkmJihlPW0ubWFwKGUsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6YSsiIn0pKSxiPW0udmFsSG9va3NbdGhpcy50eXBlXXx8bS52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJzZXQiaW4gYiYmdm9pZCAwIT09Yi5zZXQodGhpcyxlLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1lKSl9KTtpZihlKXJldHVybiBiPW0udmFsSG9va3NbZS50eXBlXXx8bS52YWxIb29rc1tlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJnZXQiaW4gYiYmdm9pZCAwIT09KGM9Yi5nZXQoZSwidmFsdWUiKSk/YzooYz1lLnZhbHVlLCJzdHJpbmciPT10eXBlb2YgYz9jLnJlcGxhY2UobGIsIiIpOm51bGw9PWM/IiI6Yyl9fX0pLG0uZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9bS5maW5kLmF0dHIoYSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9Yj9iOm0udHJpbShtLnRleHQoYSkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGMsZD1hLm9wdGlvbnMsZT1hLnNlbGVjdGVkSW5kZXgsZj0ic2VsZWN0LW9uZSI9PT1hLnR5cGV8fDA+ZSxnPWY/bnVsbDpbXSxoPWY/ZSsxOmQubGVuZ3RoLGk9MD5lP2g6Zj9lOjA7aD5pO2krKylpZihjPWRbaV0sISghYy5zZWxlY3RlZCYmaSE9PWV8fChrLm9wdERpc2FibGVkP2MuZGlzYWJsZWQ6bnVsbCE9PWMuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpKXx8Yy5wYXJlbnROb2RlLmRpc2FibGVkJiZtLm5vZGVOYW1lKGMucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKGI9bShjKS52YWwoKSxmKXJldHVybiBiO2cucHVzaChiKX1yZXR1cm4gZ30sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPWEub3B0aW9ucyxmPW0ubWFrZUFycmF5KGIpLGc9ZS5sZW5ndGg7d2hpbGUoZy0tKWlmKGQ9ZVtnXSxtLmluQXJyYXkobS52YWxIb29rcy5vcHRpb24uZ2V0KGQpLGYpPj0wKXRyeXtkLnNlbGVjdGVkPWM9ITB9Y2F0Y2goaCl7ZC5zY3JvbGxIZWlnaHR9ZWxzZSBkLnNlbGVjdGVkPSExO3JldHVybiBjfHwoYS5zZWxlY3RlZEluZGV4PS0xKSxlfX19fSksbS5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7bS52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uaXNBcnJheShiKT9hLmNoZWNrZWQ9bS5pbkFycmF5KG0oYSkudmFsKCksYik+PTA6dm9pZCAwfX0say5jaGVja09ufHwobS52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmEudmFsdWV9KX0pO3ZhciBtYixuYixvYj1tLmV4cHIuYXR0ckhhbmRsZSxwYj0vXig/OmNoZWNrZWR8c2VsZWN0ZWQpJC9pLHFiPWsuZ2V0U2V0QXR0cmlidXRlLHJiPWsuaW5wdXQ7bS5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLG0uYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bS5yZW1vdmVBdHRyKHRoaXMsYSl9KX19KSxtLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoYSYmMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4gdHlwZW9mIGEuZ2V0QXR0cmlidXRlPT09Sz9tLnByb3AoYSxiLGMpOigxPT09ZiYmbS5pc1hNTERvYyhhKXx8KGI9Yi50b0xvd2VyQ2FzZSgpLGQ9bS5hdHRySG9va3NbYl18fChtLmV4cHIubWF0Y2guYm9vbC50ZXN0KGIpP25iOm1iKSksdm9pZCAwPT09Yz9kJiYiZ2V0ImluIGQmJm51bGwhPT0oZT1kLmdldChhLGIpKT9lOihlPW0uZmluZC5hdHRyKGEsYiksbnVsbD09ZT92b2lkIDA6ZSk6bnVsbCE9PWM/ZCYmInNldCJpbiBkJiZ2b2lkIDAhPT0oZT1kLnNldChhLGMsYikpP2U6KGEuc2V0QXR0cmlidXRlKGIsYysiIiksYyk6dm9pZCBtLnJlbW92ZUF0dHIoYSxiKSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9MCxmPWImJmIubWF0Y2goRSk7aWYoZiYmMT09PWEubm9kZVR5cGUpd2hpbGUoYz1mW2UrK10pZD1tLnByb3BGaXhbY118fGMsbS5leHByLm1hdGNoLmJvb2wudGVzdChjKT9yYiYmcWJ8fCFwYi50ZXN0KGMpP2FbZF09ITE6YVttLmNhbWVsQ2FzZSgiZGVmYXVsdC0iK2MpXT1hW2RdPSExOm0uYXR0cihhLGMsIiIpLGEucmVtb3ZlQXR0cmlidXRlKHFiP2M6ZCl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoIWsucmFkaW9WYWx1ZSYmInJhZGlvIj09PWImJm0ubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpLGJ9fX19fSksbmI9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI9PT0hMT9tLnJlbW92ZUF0dHIoYSxjKTpyYiYmcWJ8fCFwYi50ZXN0KGMpP2Euc2V0QXR0cmlidXRlKCFxYiYmbS5wcm9wRml4W2NdfHxjLGMpOmFbbS5jYW1lbENhc2UoImRlZmF1bHQtIitjKV09YVtjXT0hMCxjfX0sbS5lYWNoKG0uZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGEsYil7dmFyIGM9b2JbYl18fG0uZmluZC5hdHRyO29iW2JdPXJiJiZxYnx8IXBiLnRlc3QoYik/ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGY7cmV0dXJuIGR8fChmPW9iW2JdLG9iW2JdPWUsZT1udWxsIT1jKGEsYixkKT9iLnRvTG93ZXJDYXNlKCk6bnVsbCxvYltiXT1mKSxlfTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmFbbS5jYW1lbENhc2UoImRlZmF1bHQtIitiKV0/Yi50b0xvd2VyQ2FzZSgpOm51bGx9fSkscmImJnFifHwobS5hdHRySG9va3MudmFsdWU9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0ubm9kZU5hbWUoYSwiaW5wdXQiKT92b2lkKGEuZGVmYXVsdFZhbHVlPWIpOm1iJiZtYi5zZXQoYSxiLGMpfX0pLHFifHwobWI9e3NldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkfHxhLnNldEF0dHJpYnV0ZU5vZGUoZD1hLm93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKGMpKSxkLnZhbHVlPWIrPSIiLCJ2YWx1ZSI9PT1jfHxiPT09YS5nZXRBdHRyaWJ1dGUoYyk/Yjp2b2lkIDB9fSxvYi5pZD1vYi5uYW1lPW9iLmNvb3Jkcz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGM/dm9pZCAwOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJiIiIT09ZC52YWx1ZT9kLnZhbHVlOm51bGx9LG0udmFsSG9va3MuYnV0dG9uPXtnZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldEF0dHJpYnV0ZU5vZGUoYik7cmV0dXJuIGMmJmMuc3BlY2lmaWVkP2MudmFsdWU6dm9pZCAwfSxzZXQ6bWIuc2V0fSxtLmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGU9e3NldDpmdW5jdGlvbihhLGIsYyl7bWIuc2V0KGEsIiI9PT1iPyExOmIsYyl9fSxtLmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYil7bS5hdHRySG9va3NbYl09e3NldDpmdW5jdGlvbihhLGMpe3JldHVybiIiPT09Yz8oYS5zZXRBdHRyaWJ1dGUoYiwiYXV0byIpLGMpOnZvaWQgMH19fSkpLGsuc3R5bGV8fChtLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHR8fHZvaWQgMH0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD1iKyIifX0pO3ZhciBzYj0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0KSQvaSx0Yj0vXig/OmF8YXJlYSkkL2k7bS5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLG0ucHJvcCxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXtyZXR1cm4gYT1tLnByb3BGaXhbYV18fGEsdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbYV09dm9pZCAwLGRlbGV0ZSB0aGlzW2FdfWNhdGNoKGIpe319KX19KSxtLmV4dGVuZCh7cHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9LHByb3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnPWEubm9kZVR5cGU7aWYoYSYmMyE9PWcmJjghPT1nJiYyIT09ZylyZXR1cm4gZj0xIT09Z3x8IW0uaXNYTUxEb2MoYSksZiYmKGI9bS5wcm9wRml4W2JdfHxiLGU9bS5wcm9wSG9va3NbYl0pLHZvaWQgMCE9PWM/ZSYmInNldCJpbiBlJiZ2b2lkIDAhPT0oZD1lLnNldChhLGMsYikpP2Q6YVtiXT1jOmUmJiJnZXQiaW4gZSYmbnVsbCE9PShkPWUuZ2V0KGEsYikpP2Q6YVtiXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW0uZmluZC5hdHRyKGEsInRhYmluZGV4Iik7cmV0dXJuIGI/cGFyc2VJbnQoYiwxMCk6c2IudGVzdChhLm5vZGVOYW1lKXx8dGIudGVzdChhLm5vZGVOYW1lKSYmYS5ocmVmPzA6LTF9fX19KSxrLmhyZWZOb3JtYWxpemVkfHxtLmVhY2goWyJocmVmIiwic3JjIl0sZnVuY3Rpb24oYSxiKXttLnByb3BIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZShiLDQpfX19KSxrLm9wdFNlbGVjdGVkfHwobS5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCksbnVsbH19KSxtLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe20ucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxrLmVuY3R5cGV8fChtLnByb3BGaXguZW5jdHlwZT0iZW5jb2RpbmciKTt2YXIgdWI9L1tcdFxyXG5cZl0vZzttLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MCxpPXRoaXMubGVuZ3RoLGo9InN0cmluZyI9PXR5cGVvZiBhJiZhO2lmKG0uaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe20odGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoailmb3IoYj0oYXx8IiIpLm1hdGNoKEUpfHxbXTtpPmg7aCsrKWlmKGM9dGhpc1toXSxkPTE9PT1jLm5vZGVUeXBlJiYoYy5jbGFzc05hbWU/KCIgIitjLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodWIsIiAiKToiICIpKXtmPTA7d2hpbGUoZT1iW2YrK10pZC5pbmRleE9mKCIgIitlKyIgIik8MCYmKGQrPWUrIiAiKTtnPW0udHJpbShkKSxjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MCxpPXRoaXMubGVuZ3RoLGo9MD09PWFyZ3VtZW50cy5sZW5ndGh8fCJzdHJpbmciPT10eXBlb2YgYSYmYTtpZihtLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXttKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGopZm9yKGI9KGF8fCIiKS5tYXRjaChFKXx8W107aT5oO2grKylpZihjPXRoaXNbaF0sZD0xPT09Yy5ub2RlVHlwZSYmKGMuY2xhc3NOYW1lPygiICIrYy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHViLCIgIik6IiIpKXtmPTA7d2hpbGUoZT1iW2YrK10pd2hpbGUoZC5pbmRleE9mKCIgIitlKyIgIik+PTApZD1kLnJlcGxhY2UoIiAiK2UrIiAiLCIgIik7Zz1hP20udHJpbShkKToiIixjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBiJiYic3RyaW5nIj09PWM/Yj90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6dGhpcy5lYWNoKG0uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihjKXttKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUsYiksYil9OmZ1bmN0aW9uKCl7aWYoInN0cmluZyI9PT1jKXt2YXIgYixkPTAsZT1tKHRoaXMpLGY9YS5tYXRjaChFKXx8W107d2hpbGUoYj1mW2QrK10pZS5oYXNDbGFzcyhiKT9lLnJlbW92ZUNsYXNzKGIpOmUuYWRkQ2xhc3MoYil9ZWxzZShjPT09S3x8ImJvb2xlYW4iPT09YykmJih0aGlzLmNsYXNzTmFtZSYmbS5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjptLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iICIrYSsiICIsYz0wLGQ9dGhpcy5sZW5ndGg7ZD5jO2MrKylpZigxPT09dGhpc1tjXS5ub2RlVHlwZSYmKCIgIit0aGlzW2NdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodWIsIiAiKS5pbmRleE9mKGIpPj0wKXJldHVybiEwO3JldHVybiExfX0pLG0uZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe20uZm5bYl09ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oYixudWxsLGEsYyk6dGhpcy50cmlnZ2VyKGIpfX0pLG0uZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX0sYmluZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYSxudWxsLGIsYyl9LHVuYmluZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9mZihhLG51bGwsYil9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGIsYSxjLGQpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGF8fCIqKiIsYyl9fSk7dmFyIHZiPW0ubm93KCksd2I9L1w/Lyx4Yj0vKCwpfChcW3x7KXwofXxdKXwiKD86W14iXFxcclxuXXxcXFsiXFxcL2JmbnJ0XXxcXHVbXGRhLWZBLUZdezR9KSoiXHMqOj98dHJ1ZXxmYWxzZXxudWxsfC0/KD8hMFxkKVxkKyg/OlwuXGQrfCkoPzpbZUVdWystXT9cZCt8KS9nO20ucGFyc2VKU09OPWZ1bmN0aW9uKGIpe2lmKGEuSlNPTiYmYS5KU09OLnBhcnNlKXJldHVybiBhLkpTT04ucGFyc2UoYisiIik7dmFyIGMsZD1udWxsLGU9bS50cmltKGIrIiIpO3JldHVybiBlJiYhbS50cmltKGUucmVwbGFjZSh4YixmdW5jdGlvbihhLGIsZSxmKXtyZXR1cm4gYyYmYiYmKGQ9MCksMD09PWQ/YTooYz1lfHxiLGQrPSFmLSFlLCIiKX0pKT9GdW5jdGlvbigicmV0dXJuICIrZSkoKTptLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LG0ucGFyc2VYTUw9ZnVuY3Rpb24oYil7dmFyIGMsZDtpZighYnx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBudWxsO3RyeXthLkRPTVBhcnNlcj8oZD1uZXcgRE9NUGFyc2VyLGM9ZC5wYXJzZUZyb21TdHJpbmcoYiwidGV4dC94bWwiKSk6KGM9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxjLmFzeW5jPSJmYWxzZSIsYy5sb2FkWE1MKGIpKX1jYXRjaChlKXtjPXZvaWQgMH1yZXR1cm4gYyYmYy5kb2N1bWVudEVsZW1lbnQmJiFjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8bS5lcnJvcigiSW52YWxpZCBYTUw6ICIrYiksY307dmFyIHliLHpiLEFiPS8jLiokLyxCYj0vKFs/Jl0pXz1bXiZdKi8sQ2I9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9nbSxEYj0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxFYj0vXig/OkdFVHxIRUFEKSQvLEZiPS9eXC9cLy8sR2I9L14oW1x3ListXSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwvPyM6XSopKD86OihcZCspfCl8KS8sSGI9e30sSWI9e30sSmI9IiovIi5jb25jYXQoIioiKTt0cnl7emI9bG9jYXRpb24uaHJlZn1jYXRjaChLYil7emI9eS5jcmVhdGVFbGVtZW50KCJhIiksemIuaHJlZj0iIix6Yj16Yi5ocmVmfXliPUdiLmV4ZWMoemIudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIExiKGEpe3JldHVybiBmdW5jdGlvbihiLGMpeyJzdHJpbmciIT10eXBlb2YgYiYmKGM9YixiPSIqIik7dmFyIGQsZT0wLGY9Yi50b0xvd2VyQ2FzZSgpLm1hdGNoKEUpfHxbXTtpZihtLmlzRnVuY3Rpb24oYykpd2hpbGUoZD1mW2UrK10pIisiPT09ZC5jaGFyQXQoMCk/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gTWIoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09SWI7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxtLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBOYihhLGIpe3ZhciBjLGQsZT1tLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGQgaW4gYil2b2lkIDAhPT1iW2RdJiYoKGVbZF0/YTpjfHwoYz17fSkpW2RdPWJbZF0pO3JldHVybiBjJiZtLmV4dGVuZCghMCxhLGMpLGF9ZnVuY3Rpb24gT2IoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWUmJihlPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihlKWZvcihnIGluIGgpaWYoaFtnXSYmaFtnXS50ZXN0KGUpKXtpLnVuc2hpZnQoZyk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGcgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tnKyIgIitpWzBdXSl7Zj1nO2JyZWFrfWR8fChkPWcpfWY9Znx8ZH1yZXR1cm4gZj8oZiE9PWlbMF0mJmkudW5zaGlmdChmKSxjW2ZdKTp2b2lkIDB9ZnVuY3Rpb24gUGIoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1tLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6emIsdHlwZToiR0VUIixpc0xvY2FsOkRiLnRlc3QoeWJbMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6SmIsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjptLnBhcnNlSlNPTiwidGV4dCB4bWwiOm0ucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihhLGIpe3JldHVybiBiP05iKE5iKGEsbS5hamF4U2V0dGluZ3MpLGIpOk5iKG0uYWpheFNldHRpbmdzLGEpfSxhamF4UHJlZmlsdGVyOkxiKEhiKSxhamF4VHJhbnNwb3J0OkxiKEliKSxhamF4OmZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBhJiYoYj1hLGE9dm9pZCAwKSxiPWJ8fHt9O3ZhciBjLGQsZSxmLGcsaCxpLGosaz1tLmFqYXhTZXR1cCh7fSxiKSxsPWsuY29udGV4dHx8ayxuPWsuY29udGV4dCYmKGwubm9kZVR5cGV8fGwuanF1ZXJ5KT9tKGwpOm0uZXZlbnQsbz1tLkRlZmVycmVkKCkscD1tLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxxPWsuc3RhdHVzQ29kZXx8e30scj17fSxzPXt9LHQ9MCx1PSJjYW5jZWxlZCIsdj17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKDI9PT10KXtpZighail7aj17fTt3aGlsZShiPUNiLmV4ZWMoZikpaltiWzFdLnRvTG93ZXJDYXNlKCldPWJbMl19Yj1qW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIG51bGw9PWI/bnVsbDpifSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gMj09PXQ/ZjpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS50b0xvd2VyQ2FzZSgpO3JldHVybiB0fHwoYT1zW2NdPXNbY118fGEsclthXT1iKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3JldHVybiB0fHwoay5taW1lVHlwZT1hKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKGEpaWYoMj50KWZvcihiIGluIGEpcVtiXT1bcVtiXSxhW2JdXTtlbHNlIHYuYWx3YXlzKGFbdi5zdGF0dXNdKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YXx8dTtyZXR1cm4gaSYmaS5hYm9ydChiKSx4KDAsYiksdGhpc319O2lmKG8ucHJvbWlzZSh2KS5jb21wbGV0ZT1wLmFkZCx2LnN1Y2Nlc3M9di5kb25lLHYuZXJyb3I9di5mYWlsLGsudXJsPSgoYXx8ay51cmx8fHpiKSsiIikucmVwbGFjZShBYiwiIikucmVwbGFjZShGYix5YlsxXSsiLy8iKSxrLnR5cGU9Yi5tZXRob2R8fGIudHlwZXx8ay5tZXRob2R8fGsudHlwZSxrLmRhdGFUeXBlcz1tLnRyaW0oay5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKEUpfHxbIiJdLG51bGw9PWsuY3Jvc3NEb21haW4mJihjPUdiLmV4ZWMoay51cmwudG9Mb3dlckNhc2UoKSksay5jcm9zc0RvbWFpbj0hKCFjfHxjWzFdPT09eWJbMV0mJmNbMl09PT15YlsyXSYmKGNbM118fCgiaHR0cDoiPT09Y1sxXT8iODAiOiI0NDMiKSk9PT0oeWJbM118fCgiaHR0cDoiPT09eWJbMV0/IjgwIjoiNDQzIikpKSksay5kYXRhJiZrLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGsuZGF0YSYmKGsuZGF0YT1tLnBhcmFtKGsuZGF0YSxrLnRyYWRpdGlvbmFsKSksTWIoSGIsayxiLHYpLDI9PT10KXJldHVybiB2O2g9bS5ldmVudCYmay5nbG9iYWwsaCYmMD09PW0uYWN0aXZlKysmJm0uZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iiksay50eXBlPWsudHlwZS50b1VwcGVyQ2FzZSgpLGsuaGFzQ29udGVudD0hRWIudGVzdChrLnR5cGUpLGU9ay51cmwsay5oYXNDb250ZW50fHwoay5kYXRhJiYoZT1rLnVybCs9KHdiLnRlc3QoZSk/IiYiOiI/Iikray5kYXRhLGRlbGV0ZSBrLmRhdGEpLGsuY2FjaGU9PT0hMSYmKGsudXJsPUJiLnRlc3QoZSk/ZS5yZXBsYWNlKEJiLCIkMV89Iit2YisrKTplKyh3Yi50ZXN0KGUpPyImIjoiPyIpKyJfPSIrdmIrKykpLGsuaWZNb2RpZmllZCYmKG0ubGFzdE1vZGlmaWVkW2VdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixtLmxhc3RNb2RpZmllZFtlXSksbS5ldGFnW2VdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLG0uZXRhZ1tlXSkpLChrLmRhdGEmJmsuaGFzQ29udGVudCYmay5jb250ZW50VHlwZSE9PSExfHxiLmNvbnRlbnRUeXBlKSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGsuY29udGVudFR5cGUpLHYuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixrLmRhdGFUeXBlc1swXSYmay5hY2NlcHRzW2suZGF0YVR5cGVzWzBdXT9rLmFjY2VwdHNbay5kYXRhVHlwZXNbMF1dKygiKiIhPT1rLmRhdGFUeXBlc1swXT8iLCAiK0piKyI7IHE9MC4wMSI6IiIpOmsuYWNjZXB0c1siKiJdKTtmb3IoZCBpbiBrLmhlYWRlcnMpdi5zZXRSZXF1ZXN0SGVhZGVyKGQsay5oZWFkZXJzW2RdKTtpZihrLmJlZm9yZVNlbmQmJihrLmJlZm9yZVNlbmQuY2FsbChsLHYsayk9PT0hMXx8Mj09PXQpKXJldHVybiB2LmFib3J0KCk7dT0iYWJvcnQiO2ZvcihkIGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbZF0oa1tkXSk7aWYoaT1NYihJYixrLGIsdikpe3YucmVhZHlTdGF0ZT0xLGgmJm4udHJpZ2dlcigiYWpheFNlbmQiLFt2LGtdKSxrLmFzeW5jJiZrLnRpbWVvdXQ+MCYmKGc9c2V0VGltZW91dChmdW5jdGlvbigpe3YuYWJvcnQoInRpbWVvdXQiKX0say50aW1lb3V0KSk7dHJ5e3Q9MSxpLnNlbmQocix4KX1jYXRjaCh3KXtpZighKDI+dCkpdGhyb3cgdzt4KC0xLHcpfX1lbHNlIHgoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIHgoYSxiLGMsZCl7dmFyIGoscixzLHUsdyx4PWI7MiE9PXQmJih0PTIsZyYmY2xlYXJUaW1lb3V0KGcpLGk9dm9pZCAwLGY9ZHx8IiIsdi5yZWFkeVN0YXRlPWE+MD80OjAsaj1hPj0yMDAmJjMwMD5hfHwzMDQ9PT1hLGMmJih1PU9iKGssdixjKSksdT1QYihrLHUsdixqKSxqPyhrLmlmTW9kaWZpZWQmJih3PXYuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSx3JiYobS5sYXN0TW9kaWZpZWRbZV09dyksdz12LmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIiksdyYmKG0uZXRhZ1tlXT13KSksMjA0PT09YXx8IkhFQUQiPT09ay50eXBlP3g9Im5vY29udGVudCI6MzA0PT09YT94PSJub3Rtb2RpZmllZCI6KHg9dS5zdGF0ZSxyPXUuZGF0YSxzPXUuZXJyb3Isaj0hcykpOihzPXgsKGF8fCF4KSYmKHg9ImVycm9yIiwwPmEmJihhPTApKSksdi5zdGF0dXM9YSx2LnN0YXR1c1RleHQ9KGJ8fHgpKyIiLGo/by5yZXNvbHZlV2l0aChsLFtyLHgsdl0pOm8ucmVqZWN0V2l0aChsLFt2LHgsc10pLHYuc3RhdHVzQ29kZShxKSxxPXZvaWQgMCxoJiZuLnRyaWdnZXIoaj8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt2LGssaj9yOnNdKSxwLmZpcmVXaXRoKGwsW3YseF0pLGgmJihuLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3Ysa10pLC0tbS5hY3RpdmV8fG0uZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB2fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLG0uZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe21bYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIG0uaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLG0uYWpheCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0pfX0pLG0uX2V2YWxVcmw9ZnVuY3Rpb24oYSl7cmV0dXJuIG0uYWpheCh7dXJsOmEsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0Iixhc3luYzohMSxnbG9iYWw6ITEsInRocm93cyI6ITB9KX0sbS5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oYSl7aWYobS5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bSh0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPW0oYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJjE9PT1hLmZpcnN0Q2hpbGQubm9kZVR5cGUpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKG0uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihiKXttKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9OmZ1bmN0aW9uKCl7dmFyIGI9bSh0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1tLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXttKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7bS5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fG0odGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfX0pLG0uZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXRXaWR0aDw9MCYmYS5vZmZzZXRIZWlnaHQ8PTB8fCFrLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cygpJiYibm9uZSI9PT0oYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxtLmNzcyhhLCJkaXNwbGF5IikpfSxtLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFtLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9O3ZhciBRYj0vJTIwL2csUmI9L1xbXF0kLyxTYj0vXHI/XG4vZyxUYj0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksVWI9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIFZiKGEsYixjLGQpe3ZhciBlO2lmKG0uaXNBcnJheShiKSltLmVhY2goYixmdW5jdGlvbihiLGUpe2N8fFJiLnRlc3QoYSk/ZChhLGUpOlZiKGErIlsiKygib2JqZWN0Ij09dHlwZW9mIGU/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoY3x8Im9iamVjdCIhPT1tLnR5cGUoYikpZChhLGIpO2Vsc2UgZm9yKGUgaW4gYilWYihhKyJbIitlKyJdIixiW2VdLGMsZCl9bS5wYXJhbT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT1mdW5jdGlvbihhLGIpe2I9bS5pc0Z1bmN0aW9uKGIpP2IoKTpudWxsPT1iPyIiOmIsZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2lmKHZvaWQgMD09PWImJihiPW0uYWpheFNldHRpbmdzJiZtLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCksbS5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIW0uaXNQbGFpbk9iamVjdChhKSltLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IoYyBpbiBhKVZiKGMsYVtjXSxiLGUpO3JldHVybiBkLmpvaW4oIiYiKS5yZXBsYWNlKFFiLCIrIil9LG0uZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gbS5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPW0ucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBhP20ubWFrZUFycmF5KGEpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIW0odGhpcykuaXMoIjpkaXNhYmxlZCIpJiZVYi50ZXN0KHRoaXMubm9kZU5hbWUpJiYhVGIudGVzdChhKSYmKHRoaXMuY2hlY2tlZHx8IVcudGVzdChhKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1tKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1jP251bGw6bS5pc0FycmF5KGMpP20ubWFwKGMsZnVuY3Rpb24oYSl7cmV0dXJue25hbWU6Yi5uYW1lLHZhbHVlOmEucmVwbGFjZShTYiwiXHJcbiIpfX0pOntuYW1lOmIubmFtZSx2YWx1ZTpjLnJlcGxhY2UoU2IsIlxyXG4iKX19KS5nZXQoKX19KSxtLmFqYXhTZXR0aW5ncy54aHI9dm9pZCAwIT09YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmL14oZ2V0fHBvc3R8aGVhZHxwdXR8ZGVsZXRlfG9wdGlvbnMpJC9pLnRlc3QodGhpcy50eXBlKSYmWmIoKXx8JGIoKX06WmI7dmFyIFdiPTAsWGI9e30sWWI9bS5hamF4U2V0dGluZ3MueGhyKCk7YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib251bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIFhiKVhiW2FdKHZvaWQgMCwhMCl9KSxrLmNvcnM9ISFZYiYmIndpdGhDcmVkZW50aWFscyJpbiBZYixZYj1rLmFqYXg9ISFZYixZYiYmbS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGEpe2lmKCFhLmNyb3NzRG9tYWlufHxrLmNvcnMpe3ZhciBiO3JldHVybntzZW5kOmZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hLnhocigpLGc9KytXYjtpZihmLm9wZW4oYS50eXBlLGEudXJsLGEuYXN5bmMsYS51c2VybmFtZSxhLnBhc3N3b3JkKSxhLnhockZpZWxkcylmb3IoZSBpbiBhLnhockZpZWxkcylmW2VdPWEueGhyRmllbGRzW2VdO2EubWltZVR5cGUmJmYub3ZlcnJpZGVNaW1lVHlwZSYmZi5vdmVycmlkZU1pbWVUeXBlKGEubWltZVR5cGUpLGEuY3Jvc3NEb21haW58fGNbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGNbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoZSBpbiBjKXZvaWQgMCE9PWNbZV0mJmYuc2V0UmVxdWVzdEhlYWRlcihlLGNbZV0rIiIpO2Yuc2VuZChhLmhhc0NvbnRlbnQmJmEuZGF0YXx8bnVsbCksYj1mdW5jdGlvbihjLGUpe3ZhciBoLGksajtpZihiJiYoZXx8ND09PWYucmVhZHlTdGF0ZSkpaWYoZGVsZXRlIFhiW2ddLGI9dm9pZCAwLGYub25yZWFkeXN0YXRlY2hhbmdlPW0ubm9vcCxlKTQhPT1mLnJlYWR5U3RhdGUmJmYuYWJvcnQoKTtlbHNle2o9e30saD1mLnN0YXR1cywic3RyaW5nIj09dHlwZW9mIGYucmVzcG9uc2VUZXh0JiYoai50ZXh0PWYucmVzcG9uc2VUZXh0KTt0cnl7aT1mLnN0YXR1c1RleHR9Y2F0Y2goayl7aT0iIn1ofHwhYS5pc0xvY2FsfHxhLmNyb3NzRG9tYWluPzEyMjM9PT1oJiYoaD0yMDQpOmg9ai50ZXh0PzIwMDo0MDR9aiYmZChoLGksaixmLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKX0sYS5hc3luYz80PT09Zi5yZWFkeVN0YXRlP3NldFRpbWVvdXQoYik6Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9WGJbZ109YjpiKCl9LGFib3J0OmZ1bmN0aW9uKCl7YiYmYih2b2lkIDAsITApfX19fSk7ZnVuY3Rpb24gWmIoKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319ZnVuY3Rpb24gJGIoKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1tLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6Lyg/OmphdmF8ZWNtYSlzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBtLmdsb2JhbEV2YWwoYSksYX19fSksbS5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEuY2FjaGUmJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLG0uYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgYixjPXkuaGVhZHx8bSgiaGVhZCIpWzBdfHx5LmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihkLGUpe2I9eS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxiLmFzeW5jPSEwLGEuc2NyaXB0Q2hhcnNldCYmKGIuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGIuc3JjPWEudXJsLGIub25sb2FkPWIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7KGN8fCFiLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoYi5yZWFkeVN0YXRlKSkmJihiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbCxjfHxlKDIwMCwic3VjY2VzcyIpKX0sYy5pbnNlcnRCZWZvcmUoYixjLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIub25sb2FkKHZvaWQgMCwhMCl9fX19KTt2YXIgX2I9W10sYWM9Lyg9KVw/KD89JnwkKXxcP1w/LzttLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9X2IucG9wKCl8fG0uZXhwYW5kbysiXyIrdmIrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLG0uYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKGFjLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYhKGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmYWMudGVzdChiLmRhdGEpJiYiZGF0YSIpO3JldHVybiBofHwianNvbnAiPT09Yi5kYXRhVHlwZXNbMF0/KGU9Yi5qc29ucENhbGxiYWNrPW0uaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxoP2JbaF09YltoXS5yZXBsYWNlKGFjLCIkMSIrZSk6Yi5qc29ucCE9PSExJiYoYi51cmwrPSh3Yi50ZXN0KGIudXJsKT8iJiI6Ij8iKStiLmpzb25wKyI9IitlKSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gZ3x8bS5lcnJvcihlKyIgd2FzIG5vdCBjYWxsZWQiKSxnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiIsZj1hW2VdLGFbZV09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZC5hbHdheXMoZnVuY3Rpb24oKXthW2VdPWYsYltlXSYmKGIuanNvbnBDYWxsYmFjaz1jLmpzb25wQ2FsbGJhY2ssX2IucHVzaChlKSksZyYmbS5pc0Z1bmN0aW9uKGYpJiZmKGdbMF0pLGc9Zj12b2lkIDB9KSwic2NyaXB0Iik6dm9pZCAwfSksbS5wYXJzZUhUTUw9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgYiYmKGM9YixiPSExKSxiPWJ8fHk7dmFyIGQ9dS5leGVjKGEpLGU9IWMmJltdO3JldHVybiBkP1tiLmNyZWF0ZUVsZW1lbnQoZFsxXSldOihkPW0uYnVpbGRGcmFnbWVudChbYV0sYixlKSxlJiZlLmxlbmd0aCYmbShlKS5yZW1vdmUoKSxtLm1lcmdlKFtdLGQuY2hpbGROb2RlcykpfTt2YXIgYmM9bS5mbi5sb2FkO20uZm4ubG9hZD1mdW5jdGlvbihhLGIsYyl7aWYoInN0cmluZyIhPXR5cGVvZiBhJiZiYylyZXR1cm4gYmMuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBkLGUsZixnPXRoaXMsaD1hLmluZGV4T2YoIiAiKTtyZXR1cm4gaD49MCYmKGQ9bS50cmltKGEuc2xpY2UoaCxhLmxlbmd0aCkpLGE9YS5zbGljZSgwLGgpKSxtLmlzRnVuY3Rpb24oYik/KGM9YixiPXZvaWQgMCk6YiYmIm9iamVjdCI9PXR5cGVvZiBiJiYoZj0iUE9TVCIpLGcubGVuZ3RoPjAmJm0uYWpheCh7dXJsOmEsdHlwZTpmLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2U9YXJndW1lbnRzLGcuaHRtbChkP20oIjxkaXY+IikuYXBwZW5kKG0ucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuY29tcGxldGUoYyYmZnVuY3Rpb24oYSxiKXtnLmVhY2goYyxlfHxbYS5yZXNwb25zZVRleHQsYixhXSl9KSx0aGlzfSxtLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbihhLGIpe20uZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub24oYixhKX19KSxtLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gbS5ncmVwKG0udGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofTt2YXIgY2M9YS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7ZnVuY3Rpb24gZGMoYSl7cmV0dXJuIG0uaXNXaW5kb3coYSk/YTo5PT09YS5ub2RlVHlwZT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzohMX1tLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixrPW0uY3NzKGEsInBvc2l0aW9uIiksbD1tKGEpLG49e307InN0YXRpYyI9PT1rJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxoPWwub2Zmc2V0KCksZj1tLmNzcyhhLCJ0b3AiKSxpPW0uY3NzKGEsImxlZnQiKSxqPSgiYWJzb2x1dGUiPT09a3x8ImZpeGVkIj09PWspJiZtLmluQXJyYXkoImF1dG8iLFtmLGldKT4tMSxqPyhkPWwucG9zaXRpb24oKSxnPWQudG9wLGU9ZC5sZWZ0KTooZz1wYXJzZUZsb2F0KGYpfHwwLGU9cGFyc2VGbG9hdChpKXx8MCksbS5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGgpKSxudWxsIT1iLnRvcCYmKG4udG9wPWIudG9wLWgudG9wK2cpLG51bGwhPWIubGVmdCYmKG4ubGVmdD1iLmxlZnQtaC5sZWZ0K2UpLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLG4pOmwuY3NzKG4pfX0sbS5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbihhKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT1hP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe20ub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTt2YXIgYixjLGQ9e3RvcDowLGxlZnQ6MH0sZT10aGlzWzBdLGY9ZSYmZS5vd25lckRvY3VtZW50O2lmKGYpcmV0dXJuIGI9Zi5kb2N1bWVudEVsZW1lbnQsbS5jb250YWlucyhiLGUpPyh0eXBlb2YgZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QhPT1LJiYoZD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxjPWRjKGYpLHt0b3A6ZC50b3ArKGMucGFnZVlPZmZzZXR8fGIuc2Nyb2xsVG9wKS0oYi5jbGllbnRUb3B8fDApLGxlZnQ6ZC5sZWZ0KyhjLnBhZ2VYT2Zmc2V0fHxiLnNjcm9sbExlZnQpLShiLmNsaWVudExlZnR8fDApfSk6ZH0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzWzBdKXt2YXIgYSxiLGM9e3RvcDowLGxlZnQ6MH0sZD10aGlzWzBdO3JldHVybiJmaXhlZCI9PT1tLmNzcyhkLCJwb3NpdGlvbiIpP2I9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTooYT10aGlzLm9mZnNldFBhcmVudCgpLGI9dGhpcy5vZmZzZXQoKSxtLm5vZGVOYW1lKGFbMF0sImh0bWwiKXx8KGM9YS5vZmZzZXQoKSksYy50b3ArPW0uY3NzKGFbMF0sImJvcmRlclRvcFdpZHRoIiwhMCksYy5sZWZ0Kz1tLmNzcyhhWzBdLCJib3JkZXJMZWZ0V2lkdGgiLCEwKSkse3RvcDpiLnRvcC1jLnRvcC1tLmNzcyhkLCJtYXJnaW5Ub3AiLCEwKSxsZWZ0OmIubGVmdC1jLmxlZnQtbS5jc3MoZCwibWFyZ2luTGVmdCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXMub2Zmc2V0UGFyZW50fHxjYzt3aGlsZShhJiYhbS5ub2RlTmFtZShhLCJodG1sIikmJiJzdGF0aWMiPT09bS5jc3MoYSwicG9zaXRpb24iKSlhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfHxjY30pfX0pLG0uZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPS9ZLy50ZXN0KGIpO20uZm5bYV09ZnVuY3Rpb24oZCl7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihhLGQsZSl7dmFyIGY9ZGMoYSk7cmV0dXJuIHZvaWQgMD09PWU/Zj9iIGluIGY/ZltiXTpmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXTphW2RdOnZvaWQoZj9mLnNjcm9sbFRvKGM/bShmKS5zY3JvbGxMZWZ0KCk6ZSxjP2U6bShmKS5zY3JvbGxUb3AoKSk6YVtkXT1lKX0sYSxkLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSksbS5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsYil7bS5jc3NIb29rc1tiXT1MYShrLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oYSxjKXtyZXR1cm4gYz8oYz1KYShhLGIpLEhhLnRlc3QoYyk/bShhKS5wb3NpdGlvbigpW2JdKyJweCI6Yyk6dm9pZCAwfSl9KSxtLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGIpe20uZWFjaCh7cGFkZGluZzoiaW5uZXIiK2EsY29udGVudDpiLCIiOiJvdXRlciIrYX0sZnVuY3Rpb24oYyxkKXttLmZuW2RdPWZ1bmN0aW9uKGQsZSl7dmFyIGY9YXJndW1lbnRzLmxlbmd0aCYmKGN8fCJib29sZWFuIiE9dHlwZW9mIGQpLGc9Y3x8KGQ9PT0hMHx8ZT09PSEwPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZTtyZXR1cm4gbS5pc1dpbmRvdyhiKT9iLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IithXTo5PT09Yi5ub2RlVHlwZT8oZT1iLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChiLmJvZHlbInNjcm9sbCIrYV0sZVsic2Nyb2xsIithXSxiLmJvZHlbIm9mZnNldCIrYV0sZVsib2Zmc2V0IithXSxlWyJjbGllbnQiK2FdKSk6dm9pZCAwPT09ZD9tLmNzcyhiLGMsZyk6bS5zdHlsZShiLGMsZCxnKX0sYixmP2Q6dm9pZCAwLGYsbnVsbCl9fSl9KSxtLmZuLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LG0uZm4uYW5kU2VsZj1tLmZuLmFkZEJhY2ssImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIG19KTt2YXIgZWM9YS5qUXVlcnksZmM9YS4kO3JldHVybiBtLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oYil7cmV0dXJuIGEuJD09PW0mJihhLiQ9ZmMpLGImJmEualF1ZXJ5PT09bSYmKGEualF1ZXJ5PWVjKSxtfSx0eXBlb2YgYj09PUsmJihhLmpRdWVyeT1hLiQ9bSksbX0pOwo="></script>
<script src="data:application/javascript;base64,LyohCiAqIEJvd3NlciAtIGEgYnJvd3NlciBkZXRlY3RvcgogKiBodHRwczovL2dpdGh1Yi5jb20vZGVkL2Jvd3NlcgogKiBNSVQgTGljZW5zZSB8IChjKSBEdXN0aW4gRGlheiAyMDE1CiAqLwohZnVuY3Rpb24oZSx0LG4pe3R5cGVvZiBtb2R1bGUhPSJ1bmRlZmluZWQiJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1uKCk6dHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZD9kZWZpbmUodCxuKTplW3RdPW4oKX0odGhpcywiYm93c2VyIixmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7ZnVuY3Rpb24gbihlKXt2YXIgbj10Lm1hdGNoKGUpO3JldHVybiBuJiZuLmxlbmd0aD4xJiZuWzFdfHwiIn1mdW5jdGlvbiByKGUpe3ZhciBuPXQubWF0Y2goZSk7cmV0dXJuIG4mJm4ubGVuZ3RoPjEmJm5bMl18fCIifWZ1bmN0aW9uIE4oZSl7c3dpdGNoKGUpe2Nhc2UiTlQiOnJldHVybiJOVCI7Y2FzZSJYUCI6cmV0dXJuIlhQIjtjYXNlIk5UIDUuMCI6cmV0dXJuIjIwMDAiO2Nhc2UiTlQgNS4xIjpyZXR1cm4iWFAiO2Nhc2UiTlQgNS4yIjpyZXR1cm4iMjAwMyI7Y2FzZSJOVCA2LjAiOnJldHVybiJWaXN0YSI7Y2FzZSJOVCA2LjEiOnJldHVybiI3IjtjYXNlIk5UIDYuMiI6cmV0dXJuIjgiO2Nhc2UiTlQgNi4zIjpyZXR1cm4iOC4xIjtjYXNlIk5UIDEwLjAiOnJldHVybiIxMCI7ZGVmYXVsdDpyZXR1cm4gdW5kZWZpbmVkfX12YXIgaT1uKC8oaXBvZHxpcGhvbmV8aXBhZCkvaSkudG9Mb3dlckNhc2UoKSxzPS9saWtlIGFuZHJvaWQvaS50ZXN0KHQpLG89IXMmJi9hbmRyb2lkL2kudGVzdCh0KSx1PS9uZXh1c1xzKlswLTZdXHMqL2kudGVzdCh0KSxhPSF1JiYvbmV4dXNccypbMC05XSsvaS50ZXN0KHQpLGY9L0NyT1MvLnRlc3QodCksbD0vc2lsay9pLnRlc3QodCksYz0vc2FpbGZpc2gvaS50ZXN0KHQpLGg9L3RpemVuL2kudGVzdCh0KSxwPS8od2VifGhwdylvcy9pLnRlc3QodCksZD0vd2luZG93cyBwaG9uZS9pLnRlc3QodCksdj0vU2Ftc3VuZ0Jyb3dzZXIvaS50ZXN0KHQpLG09IWQmJi93aW5kb3dzL2kudGVzdCh0KSxnPSFpJiYhbCYmL21hY2ludG9zaC9pLnRlc3QodCkseT0hbyYmIWMmJiFoJiYhcCYmL2xpbnV4L2kudGVzdCh0KSxiPXIoL2VkZyhbZWFdfGlvcylcLyhcZCsoXC5cZCspPykvaSksdz1uKC92ZXJzaW9uXC8oXGQrKFwuXGQrKT8pL2kpLEU9L3RhYmxldC9pLnRlc3QodCkmJiEvdGFibGV0IHBjL2kudGVzdCh0KSxTPSFFJiYvW14tXW1vYmkvaS50ZXN0KHQpLHg9L3hib3gvaS50ZXN0KHQpLFQ7L29wZXJhL2kudGVzdCh0KT9UPXtuYW1lOiJPcGVyYSIsb3BlcmE6ZSx2ZXJzaW9uOnd8fG4oLyg/Om9wZXJhfG9wcnxvcGlvcylbXHNcL10oXGQrKFwuXGQrKT8pL2kpfTovb3ByXC98b3Bpb3MvaS50ZXN0KHQpP1Q9e25hbWU6Ik9wZXJhIixvcGVyYTplLHZlcnNpb246bigvKD86b3ByfG9waW9zKVtcc1wvXShcZCsoXC5cZCspPykvaSl8fHd9Oi9TYW1zdW5nQnJvd3Nlci9pLnRlc3QodCk/VD17bmFtZToiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCIsc2Ftc3VuZ0Jyb3dzZXI6ZSx2ZXJzaW9uOnd8fG4oLyg/OlNhbXN1bmdCcm93c2VyKVtcc1wvXShcZCsoXC5cZCspPykvaSl9Oi9jb2FzdC9pLnRlc3QodCk/VD17bmFtZToiT3BlcmEgQ29hc3QiLGNvYXN0OmUsdmVyc2lvbjp3fHxuKC8oPzpjb2FzdClbXHNcL10oXGQrKFwuXGQrKT8pL2kpfToveWFicm93c2VyL2kudGVzdCh0KT9UPXtuYW1lOiJZYW5kZXggQnJvd3NlciIseWFuZGV4YnJvd3NlcjplLHZlcnNpb246d3x8bigvKD86eWFicm93c2VyKVtcc1wvXShcZCsoXC5cZCspPykvaSl9Oi91Y2Jyb3dzZXIvaS50ZXN0KHQpP1Q9e25hbWU6IlVDIEJyb3dzZXIiLHVjYnJvd3NlcjplLHZlcnNpb246bigvKD86dWNicm93c2VyKVtcc1wvXShcZCsoPzpcLlxkKykrKS9pKX06L214aW9zL2kudGVzdCh0KT9UPXtuYW1lOiJNYXh0aG9uIixtYXh0aG9uOmUsdmVyc2lvbjpuKC8oPzpteGlvcylbXHNcL10oXGQrKD86XC5cZCspKykvaSl9Oi9lcGlwaGFueS9pLnRlc3QodCk/VD17bmFtZToiRXBpcGhhbnkiLGVwaXBoYW55OmUsdmVyc2lvbjpuKC8oPzplcGlwaGFueSlbXHNcL10oXGQrKD86XC5cZCspKykvaSl9Oi9wdWZmaW4vaS50ZXN0KHQpP1Q9e25hbWU6IlB1ZmZpbiIscHVmZmluOmUsdmVyc2lvbjpuKC8oPzpwdWZmaW4pW1xzXC9dKFxkKyg/OlwuXGQrKT8pL2kpfTovc2xlaXBuaXIvaS50ZXN0KHQpP1Q9e25hbWU6IlNsZWlwbmlyIixzbGVpcG5pcjplLHZlcnNpb246bigvKD86c2xlaXBuaXIpW1xzXC9dKFxkKyg/OlwuXGQrKSspL2kpfTovay1tZWxlb24vaS50ZXN0KHQpP1Q9e25hbWU6IkstTWVsZW9uIixrTWVsZW9uOmUsdmVyc2lvbjpuKC8oPzprLW1lbGVvbilbXHNcL10oXGQrKD86XC5cZCspKykvaSl9OmQ/KFQ9e25hbWU6IldpbmRvd3MgUGhvbmUiLG9zbmFtZToiV2luZG93cyBQaG9uZSIsd2luZG93c3Bob25lOmV9LGI/KFQubXNlZGdlPWUsVC52ZXJzaW9uPWIpOihULm1zaWU9ZSxULnZlcnNpb249bigvaWVtb2JpbGVcLyhcZCsoXC5cZCspPykvaSkpKTovbXNpZXx0cmlkZW50L2kudGVzdCh0KT9UPXtuYW1lOiJJbnRlcm5ldCBFeHBsb3JlciIsbXNpZTplLHZlcnNpb246bigvKD86bXNpZSB8cnY6KShcZCsoXC5cZCspPykvaSl9OmY/VD17bmFtZToiQ2hyb21lIixvc25hbWU6IkNocm9tZSBPUyIsY2hyb21lb3M6ZSxjaHJvbWVCb29rOmUsY2hyb21lOmUsdmVyc2lvbjpuKC8oPzpjaHJvbWV8Y3Jpb3N8Y3JtbylcLyhcZCsoXC5cZCspPykvaSl9Oi9lZGcoW2VhXXxpb3MpL2kudGVzdCh0KT9UPXtuYW1lOiJNaWNyb3NvZnQgRWRnZSIsbXNlZGdlOmUsdmVyc2lvbjpifTovdml2YWxkaS9pLnRlc3QodCk/VD17bmFtZToiVml2YWxkaSIsdml2YWxkaTplLHZlcnNpb246bigvdml2YWxkaVwvKFxkKyhcLlxkKyk/KS9pKXx8d306Yz9UPXtuYW1lOiJTYWlsZmlzaCIsb3NuYW1lOiJTYWlsZmlzaCBPUyIsc2FpbGZpc2g6ZSx2ZXJzaW9uOm4oL3NhaWxmaXNoXHM/YnJvd3NlclwvKFxkKyhcLlxkKyk/KS9pKX06L3NlYW1vbmtleVwvL2kudGVzdCh0KT9UPXtuYW1lOiJTZWFNb25rZXkiLHNlYW1vbmtleTplLHZlcnNpb246bigvc2VhbW9ua2V5XC8oXGQrKFwuXGQrKT8pL2kpfTovZmlyZWZveHxpY2V3ZWFzZWx8Znhpb3MvaS50ZXN0KHQpPyhUPXtuYW1lOiJGaXJlZm94IixmaXJlZm94OmUsdmVyc2lvbjpuKC8oPzpmaXJlZm94fGljZXdlYXNlbHxmeGlvcylbIFwvXShcZCsoXC5cZCspPykvaSl9LC9cKChtb2JpbGV8dGFibGV0KTtbXlwpXSpydjpbXGRcLl0rXCkvaS50ZXN0KHQpJiYoVC5maXJlZm94b3M9ZSxULm9zbmFtZT0iRmlyZWZveCBPUyIpKTpsP1Q9e25hbWU6IkFtYXpvbiBTaWxrIixzaWxrOmUsdmVyc2lvbjpuKC9zaWxrXC8oXGQrKFwuXGQrKT8pL2kpfTovcGhhbnRvbS9pLnRlc3QodCk/VD17bmFtZToiUGhhbnRvbUpTIixwaGFudG9tOmUsdmVyc2lvbjpuKC9waGFudG9tanNcLyhcZCsoXC5cZCspPykvaSl9Oi9zbGltZXJqcy9pLnRlc3QodCk/VD17bmFtZToiU2xpbWVySlMiLHNsaW1lcjplLHZlcnNpb246bigvc2xpbWVyanNcLyhcZCsoXC5cZCspPykvaSl9Oi9ibGFja2JlcnJ5fFxiYmJcZCsvaS50ZXN0KHQpfHwvcmltXHN0YWJsZXQvaS50ZXN0KHQpP1Q9e25hbWU6IkJsYWNrQmVycnkiLG9zbmFtZToiQmxhY2tCZXJyeSBPUyIsYmxhY2tiZXJyeTplLHZlcnNpb246d3x8bigvYmxhY2tiZXJyeVtcZF0rXC8oXGQrKFwuXGQrKT8pL2kpfTpwPyhUPXtuYW1lOiJXZWJPUyIsb3NuYW1lOiJXZWJPUyIsd2Vib3M6ZSx2ZXJzaW9uOnd8fG4oL3coPzplYik/b3Nicm93c2VyXC8oXGQrKFwuXGQrKT8pL2kpfSwvdG91Y2hwYWRcLy9pLnRlc3QodCkmJihULnRvdWNocGFkPWUpKTovYmFkYS9pLnRlc3QodCk/VD17bmFtZToiQmFkYSIsb3NuYW1lOiJCYWRhIixiYWRhOmUsdmVyc2lvbjpuKC9kb2xmaW5cLyhcZCsoXC5cZCspPykvaSl9Omg/VD17bmFtZToiVGl6ZW4iLG9zbmFtZToiVGl6ZW4iLHRpemVuOmUsdmVyc2lvbjpuKC8oPzp0aXplblxzPyk/YnJvd3NlclwvKFxkKyhcLlxkKyk/KS9pKXx8d306L3F1cHppbGxhL2kudGVzdCh0KT9UPXtuYW1lOiJRdXBaaWxsYSIscXVwemlsbGE6ZSx2ZXJzaW9uOm4oLyg/OnF1cHppbGxhKVtcc1wvXShcZCsoPzpcLlxkKykrKS9pKXx8d306L2Nocm9taXVtL2kudGVzdCh0KT9UPXtuYW1lOiJDaHJvbWl1bSIsY2hyb21pdW06ZSx2ZXJzaW9uOm4oLyg/OmNocm9taXVtKVtcc1wvXShcZCsoPzpcLlxkKyk/KS9pKXx8d306L2Nocm9tZXxjcmlvc3xjcm1vL2kudGVzdCh0KT9UPXtuYW1lOiJDaHJvbWUiLGNocm9tZTplLHZlcnNpb246bigvKD86Y2hyb21lfGNyaW9zfGNybW8pXC8oXGQrKFwuXGQrKT8pL2kpfTpvP1Q9e25hbWU6IkFuZHJvaWQiLHZlcnNpb246d306L3NhZmFyaXxhcHBsZXdlYmtpdC9pLnRlc3QodCk/KFQ9e25hbWU6IlNhZmFyaSIsc2FmYXJpOmV9LHcmJihULnZlcnNpb249dykpOmk/KFQ9e25hbWU6aT09ImlwaG9uZSI/ImlQaG9uZSI6aT09ImlwYWQiPyJpUGFkIjoiaVBvZCJ9LHcmJihULnZlcnNpb249dykpOi9nb29nbGVib3QvaS50ZXN0KHQpP1Q9e25hbWU6Ikdvb2dsZWJvdCIsZ29vZ2xlYm90OmUsdmVyc2lvbjpuKC9nb29nbGVib3RcLyhcZCsoXC5cZCspKS9pKXx8d306VD17bmFtZTpuKC9eKC4qKVwvKC4qKSAvKSx2ZXJzaW9uOnIoL14oLiopXC8oLiopIC8pfSwhVC5tc2VkZ2UmJi8oYXBwbGUpP3dlYmtpdC9pLnRlc3QodCk/KC8oYXBwbGUpP3dlYmtpdFwvNTM3XC4zNi9pLnRlc3QodCk/KFQubmFtZT1ULm5hbWV8fCJCbGluayIsVC5ibGluaz1lKTooVC5uYW1lPVQubmFtZXx8IldlYmtpdCIsVC53ZWJraXQ9ZSksIVQudmVyc2lvbiYmdyYmKFQudmVyc2lvbj13KSk6IVQub3BlcmEmJi9nZWNrb1wvL2kudGVzdCh0KSYmKFQubmFtZT1ULm5hbWV8fCJHZWNrbyIsVC5nZWNrbz1lLFQudmVyc2lvbj1ULnZlcnNpb258fG4oL2dlY2tvXC8oXGQrKFwuXGQrKT8pL2kpKSwhVC53aW5kb3dzcGhvbmUmJihvfHxULnNpbGspPyhULmFuZHJvaWQ9ZSxULm9zbmFtZT0iQW5kcm9pZCIpOiFULndpbmRvd3NwaG9uZSYmaT8oVFtpXT1lLFQuaW9zPWUsVC5vc25hbWU9ImlPUyIpOmc/KFQubWFjPWUsVC5vc25hbWU9Im1hY09TIik6eD8oVC54Ym94PWUsVC5vc25hbWU9Ilhib3giKTptPyhULndpbmRvd3M9ZSxULm9zbmFtZT0iV2luZG93cyIpOnkmJihULmxpbnV4PWUsVC5vc25hbWU9IkxpbnV4Iik7dmFyIEM9IiI7VC53aW5kb3dzP0M9TihuKC9XaW5kb3dzICgoTlR8WFApKCBcZFxkPy5cZCk/KS9pKSk6VC53aW5kb3dzcGhvbmU/Qz1uKC93aW5kb3dzIHBob25lICg/Om9zKT9ccz8oXGQrKFwuXGQrKSopL2kpOlQubWFjPyhDPW4oL01hYyBPUyBYIChcZCsoW19cLlxzXVxkKykqKS9pKSxDPUMucmVwbGFjZSgvW19cc10vZywiLiIpKTppPyhDPW4oL29zIChcZCsoW19cc11cZCspKikgbGlrZSBtYWMgb3MgeC9pKSxDPUMucmVwbGFjZSgvW19cc10vZywiLiIpKTpvP0M9bigvYW5kcm9pZFsgXC8tXShcZCsoXC5cZCspKikvaSk6VC53ZWJvcz9DPW4oLyg/OndlYnxocHcpb3NcLyhcZCsoXC5cZCspKikvaSk6VC5ibGFja2JlcnJ5P0M9bigvcmltXHN0YWJsZXRcc29zXHMoXGQrKFwuXGQrKSopL2kpOlQuYmFkYT9DPW4oL2JhZGFcLyhcZCsoXC5cZCspKikvaSk6VC50aXplbiYmKEM9bigvdGl6ZW5bXC9cc10oXGQrKFwuXGQrKSopL2kpKSxDJiYoVC5vc3ZlcnNpb249Qyk7dmFyIGs9IVQud2luZG93cyYmQy5zcGxpdCgiLiIpWzBdO2lmKEV8fGF8fGk9PSJpcGFkInx8byYmKGs9PTN8fGs+PTQmJiFTKXx8VC5zaWxrKVQudGFibGV0PWU7ZWxzZSBpZihTfHxpPT0iaXBob25lInx8aT09Imlwb2QifHxvfHx1fHxULmJsYWNrYmVycnl8fFQud2Vib3N8fFQuYmFkYSlULm1vYmlsZT1lO3JldHVybiBULm1zZWRnZXx8VC5tc2llJiZULnZlcnNpb24+PTEwfHxULnlhbmRleGJyb3dzZXImJlQudmVyc2lvbj49MTV8fFQudml2YWxkaSYmVC52ZXJzaW9uPj0xfHxULmNocm9tZSYmVC52ZXJzaW9uPj0yMHx8VC5zYW1zdW5nQnJvd3NlciYmVC52ZXJzaW9uPj00fHxULmZpcmVmb3gmJlQudmVyc2lvbj49MjB8fFQuc2FmYXJpJiZULnZlcnNpb24+PTZ8fFQub3BlcmEmJlQudmVyc2lvbj49MTB8fFQuaW9zJiZULm9zdmVyc2lvbiYmVC5vc3ZlcnNpb24uc3BsaXQoIi4iKVswXT49Nnx8VC5ibGFja2JlcnJ5JiZULnZlcnNpb24+PTEwLjF8fFQuY2hyb21pdW0mJlQudmVyc2lvbj49MjA/VC5hPWU6VC5tc2llJiZULnZlcnNpb248MTB8fFQuY2hyb21lJiZULnZlcnNpb248MjB8fFQuZmlyZWZveCYmVC52ZXJzaW9uPDIwfHxULnNhZmFyaSYmVC52ZXJzaW9uPDZ8fFQub3BlcmEmJlQudmVyc2lvbjwxMHx8VC5pb3MmJlQub3N2ZXJzaW9uJiZULm9zdmVyc2lvbi5zcGxpdCgiLiIpWzBdPDZ8fFQuY2hyb21pdW0mJlQudmVyc2lvbjwyMD9ULmM9ZTpULng9ZSxUfWZ1bmN0aW9uIHIoZSl7cmV0dXJuIGUuc3BsaXQoIi4iKS5sZW5ndGh9ZnVuY3Rpb24gaShlLHQpe3ZhciBuPVtdLHI7aWYoQXJyYXkucHJvdG90eXBlLm1hcClyZXR1cm4gQXJyYXkucHJvdG90eXBlLm1hcC5jYWxsKGUsdCk7Zm9yKHI9MDtyPGUubGVuZ3RoO3IrKyluLnB1c2godChlW3JdKSk7cmV0dXJuIG59ZnVuY3Rpb24gcyhlKXt2YXIgdD1NYXRoLm1heChyKGVbMF0pLHIoZVsxXSkpLG49aShlLGZ1bmN0aW9uKGUpe3ZhciBuPXQtcihlKTtyZXR1cm4gZSs9KG5ldyBBcnJheShuKzEpKS5qb2luKCIuMCIpLGkoZS5zcGxpdCgiLiIpLGZ1bmN0aW9uKGUpe3JldHVybihuZXcgQXJyYXkoMjAtZS5sZW5ndGgpKS5qb2luKCIwIikrZX0pLnJldmVyc2UoKX0pO3doaWxlKC0tdD49MCl7aWYoblswXVt0XT5uWzFdW3RdKXJldHVybiAxO2lmKG5bMF1bdF0hPT1uWzFdW3RdKXJldHVybi0xO2lmKHQ9PT0wKXJldHVybiAwfX1mdW5jdGlvbiBvKGUscixpKXt2YXIgbz1uO3R5cGVvZiByPT0ic3RyaW5nIiYmKGk9cixyPXZvaWQgMCkscj09PXZvaWQgMCYmKHI9ITEpLGkmJihvPXQoaSkpO3ZhciB1PSIiK28udmVyc2lvbjtmb3IodmFyIGEgaW4gZSlpZihlLmhhc093blByb3BlcnR5KGEpJiZvW2FdKXtpZih0eXBlb2YgZVthXSE9InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJCcm93c2VyIHZlcnNpb24gaW4gdGhlIG1pblZlcnNpb24gbWFwIHNob3VsZCBiZSBhIHN0cmluZzogIithKyI6ICIrU3RyaW5nKGUpKTtyZXR1cm4gcyhbdSxlW2FdXSk8MH1yZXR1cm4gcn1mdW5jdGlvbiB1KGUsdCxuKXtyZXR1cm4hbyhlLHQsbil9dmFyIGU9ITAsbj10KHR5cGVvZiBuYXZpZ2F0b3IhPSJ1bmRlZmluZWQiP25hdmlnYXRvci51c2VyQWdlbnR8fCIiOiIiKTtyZXR1cm4gbi50ZXN0PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7Kyt0KXt2YXIgcj1lW3RdO2lmKHR5cGVvZiByPT0ic3RyaW5nIiYmciBpbiBuKXJldHVybiEwfXJldHVybiExfSxuLmlzVW5zdXBwb3J0ZWRCcm93c2VyPW8sbi5jb21wYXJlVmVyc2lvbnM9cyxuLmNoZWNrPXUsbi5fZGV0ZWN0PXQsbi5kZXRlY3Q9dCxufSk="></script>
<script src="data:application/javascript;base64,Ly8gd2ViY29tcG9uZW50cy5qcyByZXF1aXJlcyBTZXQgYXBpIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUgaW4gYWxsIGJyb3dzZXJzCmlmICh0eXBlb2YoU2V0KSAhPT0gInVuZGVmaW5lZCIpIHsKLyoqCkBsaWNlbnNlIEBub2NvbXBpbGUKQ29weXJpZ2h0IChjKSAyMDE4IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KKGZ1bmN0aW9uKCl7LyoKCiBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiovCid1c2Ugc3RyaWN0Jzt2YXIgcSxhYT0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93PT09dGhpcz90aGlzOiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOnRoaXMsYmE9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7YSE9QXJyYXkucHJvdG90eXBlJiZhIT1PYmplY3QucHJvdG90eXBlJiYoYVtiXT1jLnZhbHVlKX07ZnVuY3Rpb24gY2EoKXtjYT1mdW5jdGlvbigpe307YWEuU3ltYm9sfHwoYWEuU3ltYm9sPWRhKX12YXIgZGE9ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4ianNjb21wX3N5bWJvbF8iKyhifHwiIikrYSsrfX0oKTsKZnVuY3Rpb24gZWEoKXtjYSgpO3ZhciBhPWFhLlN5bWJvbC5pdGVyYXRvcjthfHwoYT1hYS5TeW1ib2wuaXRlcmF0b3I9YWEuU3ltYm9sKCJpdGVyYXRvciIpKTsiZnVuY3Rpb24iIT10eXBlb2YgQXJyYXkucHJvdG90eXBlW2FdJiZiYShBcnJheS5wcm90b3R5cGUsYSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGZhKHRoaXMpfX0pO2VhPWZ1bmN0aW9uKCl7fX1mdW5jdGlvbiBmYShhKXt2YXIgYj0wO3JldHVybiBoYShmdW5jdGlvbigpe3JldHVybiBiPGEubGVuZ3RoP3tkb25lOiExLHZhbHVlOmFbYisrXX06e2RvbmU6ITB9fSl9ZnVuY3Rpb24gaGEoYSl7ZWEoKTthPXtuZXh0OmF9O2FbYWEuU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtyZXR1cm4gYX1mdW5jdGlvbiBpYShhKXtlYSgpO3ZhciBiPWFbU3ltYm9sLml0ZXJhdG9yXTtyZXR1cm4gYj9iLmNhbGwoYSk6ZmEoYSl9CmZ1bmN0aW9uIGphKGEpe2Zvcih2YXIgYixjPVtdOyEoYj1hLm5leHQoKSkuZG9uZTspYy5wdXNoKGIudmFsdWUpO3JldHVybiBjfQooZnVuY3Rpb24oKXtpZighZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTthLmluaXRFdmVudCgiZm9vIiwhMCwhMCk7YS5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBhLmRlZmF1bHRQcmV2ZW50ZWR9KCkpe3ZhciBhPUV2ZW50LnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdDtFdmVudC5wcm90b3R5cGUucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbGFibGUmJihhLmNhbGwodGhpcyksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImRlZmF1bHRQcmV2ZW50ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sY29uZmlndXJhYmxlOiEwfSkpfX12YXIgYj0vVHJpZGVudC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZighd2luZG93LkN1c3RvbUV2ZW50fHxiJiYiZnVuY3Rpb24iIT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCl3aW5kb3cuQ3VzdG9tRXZlbnQ9ZnVuY3Rpb24oYSxiKXtiPWJ8fHt9O3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpOwpjLmluaXRDdXN0b21FdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlLGIuZGV0YWlsKTtyZXR1cm4gY30sd2luZG93LkN1c3RvbUV2ZW50LnByb3RvdHlwZT13aW5kb3cuRXZlbnQucHJvdG90eXBlO2lmKCF3aW5kb3cuRXZlbnR8fGImJiJmdW5jdGlvbiIhPT10eXBlb2Ygd2luZG93LkV2ZW50KXt2YXIgYz13aW5kb3cuRXZlbnQ7d2luZG93LkV2ZW50PWZ1bmN0aW9uKGEsYil7Yj1ifHx7fTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtjLmluaXRFdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlKTtyZXR1cm4gY307aWYoYylmb3IodmFyIGQgaW4gYyl3aW5kb3cuRXZlbnRbZF09Y1tkXTt3aW5kb3cuRXZlbnQucHJvdG90eXBlPWMucHJvdG90eXBlfWlmKCF3aW5kb3cuTW91c2VFdmVudHx8YiYmImZ1bmN0aW9uIiE9PXR5cGVvZiB3aW5kb3cuTW91c2VFdmVudCl7Yj13aW5kb3cuTW91c2VFdmVudDt3aW5kb3cuTW91c2VFdmVudD1mdW5jdGlvbihhLApiKXtiPWJ8fHt9O3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50Iik7Yy5pbml0TW91c2VFdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlLGIudmlld3x8d2luZG93LGIuZGV0YWlsLGIuc2NyZWVuWCxiLnNjcmVlblksYi5jbGllbnRYLGIuY2xpZW50WSxiLmN0cmxLZXksYi5hbHRLZXksYi5zaGlmdEtleSxiLm1ldGFLZXksYi5idXR0b24sYi5yZWxhdGVkVGFyZ2V0KTtyZXR1cm4gY307aWYoYilmb3IoZCBpbiBiKXdpbmRvdy5Nb3VzZUV2ZW50W2RdPWJbZF07d2luZG93Lk1vdXNlRXZlbnQucHJvdG90eXBlPWIucHJvdG90eXBlfUFycmF5LmZyb218fChBcnJheS5mcm9tPWZ1bmN0aW9uKGEpe3JldHVybltdLnNsaWNlLmNhbGwoYSl9KTtPYmplY3QuYXNzaWdufHwoT2JqZWN0LmFzc2lnbj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxkPTAsZTtkPGMubGVuZ3RoO2QrKylpZihlPWNbZF0pZm9yKHZhciBmPQphLG49ZSxyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG4pLEc9MDtHPHIubGVuZ3RoO0crKyllPXJbR10sZltlXT1uW2VdO3JldHVybiBhfSl9KSh3aW5kb3cuV2ViQ29tcG9uZW50cyk7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe31mdW5jdGlvbiBiKGEsYil7aWYoIWEuY2hpbGROb2Rlcy5sZW5ndGgpcmV0dXJuW107c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgTm9kZS5ET0NVTUVOVF9OT0RFOnJldHVybiBHLmNhbGwoYSxiKTtjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpyZXR1cm4geC5jYWxsKGEsYik7ZGVmYXVsdDpyZXR1cm4gci5jYWxsKGEsYil9fXZhciBjPSJ1bmRlZmluZWQiPT09dHlwZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQsZD0hKGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5jbG9uZU5vZGUoKWluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCksZT0hMTsvVHJpZGVudC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYil7aWYoYSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpZm9yKHZhciBkO2Q9YS5maXJzdENoaWxkOyljLmNhbGwodGhpcyxkLGIpO2Vsc2UgYy5jYWxsKHRoaXMsCmEsYik7cmV0dXJuIGF9ZT0hMDt2YXIgYj1Ob2RlLnByb3RvdHlwZS5jbG9uZU5vZGU7Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlPWZ1bmN0aW9uKGEpe2E9Yi5jYWxsKHRoaXMsYSk7dGhpcyBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQmJihhLl9fcHJvdG9fXz1Eb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSk7cmV0dXJuIGF9O0RvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGw9SFRNTEVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGw7RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3Rvcj1IVE1MRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvcjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSx7bm9kZVR5cGU6e2dldDpmdW5jdGlvbigpe3JldHVybiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREV9LGNvbmZpZ3VyYWJsZTohMH0sbG9jYWxOYW1lOntnZXQ6ZnVuY3Rpb24oKXt9LApjb25maWd1cmFibGU6ITB9LG5vZGVOYW1lOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iI2RvY3VtZW50LWZyYWdtZW50In0sY29uZmlndXJhYmxlOiEwfX0pO3ZhciBjPU5vZGUucHJvdG90eXBlLmluc2VydEJlZm9yZTtOb2RlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmU9YTt2YXIgZD1Ob2RlLnByb3RvdHlwZS5hcHBlbmRDaGlsZDtOb2RlLnByb3RvdHlwZS5hcHBlbmRDaGlsZD1mdW5jdGlvbihiKXtiIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudD9hLmNhbGwodGhpcyxiLG51bGwpOmQuY2FsbCh0aGlzLGIpO3JldHVybiBifTt2YXIgZj1Ob2RlLnByb3RvdHlwZS5yZW1vdmVDaGlsZCxnPU5vZGUucHJvdG90eXBlLnJlcGxhY2VDaGlsZDtOb2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQ9ZnVuY3Rpb24oYixjKXtiIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudD8oYS5jYWxsKHRoaXMsYixjKSxmLmNhbGwodGhpcyxjKSk6Zy5jYWxsKHRoaXMsYixjKTtyZXR1cm4gY307RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQ9CmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jcmVhdGVFbGVtZW50KCJkZiIpO2EuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlO3JldHVybiBhfTt2YXIgaD1Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZTtEb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZT1mdW5jdGlvbihhLGIpe2I9aC5jYWxsKHRoaXMsYSxifHwhMSk7YSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQmJihiLl9fcHJvdG9fXz1Eb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSk7cmV0dXJuIGJ9fSgpO3ZhciBmPU5vZGUucHJvdG90eXBlLmNsb25lTm9kZSxnPURvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50LGg9RG9jdW1lbnQucHJvdG90eXBlLmltcG9ydE5vZGUsaz1Ob2RlLnByb3RvdHlwZS5yZW1vdmVDaGlsZCxtPU5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkLG49Tm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkLHI9RWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbCwKRz1Eb2N1bWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbCx4PURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwsdj1mdW5jdGlvbigpe2lmKCFjKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpLGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtiLmNvbnRlbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpO2EuY29udGVudC5hcHBlbmRDaGlsZChiKTthPWEuY2xvbmVOb2RlKCEwKTtyZXR1cm4gMD09PWEuY29udGVudC5jaGlsZE5vZGVzLmxlbmd0aHx8MD09PWEuY29udGVudC5maXJzdENoaWxkLmNvbnRlbnQuY2hpbGROb2Rlcy5sZW5ndGh8fGR9fSgpO2lmKGMpe3ZhciBVPWRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgidGVtcGxhdGUiKSxEYz0hMCx4YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO3hhLnRleHRDb250ZW50PSJ0ZW1wbGF0ZXtkaXNwbGF5Om5vbmU7fSI7CnZhciBFYz1kb2N1bWVudC5oZWFkO0VjLmluc2VydEJlZm9yZSh4YSxFYy5maXJzdEVsZW1lbnRDaGlsZCk7YS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShIVE1MRWxlbWVudC5wcm90b3R5cGUpO3ZhciBtZj0hZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikuaGFzT3duUHJvcGVydHkoImlubmVySFRNTCIpO2EuUj1mdW5jdGlvbihiKXtpZighYi5jb250ZW50JiZiLm5hbWVzcGFjZVVSST09PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkpe2IuY29udGVudD1VLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmb3IodmFyIGM7Yz1iLmZpcnN0Q2hpbGQ7KW0uY2FsbChiLmNvbnRlbnQsYyk7aWYobWYpYi5fX3Byb3RvX189YS5wcm90b3R5cGU7ZWxzZSBpZihiLmNsb25lTm9kZT1mdW5jdGlvbihiKXtyZXR1cm4gYS5hKHRoaXMsYil9LERjKXRyeXtwKGIpLEZjKGIpfWNhdGNoKHpoKXtEYz0hMX1hLmIoYi5jb250ZW50KX19O3ZhciBwPWZ1bmN0aW9uKGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShiLAoiaW5uZXJIVE1MIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEdjKHRoaXMpfSxzZXQ6ZnVuY3Rpb24oYil7VS5ib2R5LmlubmVySFRNTD1iO2ZvcihhLmIoVSk7dGhpcy5jb250ZW50LmZpcnN0Q2hpbGQ7KWsuY2FsbCh0aGlzLmNvbnRlbnQsdGhpcy5jb250ZW50LmZpcnN0Q2hpbGQpO2Zvcig7VS5ib2R5LmZpcnN0Q2hpbGQ7KW0uY2FsbCh0aGlzLmNvbnRlbnQsVS5ib2R5LmZpcnN0Q2hpbGQpfSxjb25maWd1cmFibGU6ITB9KX0sRmM9ZnVuY3Rpb24oYSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIm91dGVySFRNTCIse2dldDpmdW5jdGlvbigpe3JldHVybiI8dGVtcGxhdGU+Iit0aGlzLmlubmVySFRNTCsiPC90ZW1wbGF0ZT4ifSxzZXQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5wYXJlbnROb2RlKXtVLmJvZHkuaW5uZXJIVE1MPWE7Zm9yKGE9dGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtVLmJvZHkuZmlyc3RDaGlsZDspbS5jYWxsKGEsVS5ib2R5LmZpcnN0Q2hpbGQpOwpuLmNhbGwodGhpcy5wYXJlbnROb2RlLGEsdGhpcyl9ZWxzZSB0aHJvdyBFcnJvcigiRmFpbGVkIHRvIHNldCB0aGUgJ291dGVySFRNTCcgcHJvcGVydHkgb24gJ0VsZW1lbnQnOiBUaGlzIGVsZW1lbnQgaGFzIG5vIHBhcmVudCBub2RlLiIpO30sY29uZmlndXJhYmxlOiEwfSl9O3AoYS5wcm90b3R5cGUpO0ZjKGEucHJvdG90eXBlKTthLmI9ZnVuY3Rpb24oYyl7Yz1iKGMsInRlbXBsYXRlIik7Zm9yKHZhciBkPTAsZT1jLmxlbmd0aCxmO2Q8ZSYmKGY9Y1tkXSk7ZCsrKWEuUihmKX07ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsZnVuY3Rpb24oKXthLmIoZG9jdW1lbnQpfSk7RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgYj1nLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsidGVtcGxhdGUiPT09Yi5sb2NhbE5hbWUmJmEuUihiKTtyZXR1cm4gYn07dmFyIG5mPS9bJlx1MDBBMCJdL2csa2I9L1smXHUwMEEwPD5dL2csCmw9ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgIiYiOnJldHVybiImYW1wOyI7Y2FzZSAiPCI6cmV0dXJuIiZsdDsiO2Nhc2UgIj4iOnJldHVybiImZ3Q7IjtjYXNlICciJzpyZXR1cm4iJnF1b3Q7IjtjYXNlICJcdTAwYTAiOnJldHVybiImbmJzcDsifX07eGE9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGM9MDtjPGEubGVuZ3RoO2MrKyliW2FbY11dPSEwO3JldHVybiBifTt2YXIgRj14YSgiYXJlYSBiYXNlIGJyIGNvbCBjb21tYW5kIGVtYmVkIGhyIGltZyBpbnB1dCBrZXlnZW4gbGluayBtZXRhIHBhcmFtIHNvdXJjZSB0cmFjayB3YnIiLnNwbGl0KCIgIikpLG9mPXhhKCJzdHlsZSBzY3JpcHQgeG1wIGlmcmFtZSBub2VtYmVkIG5vZnJhbWVzIHBsYWludGV4dCBub3NjcmlwdCIuc3BsaXQoIiAiKSksR2M9ZnVuY3Rpb24oYSxiKXsidGVtcGxhdGUiPT09YS5sb2NhbE5hbWUmJihhPWEuY29udGVudCk7Zm9yKHZhciBjPSIiLGQ9Yj9iKGEpOmEuY2hpbGROb2RlcyxlPTAsZj1kLmxlbmd0aCwKZztlPGYmJihnPWRbZV0pO2UrKyl7YTp7dmFyIGg9Zzt2YXIgaz1hO3ZhciBtPWI7c3dpdGNoKGgubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Zm9yKHZhciBuPWgubG9jYWxOYW1lLHY9IjwiK24scj1oLmF0dHJpYnV0ZXMscD0wO2s9cltwXTtwKyspdis9IiAiK2submFtZSsnPSInK2sudmFsdWUucmVwbGFjZShuZixsKSsnIic7dis9Ij4iO2g9RltuXT92OnYrR2MoaCxtKSsiPC8iK24rIj4iO2JyZWFrIGE7Y2FzZSBOb2RlLlRFWFRfTk9ERTpoPWguZGF0YTtoPWsmJm9mW2subG9jYWxOYW1lXT9oOmgucmVwbGFjZShrYixsKTticmVhayBhO2Nhc2UgTm9kZS5DT01NRU5UX05PREU6aD0iXHgzYyEtLSIraC5kYXRhKyItLVx4M2UiO2JyZWFrIGE7ZGVmYXVsdDp0aHJvdyB3aW5kb3cuY29uc29sZS5lcnJvcihoKSxFcnJvcigibm90IGltcGxlbWVudGVkIik7fX1jKz1ofXJldHVybiBjfX1pZihjfHx2KXthLmE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1mLmNhbGwoYSwhMSk7CnRoaXMuUiYmdGhpcy5SKGMpO2ImJihtLmNhbGwoYy5jb250ZW50LGYuY2FsbChhLmNvbnRlbnQsITApKSxsYihjLmNvbnRlbnQsYS5jb250ZW50KSk7cmV0dXJuIGN9O3ZhciBsYj1mdW5jdGlvbihjLGQpe2lmKGQucXVlcnlTZWxlY3RvckFsbCYmKGQ9YihkLCJ0ZW1wbGF0ZSIpLDAhPT1kLmxlbmd0aCkpe2M9YihjLCJ0ZW1wbGF0ZSIpO2Zvcih2YXIgZT0wLGY9Yy5sZW5ndGgsZyxoO2U8ZjtlKyspaD1kW2VdLGc9Y1tlXSxhJiZhLlImJmEuUihoKSxuLmNhbGwoZy5wYXJlbnROb2RlLHBmLmNhbGwoaCwhMCksZyl9fSxwZj1Ob2RlLnByb3RvdHlwZS5jbG9uZU5vZGU9ZnVuY3Rpb24oYil7aWYoIWUmJmQmJnRoaXMgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KWlmKGIpdmFyIGM9cWYuY2FsbCh0aGlzLm93bmVyRG9jdW1lbnQsdGhpcywhMCk7ZWxzZSByZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtlbHNlIHRoaXMubm9kZVR5cGU9PT0KTm9kZS5FTEVNRU5UX05PREUmJiJ0ZW1wbGF0ZSI9PT10aGlzLmxvY2FsTmFtZSYmdGhpcy5uYW1lc3BhY2VVUkk9PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkk/Yz1hLmEodGhpcyxiKTpjPWYuY2FsbCh0aGlzLGIpO2ImJmxiKGMsdGhpcyk7cmV0dXJuIGN9LHFmPURvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlPWZ1bmN0aW9uKGMsZCl7ZD1kfHwhMTtpZigidGVtcGxhdGUiPT09Yy5sb2NhbE5hbWUpcmV0dXJuIGEuYShjLGQpO3ZhciBlPWguY2FsbCh0aGlzLGMsZCk7aWYoZCl7bGIoZSxjKTtjPWIoZSwnc2NyaXB0Om5vdChbdHlwZV0pLHNjcmlwdFt0eXBlPSJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Il0sc2NyaXB0W3R5cGU9InRleHQvamF2YXNjcmlwdCJdJyk7Zm9yKHZhciBmLGs9MDtrPGMubGVuZ3RoO2srKyl7Zj1jW2tdO2Q9Zy5jYWxsKGRvY3VtZW50LCJzY3JpcHQiKTtkLnRleHRDb250ZW50PWYudGV4dENvbnRlbnQ7Zm9yKHZhciBtPWYuYXR0cmlidXRlcywKbD0wLHY7bDxtLmxlbmd0aDtsKyspdj1tW2xdLGQuc2V0QXR0cmlidXRlKHYubmFtZSx2LnZhbHVlKTtuLmNhbGwoZi5wYXJlbnROb2RlLGQsZil9fXJldHVybiBlfX1jJiYod2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQ9YSl9KSgpO3ZhciBrYTtBcnJheS5pc0FycmF5P2thPUFycmF5LmlzQXJyYXk6a2E9ZnVuY3Rpb24oYSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKX07dmFyIGxhPWthO3ZhciBtYT0wLG5hLG9hPSJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdz93aW5kb3c6dm9pZCAwLHBhPW9hfHx7fSxxYT1wYS5NdXRhdGlvbk9ic2VydmVyfHxwYS5XZWJLaXRNdXRhdGlvbk9ic2VydmVyLHJhPSJ1bmRlZmluZWQiPT09dHlwZW9mIHNlbGYmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHByb2Nlc3MmJiJbb2JqZWN0IHByb2Nlc3NdIj09PXt9LnRvU3RyaW5nLmNhbGwocHJvY2Vzcyksc2E9InVuZGVmaW5lZCIhPT10eXBlb2YgVWludDhDbGFtcGVkQXJyYXkmJiJ1bmRlZmluZWQiIT09dHlwZW9mIGltcG9ydFNjcmlwdHMmJiJ1bmRlZmluZWQiIT09dHlwZW9mIE1lc3NhZ2VDaGFubmVsO2Z1bmN0aW9uIHRhKCl7cmV0dXJuInVuZGVmaW5lZCIhPT10eXBlb2YgbmE/ZnVuY3Rpb24oKXtuYSh1YSl9OnZhKCl9CmZ1bmN0aW9uIHdhKCl7dmFyIGE9MCxiPW5ldyBxYSh1YSksYz1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIik7Yi5vYnNlcnZlKGMse2NoYXJhY3RlckRhdGE6ITB9KTtyZXR1cm4gZnVuY3Rpb24oKXtjLmRhdGE9YT0rK2ElMn19ZnVuY3Rpb24geWEoKXt2YXIgYT1uZXcgTWVzc2FnZUNoYW5uZWw7YS5wb3J0MS5vbm1lc3NhZ2U9dWE7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGEucG9ydDIucG9zdE1lc3NhZ2UoMCl9fWZ1bmN0aW9uIHZhKCl7dmFyIGE9c2V0VGltZW91dDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYSh1YSwxKX19dmFyIHphPUFycmF5KDFFMyk7ZnVuY3Rpb24gdWEoKXtmb3IodmFyIGE9MDthPG1hO2ErPTIpKDAsemFbYV0pKHphW2ErMV0pLHphW2FdPXZvaWQgMCx6YVthKzFdPXZvaWQgMDttYT0wfXZhciBBYSxCYTsKaWYocmEpQmE9ZnVuY3Rpb24oKXtyZXR1cm4gcHJvY2Vzcy54Yih1YSl9O2Vsc2V7dmFyIENhO2lmKHFhKUNhPXdhKCk7ZWxzZXt2YXIgRGE7aWYoc2EpRGE9eWEoKTtlbHNle3ZhciBFYTtpZih2b2lkIDA9PT1vYSYmImZ1bmN0aW9uIj09PXR5cGVvZiByZXF1aXJlKXRyeXt2YXIgRmE9cmVxdWlyZSgidmVydHgiKTtuYT1GYS56Ynx8RmEueWI7RWE9dGEoKX1jYXRjaChhKXtFYT12YSgpfWVsc2UgRWE9dmEoKTtEYT1FYX1DYT1EYX1CYT1DYX1BYT1CYTtmdW5jdGlvbiBHYShhLGIpe3phW21hXT1hO3phW21hKzFdPWI7bWErPTI7Mj09PW1hJiZBYSgpfTtmdW5jdGlvbiBIYShhLGIpe3ZhciBjPXRoaXMsZD1uZXcgdGhpcy5jb25zdHJ1Y3RvcihJYSk7dm9pZCAwPT09ZFtKYV0mJkthKGQpO3ZhciBlPWMubztpZihlKXt2YXIgZj1hcmd1bWVudHNbZS0xXTtHYShmdW5jdGlvbigpe3JldHVybiBMYShlLGQsZixjLmwpfSl9ZWxzZSBNYShjLGQsYSxiKTtyZXR1cm4gZH07ZnVuY3Rpb24gTmEoYSl7aWYoYSYmIm9iamVjdCI9PT10eXBlb2YgYSYmYS5jb25zdHJ1Y3Rvcj09PXRoaXMpcmV0dXJuIGE7dmFyIGI9bmV3IHRoaXMoSWEpO09hKGIsYSk7cmV0dXJuIGJ9O3ZhciBKYT1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMTYpO2Z1bmN0aW9uIElhKCl7fXZhciBRYT1uZXcgUGE7ZnVuY3Rpb24gUmEoYSl7dHJ5e3JldHVybiBhLnRoZW59Y2F0Y2goYil7cmV0dXJuIFFhLmVycm9yPWIsUWF9fWZ1bmN0aW9uIFNhKGEsYixjLGQpe3RyeXthLmNhbGwoYixjLGQpfWNhdGNoKGUpe3JldHVybiBlfX1mdW5jdGlvbiBUYShhLGIsYyl7R2EoZnVuY3Rpb24oYSl7dmFyIGQ9ITEsZj1TYShjLGIsZnVuY3Rpb24oYyl7ZHx8KGQ9ITAsYiE9PWM/T2EoYSxjKTp0KGEsYykpfSxmdW5jdGlvbihiKXtkfHwoZD0hMCx1KGEsYikpfSk7IWQmJmYmJihkPSEwLHUoYSxmKSl9LGEpfWZ1bmN0aW9uIFVhKGEsYil7MT09PWIubz90KGEsYi5sKToyPT09Yi5vP3UoYSxiLmwpOk1hKGIsdm9pZCAwLGZ1bmN0aW9uKGIpe3JldHVybiBPYShhLGIpfSxmdW5jdGlvbihiKXtyZXR1cm4gdShhLGIpfSl9CmZ1bmN0aW9uIFZhKGEsYixjKXtiLmNvbnN0cnVjdG9yPT09YS5jb25zdHJ1Y3RvciYmYz09PUhhJiZiLmNvbnN0cnVjdG9yLnJlc29sdmU9PT1OYT9VYShhLGIpOmM9PT1RYT8odShhLFFhLmVycm9yKSxRYS5lcnJvcj1udWxsKTp2b2lkIDA9PT1jP3QoYSxiKToiZnVuY3Rpb24iPT09dHlwZW9mIGM/VGEoYSxiLGMpOnQoYSxiKX1mdW5jdGlvbiBPYShhLGIpe2lmKGE9PT1iKXUoYSxuZXcgVHlwZUVycm9yKCJZb3UgY2Fubm90IHJlc29sdmUgYSBwcm9taXNlIHdpdGggaXRzZWxmIikpO2Vsc2V7dmFyIGM9dHlwZW9mIGI7bnVsbD09PWJ8fCJvYmplY3QiIT09YyYmImZ1bmN0aW9uIiE9PWM/dChhLGIpOlZhKGEsYixSYShiKSl9fWZ1bmN0aW9uIFdhKGEpe2EueGEmJmEueGEoYS5sKTtYYShhKX1mdW5jdGlvbiB0KGEsYil7dm9pZCAwPT09YS5vJiYoYS5sPWIsYS5vPTEsMCE9PWEuVS5sZW5ndGgmJkdhKFhhLGEpKX0KZnVuY3Rpb24gdShhLGIpe3ZvaWQgMD09PWEubyYmKGEubz0yLGEubD1iLEdhKFdhLGEpKX1mdW5jdGlvbiBNYShhLGIsYyxkKXt2YXIgZT1hLlUsZj1lLmxlbmd0aDthLnhhPW51bGw7ZVtmXT1iO2VbZisxXT1jO2VbZisyXT1kOzA9PT1mJiZhLm8mJkdhKFhhLGEpfWZ1bmN0aW9uIFhhKGEpe3ZhciBiPWEuVSxjPWEubztpZigwIT09Yi5sZW5ndGgpe2Zvcih2YXIgZCxlLGY9YS5sLGc9MDtnPGIubGVuZ3RoO2crPTMpZD1iW2ddLGU9YltnK2NdLGQ/TGEoYyxkLGUsZik6ZShmKTthLlUubGVuZ3RoPTB9fWZ1bmN0aW9uIFBhKCl7dGhpcy5lcnJvcj1udWxsfXZhciBZYT1uZXcgUGE7CmZ1bmN0aW9uIExhKGEsYixjLGQpe3ZhciBlPSJmdW5jdGlvbiI9PT10eXBlb2YgYztpZihlKXt0cnl7dmFyIGY9YyhkKX1jYXRjaChtKXtZYS5lcnJvcj1tLGY9WWF9aWYoZj09PVlhKXt2YXIgZz0hMDt2YXIgaD1mLmVycm9yO2YuZXJyb3I9bnVsbH1lbHNlIHZhciBrPSEwO2lmKGI9PT1mKXt1KGIsbmV3IFR5cGVFcnJvcigiQSBwcm9taXNlcyBjYWxsYmFjayBjYW5ub3QgcmV0dXJuIHRoYXQgc2FtZSBwcm9taXNlLiIpKTtyZXR1cm59fWVsc2UgZj1kLGs9ITA7dm9pZCAwPT09Yi5vJiYoZSYmaz9PYShiLGYpOmc/dShiLGgpOjE9PT1hP3QoYixmKToyPT09YSYmdShiLGYpKX1mdW5jdGlvbiBaYShhLGIpe3RyeXtiKGZ1bmN0aW9uKGIpe09hKGEsYil9LGZ1bmN0aW9uKGIpe3UoYSxiKX0pfWNhdGNoKGMpe3UoYSxjKX19dmFyICRhPTA7ZnVuY3Rpb24gS2EoYSl7YVtKYV09JGErKzthLm89dm9pZCAwO2EubD12b2lkIDA7YS5VPVtdfTtmdW5jdGlvbiBhYihhLGIpe3RoaXMuTmE9YTt0aGlzLk49bmV3IGEoSWEpO3RoaXMuTltKYV18fEthKHRoaXMuTik7aWYobGEoYikpaWYodGhpcy4kPXRoaXMubGVuZ3RoPWIubGVuZ3RoLHRoaXMubD1BcnJheSh0aGlzLmxlbmd0aCksMD09PXRoaXMubGVuZ3RoKXQodGhpcy5OLHRoaXMubCk7ZWxzZXt0aGlzLmxlbmd0aD10aGlzLmxlbmd0aHx8MDtmb3IoYT0wO3ZvaWQgMD09PXRoaXMubyYmYTxiLmxlbmd0aDthKyspYmIodGhpcyxiW2FdLGEpOzA9PT10aGlzLiQmJnQodGhpcy5OLHRoaXMubCl9ZWxzZSB1KHRoaXMuTixFcnJvcigiQXJyYXkgTWV0aG9kcyBtdXN0IGJlIHByb3ZpZGVkIGFuIEFycmF5IikpfQpmdW5jdGlvbiBiYihhLGIsYyl7dmFyIGQ9YS5OYSxlPWQucmVzb2x2ZTtlPT09TmE/KGU9UmEoYiksZT09PUhhJiZ2b2lkIDAhPT1iLm8/Y2IoYSxiLm8sYyxiLmwpOiJmdW5jdGlvbiIhPT10eXBlb2YgZT8oYS4kLS0sYS5sW2NdPWIpOmQ9PT13PyhkPW5ldyBkKElhKSxWYShkLGIsZSksZGIoYSxkLGMpKTpkYihhLG5ldyBkKGZ1bmN0aW9uKGEpe3JldHVybiBhKGIpfSksYykpOmRiKGEsZShiKSxjKX1mdW5jdGlvbiBjYihhLGIsYyxkKXt2YXIgZT1hLk47dm9pZCAwPT09ZS5vJiYoYS4kLS0sMj09PWI/dShlLGQpOmEubFtjXT1kKTswPT09YS4kJiZ0KGUsYS5sKX1mdW5jdGlvbiBkYihhLGIsYyl7TWEoYix2b2lkIDAsZnVuY3Rpb24oYil7cmV0dXJuIGNiKGEsMSxjLGIpfSxmdW5jdGlvbihiKXtyZXR1cm4gY2IoYSwyLGMsYil9KX07ZnVuY3Rpb24gZWIoYSl7cmV0dXJuKG5ldyBhYih0aGlzLGEpKS5OfTtmdW5jdGlvbiBmYihhKXt2YXIgYj10aGlzO3JldHVybiBsYShhKT9uZXcgYihmdW5jdGlvbihjLGQpe2Zvcih2YXIgZT1hLmxlbmd0aCxmPTA7ZjxlO2YrKyliLnJlc29sdmUoYVtmXSkudGhlbihjLGQpfSk6bmV3IGIoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYihuZXcgVHlwZUVycm9yKCJZb3UgbXVzdCBwYXNzIGFuIGFycmF5IHRvIHJhY2UuIikpfSl9O2Z1bmN0aW9uIGdiKGEpe3ZhciBiPW5ldyB0aGlzKElhKTt1KGIsYSk7cmV0dXJuIGJ9O2Z1bmN0aW9uIHcoYSl7dGhpc1tKYV09JGErKzt0aGlzLmw9dGhpcy5vPXZvaWQgMDt0aGlzLlU9W107aWYoSWEhPT1hKXtpZigiZnVuY3Rpb24iIT09dHlwZW9mIGEpdGhyb3cgbmV3IFR5cGVFcnJvcigiWW91IG11c3QgcGFzcyBhIHJlc29sdmVyIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgcHJvbWlzZSBjb25zdHJ1Y3RvciIpO2lmKHRoaXMgaW5zdGFuY2VvZiB3KVphKHRoaXMsYSk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCJGYWlsZWQgdG8gY29uc3RydWN0ICdQcm9taXNlJzogUGxlYXNlIHVzZSB0aGUgJ25ldycgb3BlcmF0b3IsIHRoaXMgb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi4iKTt9fXcucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp3LHRoZW46SGEsYTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50aGVuKG51bGwsYSl9fTsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8Kd2luZG93LlByb21pc2V8fCh3aW5kb3cuUHJvbWlzZT13LHcucHJvdG90eXBlWyJjYXRjaCJdPXcucHJvdG90eXBlLmEsdy5wcm90b3R5cGUudGhlbj13LnByb3RvdHlwZS50aGVuLHcuYWxsPWViLHcucmFjZT1mYix3LnJlc29sdmU9TmEsdy5yZWplY3Q9Z2IpOy8qCgogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwp3aW5kb3cuV2ViQ29tcG9uZW50cz13aW5kb3cuV2ViQ29tcG9uZW50c3x8e2ZsYWdzOnt9fTt2YXIgaGI9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYyo9IndlYmNvbXBvbmVudHMtYnVuZGxlIl0nKSxpYj0vd2MtKC4rKS8seT17fTtpZigheS5ub09wdHMpe2xvY2F0aW9uLnNlYXJjaC5zbGljZSgxKS5zcGxpdCgiJiIpLmZvckVhY2goZnVuY3Rpb24oYSl7YT1hLnNwbGl0KCI9Iik7dmFyIGI7YVswXSYmKGI9YVswXS5tYXRjaChpYikpJiYoeVtiWzFdXT1hWzFdfHwhMCl9KTtpZihoYilmb3IodmFyIGpiPTAsbWI7bWI9aGIuYXR0cmlidXRlc1tqYl07amIrKykic3JjIiE9PW1iLm5hbWUmJih5W21iLm5hbWVdPW1iLnZhbHVlfHwhMCk7aWYoeS5sb2cmJnkubG9nLnNwbGl0KXt2YXIgbmI9eS5sb2cuc3BsaXQoIiwiKTt5LmxvZz17fTtuYi5mb3JFYWNoKGZ1bmN0aW9uKGEpe3kubG9nW2FdPSEwfSl9ZWxzZSB5LmxvZz17fX0Kd2luZG93LldlYkNvbXBvbmVudHMuZmxhZ3M9eTt2YXIgb2I9eS5zaGFkeWRvbTtvYiYmKHdpbmRvdy5TaGFkeURPTT13aW5kb3cuU2hhZHlET018fHt9LHdpbmRvdy5TaGFkeURPTS5mb3JjZT1vYik7dmFyIHBiPXkucmVnaXN0ZXJ8fHkuY2U7cGImJndpbmRvdy5jdXN0b21FbGVtZW50cyYmKHdpbmRvdy5jdXN0b21FbGVtZW50cy5mb3JjZVBvbHlmaWxsPXBiKTsvKgoKQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KZnVuY3Rpb24gcWIoKXt0aGlzLkRhPXRoaXMucm9vdD1udWxsO3RoaXMuZGE9ITE7dGhpcy5MPXRoaXMuWj10aGlzLnBhPXRoaXMuYXNzaWduZWRTbG90PXRoaXMuYXNzaWduZWROb2Rlcz10aGlzLlM9bnVsbDt0aGlzLmNoaWxkTm9kZXM9dGhpcy5uZXh0U2libGluZz10aGlzLnByZXZpb3VzU2libGluZz10aGlzLmxhc3RDaGlsZD10aGlzLmZpcnN0Q2hpbGQ9dGhpcy5wYXJlbnROb2RlPXRoaXMuVj12b2lkIDA7dGhpcy5JYT10aGlzLnZhPSExfXFiLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57fX07ZnVuY3Rpb24geihhKXthLmthfHwoYS5rYT1uZXcgcWIpO3JldHVybiBhLmthfWZ1bmN0aW9uIEEoYSl7cmV0dXJuIGEmJmEua2F9O3ZhciBCPXdpbmRvdy5TaGFkeURPTXx8e307Qi5VYT0hKCFFbGVtZW50LnByb3RvdHlwZS5hdHRhY2hTaGFkb3d8fCFOb2RlLnByb3RvdHlwZS5nZXRSb290Tm9kZSk7dmFyIHJiPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTm9kZS5wcm90b3R5cGUsImZpcnN0Q2hpbGQiKTtCLkk9ISEocmImJnJiLmNvbmZpZ3VyYWJsZSYmcmIuZ2V0KTtCLkJhPUIuZm9yY2V8fCFCLlVhO3ZhciBzYj1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKCJUcmlkZW50IiksdGI9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgiRWRnZSIpO3ZvaWQgMD09PUIuRmEmJihCLkZhPUIuSSYmKHNifHx0YikpO2Z1bmN0aW9uIHViKGEpe3JldHVybihhPUEoYSkpJiZ2b2lkIDAhPT1hLmZpcnN0Q2hpbGR9ZnVuY3Rpb24gQyhhKXtyZXR1cm4iU2hhZHlSb290Ij09PWEuT2F9ZnVuY3Rpb24gdmIoYSl7YT1hLmdldFJvb3ROb2RlKCk7aWYoQyhhKSlyZXR1cm4gYX0KdmFyIHdiPUVsZW1lbnQucHJvdG90eXBlLHhiPXdiLm1hdGNoZXN8fHdiLm1hdGNoZXNTZWxlY3Rvcnx8d2IubW96TWF0Y2hlc1NlbGVjdG9yfHx3Yi5tc01hdGNoZXNTZWxlY3Rvcnx8d2Iub01hdGNoZXNTZWxlY3Rvcnx8d2Iud2Via2l0TWF0Y2hlc1NlbGVjdG9yO2Z1bmN0aW9uIHliKGEsYil7aWYoYSYmYilmb3IodmFyIGM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYiksZD0wLGU7ZDxjLmxlbmd0aCYmKGU9Y1tkXSk7ZCsrKXt2YXIgZj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGIsZSk7ZiYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZSxmKX19ZnVuY3Rpb24gemIoYSxiKXtmb3IodmFyIGM9W10sZD0xO2Q8YXJndW1lbnRzLmxlbmd0aDsrK2QpY1tkLTFdPWFyZ3VtZW50c1tkXTtmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKXliKGEsY1tkXSk7cmV0dXJuIGF9ZnVuY3Rpb24gQWIoYSxiKXtmb3IodmFyIGMgaW4gYilhW2NdPWJbY119CnZhciBCYj1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIiksQ2I9MCxEYj1bXTsobmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXtmb3IoO0RiLmxlbmd0aDspdHJ5e0RiLnNoaWZ0KCkoKX1jYXRjaChhKXt0aHJvdyBCYi50ZXh0Q29udGVudD1DYisrLGE7fX0pKS5vYnNlcnZlKEJiLHtjaGFyYWN0ZXJEYXRhOiEwfSk7ZnVuY3Rpb24gRWIoYSl7RGIucHVzaChhKTtCYi50ZXh0Q29udGVudD1DYisrfXZhciBGYj0hIWRvY3VtZW50LmNvbnRhaW5zO2Z1bmN0aW9uIEdiKGEsYil7Zm9yKDtiOyl7aWYoYj09YSlyZXR1cm4hMDtiPWIucGFyZW50Tm9kZX1yZXR1cm4hMX07dmFyIEhiPVtdLEliO2Z1bmN0aW9uIEpiKGEpe0lifHwoSWI9ITAsRWIoS2IpKTtIYi5wdXNoKGEpfWZ1bmN0aW9uIEtiKCl7SWI9ITE7Zm9yKHZhciBhPSEhSGIubGVuZ3RoO0hiLmxlbmd0aDspSGIuc2hpZnQoKSgpO3JldHVybiBhfUtiLmxpc3Q9SGI7ZnVuY3Rpb24gTGIoKXt0aGlzLmE9ITE7dGhpcy5hZGRlZE5vZGVzPVtdO3RoaXMucmVtb3ZlZE5vZGVzPVtdO3RoaXMuY2E9bmV3IFNldH1mdW5jdGlvbiBNYihhKXthLmF8fChhLmE9ITAsRWIoZnVuY3Rpb24oKXtOYihhKX0pKX1mdW5jdGlvbiBOYihhKXtpZihhLmEpe2EuYT0hMTt2YXIgYj1hLnRha2VSZWNvcmRzKCk7Yi5sZW5ndGgmJmEuY2EuZm9yRWFjaChmdW5jdGlvbihhKXthKGIpfSl9fUxiLnByb3RvdHlwZS50YWtlUmVjb3Jkcz1mdW5jdGlvbigpe2lmKHRoaXMuYWRkZWROb2Rlcy5sZW5ndGh8fHRoaXMucmVtb3ZlZE5vZGVzLmxlbmd0aCl7dmFyIGE9W3thZGRlZE5vZGVzOnRoaXMuYWRkZWROb2RlcyxyZW1vdmVkTm9kZXM6dGhpcy5yZW1vdmVkTm9kZXN9XTt0aGlzLmFkZGVkTm9kZXM9W107dGhpcy5yZW1vdmVkTm9kZXM9W107cmV0dXJuIGF9cmV0dXJuW119OwpmdW5jdGlvbiBPYihhLGIpe3ZhciBjPXooYSk7Yy5TfHwoYy5TPW5ldyBMYik7Yy5TLmNhLmFkZChiKTt2YXIgZD1jLlM7cmV0dXJue0xhOmIsUDpkLFBhOmEsdGFrZVJlY29yZHM6ZnVuY3Rpb24oKXtyZXR1cm4gZC50YWtlUmVjb3JkcygpfX19ZnVuY3Rpb24gUGIoYSl7dmFyIGI9YSYmYS5QO2ImJihiLmNhLmRlbGV0ZShhLkxhKSxiLmNhLnNpemV8fCh6KGEuUGEpLlM9bnVsbCkpfQpmdW5jdGlvbiBRYihhLGIpe3ZhciBjPWIuZ2V0Um9vdE5vZGUoKTtyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYSl7dmFyIGI9Yz09PWEudGFyZ2V0LmdldFJvb3ROb2RlKCk7aWYoYiYmYS5hZGRlZE5vZGVzKXtpZihiPUFycmF5LmZyb20oYS5hZGRlZE5vZGVzKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGM9PT1hLmdldFJvb3ROb2RlKCl9KSxiLmxlbmd0aClyZXR1cm4gYT1PYmplY3QuY3JlYXRlKGEpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJhZGRlZE5vZGVzIix7dmFsdWU6Yixjb25maWd1cmFibGU6ITB9KSxhfWVsc2UgaWYoYilyZXR1cm4gYX0pLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYX0pfTt2YXIgRD17fSxSYj1FbGVtZW50LnByb3RvdHlwZS5pbnNlcnRCZWZvcmUsU2I9RWxlbWVudC5wcm90b3R5cGUucmVwbGFjZUNoaWxkLFRiPUVsZW1lbnQucHJvdG90eXBlLnJlbW92ZUNoaWxkLFViPUVsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZSxWYj1FbGVtZW50LnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGUsV2I9RWxlbWVudC5wcm90b3R5cGUuY2xvbmVOb2RlLFhiPURvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlLFliPUVsZW1lbnQucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIsWmI9RWxlbWVudC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciwkYj1XaW5kb3cucHJvdG90eXBlLmFkZEV2ZW50TGlzdGVuZXIsYWM9V2luZG93LnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyLGJjPUVsZW1lbnQucHJvdG90eXBlLmRpc3BhdGNoRXZlbnQsY2M9Tm9kZS5wcm90b3R5cGUuY29udGFpbnN8fEhUTUxFbGVtZW50LnByb3RvdHlwZS5jb250YWlucyxkYz1Eb2N1bWVudC5wcm90b3R5cGUuZ2V0RWxlbWVudEJ5SWQsCmVjPUVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3IsZmM9RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvcixnYz1Eb2N1bWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvcixoYz1FbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsLGljPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwsamM9RG9jdW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGw7RC5hcHBlbmRDaGlsZD1FbGVtZW50LnByb3RvdHlwZS5hcHBlbmRDaGlsZDtELmluc2VydEJlZm9yZT1SYjtELnJlcGxhY2VDaGlsZD1TYjtELnJlbW92ZUNoaWxkPVRiO0Quc2V0QXR0cmlidXRlPVViO0QucmVtb3ZlQXR0cmlidXRlPVZiO0QuY2xvbmVOb2RlPVdiO0QuaW1wb3J0Tm9kZT1YYjtELmFkZEV2ZW50TGlzdGVuZXI9WWI7RC5yZW1vdmVFdmVudExpc3RlbmVyPVpiO0QuZWI9JGI7RC5mYj1hYztELmRpc3BhdGNoRXZlbnQ9YmM7RC5jb250YWlucz1jYzsKRC5nZXRFbGVtZW50QnlJZD1kYztELm9iPWVjO0Quc2I9ZmM7RC5tYj1nYztELnF1ZXJ5U2VsZWN0b3I9ZnVuY3Rpb24oYSl7c3dpdGNoKHRoaXMubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6cmV0dXJuIGVjLmNhbGwodGhpcyxhKTtjYXNlIE5vZGUuRE9DVU1FTlRfTk9ERTpyZXR1cm4gZ2MuY2FsbCh0aGlzLGEpO2RlZmF1bHQ6cmV0dXJuIGZjLmNhbGwodGhpcyxhKX19O0QucGI9aGM7RC50Yj1pYztELm5iPWpjO0QucXVlcnlTZWxlY3RvckFsbD1mdW5jdGlvbihhKXtzd2l0Y2godGhpcy5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpyZXR1cm4gaGMuY2FsbCh0aGlzLGEpO2Nhc2UgTm9kZS5ET0NVTUVOVF9OT0RFOnJldHVybiBqYy5jYWxsKHRoaXMsYSk7ZGVmYXVsdDpyZXR1cm4gaWMuY2FsbCh0aGlzLGEpfX07dmFyIGtjPS9bJlx1MDBBMCJdL2csbGM9L1smXHUwMEEwPD5dL2c7ZnVuY3Rpb24gbWMoYSl7c3dpdGNoKGEpe2Nhc2UgIiYiOnJldHVybiImYW1wOyI7Y2FzZSAiPCI6cmV0dXJuIiZsdDsiO2Nhc2UgIj4iOnJldHVybiImZ3Q7IjtjYXNlICciJzpyZXR1cm4iJnF1b3Q7IjtjYXNlICJcdTAwYTAiOnJldHVybiImbmJzcDsifX1mdW5jdGlvbiBuYyhhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7YysrKWJbYVtjXV09ITA7cmV0dXJuIGJ9dmFyIG9jPW5jKCJhcmVhIGJhc2UgYnIgY29sIGNvbW1hbmQgZW1iZWQgaHIgaW1nIGlucHV0IGtleWdlbiBsaW5rIG1ldGEgcGFyYW0gc291cmNlIHRyYWNrIHdiciIuc3BsaXQoIiAiKSkscGM9bmMoInN0eWxlIHNjcmlwdCB4bXAgaWZyYW1lIG5vZW1iZWQgbm9mcmFtZXMgcGxhaW50ZXh0IG5vc2NyaXB0Ii5zcGxpdCgiICIpKTsKZnVuY3Rpb24gcWMoYSxiKXsidGVtcGxhdGUiPT09YS5sb2NhbE5hbWUmJihhPWEuY29udGVudCk7Zm9yKHZhciBjPSIiLGQ9Yj9iKGEpOmEuY2hpbGROb2RlcyxlPTAsZj1kLmxlbmd0aCxnO2U8ZiYmKGc9ZFtlXSk7ZSsrKXthOnt2YXIgaD1nO3ZhciBrPWE7dmFyIG09Yjtzd2l0Y2goaC5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpmb3IodmFyIG49aC5sb2NhbE5hbWUscj0iPCIrbixHPWguYXR0cmlidXRlcyx4PTA7az1HW3hdO3grKylyKz0iICIray5uYW1lKyc9Iicray52YWx1ZS5yZXBsYWNlKGtjLG1jKSsnIic7cis9Ij4iO2g9b2Nbbl0/cjpyK3FjKGgsbSkrIjwvIituKyI+IjticmVhayBhO2Nhc2UgTm9kZS5URVhUX05PREU6aD1oLmRhdGE7aD1rJiZwY1trLmxvY2FsTmFtZV0/aDpoLnJlcGxhY2UobGMsbWMpO2JyZWFrIGE7Y2FzZSBOb2RlLkNPTU1FTlRfTk9ERTpoPSJceDNjIS0tIitoLmRhdGErIi0tXHgzZSI7YnJlYWsgYTtkZWZhdWx0OnRocm93IHdpbmRvdy5jb25zb2xlLmVycm9yKGgpLApFcnJvcigibm90IGltcGxlbWVudGVkIik7fX1jKz1ofXJldHVybiBjfTt2YXIgRT17fSxIPWRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZG9jdW1lbnQsTm9kZUZpbHRlci5TSE9XX0FMTCxudWxsLCExKSxJPWRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZG9jdW1lbnQsTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQsbnVsbCwhMSk7ZnVuY3Rpb24gcmMoYSl7dmFyIGI9W107SC5jdXJyZW50Tm9kZT1hO2ZvcihhPUguZmlyc3RDaGlsZCgpO2E7KWIucHVzaChhKSxhPUgubmV4dFNpYmxpbmcoKTtyZXR1cm4gYn1FLnBhcmVudE5vZGU9ZnVuY3Rpb24oYSl7SC5jdXJyZW50Tm9kZT1hO3JldHVybiBILnBhcmVudE5vZGUoKX07RS5maXJzdENoaWxkPWZ1bmN0aW9uKGEpe0guY3VycmVudE5vZGU9YTtyZXR1cm4gSC5maXJzdENoaWxkKCl9O0UubGFzdENoaWxkPWZ1bmN0aW9uKGEpe0guY3VycmVudE5vZGU9YTtyZXR1cm4gSC5sYXN0Q2hpbGQoKX07RS5wcmV2aW91c1NpYmxpbmc9ZnVuY3Rpb24oYSl7SC5jdXJyZW50Tm9kZT1hO3JldHVybiBILnByZXZpb3VzU2libGluZygpfTsKRS5uZXh0U2libGluZz1mdW5jdGlvbihhKXtILmN1cnJlbnROb2RlPWE7cmV0dXJuIEgubmV4dFNpYmxpbmcoKX07RS5jaGlsZE5vZGVzPXJjO0UucGFyZW50RWxlbWVudD1mdW5jdGlvbihhKXtJLmN1cnJlbnROb2RlPWE7cmV0dXJuIEkucGFyZW50Tm9kZSgpfTtFLmZpcnN0RWxlbWVudENoaWxkPWZ1bmN0aW9uKGEpe0kuY3VycmVudE5vZGU9YTtyZXR1cm4gSS5maXJzdENoaWxkKCl9O0UubGFzdEVsZW1lbnRDaGlsZD1mdW5jdGlvbihhKXtJLmN1cnJlbnROb2RlPWE7cmV0dXJuIEkubGFzdENoaWxkKCl9O0UucHJldmlvdXNFbGVtZW50U2libGluZz1mdW5jdGlvbihhKXtJLmN1cnJlbnROb2RlPWE7cmV0dXJuIEkucHJldmlvdXNTaWJsaW5nKCl9O0UubmV4dEVsZW1lbnRTaWJsaW5nPWZ1bmN0aW9uKGEpe0kuY3VycmVudE5vZGU9YTtyZXR1cm4gSS5uZXh0U2libGluZygpfTsKRS5jaGlsZHJlbj1mdW5jdGlvbihhKXt2YXIgYj1bXTtJLmN1cnJlbnROb2RlPWE7Zm9yKGE9SS5maXJzdENoaWxkKCk7YTspYi5wdXNoKGEpLGE9SS5uZXh0U2libGluZygpO3JldHVybiBifTtFLmlubmVySFRNTD1mdW5jdGlvbihhKXtyZXR1cm4gcWMoYSxmdW5jdGlvbihhKXtyZXR1cm4gcmMoYSl9KX07RS50ZXh0Q29udGVudD1mdW5jdGlvbihhKXtzd2l0Y2goYS5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTphPWRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoYSxOb2RlRmlsdGVyLlNIT1dfVEVYVCxudWxsLCExKTtmb3IodmFyIGI9IiIsYztjPWEubmV4dE5vZGUoKTspYis9Yy5ub2RlVmFsdWU7cmV0dXJuIGI7ZGVmYXVsdDpyZXR1cm4gYS5ub2RlVmFsdWV9fTt2YXIgSj17fSxzYz1CLkksdGM9W05vZGUucHJvdG90eXBlLEVsZW1lbnQucHJvdG90eXBlLEhUTUxFbGVtZW50LnByb3RvdHlwZV07ZnVuY3Rpb24gSyhhKXt2YXIgYjthOntmb3IoYj0wO2I8dGMubGVuZ3RoO2IrKyl7dmFyIGM9dGNbYl07aWYoYy5oYXNPd25Qcm9wZXJ0eShhKSl7Yj1jO2JyZWFrIGF9fWI9dm9pZCAwfWlmKCFiKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBkZXNjcmlwdG9yIGZvciAiK2EpO3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGIsYSl9CnZhciBMPXNjP3twYXJlbnROb2RlOksoInBhcmVudE5vZGUiKSxmaXJzdENoaWxkOksoImZpcnN0Q2hpbGQiKSxsYXN0Q2hpbGQ6SygibGFzdENoaWxkIikscHJldmlvdXNTaWJsaW5nOksoInByZXZpb3VzU2libGluZyIpLG5leHRTaWJsaW5nOksoIm5leHRTaWJsaW5nIiksY2hpbGROb2RlczpLKCJjaGlsZE5vZGVzIikscGFyZW50RWxlbWVudDpLKCJwYXJlbnRFbGVtZW50IikscHJldmlvdXNFbGVtZW50U2libGluZzpLKCJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIiksbmV4dEVsZW1lbnRTaWJsaW5nOksoIm5leHRFbGVtZW50U2libGluZyIpLGlubmVySFRNTDpLKCJpbm5lckhUTUwiKSx0ZXh0Q29udGVudDpLKCJ0ZXh0Q29udGVudCIpLGZpcnN0RWxlbWVudENoaWxkOksoImZpcnN0RWxlbWVudENoaWxkIiksbGFzdEVsZW1lbnRDaGlsZDpLKCJsYXN0RWxlbWVudENoaWxkIiksY2hpbGRyZW46SygiY2hpbGRyZW4iKX06e30sdWM9c2M/e2ZpcnN0RWxlbWVudENoaWxkOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUsCiJmaXJzdEVsZW1lbnRDaGlsZCIpLGxhc3RFbGVtZW50Q2hpbGQ6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSwibGFzdEVsZW1lbnRDaGlsZCIpLGNoaWxkcmVuOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUsImNoaWxkcmVuIil9Ont9LHZjPXNjP3tmaXJzdEVsZW1lbnRDaGlsZDpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKERvY3VtZW50LnByb3RvdHlwZSwiZmlyc3RFbGVtZW50Q2hpbGQiKSxsYXN0RWxlbWVudENoaWxkOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRG9jdW1lbnQucHJvdG90eXBlLCJsYXN0RWxlbWVudENoaWxkIiksY2hpbGRyZW46T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihEb2N1bWVudC5wcm90b3R5cGUsImNoaWxkcmVuIil9Ont9O0ouQ2E9TDtKLnJiPXVjO0oubGI9dmM7Si5wYXJlbnROb2RlPWZ1bmN0aW9uKGEpe3JldHVybiBMLnBhcmVudE5vZGUuZ2V0LmNhbGwoYSl9OwpKLmZpcnN0Q2hpbGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIEwuZmlyc3RDaGlsZC5nZXQuY2FsbChhKX07Si5sYXN0Q2hpbGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIEwubGFzdENoaWxkLmdldC5jYWxsKGEpfTtKLnByZXZpb3VzU2libGluZz1mdW5jdGlvbihhKXtyZXR1cm4gTC5wcmV2aW91c1NpYmxpbmcuZ2V0LmNhbGwoYSl9O0oubmV4dFNpYmxpbmc9ZnVuY3Rpb24oYSl7cmV0dXJuIEwubmV4dFNpYmxpbmcuZ2V0LmNhbGwoYSl9O0ouY2hpbGROb2Rlcz1mdW5jdGlvbihhKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoTC5jaGlsZE5vZGVzLmdldC5jYWxsKGEpKX07Si5wYXJlbnRFbGVtZW50PWZ1bmN0aW9uKGEpe3JldHVybiBMLnBhcmVudEVsZW1lbnQuZ2V0LmNhbGwoYSl9O0oucHJldmlvdXNFbGVtZW50U2libGluZz1mdW5jdGlvbihhKXtyZXR1cm4gTC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmdldC5jYWxsKGEpfTtKLm5leHRFbGVtZW50U2libGluZz1mdW5jdGlvbihhKXtyZXR1cm4gTC5uZXh0RWxlbWVudFNpYmxpbmcuZ2V0LmNhbGwoYSl9OwpKLmlubmVySFRNTD1mdW5jdGlvbihhKXtyZXR1cm4gTC5pbm5lckhUTUwuZ2V0LmNhbGwoYSl9O0oudGV4dENvbnRlbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIEwudGV4dENvbnRlbnQuZ2V0LmNhbGwoYSl9O0ouY2hpbGRyZW49ZnVuY3Rpb24oYSl7c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOmE9dWMuY2hpbGRyZW4uZ2V0LmNhbGwoYSk7YnJlYWs7Y2FzZSBOb2RlLkRPQ1VNRU5UX05PREU6YT12Yy5jaGlsZHJlbi5nZXQuY2FsbChhKTticmVhaztkZWZhdWx0OmE9TC5jaGlsZHJlbi5nZXQuY2FsbChhKX1yZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSl9OwpKLmZpcnN0RWxlbWVudENoaWxkPWZ1bmN0aW9uKGEpe3N3aXRjaChhLm5vZGVUeXBlKXtjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpyZXR1cm4gdWMuZmlyc3RFbGVtZW50Q2hpbGQuZ2V0LmNhbGwoYSk7Y2FzZSBOb2RlLkRPQ1VNRU5UX05PREU6cmV0dXJuIHZjLmZpcnN0RWxlbWVudENoaWxkLmdldC5jYWxsKGEpO2RlZmF1bHQ6cmV0dXJuIEwuZmlyc3RFbGVtZW50Q2hpbGQuZ2V0LmNhbGwoYSl9fTtKLmxhc3RFbGVtZW50Q2hpbGQ9ZnVuY3Rpb24oYSl7c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOnJldHVybiB1Yy5sYXN0RWxlbWVudENoaWxkLmdldC5jYWxsKGEpO2Nhc2UgTm9kZS5ET0NVTUVOVF9OT0RFOnJldHVybiB2Yy5sYXN0RWxlbWVudENoaWxkLmdldC5jYWxsKGEpO2RlZmF1bHQ6cmV0dXJuIEwubGFzdEVsZW1lbnRDaGlsZC5nZXQuY2FsbChhKX19O3ZhciBNPUIuRmE/SjpFO2Z1bmN0aW9uIHdjKGEpe2Zvcig7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCl9CnZhciB4Yz1CLkkseWM9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCJpbmVydCIpLHpjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTm9kZS5wcm90b3R5cGUsImlzQ29ubmVjdGVkIiksQWM9emMmJnpjLmdldCxCYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKERvY3VtZW50LnByb3RvdHlwZSwiYWN0aXZlRWxlbWVudCIpLENjPXtwYXJlbnRFbGVtZW50OntnZXQ6ZnVuY3Rpb24oKXt2YXIgYT1BKHRoaXMpOyhhPWEmJmEucGFyZW50Tm9kZSkmJmEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSYmKGE9bnVsbCk7cmV0dXJuIHZvaWQgMCE9PWE/YTpNLnBhcmVudEVsZW1lbnQodGhpcyl9LGNvbmZpZ3VyYWJsZTohMH0scGFyZW50Tm9kZTp7Z2V0OmZ1bmN0aW9uKCl7dmFyIGE9QSh0aGlzKTthPWEmJmEucGFyZW50Tm9kZTtyZXR1cm4gdm9pZCAwIT09YT9hOk0ucGFyZW50Tm9kZSh0aGlzKX0sY29uZmlndXJhYmxlOiEwfSwKbmV4dFNpYmxpbmc6e2dldDpmdW5jdGlvbigpe3ZhciBhPUEodGhpcyk7YT1hJiZhLm5leHRTaWJsaW5nO3JldHVybiB2b2lkIDAhPT1hP2E6TS5uZXh0U2libGluZyh0aGlzKX0sY29uZmlndXJhYmxlOiEwfSxwcmV2aW91c1NpYmxpbmc6e2dldDpmdW5jdGlvbigpe3ZhciBhPUEodGhpcyk7YT1hJiZhLnByZXZpb3VzU2libGluZztyZXR1cm4gdm9pZCAwIT09YT9hOk0ucHJldmlvdXNTaWJsaW5nKHRoaXMpfSxjb25maWd1cmFibGU6ITB9LG5leHRFbGVtZW50U2libGluZzp7Z2V0OmZ1bmN0aW9uKCl7dmFyIGE9QSh0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLm5leHRTaWJsaW5nKXtmb3IoYT10aGlzLm5leHRTaWJsaW5nO2EmJmEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERTspYT1hLm5leHRTaWJsaW5nO3JldHVybiBhfXJldHVybiBNLm5leHRFbGVtZW50U2libGluZyh0aGlzKX0sY29uZmlndXJhYmxlOiEwfSxwcmV2aW91c0VsZW1lbnRTaWJsaW5nOntnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0KQSh0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLnByZXZpb3VzU2libGluZyl7Zm9yKGE9dGhpcy5wcmV2aW91c1NpYmxpbmc7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEucHJldmlvdXNTaWJsaW5nO3JldHVybiBhfXJldHVybiBNLnByZXZpb3VzRWxlbWVudFNpYmxpbmcodGhpcyl9LGNvbmZpZ3VyYWJsZTohMH19LEhjPXtjbGFzc05hbWU6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiJ9LHNldDpmdW5jdGlvbihhKXt0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGEpfSxjb25maWd1cmFibGU6ITB9fSxJYz17Y2hpbGROb2Rlczp7Z2V0OmZ1bmN0aW9uKCl7aWYodWIodGhpcykpe3ZhciBhPUEodGhpcyk7aWYoIWEuY2hpbGROb2Rlcyl7YS5jaGlsZE5vZGVzPVtdO2Zvcih2YXIgYj10aGlzLmZpcnN0Q2hpbGQ7YjtiPWIubmV4dFNpYmxpbmcpYS5jaGlsZE5vZGVzLnB1c2goYil9dmFyIGM9YS5jaGlsZE5vZGVzfWVsc2UgYz0KTS5jaGlsZE5vZGVzKHRoaXMpO2MuaXRlbT1mdW5jdGlvbihhKXtyZXR1cm4gY1thXX07cmV0dXJuIGN9LGNvbmZpZ3VyYWJsZTohMH0sY2hpbGRFbGVtZW50Q291bnQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aH0sY29uZmlndXJhYmxlOiEwfSxmaXJzdENoaWxkOntnZXQ6ZnVuY3Rpb24oKXt2YXIgYT1BKHRoaXMpO2E9YSYmYS5maXJzdENoaWxkO3JldHVybiB2b2lkIDAhPT1hP2E6TS5maXJzdENoaWxkKHRoaXMpfSxjb25maWd1cmFibGU6ITB9LGxhc3RDaGlsZDp7Z2V0OmZ1bmN0aW9uKCl7dmFyIGE9QSh0aGlzKTthPWEmJmEubGFzdENoaWxkO3JldHVybiB2b2lkIDAhPT1hP2E6TS5sYXN0Q2hpbGQodGhpcyl9LGNvbmZpZ3VyYWJsZTohMH0sdGV4dENvbnRlbnQ6e2dldDpmdW5jdGlvbigpe2lmKHViKHRoaXMpKXtmb3IodmFyIGE9W10sYj0wLGM9dGhpcy5jaGlsZE5vZGVzLGQ7ZD1jW2JdO2IrKylkLm5vZGVUeXBlIT09Tm9kZS5DT01NRU5UX05PREUmJgphLnB1c2goZC50ZXh0Q29udGVudCk7cmV0dXJuIGEuam9pbigiIil9cmV0dXJuIE0udGV4dENvbnRlbnQodGhpcyl9LHNldDpmdW5jdGlvbihhKXtpZigidW5kZWZpbmVkIj09PXR5cGVvZiBhfHxudWxsPT09YSlhPSIiO3N3aXRjaCh0aGlzLm5vZGVUeXBlKXtjYXNlIE5vZGUuRUxFTUVOVF9OT0RFOmNhc2UgTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOmlmKCF1Yih0aGlzKSYmeGMpe3ZhciBiPXRoaXMuZmlyc3RDaGlsZDsoYiE9dGhpcy5sYXN0Q2hpbGR8fGImJmIubm9kZVR5cGUhPU5vZGUuVEVYVF9OT0RFKSYmd2ModGhpcyk7Si5DYS50ZXh0Q29udGVudC5zZXQuY2FsbCh0aGlzLGEpfWVsc2Ugd2ModGhpcyksKDA8YS5sZW5ndGh8fHRoaXMubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSkmJnRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYSkpO2JyZWFrO2RlZmF1bHQ6dGhpcy5ub2RlVmFsdWU9YX19LGNvbmZpZ3VyYWJsZTohMH0sZmlyc3RFbGVtZW50Q2hpbGQ6e2dldDpmdW5jdGlvbigpe3ZhciBhPQpBKHRoaXMpO2lmKGEmJnZvaWQgMCE9PWEuZmlyc3RDaGlsZCl7Zm9yKGE9dGhpcy5maXJzdENoaWxkO2EmJmEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERTspYT1hLm5leHRTaWJsaW5nO3JldHVybiBhfXJldHVybiBNLmZpcnN0RWxlbWVudENoaWxkKHRoaXMpfSxjb25maWd1cmFibGU6ITB9LGxhc3RFbGVtZW50Q2hpbGQ6e2dldDpmdW5jdGlvbigpe3ZhciBhPUEodGhpcyk7aWYoYSYmdm9pZCAwIT09YS5sYXN0Q2hpbGQpe2ZvcihhPXRoaXMubGFzdENoaWxkO2EmJmEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERTspYT1hLnByZXZpb3VzU2libGluZztyZXR1cm4gYX1yZXR1cm4gTS5sYXN0RWxlbWVudENoaWxkKHRoaXMpfSxjb25maWd1cmFibGU6ITB9LGNoaWxkcmVuOntnZXQ6ZnVuY3Rpb24oKXt2YXIgYTt1Yih0aGlzKT9hPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbCh0aGlzLmNoaWxkTm9kZXMsZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERX0pOgphPU0uY2hpbGRyZW4odGhpcyk7YS5pdGVtPWZ1bmN0aW9uKGIpe3JldHVybiBhW2JdfTtyZXR1cm4gYX0sY29uZmlndXJhYmxlOiEwfSxpbm5lckhUTUw6e2dldDpmdW5jdGlvbigpe3JldHVybiB1Yih0aGlzKT9xYygidGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWU/dGhpcy5jb250ZW50OnRoaXMpOk0uaW5uZXJIVE1MKHRoaXMpfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9InRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lP3RoaXMuY29udGVudDp0aGlzO3djKGIpO3ZhciBjPXRoaXMubG9jYWxOYW1lO2MmJiJ0ZW1wbGF0ZSIhPT1jfHwoYz0iZGl2Iik7Yz15Yy5jcmVhdGVFbGVtZW50KGMpO2Zvcih4Yz9KLkNhLmlubmVySFRNTC5zZXQuY2FsbChjLGEpOmMuaW5uZXJIVE1MPWE7Yy5maXJzdENoaWxkOyliLmFwcGVuZENoaWxkKGMuZmlyc3RDaGlsZCl9LGNvbmZpZ3VyYWJsZTohMH19LEpjPXtzaGFkb3dSb290OntnZXQ6ZnVuY3Rpb24oKXt2YXIgYT1BKHRoaXMpO3JldHVybiBhJiYKYS5EYXx8bnVsbH0sY29uZmlndXJhYmxlOiEwfX0sS2M9e2FjdGl2ZUVsZW1lbnQ6e2dldDpmdW5jdGlvbigpe3ZhciBhPUJjJiZCYy5nZXQ/QmMuZ2V0LmNhbGwoZG9jdW1lbnQpOkIuST92b2lkIDA6ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZihhJiZhLm5vZGVUeXBlKXt2YXIgYj0hIUModGhpcyk7aWYodGhpcz09PWRvY3VtZW50fHxiJiZ0aGlzLmhvc3QhPT1hJiZELmNvbnRhaW5zLmNhbGwodGhpcy5ob3N0LGEpKXtmb3IoYj12YihhKTtiJiZiIT09dGhpczspYT1iLmhvc3QsYj12YihhKTthPXRoaXM9PT1kb2N1bWVudD9iP251bGw6YTpiPT09dGhpcz9hOm51bGx9ZWxzZSBhPW51bGx9ZWxzZSBhPW51bGw7cmV0dXJuIGF9LHNldDpmdW5jdGlvbigpe30sY29uZmlndXJhYmxlOiEwfX07CmZ1bmN0aW9uIE4oYSxiLGMpe2Zvcih2YXIgZCBpbiBiKXt2YXIgZT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEsZCk7ZSYmZS5jb25maWd1cmFibGV8fCFlJiZjP09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGQsYltkXSk6YyYmY29uc29sZS53YXJuKCJDb3VsZCBub3QgZGVmaW5lIixkLCJvbiIsYSl9fWZ1bmN0aW9uIExjKGEpe04oYSxDYyk7TihhLEhjKTtOKGEsSWMpO04oYSxLYyl9CmZ1bmN0aW9uIE1jKCl7dmFyIGE9TmMucHJvdG90eXBlO2EuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlO04oYSxDYywhMCk7TihhLEljLCEwKTtOKGEsS2MsITApO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGEse25vZGVUeXBlOnt2YWx1ZTpOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUsY29uZmlndXJhYmxlOiEwfSxub2RlTmFtZTp7dmFsdWU6IiNkb2N1bWVudC1mcmFnbWVudCIsY29uZmlndXJhYmxlOiEwfSxub2RlVmFsdWU6e3ZhbHVlOm51bGwsY29uZmlndXJhYmxlOiEwfX0pO1sibG9jYWxOYW1lIiwibmFtZXNwYWNlVVJJIiwicHJlZml4Il0uZm9yRWFjaChmdW5jdGlvbihiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHt2YWx1ZTp2b2lkIDAsY29uZmlndXJhYmxlOiEwfSl9KTtbIm93bmVyRG9jdW1lbnQiLCJiYXNlVVJJIiwiaXNDb25uZWN0ZWQiXS5mb3JFYWNoKGZ1bmN0aW9uKGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhvc3RbYl19LApjb25maWd1cmFibGU6ITB9KX0pfXZhciBPYz1CLkk/ZnVuY3Rpb24oKXt9OmZ1bmN0aW9uKGEpe3ZhciBiPXooYSk7Yi52YXx8KGIudmE9ITAsTihhLENjLCEwKSxOKGEsSGMsITApKX0sUGM9Qi5JP2Z1bmN0aW9uKCl7fTpmdW5jdGlvbihhKXt6KGEpLklhfHwoTihhLEljLCEwKSxOKGEsSmMsITApKX07dmFyIFFjPU0uY2hpbGROb2RlcztmdW5jdGlvbiBSYyhhLGIsYyl7T2MoYSk7Yz1jfHxudWxsO3ZhciBkPXooYSksZT16KGIpLGY9Yz96KGMpOm51bGw7ZC5wcmV2aW91c1NpYmxpbmc9Yz9mLnByZXZpb3VzU2libGluZzpiLmxhc3RDaGlsZDtpZihmPUEoZC5wcmV2aW91c1NpYmxpbmcpKWYubmV4dFNpYmxpbmc9YTtpZihmPUEoZC5uZXh0U2libGluZz1jKSlmLnByZXZpb3VzU2libGluZz1hO2QucGFyZW50Tm9kZT1iO2M/Yz09PWUuZmlyc3RDaGlsZCYmKGUuZmlyc3RDaGlsZD1hKTooZS5sYXN0Q2hpbGQ9YSxlLmZpcnN0Q2hpbGR8fChlLmZpcnN0Q2hpbGQ9YSkpO2UuY2hpbGROb2Rlcz1udWxsfQpmdW5jdGlvbiBTYyhhLGIpe3ZhciBjPXooYSk7aWYodm9pZCAwPT09Yy5maXJzdENoaWxkKWZvcihiPWJ8fFFjKGEpLGMuZmlyc3RDaGlsZD1iWzBdfHxudWxsLGMubGFzdENoaWxkPWJbYi5sZW5ndGgtMV18fG51bGwsUGMoYSksYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD1iW2NdLGU9eihkKTtlLnBhcmVudE5vZGU9YTtlLm5leHRTaWJsaW5nPWJbYysxXXx8bnVsbDtlLnByZXZpb3VzU2libGluZz1iW2MtMV18fG51bGw7T2MoZCl9fTt2YXIgVGM9TS5wYXJlbnROb2RlOwpmdW5jdGlvbiBVYyhhLGIsYyl7aWYoYj09PWEpdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdhcHBlbmRDaGlsZCcgb24gJ05vZGUnOiBUaGUgbmV3IGNoaWxkIGVsZW1lbnQgY29udGFpbnMgdGhlIHBhcmVudC4iKTtpZihjKXt2YXIgZD1BKGMpO2Q9ZCYmZC5wYXJlbnROb2RlO2lmKHZvaWQgMCE9PWQmJmQhPT1hfHx2b2lkIDA9PT1kJiZUYyhjKSE9PWEpdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdpbnNlcnRCZWZvcmUnIG9uICdOb2RlJzogVGhlIG5vZGUgYmVmb3JlIHdoaWNoIHRoZSBuZXcgbm9kZSBpcyB0byBiZSBpbnNlcnRlZCBpcyBub3QgYSBjaGlsZCBvZiB0aGlzIG5vZGUuIik7fWlmKGM9PT1iKXJldHVybiBiO2IucGFyZW50Tm9kZSYmVmMoYi5wYXJlbnROb2RlLGIpO3ZhciBlLGY7aWYoIWIuX19ub0luc2VydGlvblBvaW50KXtpZihmPWU9dmIoYSkpe3ZhciBnOyJzbG90Ij09PWIubG9jYWxOYW1lP2c9W2JdOmIucXVlcnlTZWxlY3RvckFsbCYmCihnPWIucXVlcnlTZWxlY3RvckFsbCgic2xvdCIpKTtmPWcmJmcubGVuZ3RoP2c6dm9pZCAwfWYmJihnPWUsZD1mLGcuYT1nLmF8fFtdLGcubT1nLm18fFtdLGcudz1nLnd8fHt9LGcuYS5wdXNoLmFwcGx5KGcuYSxbXS5jb25jYXQoZCBpbnN0YW5jZW9mIEFycmF5P2Q6amEoaWEoZCkpKSkpfSgic2xvdCI9PT1hLmxvY2FsTmFtZXx8ZikmJihlPWV8fHZiKGEpKSYmV2MoZSk7aWYodWIoYSkpe2U9YztQYyhhKTtmPXooYSk7dm9pZCAwIT09Zi5maXJzdENoaWxkJiYoZi5jaGlsZE5vZGVzPW51bGwpO2lmKGIubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe2Y9Yi5jaGlsZE5vZGVzO2ZvcihnPTA7ZzxmLmxlbmd0aDtnKyspUmMoZltnXSxhLGUpO2U9eihiKTtmPXZvaWQgMCE9PWUuZmlyc3RDaGlsZD9udWxsOnZvaWQgMDtlLmZpcnN0Q2hpbGQ9ZS5sYXN0Q2hpbGQ9ZjtlLmNoaWxkTm9kZXM9Zn1lbHNlIFJjKGIsYSxlKTtlPUEoYSk7aWYoWGMoYSkpe1djKGUucm9vdCk7CnZhciBoPSEwfWVsc2UgZS5yb290JiYoaD0hMCl9aHx8KGg9QyhhKT9hLmhvc3Q6YSxjPyhjPVljKGMpLEQuaW5zZXJ0QmVmb3JlLmNhbGwoaCxiLGMpKTpELmFwcGVuZENoaWxkLmNhbGwoaCxiKSk7WmMoYSxiKTtyZXR1cm4gYn0KZnVuY3Rpb24gVmMoYSxiKXtpZihiLnBhcmVudE5vZGUhPT1hKXRocm93IEVycm9yKCJUaGUgbm9kZSB0byBiZSByZW1vdmVkIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgbm9kZTogIitiKTt2YXIgYz12YihiKSxkPUEoYSk7aWYodWIoYSkpe3ZhciBlPXooYiksZj16KGEpO2I9PT1mLmZpcnN0Q2hpbGQmJihmLmZpcnN0Q2hpbGQ9ZS5uZXh0U2libGluZyk7Yj09PWYubGFzdENoaWxkJiYoZi5sYXN0Q2hpbGQ9ZS5wcmV2aW91c1NpYmxpbmcpO3ZhciBnPWUucHJldmlvdXNTaWJsaW5nLGg9ZS5uZXh0U2libGluZztnJiYoeihnKS5uZXh0U2libGluZz1oKTtoJiYoeihoKS5wcmV2aW91c1NpYmxpbmc9Zyk7ZS5wYXJlbnROb2RlPWUucHJldmlvdXNTaWJsaW5nPWUubmV4dFNpYmxpbmc9dm9pZCAwO3ZvaWQgMCE9PWYuY2hpbGROb2RlcyYmKGYuY2hpbGROb2Rlcz1udWxsKTtpZihYYyhhKSl7V2MoZC5yb290KTt2YXIgaz0hMH19JGMoYik7aWYoYyl7KGU9YSYmInNsb3QiPT09YS5sb2NhbE5hbWUpJiYKKGs9ITApO2lmKGMubSl7YWQoYyk7Zj1jLnc7Zm9yKHYgaW4gZilmb3IoZz1mW3ZdLGg9MDtoPGcubGVuZ3RoO2grKyl7dmFyIG09Z1toXTtpZihHYihiLG0pKXtnLnNwbGljZShoLDEpO3ZhciBuPWMubS5pbmRleE9mKG0pOzA8PW4mJmMubS5zcGxpY2UobiwxKTtoLS07bj1BKG0pO2lmKG09bi5MKWZvcih2YXIgcj0wO3I8bS5sZW5ndGg7cisrKXt2YXIgRz1tW3JdLHg9YmQoRyk7eCYmRC5yZW1vdmVDaGlsZC5jYWxsKHgsRyl9bi5MPVtdO24uYXNzaWduZWROb2Rlcz1bXTtuPSEwfX12YXIgdj1ufWVsc2Ugdj12b2lkIDA7KHZ8fGUpJiZXYyhjKX1rfHwoaz1DKGEpP2EuaG9zdDphLCghZC5yb290JiYic2xvdCIhPT1iLmxvY2FsTmFtZXx8az09PVRjKGIpKSYmRC5yZW1vdmVDaGlsZC5jYWxsKGssYikpO1pjKGEsbnVsbCxiKTtyZXR1cm4gYn0KZnVuY3Rpb24gJGMoYSl7dmFyIGI9QShhKTtpZihiJiZ2b2lkIDAhPT1iLlYpe2I9YS5jaGlsZE5vZGVzO2Zvcih2YXIgYz0wLGQ9Yi5sZW5ndGgsZTtjPGQmJihlPWJbY10pO2MrKykkYyhlKX1pZihhPUEoYSkpYS5WPXZvaWQgMH1mdW5jdGlvbiBZYyhhKXt2YXIgYj1hO2EmJiJzbG90Ij09PWEubG9jYWxOYW1lJiYoYj0oYj0oYj1BKGEpKSYmYi5MKSYmYi5sZW5ndGg/YlswXTpZYyhhLm5leHRTaWJsaW5nKSk7cmV0dXJuIGJ9ZnVuY3Rpb24gWGMoYSl7cmV0dXJuKGE9KGE9QShhKSkmJmEucm9vdCkmJmNkKGEpfQpmdW5jdGlvbiBkZChhLGIpe2lmKCJzbG90Ij09PWIpYT1hLnBhcmVudE5vZGUsWGMoYSkmJldjKEEoYSkucm9vdCk7ZWxzZSBpZigic2xvdCI9PT1hLmxvY2FsTmFtZSYmIm5hbWUiPT09YiYmKGI9dmIoYSkpKXtpZihiLm0pe3ZhciBjPWEuSmEsZD1lZChhKTtpZihkIT09Yyl7Yz1iLndbY107dmFyIGU9Yy5pbmRleE9mKGEpOzA8PWUmJmMuc3BsaWNlKGUsMSk7Yz1iLndbZF18fChiLndbZF09W10pO2MucHVzaChhKTsxPGMubGVuZ3RoJiYoYi53W2RdPWZkKGMpKX19V2MoYil9fWZ1bmN0aW9uIFpjKGEsYixjKXtpZihhPShhPUEoYSkpJiZhLlMpYiYmYS5hZGRlZE5vZGVzLnB1c2goYiksYyYmYS5yZW1vdmVkTm9kZXMucHVzaChjKSxNYihhKX0KZnVuY3Rpb24gZ2QoYSl7aWYoYSYmYS5ub2RlVHlwZSl7dmFyIGI9eihhKSxjPWIuVjt2b2lkIDA9PT1jJiYoQyhhKT8oYz1hLGIuVj1jKTooYz0oYz1hLnBhcmVudE5vZGUpP2dkKGMpOmEsRC5jb250YWlucy5jYWxsKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxhKSYmKGIuVj1jKSkpO3JldHVybiBjfX1mdW5jdGlvbiBoZChhLGIsYyl7dmFyIGQ9W107aWQoYS5jaGlsZE5vZGVzLGIsYyxkKTtyZXR1cm4gZH1mdW5jdGlvbiBpZChhLGIsYyxkKXtmb3IodmFyIGU9MCxmPWEubGVuZ3RoLGc7ZTxmJiYoZz1hW2VdKTtlKyspe3ZhciBoO2lmKGg9Zy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXtoPWc7dmFyIGs9YixtPWMsbj1kLHI9ayhoKTtyJiZuLnB1c2goaCk7bSYmbShyKT9oPXI6KGlkKGguY2hpbGROb2RlcyxrLG0sbiksaD12b2lkIDApfWlmKGgpYnJlYWt9fXZhciBqZD1udWxsOwpmdW5jdGlvbiBrZChhLGIsYyl7amR8fChqZD13aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5TY29waW5nU2hpbSk7amQmJiJjbGFzcyI9PT1iP2pkLnNldEVsZW1lbnRDbGFzcyhhLGMpOihELnNldEF0dHJpYnV0ZS5jYWxsKGEsYixjKSxkZChhLGIpKX1mdW5jdGlvbiBsZChhLGIpe2lmKGEub3duZXJEb2N1bWVudCE9PWRvY3VtZW50KXJldHVybiBELmltcG9ydE5vZGUuY2FsbChkb2N1bWVudCxhLGIpO3ZhciBjPUQuaW1wb3J0Tm9kZS5jYWxsKGRvY3VtZW50LGEsITEpO2lmKGIpe2E9YS5jaGlsZE5vZGVzO2I9MDtmb3IodmFyIGQ7YjxhLmxlbmd0aDtiKyspZD1sZChhW2JdLCEwKSxjLmFwcGVuZENoaWxkKGQpfXJldHVybiBjfTt2YXIgbWQ9Il9fZXZlbnRXcmFwcGVycyIrRGF0ZS5ub3coKSxuZD17Ymx1cjohMCxmb2N1czohMCxmb2N1c2luOiEwLGZvY3Vzb3V0OiEwLGNsaWNrOiEwLGRibGNsaWNrOiEwLG1vdXNlZG93bjohMCxtb3VzZWVudGVyOiEwLG1vdXNlbGVhdmU6ITAsbW91c2Vtb3ZlOiEwLG1vdXNlb3V0OiEwLG1vdXNlb3ZlcjohMCxtb3VzZXVwOiEwLHdoZWVsOiEwLGJlZm9yZWlucHV0OiEwLGlucHV0OiEwLGtleWRvd246ITAsa2V5dXA6ITAsY29tcG9zaXRpb25zdGFydDohMCxjb21wb3NpdGlvbnVwZGF0ZTohMCxjb21wb3NpdGlvbmVuZDohMCx0b3VjaHN0YXJ0OiEwLHRvdWNoZW5kOiEwLHRvdWNobW92ZTohMCx0b3VjaGNhbmNlbDohMCxwb2ludGVyb3ZlcjohMCxwb2ludGVyZW50ZXI6ITAscG9pbnRlcmRvd246ITAscG9pbnRlcm1vdmU6ITAscG9pbnRlcnVwOiEwLHBvaW50ZXJjYW5jZWw6ITAscG9pbnRlcm91dDohMCxwb2ludGVybGVhdmU6ITAsZ290cG9pbnRlcmNhcHR1cmU6ITAsbG9zdHBvaW50ZXJjYXB0dXJlOiEwLApkcmFnc3RhcnQ6ITAsZHJhZzohMCxkcmFnZW50ZXI6ITAsZHJhZ2xlYXZlOiEwLGRyYWdvdmVyOiEwLGRyb3A6ITAsZHJhZ2VuZDohMCxET01BY3RpdmF0ZTohMCxET01Gb2N1c0luOiEwLERPTUZvY3VzT3V0OiEwLGtleXByZXNzOiEwfTtmdW5jdGlvbiBvZChhLGIpe3ZhciBjPVtdLGQ9YTtmb3IoYT1hPT09d2luZG93P3dpbmRvdzphLmdldFJvb3ROb2RlKCk7ZDspYy5wdXNoKGQpLGQ9ZC5hc3NpZ25lZFNsb3Q/ZC5hc3NpZ25lZFNsb3Q6ZC5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSYmZC5ob3N0JiYoYnx8ZCE9PWEpP2QuaG9zdDpkLnBhcmVudE5vZGU7Y1tjLmxlbmd0aC0xXT09PWRvY3VtZW50JiZjLnB1c2god2luZG93KTtyZXR1cm4gY30KZnVuY3Rpb24gcGQoYSxiKXtpZighQylyZXR1cm4gYTthPW9kKGEsITApO2Zvcih2YXIgYz0wLGQsZSxmLGc7YzxiLmxlbmd0aDtjKyspaWYoZD1iW2NdLGY9ZD09PXdpbmRvdz93aW5kb3c6ZC5nZXRSb290Tm9kZSgpLGYhPT1lJiYoZz1hLmluZGV4T2YoZiksZT1mKSwhQyhmKXx8LTE8ZylyZXR1cm4gZH0KdmFyIHFkPXtnZXQgY29tcG9zZWQoKXshMSE9PXRoaXMuaXNUcnVzdGVkJiZ2b2lkIDA9PT10aGlzLmhhJiYodGhpcy5oYT1uZFt0aGlzLnR5cGVdKTtyZXR1cm4gdGhpcy5oYXx8ITF9LGNvbXBvc2VkUGF0aDpmdW5jdGlvbigpe3RoaXMudGF8fCh0aGlzLnRhPW9kKHRoaXMuX190YXJnZXQsdGhpcy5jb21wb3NlZCkpO3JldHVybiB0aGlzLnRhfSxnZXQgdGFyZ2V0KCl7cmV0dXJuIHBkKHRoaXMuY3VycmVudFRhcmdldCx0aGlzLmNvbXBvc2VkUGF0aCgpKX0sZ2V0IHJlbGF0ZWRUYXJnZXQoKXtpZighdGhpcy5qYSlyZXR1cm4gbnVsbDt0aGlzLndhfHwodGhpcy53YT1vZCh0aGlzLmphLCEwKSk7cmV0dXJuIHBkKHRoaXMuY3VycmVudFRhcmdldCx0aGlzLndhKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7RXZlbnQucHJvdG90eXBlLnN0b3BQcm9wYWdhdGlvbi5jYWxsKHRoaXMpO3RoaXMuaWE9ITB9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe0V2ZW50LnByb3RvdHlwZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24uY2FsbCh0aGlzKTsKdGhpcy5pYT10aGlzLkhhPSEwfX07ZnVuY3Rpb24gcmQoYSl7ZnVuY3Rpb24gYihiLGQpe2I9bmV3IGEoYixkKTtiLmhhPWQmJiEhZC5jb21wb3NlZDtyZXR1cm4gYn1BYihiLGEpO2IucHJvdG90eXBlPWEucHJvdG90eXBlO3JldHVybiBifXZhciBzZD17Zm9jdXM6ITAsYmx1cjohMH07ZnVuY3Rpb24gdGQoYSl7cmV0dXJuIGEuX190YXJnZXQhPT1hLnRhcmdldHx8YS5qYSE9PWEucmVsYXRlZFRhcmdldH1mdW5jdGlvbiB1ZChhLGIsYyl7aWYoYz1iLl9faGFuZGxlcnMmJmIuX19oYW5kbGVyc1thLnR5cGVdJiZiLl9faGFuZGxlcnNbYS50eXBlXVtjXSlmb3IodmFyIGQ9MCxlOyhlPWNbZF0pJiYoIXRkKGEpfHxhLnRhcmdldCE9PWEucmVsYXRlZFRhcmdldCkmJihlLmNhbGwoYixhKSwhYS5IYSk7ZCsrKTt9CmZ1bmN0aW9uIHZkKGEpe3ZhciBiPWEuY29tcG9zZWRQYXRoKCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsImN1cnJlbnRUYXJnZXQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZH0sY29uZmlndXJhYmxlOiEwfSk7Zm9yKHZhciBjPWIubGVuZ3RoLTE7MDw9YztjLS0pe3ZhciBkPWJbY107dWQoYSxkLCJjYXB0dXJlIik7aWYoYS5pYSlyZXR1cm59T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsImV2ZW50UGhhc2UiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gRXZlbnQuQVRfVEFSR0VUfX0pO3ZhciBlO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspe2Q9YltjXTt2YXIgZj1BKGQpO2Y9ZiYmZi5yb290O2lmKDA9PT1jfHxmJiZmPT09ZSlpZih1ZChhLGQsImJ1YmJsZSIpLGQhPT13aW5kb3cmJihlPWQuZ2V0Um9vdE5vZGUoKSksYS5pYSlicmVha319CmZ1bmN0aW9uIHdkKGEsYixjLGQsZSxmKXtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyl7dmFyIGg9YVtnXSxrPWgudHlwZSxtPWguY2FwdHVyZSxuPWgub25jZSxyPWgucGFzc2l2ZTtpZihiPT09aC5ub2RlJiZjPT09ayYmZD09PW0mJmU9PT1uJiZmPT09cilyZXR1cm4gZ31yZXR1cm4tMX0KZnVuY3Rpb24geGQoYSxiLGMpe2lmKGIpe3ZhciBkPXR5cGVvZiBiO2lmKCJmdW5jdGlvbiI9PT1kfHwib2JqZWN0Ij09PWQpaWYoIm9iamVjdCIhPT1kfHxiLmhhbmRsZUV2ZW50JiYiZnVuY3Rpb24iPT09dHlwZW9mIGIuaGFuZGxlRXZlbnQpe2lmKGMmJiJvYmplY3QiPT09dHlwZW9mIGMpe3ZhciBlPSEhYy5jYXB0dXJlO3ZhciBmPSEhYy5vbmNlO3ZhciBnPSEhYy5wYXNzaXZlfWVsc2UgZT0hIWMsZz1mPSExO3ZhciBoPWMmJmMubGF8fHRoaXMsaz1iW21kXTtpZihrKXtpZigtMTx3ZChrLGgsYSxlLGYsZykpcmV0dXJufWVsc2UgYlttZF09W107az1mdW5jdGlvbihlKXtmJiZ0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxiLGMpO2UuX190YXJnZXR8fHlkKGUpO2lmKGghPT10aGlzKXt2YXIgZz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsImN1cnJlbnRUYXJnZXQiKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiY3VycmVudFRhcmdldCIse2dldDpmdW5jdGlvbigpe3JldHVybiBofSwKY29uZmlndXJhYmxlOiEwfSl9aWYoZS5jb21wb3NlZHx8LTE8ZS5jb21wb3NlZFBhdGgoKS5pbmRleE9mKGgpKWlmKHRkKGUpJiZlLnRhcmdldD09PWUucmVsYXRlZFRhcmdldCllLmV2ZW50UGhhc2U9PT1FdmVudC5CVUJCTElOR19QSEFTRSYmZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtlbHNlIGlmKGUuZXZlbnRQaGFzZT09PUV2ZW50LkNBUFRVUklOR19QSEFTRXx8ZS5idWJibGVzfHxlLnRhcmdldD09PWh8fGggaW5zdGFuY2VvZiBXaW5kb3cpe3ZhciBrPSJmdW5jdGlvbiI9PT1kP2IuY2FsbChoLGUpOmIuaGFuZGxlRXZlbnQmJmIuaGFuZGxlRXZlbnQoZSk7aCE9PXRoaXMmJihnPyhPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiY3VycmVudFRhcmdldCIsZyksZz1udWxsKTpkZWxldGUgZS5jdXJyZW50VGFyZ2V0KTtyZXR1cm4ga319O2JbbWRdLnB1c2goe25vZGU6aCx0eXBlOmEsY2FwdHVyZTplLG9uY2U6ZixwYXNzaXZlOmcsZ2I6a30pO3NkW2FdPyh0aGlzLl9faGFuZGxlcnM9CnRoaXMuX19oYW5kbGVyc3x8e30sdGhpcy5fX2hhbmRsZXJzW2FdPXRoaXMuX19oYW5kbGVyc1thXXx8e2NhcHR1cmU6W10sYnViYmxlOltdfSx0aGlzLl9faGFuZGxlcnNbYV1bZT8iY2FwdHVyZSI6ImJ1YmJsZSJdLnB1c2goaykpOih0aGlzIGluc3RhbmNlb2YgV2luZG93P0QuZWI6RC5hZGRFdmVudExpc3RlbmVyKS5jYWxsKHRoaXMsYSxrLGMpfX19CmZ1bmN0aW9uIHpkKGEsYixjKXtpZihiKXtpZihjJiYib2JqZWN0Ij09PXR5cGVvZiBjKXt2YXIgZD0hIWMuY2FwdHVyZTt2YXIgZT0hIWMub25jZTt2YXIgZj0hIWMucGFzc2l2ZX1lbHNlIGQ9ISFjLGY9ZT0hMTt2YXIgZz1jJiZjLmxhfHx0aGlzLGg9dm9pZCAwO3ZhciBrPW51bGw7dHJ5e2s9YlttZF19Y2F0Y2gobSl7fWsmJihlPXdkKGssZyxhLGQsZSxmKSwtMTxlJiYoaD1rLnNwbGljZShlLDEpWzBdLmdiLGsubGVuZ3RofHwoYlttZF09dm9pZCAwKSkpOyh0aGlzIGluc3RhbmNlb2YgV2luZG93P0QuZmI6RC5yZW1vdmVFdmVudExpc3RlbmVyKS5jYWxsKHRoaXMsYSxofHxiLGMpO2gmJnNkW2FdJiZ0aGlzLl9faGFuZGxlcnMmJnRoaXMuX19oYW5kbGVyc1thXSYmKGE9dGhpcy5fX2hhbmRsZXJzW2FdW2Q/ImNhcHR1cmUiOiJidWJibGUiXSxoPWEuaW5kZXhPZihoKSwtMTxoJiZhLnNwbGljZShoLDEpKX19CmZ1bmN0aW9uIEFkKCl7Zm9yKHZhciBhIGluIHNkKXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7YS5fX3RhcmdldHx8KHlkKGEpLHZkKGEpKX0sITApfWZ1bmN0aW9uIHlkKGEpe2EuX190YXJnZXQ9YS50YXJnZXQ7YS5qYT1hLnJlbGF0ZWRUYXJnZXQ7aWYoQi5JKXt2YXIgYj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoYSk7aWYoIWIuaGFzT3duUHJvcGVydHkoIl9fcGF0Y2hQcm90byIpKXt2YXIgYz1PYmplY3QuY3JlYXRlKGIpO2MuaWI9Yjt5YihjLHFkKTtiLl9fcGF0Y2hQcm90bz1jfWEuX19wcm90b19fPWIuX19wYXRjaFByb3RvfWVsc2UgeWIoYSxxZCl9dmFyIEJkPXJkKHdpbmRvdy5FdmVudCksQ2Q9cmQod2luZG93LkN1c3RvbUV2ZW50KSxEZD1yZCh3aW5kb3cuTW91c2VFdmVudCk7ZnVuY3Rpb24gRWQoYSxiKXtyZXR1cm57aW5kZXg6YSxXOltdLGJhOmJ9fQpmdW5jdGlvbiBGZChhLGIsYyxkKXt2YXIgZT0wLGY9MCxnPTAsaD0wLGs9TWF0aC5taW4oYi1lLGQtZik7aWYoMD09ZSYmMD09ZilhOntmb3IoZz0wO2c8aztnKyspaWYoYVtnXSE9PWNbZ10pYnJlYWsgYTtnPWt9aWYoYj09YS5sZW5ndGgmJmQ9PWMubGVuZ3RoKXtoPWEubGVuZ3RoO2Zvcih2YXIgbT1jLmxlbmd0aCxuPTA7bjxrLWcmJkdkKGFbLS1oXSxjWy0tbV0pOyluKys7aD1ufWUrPWc7Zis9ZztiLT1oO2QtPWg7aWYoMD09Yi1lJiYwPT1kLWYpcmV0dXJuW107aWYoZT09Yil7Zm9yKGI9RWQoZSwwKTtmPGQ7KWIuVy5wdXNoKGNbZisrXSk7cmV0dXJuW2JdfWlmKGY9PWQpcmV0dXJuW0VkKGUsYi1lKV07az1lO2c9ZjtkPWQtZysxO2g9Yi1rKzE7Yj1BcnJheShkKTtmb3IobT0wO208ZDttKyspYlttXT1BcnJheShoKSxiW21dWzBdPW07Zm9yKG09MDttPGg7bSsrKWJbMF1bbV09bTtmb3IobT0xO208ZDttKyspZm9yKG49MTtuPGg7bisrKWlmKGFbaytuLTFdPT09Y1tnK20tMV0pYlttXVtuXT0KYlttLTFdW24tMV07ZWxzZXt2YXIgcj1iW20tMV1bbl0rMSxHPWJbbV1bbi0xXSsxO2JbbV1bbl09cjxHP3I6R31rPWIubGVuZ3RoLTE7Zz1iWzBdLmxlbmd0aC0xO2Q9YltrXVtnXTtmb3IoYT1bXTswPGt8fDA8ZzspMD09az8oYS5wdXNoKDIpLGctLSk6MD09Zz8oYS5wdXNoKDMpLGstLSk6KGg9YltrLTFdW2ctMV0sbT1iW2stMV1bZ10sbj1iW2tdW2ctMV0scj1tPG4/bTxoP206aDpuPGg/bjpoLHI9PWg/KGg9PWQ/YS5wdXNoKDApOihhLnB1c2goMSksZD1oKSxrLS0sZy0tKTpyPT1tPyhhLnB1c2goMyksay0tLGQ9bSk6KGEucHVzaCgyKSxnLS0sZD1uKSk7YS5yZXZlcnNlKCk7Yj12b2lkIDA7az1bXTtmb3IoZz0wO2c8YS5sZW5ndGg7ZysrKXN3aXRjaChhW2ddKXtjYXNlIDA6YiYmKGsucHVzaChiKSxiPXZvaWQgMCk7ZSsrO2YrKzticmVhaztjYXNlIDE6Ynx8KGI9RWQoZSwwKSk7Yi5iYSsrO2UrKztiLlcucHVzaChjW2ZdKTtmKys7YnJlYWs7Y2FzZSAyOmJ8fChiPUVkKGUsCjApKTtiLmJhKys7ZSsrO2JyZWFrO2Nhc2UgMzpifHwoYj1FZChlLDApKSxiLlcucHVzaChjW2ZdKSxmKyt9YiYmay5wdXNoKGIpO3JldHVybiBrfWZ1bmN0aW9uIEdkKGEsYil7cmV0dXJuIGE9PT1ifTt2YXIgYmQ9TS5wYXJlbnROb2RlLEhkPU0uY2hpbGROb2RlcyxJZD17fTtmdW5jdGlvbiBKZChhKXt2YXIgYj1bXTtkbyBiLnVuc2hpZnQoYSk7d2hpbGUoYT1hLnBhcmVudE5vZGUpO3JldHVybiBifWZ1bmN0aW9uIE5jKGEsYixjKXtpZihhIT09SWQpdGhyb3cgbmV3IFR5cGVFcnJvcigiSWxsZWdhbCBjb25zdHJ1Y3RvciIpO3RoaXMuT2E9IlNoYWR5Um9vdCI7YT1IZChiKTt0aGlzLmhvc3Q9Yjt0aGlzLmI9YyYmYy5tb2RlO1NjKGIsYSk7Yz1BKGIpO2Mucm9vdD10aGlzO2MuRGE9ImNsb3NlZCIhPT10aGlzLmI/dGhpczpudWxsO2M9eih0aGlzKTtjLmZpcnN0Q2hpbGQ9Yy5sYXN0Q2hpbGQ9Yy5wYXJlbnROb2RlPWMubmV4dFNpYmxpbmc9Yy5wcmV2aW91c1NpYmxpbmc9bnVsbDtjLmNoaWxkTm9kZXM9W107dGhpcy5hYT0hMTt0aGlzLmE9dGhpcy53PXRoaXMubT1udWxsO2M9MDtmb3IodmFyIGQ9YS5sZW5ndGg7YzxkO2MrKylELnJlbW92ZUNoaWxkLmNhbGwoYixhW2NdKX0KZnVuY3Rpb24gV2MoYSl7YS5hYXx8KGEuYWE9ITAsSmIoZnVuY3Rpb24oKXtyZXR1cm4gS2QoYSl9KSl9ZnVuY3Rpb24gS2QoYSl7Zm9yKHZhciBiO2E7KXthLmFhJiYoYj1hKTthOnt2YXIgYz1hO2E9Yy5ob3N0LmdldFJvb3ROb2RlKCk7aWYoQyhhKSlmb3IodmFyIGQ9Yy5ob3N0LmNoaWxkTm9kZXMsZT0wO2U8ZC5sZW5ndGg7ZSsrKWlmKGM9ZFtlXSwic2xvdCI9PWMubG9jYWxOYW1lKWJyZWFrIGE7YT12b2lkIDB9fWImJmIuX3JlbmRlclJvb3QoKX0KTmMucHJvdG90eXBlLl9yZW5kZXJSb290PWZ1bmN0aW9uKCl7dGhpcy5hYT0hMTtpZih0aGlzLm0pe2FkKHRoaXMpO2Zvcih2YXIgYT0wLGI7YTx0aGlzLm0ubGVuZ3RoO2ErKyl7Yj10aGlzLm1bYV07dmFyIGM9QShiKSxkPWMuYXNzaWduZWROb2RlcztjLmFzc2lnbmVkTm9kZXM9W107Yy5MPVtdO2lmKGMucGE9ZClmb3IoYz0wO2M8ZC5sZW5ndGg7YysrKXt2YXIgZT1BKGRbY10pO2UuWj1lLmFzc2lnbmVkU2xvdDtlLmFzc2lnbmVkU2xvdD09PWImJihlLmFzc2lnbmVkU2xvdD1udWxsKX19Zm9yKGI9dGhpcy5ob3N0LmZpcnN0Q2hpbGQ7YjtiPWIubmV4dFNpYmxpbmcpTGQodGhpcyxiKTtmb3IoYT0wO2E8dGhpcy5tLmxlbmd0aDthKyspe2I9dGhpcy5tW2FdO2Q9QShiKTtpZighZC5hc3NpZ25lZE5vZGVzLmxlbmd0aClmb3IoYz1iLmZpcnN0Q2hpbGQ7YztjPWMubmV4dFNpYmxpbmcpTGQodGhpcyxjLGIpOyhjPShjPUEoYi5wYXJlbnROb2RlKSkmJmMucm9vdCkmJmNkKGMpJiZjLl9yZW5kZXJSb290KCk7Ck1kKHRoaXMsZC5MLGQuYXNzaWduZWROb2Rlcyk7aWYoYz1kLnBhKXtmb3IoZT0wO2U8Yy5sZW5ndGg7ZSsrKUEoY1tlXSkuWj1udWxsO2QucGE9bnVsbDtjLmxlbmd0aD5kLmFzc2lnbmVkTm9kZXMubGVuZ3RoJiYoZC5kYT0hMCl9ZC5kYSYmKGQuZGE9ITEsTmQodGhpcyxiKSl9YT10aGlzLm07Yj1bXTtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXS5wYXJlbnROb2RlLChlPUEoYykpJiZlLnJvb3R8fCEoMD5iLmluZGV4T2YoYykpfHxiLnB1c2goYyk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7ZD1iW2FdO2M9ZD09PXRoaXM/dGhpcy5ob3N0OmQ7ZT1bXTtkPWQuY2hpbGROb2Rlcztmb3IodmFyIGY9MDtmPGQubGVuZ3RoO2YrKyl7dmFyIGc9ZFtmXTtpZigic2xvdCI9PWcubG9jYWxOYW1lKXtnPUEoZykuTDtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKyllLnB1c2goZ1toXSl9ZWxzZSBlLnB1c2goZyl9ZD12b2lkIDA7Zj1IZChjKTtnPUZkKGUsZS5sZW5ndGgsZixmLmxlbmd0aCk7CmZvcih2YXIgaz1oPTA7aDxnLmxlbmd0aCYmKGQ9Z1toXSk7aCsrKXtmb3IodmFyIG09MCxuO208ZC5XLmxlbmd0aCYmKG49ZC5XW21dKTttKyspYmQobik9PT1jJiZELnJlbW92ZUNoaWxkLmNhbGwoYyxuKSxmLnNwbGljZShkLmluZGV4K2ssMSk7ay09ZC5iYX1mb3Ioaz0wO2s8Zy5sZW5ndGgmJihkPWdba10pO2srKylmb3IoaD1mW2QuaW5kZXhdLG09ZC5pbmRleDttPGQuaW5kZXgrZC5iYTttKyspbj1lW21dLEQuaW5zZXJ0QmVmb3JlLmNhbGwoYyxuLGgpLGYuc3BsaWNlKG0sMCxuKX19fTtmdW5jdGlvbiBMZChhLGIsYyl7dmFyIGQ9eihiKSxlPWQuWjtkLlo9bnVsbDtjfHwoYz0oYT1hLndbYi5zbG90fHwiX19jYXRjaGFsbCJdKSYmYVswXSk7Yz8oeihjKS5hc3NpZ25lZE5vZGVzLnB1c2goYiksZC5hc3NpZ25lZFNsb3Q9Yyk6ZC5hc3NpZ25lZFNsb3Q9dm9pZCAwO2UhPT1kLmFzc2lnbmVkU2xvdCYmZC5hc3NpZ25lZFNsb3QmJih6KGQuYXNzaWduZWRTbG90KS5kYT0hMCl9CmZ1bmN0aW9uIE1kKGEsYixjKXtmb3IodmFyIGQ9MCxlO2Q8Yy5sZW5ndGgmJihlPWNbZF0pO2QrKylpZigic2xvdCI9PWUubG9jYWxOYW1lKXt2YXIgZj1BKGUpLmFzc2lnbmVkTm9kZXM7ZiYmZi5sZW5ndGgmJk1kKGEsYixmKX1lbHNlIGIucHVzaChjW2RdKX1mdW5jdGlvbiBOZChhLGIpe0QuZGlzcGF0Y2hFdmVudC5jYWxsKGIsbmV3IEV2ZW50KCJzbG90Y2hhbmdlIikpO2I9QShiKTtiLmFzc2lnbmVkU2xvdCYmTmQoYSxiLmFzc2lnbmVkU2xvdCl9ZnVuY3Rpb24gYWQoYSl7aWYoYS5hJiZhLmEubGVuZ3RoKXtmb3IodmFyIGI9YS5hLGMsZD0wO2Q8Yi5sZW5ndGg7ZCsrKXt2YXIgZT1iW2RdO1NjKGUpO1NjKGUucGFyZW50Tm9kZSk7dmFyIGY9ZWQoZSk7YS53W2ZdPyhjPWN8fHt9LGNbZl09ITAsYS53W2ZdLnB1c2goZSkpOmEud1tmXT1bZV07YS5tLnB1c2goZSl9aWYoYylmb3IodmFyIGcgaW4gYylhLndbZ109ZmQoYS53W2ddKTthLmE9W119fQpmdW5jdGlvbiBlZChhKXt2YXIgYj1hLm5hbWV8fGEuZ2V0QXR0cmlidXRlKCJuYW1lIil8fCJfX2NhdGNoYWxsIjtyZXR1cm4gYS5KYT1ifWZ1bmN0aW9uIGZkKGEpe3JldHVybiBhLnNvcnQoZnVuY3Rpb24oYSxjKXthPUpkKGEpO2Zvcih2YXIgYj1KZChjKSxlPTA7ZTxhLmxlbmd0aDtlKyspe2M9YVtlXTt2YXIgZj1iW2VdO2lmKGMhPT1mKXJldHVybiBhPUFycmF5LmZyb20oYy5wYXJlbnROb2RlLmNoaWxkTm9kZXMpLGEuaW5kZXhPZihjKS1hLmluZGV4T2YoZil9fSl9ZnVuY3Rpb24gY2QoYSl7YWQoYSk7cmV0dXJuISghYS5tfHwhYS5tLmxlbmd0aCl9O2Z1bmN0aW9uIE9kKGEpe3ZhciBiPWEuZ2V0Um9vdE5vZGUoKTtDKGIpJiZLZChiKTtyZXR1cm4oYT1BKGEpKSYmYS5hc3NpZ25lZFNsb3R8fG51bGx9CnZhciBQZD17YWRkRXZlbnRMaXN0ZW5lcjp4ZC5iaW5kKHdpbmRvdykscmVtb3ZlRXZlbnRMaXN0ZW5lcjp6ZC5iaW5kKHdpbmRvdyl9LFFkPXthZGRFdmVudExpc3RlbmVyOnhkLHJlbW92ZUV2ZW50TGlzdGVuZXI6emQsYXBwZW5kQ2hpbGQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFVjKHRoaXMsYSl9LGluc2VydEJlZm9yZTpmdW5jdGlvbihhLGIpe3JldHVybiBVYyh0aGlzLGEsYil9LHJlbW92ZUNoaWxkOmZ1bmN0aW9uKGEpe3JldHVybiBWYyh0aGlzLGEpfSxyZXBsYWNlQ2hpbGQ6ZnVuY3Rpb24oYSxiKXtVYyh0aGlzLGEsYik7VmModGhpcyxiKTtyZXR1cm4gYX0sY2xvbmVOb2RlOmZ1bmN0aW9uKGEpe2lmKCJ0ZW1wbGF0ZSI9PXRoaXMubG9jYWxOYW1lKXZhciBiPUQuY2xvbmVOb2RlLmNhbGwodGhpcyxhKTtlbHNlIGlmKGI9RC5jbG9uZU5vZGUuY2FsbCh0aGlzLCExKSxhKXthPXRoaXMuY2hpbGROb2Rlcztmb3IodmFyIGM9MCxkO2M8YS5sZW5ndGg7YysrKWQ9YVtjXS5jbG9uZU5vZGUoITApLApiLmFwcGVuZENoaWxkKGQpfXJldHVybiBifSxnZXRSb290Tm9kZTpmdW5jdGlvbigpe3JldHVybiBnZCh0aGlzKX0sY29udGFpbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIEdiKHRoaXMsYSl9LGRpc3BhdGNoRXZlbnQ6ZnVuY3Rpb24oYSl7S2IoKTtyZXR1cm4gRC5kaXNwYXRjaEV2ZW50LmNhbGwodGhpcyxhKX19OwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyhRZCx7aXNDb25uZWN0ZWQ6e2dldDpmdW5jdGlvbigpe2lmKEFjJiZBYy5jYWxsKHRoaXMpKXJldHVybiEwO2lmKHRoaXMubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSlyZXR1cm4hMTt2YXIgYT10aGlzLm93bmVyRG9jdW1lbnQ7aWYoRmIpe2lmKEQuY29udGFpbnMuY2FsbChhLHRoaXMpKXJldHVybiEwfWVsc2UgaWYoYS5kb2N1bWVudEVsZW1lbnQmJkQuY29udGFpbnMuY2FsbChhLmRvY3VtZW50RWxlbWVudCx0aGlzKSlyZXR1cm4hMDtmb3IoYT10aGlzO2EmJiEoYSBpbnN0YW5jZW9mIERvY3VtZW50KTspYT1hLnBhcmVudE5vZGV8fChDKGEpP2EuaG9zdDp2b2lkIDApO3JldHVybiEhKGEmJmEgaW5zdGFuY2VvZiBEb2N1bWVudCl9LGNvbmZpZ3VyYWJsZTohMH19KTsKdmFyIFJkPXtnZXQgYXNzaWduZWRTbG90KCl7cmV0dXJuIE9kKHRoaXMpfX0sU2Q9e3F1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIGhkKHRoaXMsZnVuY3Rpb24oYil7cmV0dXJuIHhiLmNhbGwoYixhKX0sZnVuY3Rpb24oYSl7cmV0dXJuISFhfSlbMF18fG51bGx9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24oYSxiKXtpZihiKXtiPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKEQucXVlcnlTZWxlY3RvckFsbCh0aGlzLGEpKTt2YXIgYz10aGlzLmdldFJvb3ROb2RlKCk7cmV0dXJuIGIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLmdldFJvb3ROb2RlKCk9PWN9KX1yZXR1cm4gaGQodGhpcyxmdW5jdGlvbihiKXtyZXR1cm4geGIuY2FsbChiLGEpfSl9fSxUZD17YXNzaWduZWROb2RlczpmdW5jdGlvbihhKXtpZigic2xvdCI9PT10aGlzLmxvY2FsTmFtZSl7dmFyIGI9dGhpcy5nZXRSb290Tm9kZSgpO0MoYikmJktkKGIpO3JldHVybihiPUEodGhpcykpPyhhJiZhLmZsYXR0ZW4/CmIuTDpiLmFzc2lnbmVkTm9kZXMpfHxbXTpbXX19fSxVZD16Yih7c2V0QXR0cmlidXRlOmZ1bmN0aW9uKGEsYil7a2QodGhpcyxhLGIpfSxyZW1vdmVBdHRyaWJ1dGU6ZnVuY3Rpb24oYSl7RC5yZW1vdmVBdHRyaWJ1dGUuY2FsbCh0aGlzLGEpO2RkKHRoaXMsYSl9LGF0dGFjaFNoYWRvdzpmdW5jdGlvbihhKXtpZighdGhpcyl0aHJvdyJNdXN0IHByb3ZpZGUgYSBob3N0LiI7aWYoIWEpdGhyb3ciTm90IGVub3VnaCBhcmd1bWVudHMuIjtyZXR1cm4gbmV3IE5jKElkLHRoaXMsYSl9LGdldCBzbG90KCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCJzbG90Iil9LHNldCBzbG90KGEpe2tkKHRoaXMsInNsb3QiLGEpfSxnZXQgYXNzaWduZWRTbG90KCl7cmV0dXJuIE9kKHRoaXMpfX0sU2QsVGQpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFVkLEpjKTsKdmFyIFZkPXpiKHtpbXBvcnROb2RlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGxkKGEsYil9LGdldEVsZW1lbnRCeUlkOmZ1bmN0aW9uKGEpe3JldHVybiBoZCh0aGlzLGZ1bmN0aW9uKGIpe3JldHVybiBiLmlkPT1hfSxmdW5jdGlvbihhKXtyZXR1cm4hIWF9KVswXXx8bnVsbH19LFNkKTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhWZCx7X2FjdGl2ZUVsZW1lbnQ6S2MuYWN0aXZlRWxlbWVudH0pOwp2YXIgV2Q9SFRNTEVsZW1lbnQucHJvdG90eXBlLmJsdXIsWGQ9emIoe2JsdXI6ZnVuY3Rpb24oKXt2YXIgYT1BKHRoaXMpOyhhPShhPWEmJmEucm9vdCkmJmEuYWN0aXZlRWxlbWVudCk/YS5ibHVyKCk6V2QuY2FsbCh0aGlzKX19KSxZZD17YWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGIsYyl7Im9iamVjdCIhPT10eXBlb2YgYyYmKGM9e2NhcHR1cmU6ISFjfSk7Yy5sYT10aGlzO3RoaXMuaG9zdC5hZGRFdmVudExpc3RlbmVyKGEsYixjKX0scmVtb3ZlRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGIsYyl7Im9iamVjdCIhPT10eXBlb2YgYyYmKGM9e2NhcHR1cmU6ISFjfSk7Yy5sYT10aGlzO3RoaXMuaG9zdC5yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKX0sZ2V0RWxlbWVudEJ5SWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGhkKHRoaXMsZnVuY3Rpb24oYil7cmV0dXJuIGIuaWQ9PWF9LGZ1bmN0aW9uKGEpe3JldHVybiEhYX0pWzBdfHxudWxsfX07CmZ1bmN0aW9uIFpkKGEsYil7Zm9yKHZhciBjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGIpLGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9Y1tkXSxmPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYixlKTtmLnZhbHVlP2FbZV09Zi52YWx1ZTpPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxlLGYpfX07aWYoQi5CYSl7dmFyIFNoYWR5RE9NPXtpblVzZTpCLkJhLHBhdGNoOmZ1bmN0aW9uKGEpe1BjKGEpO09jKGEpO3JldHVybiBhfSxpc1NoYWR5Um9vdDpDLGVucXVldWU6SmIsZmx1c2g6S2Isc2V0dGluZ3M6QixmaWx0ZXJNdXRhdGlvbnM6UWIsb2JzZXJ2ZUNoaWxkcmVuOk9iLHVub2JzZXJ2ZUNoaWxkcmVuOlBiLG5hdGl2ZU1ldGhvZHM6RCxuYXRpdmVUcmVlOk19O3dpbmRvdy5TaGFkeURPTT1TaGFkeURPTTt3aW5kb3cuRXZlbnQ9QmQ7d2luZG93LkN1c3RvbUV2ZW50PUNkO3dpbmRvdy5Nb3VzZUV2ZW50PURkO0FkKCk7dmFyICRkPXdpbmRvdy5jdXN0b21FbGVtZW50cyYmd2luZG93LmN1c3RvbUVsZW1lbnRzLm5hdGl2ZUhUTUxFbGVtZW50fHxIVE1MRWxlbWVudDtaZChOYy5wcm90b3R5cGUsWWQpO1pkKHdpbmRvdy5Ob2RlLnByb3RvdHlwZSxRZCk7WmQod2luZG93LldpbmRvdy5wcm90b3R5cGUsUGQpO1pkKHdpbmRvdy5UZXh0LnByb3RvdHlwZSxSZCk7WmQod2luZG93LkRvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLApTZCk7WmQod2luZG93LkVsZW1lbnQucHJvdG90eXBlLFVkKTtaZCh3aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLFZkKTt3aW5kb3cuSFRNTFNsb3RFbGVtZW50JiZaZCh3aW5kb3cuSFRNTFNsb3RFbGVtZW50LnByb3RvdHlwZSxUZCk7WmQoJGQucHJvdG90eXBlLFhkKTtCLkkmJihMYyh3aW5kb3cuTm9kZS5wcm90b3R5cGUpLExjKHdpbmRvdy5UZXh0LnByb3RvdHlwZSksTGMod2luZG93LkRvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlKSxMYyh3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUpLExjKCRkLnByb3RvdHlwZSksTGMod2luZG93LkRvY3VtZW50LnByb3RvdHlwZSksd2luZG93LkhUTUxTbG90RWxlbWVudCYmTGMod2luZG93LkhUTUxTbG90RWxlbWVudC5wcm90b3R5cGUpKTtNYygpO3dpbmRvdy5TaGFkb3dSb290PU5jfTt2YXIgYWU9bmV3IFNldCgiYW5ub3RhdGlvbi14bWwgY29sb3ItcHJvZmlsZSBmb250LWZhY2UgZm9udC1mYWNlLXNyYyBmb250LWZhY2UtdXJpIGZvbnQtZmFjZS1mb3JtYXQgZm9udC1mYWNlLW5hbWUgbWlzc2luZy1nbHlwaCIuc3BsaXQoIiAiKSk7ZnVuY3Rpb24gYmUoYSl7dmFyIGI9YWUuaGFzKGEpO2E9L15bYS16XVsuMC05X2Etel0qLVtcLS4wLTlfYS16XSokLy50ZXN0KGEpO3JldHVybiFiJiZhfWZ1bmN0aW9uIE8oYSl7dmFyIGI9YS5pc0Nvbm5lY3RlZDtpZih2b2lkIDAhPT1iKXJldHVybiBiO2Zvcig7YSYmIShhLl9fQ0VfaXNJbXBvcnREb2N1bWVudHx8YSBpbnN0YW5jZW9mIERvY3VtZW50KTspYT1hLnBhcmVudE5vZGV8fCh3aW5kb3cuU2hhZG93Um9vdCYmYSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3Q/YS5ob3N0OnZvaWQgMCk7cmV0dXJuISghYXx8IShhLl9fQ0VfaXNJbXBvcnREb2N1bWVudHx8YSBpbnN0YW5jZW9mIERvY3VtZW50KSl9CmZ1bmN0aW9uIGNlKGEsYil7Zm9yKDtiJiZiIT09YSYmIWIubmV4dFNpYmxpbmc7KWI9Yi5wYXJlbnROb2RlO3JldHVybiBiJiZiIT09YT9iLm5leHRTaWJsaW5nOm51bGx9CmZ1bmN0aW9uIGRlKGEsYixjKXtjPXZvaWQgMD09PWM/bmV3IFNldDpjO2Zvcih2YXIgZD1hO2Q7KXtpZihkLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciBlPWQ7YihlKTt2YXIgZj1lLmxvY2FsTmFtZTtpZigibGluayI9PT1mJiYiaW1wb3J0Ij09PWUuZ2V0QXR0cmlidXRlKCJyZWwiKSl7ZD1lLmltcG9ydDtpZihkIGluc3RhbmNlb2YgTm9kZSYmIWMuaGFzKGQpKWZvcihjLmFkZChkKSxkPWQuZmlyc3RDaGlsZDtkO2Q9ZC5uZXh0U2libGluZylkZShkLGIsYyk7ZD1jZShhLGUpO2NvbnRpbnVlfWVsc2UgaWYoInRlbXBsYXRlIj09PWYpe2Q9Y2UoYSxlKTtjb250aW51ZX1pZihlPWUuX19DRV9zaGFkb3dSb290KWZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZylkZShlLGIsYyl9ZD1kLmZpcnN0Q2hpbGQ/ZC5maXJzdENoaWxkOmNlKGEsZCl9fWZ1bmN0aW9uIFAoYSxiLGMpe2FbYl09Y307ZnVuY3Rpb24gZWUoKXt0aGlzLmE9bmV3IE1hcDt0aGlzLk09bmV3IE1hcDt0aGlzLkY9W107dGhpcy5jPSExfWZ1bmN0aW9uIGZlKGEsYixjKXthLmEuc2V0KGIsYyk7YS5NLnNldChjLmNvbnN0cnVjdG9yLGMpfWZ1bmN0aW9uIGdlKGEsYil7YS5jPSEwO2EuRi5wdXNoKGIpfWZ1bmN0aW9uIGhlKGEsYil7YS5jJiZkZShiLGZ1bmN0aW9uKGIpe3JldHVybiBhLmIoYil9KX1lZS5wcm90b3R5cGUuYj1mdW5jdGlvbihhKXtpZih0aGlzLmMmJiFhLl9fQ0VfcGF0Y2hlZCl7YS5fX0NFX3BhdGNoZWQ9ITA7Zm9yKHZhciBiPTA7Yjx0aGlzLkYubGVuZ3RoO2IrKyl0aGlzLkZbYl0oYSl9fTtmdW5jdGlvbiBRKGEsYil7dmFyIGM9W107ZGUoYixmdW5jdGlvbihhKXtyZXR1cm4gYy5wdXNoKGEpfSk7Zm9yKGI9MDtiPGMubGVuZ3RoO2IrKyl7dmFyIGQ9Y1tiXTsxPT09ZC5fX0NFX3N0YXRlP2EuY29ubmVjdGVkQ2FsbGJhY2soZCk6aWUoYSxkKX19CmZ1bmN0aW9uIFIoYSxiKXt2YXIgYz1bXTtkZShiLGZ1bmN0aW9uKGEpe3JldHVybiBjLnB1c2goYSl9KTtmb3IoYj0wO2I8Yy5sZW5ndGg7YisrKXt2YXIgZD1jW2JdOzE9PT1kLl9fQ0Vfc3RhdGUmJmEuZGlzY29ubmVjdGVkQ2FsbGJhY2soZCl9fQpmdW5jdGlvbiBqZShhLGIsYyl7Yz12b2lkIDA9PT1jP3t9OmM7dmFyIGQ9Yy5iYnx8bmV3IFNldCxlPWMuZ2F8fGZ1bmN0aW9uKGIpe3JldHVybiBpZShhLGIpfSxmPVtdO2RlKGIsZnVuY3Rpb24oYil7aWYoImxpbmsiPT09Yi5sb2NhbE5hbWUmJiJpbXBvcnQiPT09Yi5nZXRBdHRyaWJ1dGUoInJlbCIpKXt2YXIgYz1iLmltcG9ydDtjIGluc3RhbmNlb2YgTm9kZSYmKGMuX19DRV9pc0ltcG9ydERvY3VtZW50PSEwLGMuX19DRV9oYXNSZWdpc3RyeT0hMCk7YyYmImNvbXBsZXRlIj09PWMucmVhZHlTdGF0ZT9jLl9fQ0VfZG9jdW1lbnRMb2FkSGFuZGxlZD0hMDpiLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGZ1bmN0aW9uKCl7dmFyIGM9Yi5pbXBvcnQ7aWYoIWMuX19DRV9kb2N1bWVudExvYWRIYW5kbGVkKXtjLl9fQ0VfZG9jdW1lbnRMb2FkSGFuZGxlZD0hMDt2YXIgZj1uZXcgU2V0KGQpO2YuZGVsZXRlKGMpO2plKGEsYyx7YmI6ZixnYTplfSl9fSl9ZWxzZSBmLnB1c2goYil9LGQpOwppZihhLmMpZm9yKGI9MDtiPGYubGVuZ3RoO2IrKylhLmIoZltiXSk7Zm9yKGI9MDtiPGYubGVuZ3RoO2IrKyllKGZbYl0pfQpmdW5jdGlvbiBpZShhLGIpe2lmKHZvaWQgMD09PWIuX19DRV9zdGF0ZSl7dmFyIGM9Yi5vd25lckRvY3VtZW50O2lmKGMuZGVmYXVsdFZpZXd8fGMuX19DRV9pc0ltcG9ydERvY3VtZW50JiZjLl9fQ0VfaGFzUmVnaXN0cnkpaWYoYz1hLmEuZ2V0KGIubG9jYWxOYW1lKSl7Yy5jb25zdHJ1Y3Rpb25TdGFjay5wdXNoKGIpO3ZhciBkPWMuY29uc3RydWN0b3I7dHJ5e3RyeXtpZihuZXcgZCE9PWIpdGhyb3cgRXJyb3IoIlRoZSBjdXN0b20gZWxlbWVudCBjb25zdHJ1Y3RvciBkaWQgbm90IHByb2R1Y2UgdGhlIGVsZW1lbnQgYmVpbmcgdXBncmFkZWQuIik7fWZpbmFsbHl7Yy5jb25zdHJ1Y3Rpb25TdGFjay5wb3AoKX19Y2F0Y2goZyl7dGhyb3cgYi5fX0NFX3N0YXRlPTIsZzt9Yi5fX0NFX3N0YXRlPTE7Yi5fX0NFX2RlZmluaXRpb249YztpZihjLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaylmb3IoYz1jLm9ic2VydmVkQXR0cmlidXRlcyxkPTA7ZDxjLmxlbmd0aDtkKyspe3ZhciBlPWNbZF0sCmY9Yi5nZXRBdHRyaWJ1dGUoZSk7bnVsbCE9PWYmJmEuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKGIsZSxudWxsLGYsbnVsbCl9TyhiKSYmYS5jb25uZWN0ZWRDYWxsYmFjayhiKX19fWVlLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaz1mdW5jdGlvbihhKXt2YXIgYj1hLl9fQ0VfZGVmaW5pdGlvbjtiLmNvbm5lY3RlZENhbGxiYWNrJiZiLmNvbm5lY3RlZENhbGxiYWNrLmNhbGwoYSl9O2VlLnByb3RvdHlwZS5kaXNjb25uZWN0ZWRDYWxsYmFjaz1mdW5jdGlvbihhKXt2YXIgYj1hLl9fQ0VfZGVmaW5pdGlvbjtiLmRpc2Nvbm5lY3RlZENhbGxiYWNrJiZiLmRpc2Nvbm5lY3RlZENhbGxiYWNrLmNhbGwoYSl9OwplZS5wcm90b3R5cGUuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrPWZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGY9YS5fX0NFX2RlZmluaXRpb247Zi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2smJi0xPGYub2JzZXJ2ZWRBdHRyaWJ1dGVzLmluZGV4T2YoYikmJmYuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrLmNhbGwoYSxiLGMsZCxlKX07ZnVuY3Rpb24ga2UoYSl7dmFyIGI9ZG9jdW1lbnQ7dGhpcy5BPWE7dGhpcy5hPWI7dGhpcy5QPXZvaWQgMDtqZSh0aGlzLkEsdGhpcy5hKTsibG9hZGluZyI9PT10aGlzLmEucmVhZHlTdGF0ZSYmKHRoaXMuUD1uZXcgTXV0YXRpb25PYnNlcnZlcih0aGlzLmIuYmluZCh0aGlzKSksdGhpcy5QLm9ic2VydmUodGhpcy5hLHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pKX1mdW5jdGlvbiBsZShhKXthLlAmJmEuUC5kaXNjb25uZWN0KCl9a2UucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5hLnJlYWR5U3RhdGU7ImludGVyYWN0aXZlIiE9PWImJiJjb21wbGV0ZSIhPT1ifHxsZSh0aGlzKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcih2YXIgYz1hW2JdLmFkZGVkTm9kZXMsZD0wO2Q8Yy5sZW5ndGg7ZCsrKWplKHRoaXMuQSxjW2RdKX07ZnVuY3Rpb24gbWUoKXt2YXIgYT10aGlzO3RoaXMuYj10aGlzLmE9dm9pZCAwO3RoaXMuYz1uZXcgUHJvbWlzZShmdW5jdGlvbihiKXthLmI9YjthLmEmJmIoYS5hKX0pfW1lLnByb3RvdHlwZS5yZXNvbHZlPWZ1bmN0aW9uKGEpe2lmKHRoaXMuYSl0aHJvdyBFcnJvcigiQWxyZWFkeSByZXNvbHZlZC4iKTt0aGlzLmE9YTt0aGlzLmImJnRoaXMuYihhKX07ZnVuY3Rpb24gUyhhKXt0aGlzLm1hPSExO3RoaXMuQT1hO3RoaXMucmE9bmV3IE1hcDt0aGlzLm5hPWZ1bmN0aW9uKGEpe3JldHVybiBhKCl9O3RoaXMuWT0hMTt0aGlzLm9hPVtdO3RoaXMuTWE9bmV3IGtlKGEpfXE9Uy5wcm90b3R5cGU7CnEuZGVmaW5lPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcztpZighKGIgaW5zdGFuY2VvZiBGdW5jdGlvbikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ3VzdG9tIGVsZW1lbnQgY29uc3RydWN0b3JzIG11c3QgYmUgZnVuY3Rpb25zLiIpO2lmKCFiZShhKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIlRoZSBlbGVtZW50IG5hbWUgJyIrYSsiJyBpcyBub3QgdmFsaWQuIik7aWYodGhpcy5BLmEuZ2V0KGEpKXRocm93IEVycm9yKCJBIGN1c3RvbSBlbGVtZW50IHdpdGggbmFtZSAnIithKyInIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZC4iKTtpZih0aGlzLm1hKXRocm93IEVycm9yKCJBIGN1c3RvbSBlbGVtZW50IGlzIGFscmVhZHkgYmVpbmcgZGVmaW5lZC4iKTt0aGlzLm1hPSEwO3RyeXt2YXIgZD1mdW5jdGlvbihhKXt2YXIgYj1lW2FdO2lmKHZvaWQgMCE9PWImJiEoYiBpbnN0YW5jZW9mIEZ1bmN0aW9uKSl0aHJvdyBFcnJvcigiVGhlICciK2ErIicgY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpOwpyZXR1cm4gYn0sZT1iLnByb3RvdHlwZTtpZighKGUgaW5zdGFuY2VvZiBPYmplY3QpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBjdXN0b20gZWxlbWVudCBjb25zdHJ1Y3RvcidzIHByb3RvdHlwZSBpcyBub3QgYW4gb2JqZWN0LiIpO3ZhciBmPWQoImNvbm5lY3RlZENhbGxiYWNrIik7dmFyIGc9ZCgiZGlzY29ubmVjdGVkQ2FsbGJhY2siKTt2YXIgaD1kKCJhZG9wdGVkQ2FsbGJhY2siKTt2YXIgaz1kKCJhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2siKTt2YXIgbT1iLm9ic2VydmVkQXR0cmlidXRlc3x8W119Y2F0Y2gobil7cmV0dXJufWZpbmFsbHl7dGhpcy5tYT0hMX1iPXtsb2NhbE5hbWU6YSxjb25zdHJ1Y3RvcjpiLGNvbm5lY3RlZENhbGxiYWNrOmYsZGlzY29ubmVjdGVkQ2FsbGJhY2s6ZyxhZG9wdGVkQ2FsbGJhY2s6aCxhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2s6ayxvYnNlcnZlZEF0dHJpYnV0ZXM6bSxjb25zdHJ1Y3Rpb25TdGFjazpbXX07ZmUodGhpcy5BLGEsYik7dGhpcy5vYS5wdXNoKGIpOwp0aGlzLll8fCh0aGlzLlk9ITAsdGhpcy5uYShmdW5jdGlvbigpe3JldHVybiBuZShjKX0pKX07cS5nYT1mdW5jdGlvbihhKXtqZSh0aGlzLkEsYSl9OwpmdW5jdGlvbiBuZShhKXtpZighMSE9PWEuWSl7YS5ZPSExO2Zvcih2YXIgYj1hLm9hLGM9W10sZD1uZXcgTWFwLGU9MDtlPGIubGVuZ3RoO2UrKylkLnNldChiW2VdLmxvY2FsTmFtZSxbXSk7amUoYS5BLGRvY3VtZW50LHtnYTpmdW5jdGlvbihiKXtpZih2b2lkIDA9PT1iLl9fQ0Vfc3RhdGUpe3ZhciBlPWIubG9jYWxOYW1lLGY9ZC5nZXQoZSk7Zj9mLnB1c2goYik6YS5BLmEuZ2V0KGUpJiZjLnB1c2goYil9fX0pO2ZvcihlPTA7ZTxjLmxlbmd0aDtlKyspaWUoYS5BLGNbZV0pO2Zvcig7MDxiLmxlbmd0aDspe3ZhciBmPWIuc2hpZnQoKTtlPWYubG9jYWxOYW1lO2Y9ZC5nZXQoZi5sb2NhbE5hbWUpO2Zvcih2YXIgZz0wO2c8Zi5sZW5ndGg7ZysrKWllKGEuQSxmW2ddKTsoZT1hLnJhLmdldChlKSkmJmUucmVzb2x2ZSh2b2lkIDApfX19cS5nZXQ9ZnVuY3Rpb24oYSl7aWYoYT10aGlzLkEuYS5nZXQoYSkpcmV0dXJuIGEuY29uc3RydWN0b3J9OwpxLndoZW5EZWZpbmVkPWZ1bmN0aW9uKGEpe2lmKCFiZShhKSlyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFN5bnRheEVycm9yKCInIithKyInIGlzIG5vdCBhIHZhbGlkIGN1c3RvbSBlbGVtZW50IG5hbWUuIikpO3ZhciBiPXRoaXMucmEuZ2V0KGEpO2lmKGIpcmV0dXJuIGIuYztiPW5ldyBtZTt0aGlzLnJhLnNldChhLGIpO3RoaXMuQS5hLmdldChhKSYmIXRoaXMub2Euc29tZShmdW5jdGlvbihiKXtyZXR1cm4gYi5sb2NhbE5hbWU9PT1hfSkmJmIucmVzb2x2ZSh2b2lkIDApO3JldHVybiBiLmN9O3EuWGE9ZnVuY3Rpb24oYSl7bGUodGhpcy5NYSk7dmFyIGI9dGhpcy5uYTt0aGlzLm5hPWZ1bmN0aW9uKGMpe3JldHVybiBhKGZ1bmN0aW9uKCl7cmV0dXJuIGIoYyl9KX19O3dpbmRvdy5DdXN0b21FbGVtZW50UmVnaXN0cnk9UztTLnByb3RvdHlwZS5kZWZpbmU9Uy5wcm90b3R5cGUuZGVmaW5lO1MucHJvdG90eXBlLnVwZ3JhZGU9Uy5wcm90b3R5cGUuZ2E7ClMucHJvdG90eXBlLmdldD1TLnByb3RvdHlwZS5nZXQ7Uy5wcm90b3R5cGUud2hlbkRlZmluZWQ9Uy5wcm90b3R5cGUud2hlbkRlZmluZWQ7Uy5wcm90b3R5cGUucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjaz1TLnByb3RvdHlwZS5YYTt2YXIgb2U9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50LHBlPXdpbmRvdy5Eb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRWxlbWVudE5TLHFlPXdpbmRvdy5Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZSxyZT13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLnByZXBlbmQsc2U9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5hcHBlbmQsdGU9d2luZG93LkRvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLnByZXBlbmQsdWU9d2luZG93LkRvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLmFwcGVuZCx2ZT13aW5kb3cuTm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlLHdlPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5hcHBlbmRDaGlsZCx4ZT13aW5kb3cuTm9kZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlLHllPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5yZW1vdmVDaGlsZCx6ZT13aW5kb3cuTm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkLEFlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93Lk5vZGUucHJvdG90eXBlLAoidGV4dENvbnRlbnQiKSxCZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYXR0YWNoU2hhZG93LENlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LkVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKSxEZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuZ2V0QXR0cmlidXRlLEVlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5zZXRBdHRyaWJ1dGUsRmU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZSxHZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuZ2V0QXR0cmlidXRlTlMsSGU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZU5TLEllPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGVOUyxKZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuaW5zZXJ0QWRqYWNlbnRFbGVtZW50LEtlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5pbnNlcnRBZGphY2VudEhUTUwsTGU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnByZXBlbmQsCk1lPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hcHBlbmQsTmU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmJlZm9yZSxPZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYWZ0ZXIsUGU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlcGxhY2VXaXRoLFFlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5yZW1vdmUsUmU9d2luZG93LkhUTUxFbGVtZW50LFNlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iod2luZG93LkhUTUxFbGVtZW50LnByb3RvdHlwZSwiaW5uZXJIVE1MIiksVGU9d2luZG93LkhUTUxFbGVtZW50LnByb3RvdHlwZS5pbnNlcnRBZGphY2VudEVsZW1lbnQsVWU9d2luZG93LkhUTUxFbGVtZW50LnByb3RvdHlwZS5pbnNlcnRBZGphY2VudEhUTUw7dmFyIFZlPW5ldyBmdW5jdGlvbigpe307ZnVuY3Rpb24gV2UoKXt2YXIgYT1YZTt3aW5kb3cuSFRNTEVsZW1lbnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dmFyIGI9dGhpcy5jb25zdHJ1Y3RvcixkPWEuTS5nZXQoYik7aWYoIWQpdGhyb3cgRXJyb3IoIlRoZSBjdXN0b20gZWxlbWVudCBiZWluZyBjb25zdHJ1Y3RlZCB3YXMgbm90IHJlZ2lzdGVyZWQgd2l0aCBgY3VzdG9tRWxlbWVudHNgLiIpO3ZhciBlPWQuY29uc3RydWN0aW9uU3RhY2s7aWYoMD09PWUubGVuZ3RoKXJldHVybiBlPW9lLmNhbGwoZG9jdW1lbnQsZC5sb2NhbE5hbWUpLE9iamVjdC5zZXRQcm90b3R5cGVPZihlLGIucHJvdG90eXBlKSxlLl9fQ0Vfc3RhdGU9MSxlLl9fQ0VfZGVmaW5pdGlvbj1kLGEuYihlKSxlO2Q9ZS5sZW5ndGgtMTt2YXIgZj1lW2RdO2lmKGY9PT1WZSl0aHJvdyBFcnJvcigiVGhlIEhUTUxFbGVtZW50IGNvbnN0cnVjdG9yIHdhcyBlaXRoZXIgY2FsbGVkIHJlZW50cmFudGx5IGZvciB0aGlzIGNvbnN0cnVjdG9yIG9yIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4iKTsKZVtkXT1WZTtPYmplY3Quc2V0UHJvdG90eXBlT2YoZixiLnByb3RvdHlwZSk7YS5iKGYpO3JldHVybiBmfWIucHJvdG90eXBlPVJlLnByb3RvdHlwZTtyZXR1cm4gYn0oKX07ZnVuY3Rpb24gWWUoYSxiLGMpe2Z1bmN0aW9uIGQoYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2Zvcih2YXIgZD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoOysrZSlkW2UtMF09YXJndW1lbnRzW2VdO2U9W107Zm9yKHZhciBmPVtdLG09MDttPGQubGVuZ3RoO20rKyl7dmFyIG49ZFttXTtuIGluc3RhbmNlb2YgRWxlbWVudCYmTyhuKSYmZi5wdXNoKG4pO2lmKG4gaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KWZvcihuPW4uZmlyc3RDaGlsZDtuO249bi5uZXh0U2libGluZyllLnB1c2gobik7ZWxzZSBlLnB1c2gobil9Yi5hcHBseSh0aGlzLGQpO2ZvcihkPTA7ZDxmLmxlbmd0aDtkKyspUihhLGZbZF0pO2lmKE8odGhpcykpZm9yKGQ9MDtkPGUubGVuZ3RoO2QrKylmPWVbZF0sZiBpbnN0YW5jZW9mIEVsZW1lbnQmJlEoYSxmKX19dm9pZCAwIT09Yy5mYSYmKGIucHJlcGVuZD1kKGMuZmEpKTt2b2lkIDAhPT1jLmFwcGVuZCYmKGIuYXBwZW5kPWQoYy5hcHBlbmQpKX07ZnVuY3Rpb24gWmUoKXt2YXIgYT1YZTtQKERvY3VtZW50LnByb3RvdHlwZSwiY3JlYXRlRWxlbWVudCIsZnVuY3Rpb24oYil7aWYodGhpcy5fX0NFX2hhc1JlZ2lzdHJ5KXt2YXIgYz1hLmEuZ2V0KGIpO2lmKGMpcmV0dXJuIG5ldyBjLmNvbnN0cnVjdG9yfWI9b2UuY2FsbCh0aGlzLGIpO2EuYihiKTtyZXR1cm4gYn0pO1AoRG9jdW1lbnQucHJvdG90eXBlLCJpbXBvcnROb2RlIixmdW5jdGlvbihiLGMpe2I9cWUuY2FsbCh0aGlzLGIsYyk7dGhpcy5fX0NFX2hhc1JlZ2lzdHJ5P2plKGEsYik6aGUoYSxiKTtyZXR1cm4gYn0pO1AoRG9jdW1lbnQucHJvdG90eXBlLCJjcmVhdGVFbGVtZW50TlMiLGZ1bmN0aW9uKGIsYyl7aWYodGhpcy5fX0NFX2hhc1JlZ2lzdHJ5JiYobnVsbD09PWJ8fCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj09PWIpKXt2YXIgZD1hLmEuZ2V0KGMpO2lmKGQpcmV0dXJuIG5ldyBkLmNvbnN0cnVjdG9yfWI9cGUuY2FsbCh0aGlzLGIsYyk7YS5iKGIpO3JldHVybiBifSk7ClllKGEsRG9jdW1lbnQucHJvdG90eXBlLHtmYTpyZSxhcHBlbmQ6c2V9KX07ZnVuY3Rpb24gJGUoKXt2YXIgYT1YZTtmdW5jdGlvbiBiKGIsZCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGIsInRleHRDb250ZW50Iix7ZW51bWVyYWJsZTpkLmVudW1lcmFibGUsY29uZmlndXJhYmxlOiEwLGdldDpkLmdldCxzZXQ6ZnVuY3Rpb24oYil7aWYodGhpcy5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFKWQuc2V0LmNhbGwodGhpcyxiKTtlbHNle3ZhciBjPXZvaWQgMDtpZih0aGlzLmZpcnN0Q2hpbGQpe3ZhciBlPXRoaXMuY2hpbGROb2RlcyxoPWUubGVuZ3RoO2lmKDA8aCYmTyh0aGlzKSl7Yz1BcnJheShoKTtmb3IodmFyIGs9MDtrPGg7aysrKWNba109ZVtrXX19ZC5zZXQuY2FsbCh0aGlzLGIpO2lmKGMpZm9yKGI9MDtiPGMubGVuZ3RoO2IrKylSKGEsY1tiXSl9fX0pfVAoTm9kZS5wcm90b3R5cGUsImluc2VydEJlZm9yZSIsZnVuY3Rpb24oYixkKXtpZihiIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCl7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGIuY2hpbGROb2Rlcyk7CmI9eGUuY2FsbCh0aGlzLGIsZCk7aWYoTyh0aGlzKSlmb3IoZD0wO2Q8Yy5sZW5ndGg7ZCsrKVEoYSxjW2RdKTtyZXR1cm4gYn1jPU8oYik7ZD14ZS5jYWxsKHRoaXMsYixkKTtjJiZSKGEsYik7Tyh0aGlzKSYmUShhLGIpO3JldHVybiBkfSk7UChOb2RlLnByb3RvdHlwZSwiYXBwZW5kQ2hpbGQiLGZ1bmN0aW9uKGIpe2lmKGIgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KXt2YXIgYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYi5jaGlsZE5vZGVzKTtiPXdlLmNhbGwodGhpcyxiKTtpZihPKHRoaXMpKWZvcih2YXIgZT0wO2U8Yy5sZW5ndGg7ZSsrKVEoYSxjW2VdKTtyZXR1cm4gYn1jPU8oYik7ZT13ZS5jYWxsKHRoaXMsYik7YyYmUihhLGIpO08odGhpcykmJlEoYSxiKTtyZXR1cm4gZX0pO1AoTm9kZS5wcm90b3R5cGUsImNsb25lTm9kZSIsZnVuY3Rpb24oYil7Yj12ZS5jYWxsKHRoaXMsYik7dGhpcy5vd25lckRvY3VtZW50Ll9fQ0VfaGFzUmVnaXN0cnk/amUoYSxiKToKaGUoYSxiKTtyZXR1cm4gYn0pO1AoTm9kZS5wcm90b3R5cGUsInJlbW92ZUNoaWxkIixmdW5jdGlvbihiKXt2YXIgYz1PKGIpLGU9eWUuY2FsbCh0aGlzLGIpO2MmJlIoYSxiKTtyZXR1cm4gZX0pO1AoTm9kZS5wcm90b3R5cGUsInJlcGxhY2VDaGlsZCIsZnVuY3Rpb24oYixkKXtpZihiIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCl7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGIuY2hpbGROb2Rlcyk7Yj16ZS5jYWxsKHRoaXMsYixkKTtpZihPKHRoaXMpKWZvcihSKGEsZCksZD0wO2Q8Yy5sZW5ndGg7ZCsrKVEoYSxjW2RdKTtyZXR1cm4gYn1jPU8oYik7dmFyIGY9emUuY2FsbCh0aGlzLGIsZCksZz1PKHRoaXMpO2cmJlIoYSxkKTtjJiZSKGEsYik7ZyYmUShhLGIpO3JldHVybiBmfSk7QWUmJkFlLmdldD9iKE5vZGUucHJvdG90eXBlLEFlKTpnZShhLGZ1bmN0aW9uKGEpe2IoYSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpbXSxiPTA7Yjx0aGlzLmNoaWxkTm9kZXMubGVuZ3RoO2IrKylhLnB1c2godGhpcy5jaGlsZE5vZGVzW2JdLnRleHRDb250ZW50KTtyZXR1cm4gYS5qb2luKCIiKX0sc2V0OmZ1bmN0aW9uKGEpe2Zvcig7dGhpcy5maXJzdENoaWxkOyl5ZS5jYWxsKHRoaXMsdGhpcy5maXJzdENoaWxkKTt3ZS5jYWxsKHRoaXMsZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYSkpfX0pfSl9O2Z1bmN0aW9uIGFmKGEpe3ZhciBiPUVsZW1lbnQucHJvdG90eXBlO2Z1bmN0aW9uIGMoYil7cmV0dXJuIGZ1bmN0aW9uKGMpe2Zvcih2YXIgZD1bXSxlPTA7ZTxhcmd1bWVudHMubGVuZ3RoOysrZSlkW2UtMF09YXJndW1lbnRzW2VdO2U9W107Zm9yKHZhciBoPVtdLGs9MDtrPGQubGVuZ3RoO2srKyl7dmFyIG09ZFtrXTttIGluc3RhbmNlb2YgRWxlbWVudCYmTyhtKSYmaC5wdXNoKG0pO2lmKG0gaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KWZvcihtPW0uZmlyc3RDaGlsZDttO209bS5uZXh0U2libGluZyllLnB1c2gobSk7ZWxzZSBlLnB1c2gobSl9Yi5hcHBseSh0aGlzLGQpO2ZvcihkPTA7ZDxoLmxlbmd0aDtkKyspUihhLGhbZF0pO2lmKE8odGhpcykpZm9yKGQ9MDtkPGUubGVuZ3RoO2QrKyloPWVbZF0saCBpbnN0YW5jZW9mIEVsZW1lbnQmJlEoYSxoKX19dm9pZCAwIT09TmUmJihiLmJlZm9yZT1jKE5lKSk7dm9pZCAwIT09TmUmJihiLmFmdGVyPWMoT2UpKTt2b2lkIDAhPT0KUGUmJlAoYiwicmVwbGFjZVdpdGgiLGZ1bmN0aW9uKGIpe2Zvcih2YXIgYz1bXSxkPTA7ZDxhcmd1bWVudHMubGVuZ3RoOysrZCljW2QtMF09YXJndW1lbnRzW2RdO2Q9W107Zm9yKHZhciBnPVtdLGg9MDtoPGMubGVuZ3RoO2grKyl7dmFyIGs9Y1toXTtrIGluc3RhbmNlb2YgRWxlbWVudCYmTyhrKSYmZy5wdXNoKGspO2lmKGsgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KWZvcihrPWsuZmlyc3RDaGlsZDtrO2s9ay5uZXh0U2libGluZylkLnB1c2goayk7ZWxzZSBkLnB1c2goayl9aD1PKHRoaXMpO1BlLmFwcGx5KHRoaXMsYyk7Zm9yKGM9MDtjPGcubGVuZ3RoO2MrKylSKGEsZ1tjXSk7aWYoaClmb3IoUihhLHRoaXMpLGM9MDtjPGQubGVuZ3RoO2MrKylnPWRbY10sZyBpbnN0YW5jZW9mIEVsZW1lbnQmJlEoYSxnKX0pO3ZvaWQgMCE9PVFlJiZQKGIsInJlbW92ZSIsZnVuY3Rpb24oKXt2YXIgYj1PKHRoaXMpO1FlLmNhbGwodGhpcyk7YiYmUihhLHRoaXMpfSl9O2Z1bmN0aW9uIGJmKCl7dmFyIGE9WGU7ZnVuY3Rpb24gYihiLGMpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShiLCJpbm5lckhUTUwiLHtlbnVtZXJhYmxlOmMuZW51bWVyYWJsZSxjb25maWd1cmFibGU6ITAsZ2V0OmMuZ2V0LHNldDpmdW5jdGlvbihiKXt2YXIgZD10aGlzLGU9dm9pZCAwO08odGhpcykmJihlPVtdLGRlKHRoaXMsZnVuY3Rpb24oYSl7YSE9PWQmJmUucHVzaChhKX0pKTtjLnNldC5jYWxsKHRoaXMsYik7aWYoZSlmb3IodmFyIGY9MDtmPGUubGVuZ3RoO2YrKyl7dmFyIGc9ZVtmXTsxPT09Zy5fX0NFX3N0YXRlJiZhLmRpc2Nvbm5lY3RlZENhbGxiYWNrKGcpfXRoaXMub3duZXJEb2N1bWVudC5fX0NFX2hhc1JlZ2lzdHJ5P2plKGEsdGhpcyk6aGUoYSx0aGlzKTtyZXR1cm4gYn19KX1mdW5jdGlvbiBjKGIsYyl7UChiLCJpbnNlcnRBZGphY2VudEVsZW1lbnQiLGZ1bmN0aW9uKGIsZCl7dmFyIGU9TyhkKTtiPWMuY2FsbCh0aGlzLGIsZCk7ZSYmUihhLGQpO08oYikmJlEoYSwKZCk7cmV0dXJuIGJ9KX1mdW5jdGlvbiBkKGIsYyl7ZnVuY3Rpb24gZChiLGMpe2Zvcih2YXIgZD1bXTtiIT09YztiPWIubmV4dFNpYmxpbmcpZC5wdXNoKGIpO2ZvcihjPTA7YzxkLmxlbmd0aDtjKyspamUoYSxkW2NdKX1QKGIsImluc2VydEFkamFjZW50SFRNTCIsZnVuY3Rpb24oYSxiKXthPWEudG9Mb3dlckNhc2UoKTtpZigiYmVmb3JlYmVnaW4iPT09YSl7dmFyIGU9dGhpcy5wcmV2aW91c1NpYmxpbmc7Yy5jYWxsKHRoaXMsYSxiKTtkKGV8fHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkLHRoaXMpfWVsc2UgaWYoImFmdGVyYmVnaW4iPT09YSllPXRoaXMuZmlyc3RDaGlsZCxjLmNhbGwodGhpcyxhLGIpLGQodGhpcy5maXJzdENoaWxkLGUpO2Vsc2UgaWYoImJlZm9yZWVuZCI9PT1hKWU9dGhpcy5sYXN0Q2hpbGQsYy5jYWxsKHRoaXMsYSxiKSxkKGV8fHRoaXMuZmlyc3RDaGlsZCxudWxsKTtlbHNlIGlmKCJhZnRlcmVuZCI9PT1hKWU9dGhpcy5uZXh0U2libGluZyxjLmNhbGwodGhpcywKYSxiKSxkKHRoaXMubmV4dFNpYmxpbmcsZSk7ZWxzZSB0aHJvdyBuZXcgU3ludGF4RXJyb3IoIlRoZSB2YWx1ZSBwcm92aWRlZCAoIitTdHJpbmcoYSkrIikgaXMgbm90IG9uZSBvZiAnYmVmb3JlYmVnaW4nLCAnYWZ0ZXJiZWdpbicsICdiZWZvcmVlbmQnLCBvciAnYWZ0ZXJlbmQnLiIpO30pfUJlJiZQKEVsZW1lbnQucHJvdG90eXBlLCJhdHRhY2hTaGFkb3ciLGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9fQ0Vfc2hhZG93Um9vdD1hPUJlLmNhbGwodGhpcyxhKX0pO0NlJiZDZS5nZXQ/YihFbGVtZW50LnByb3RvdHlwZSxDZSk6U2UmJlNlLmdldD9iKEhUTUxFbGVtZW50LnByb3RvdHlwZSxTZSk6Z2UoYSxmdW5jdGlvbihhKXtiKGEse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB2ZS5jYWxsKHRoaXMsITApLmlubmVySFRNTH0sc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPSJ0ZW1wbGF0ZSI9PT10aGlzLmxvY2FsTmFtZSxjPWI/dGhpcy5jb250ZW50Ogp0aGlzLGQ9b2UuY2FsbChkb2N1bWVudCx0aGlzLmxvY2FsTmFtZSk7Zm9yKGQuaW5uZXJIVE1MPWE7MDxjLmNoaWxkTm9kZXMubGVuZ3RoOyl5ZS5jYWxsKGMsYy5jaGlsZE5vZGVzWzBdKTtmb3IoYT1iP2QuY29udGVudDpkOzA8YS5jaGlsZE5vZGVzLmxlbmd0aDspd2UuY2FsbChjLGEuY2hpbGROb2Rlc1swXSl9fSl9KTtQKEVsZW1lbnQucHJvdG90eXBlLCJzZXRBdHRyaWJ1dGUiLGZ1bmN0aW9uKGIsYyl7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gRWUuY2FsbCh0aGlzLGIsYyk7dmFyIGQ9RGUuY2FsbCh0aGlzLGIpO0VlLmNhbGwodGhpcyxiLGMpO2M9RGUuY2FsbCh0aGlzLGIpO2EuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsYixkLGMsbnVsbCl9KTtQKEVsZW1lbnQucHJvdG90eXBlLCJzZXRBdHRyaWJ1dGVOUyIsZnVuY3Rpb24oYixjLGQpe2lmKDEhPT10aGlzLl9fQ0Vfc3RhdGUpcmV0dXJuIEhlLmNhbGwodGhpcyxiLGMsZCk7dmFyIGU9R2UuY2FsbCh0aGlzLApiLGMpO0hlLmNhbGwodGhpcyxiLGMsZCk7ZD1HZS5jYWxsKHRoaXMsYixjKTthLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0aGlzLGMsZSxkLGIpfSk7UChFbGVtZW50LnByb3RvdHlwZSwicmVtb3ZlQXR0cmlidXRlIixmdW5jdGlvbihiKXtpZigxIT09dGhpcy5fX0NFX3N0YXRlKXJldHVybiBGZS5jYWxsKHRoaXMsYik7dmFyIGM9RGUuY2FsbCh0aGlzLGIpO0ZlLmNhbGwodGhpcyxiKTtudWxsIT09YyYmYS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodGhpcyxiLGMsbnVsbCxudWxsKX0pO1AoRWxlbWVudC5wcm90b3R5cGUsInJlbW92ZUF0dHJpYnV0ZU5TIixmdW5jdGlvbihiLGMpe2lmKDEhPT10aGlzLl9fQ0Vfc3RhdGUpcmV0dXJuIEllLmNhbGwodGhpcyxiLGMpO3ZhciBkPUdlLmNhbGwodGhpcyxiLGMpO0llLmNhbGwodGhpcyxiLGMpO3ZhciBlPUdlLmNhbGwodGhpcyxiLGMpO2QhPT1lJiZhLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0aGlzLGMsZCxlLGIpfSk7VGU/CmMoSFRNTEVsZW1lbnQucHJvdG90eXBlLFRlKTpKZT9jKEVsZW1lbnQucHJvdG90eXBlLEplKTpjb25zb2xlLndhcm4oIkN1c3RvbSBFbGVtZW50czogYEVsZW1lbnQjaW5zZXJ0QWRqYWNlbnRFbGVtZW50YCB3YXMgbm90IHBhdGNoZWQuIik7VWU/ZChIVE1MRWxlbWVudC5wcm90b3R5cGUsVWUpOktlP2QoRWxlbWVudC5wcm90b3R5cGUsS2UpOmNvbnNvbGUud2FybigiQ3VzdG9tIEVsZW1lbnRzOiBgRWxlbWVudCNpbnNlcnRBZGphY2VudEhUTUxgIHdhcyBub3QgcGF0Y2hlZC4iKTtZZShhLEVsZW1lbnQucHJvdG90eXBlLHtmYTpMZSxhcHBlbmQ6TWV9KTthZihhKX07dmFyIGNmPXdpbmRvdy5jdXN0b21FbGVtZW50cztpZighY2Z8fGNmLmZvcmNlUG9seWZpbGx8fCJmdW5jdGlvbiIhPXR5cGVvZiBjZi5kZWZpbmV8fCJmdW5jdGlvbiIhPXR5cGVvZiBjZi5nZXQpe3ZhciBYZT1uZXcgZWU7V2UoKTtaZSgpO1llKFhlLERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLHtmYTp0ZSxhcHBlbmQ6dWV9KTskZSgpO2JmKCk7ZG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT0hMDt2YXIgY3VzdG9tRWxlbWVudHM9bmV3IFMoWGUpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImN1c3RvbUVsZW1lbnRzIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6Y3VzdG9tRWxlbWVudHN9KX07ZnVuY3Rpb24gZGYoKXt0aGlzLmVuZD10aGlzLnN0YXJ0PTA7dGhpcy5ydWxlcz10aGlzLnBhcmVudD10aGlzLnByZXZpb3VzPW51bGw7dGhpcy5jc3NUZXh0PXRoaXMucGFyc2VkQ3NzVGV4dD0iIjt0aGlzLmF0UnVsZT0hMTt0aGlzLnR5cGU9MDt0aGlzLnBhcnNlZFNlbGVjdG9yPXRoaXMuc2VsZWN0b3I9dGhpcy5rZXlmcmFtZXNOYW1lPSIifQpmdW5jdGlvbiBlZihhKXthPWEucmVwbGFjZShmZiwiIikucmVwbGFjZShnZiwiIik7dmFyIGI9aGYsYz1hLGQ9bmV3IGRmO2Quc3RhcnQ9MDtkLmVuZD1jLmxlbmd0aDtmb3IodmFyIGU9ZCxmPTAsZz1jLmxlbmd0aDtmPGc7ZisrKWlmKCJ7Ij09PWNbZl0pe2UucnVsZXN8fChlLnJ1bGVzPVtdKTt2YXIgaD1lLGs9aC5ydWxlc1toLnJ1bGVzLmxlbmd0aC0xXXx8bnVsbDtlPW5ldyBkZjtlLnN0YXJ0PWYrMTtlLnBhcmVudD1oO2UucHJldmlvdXM9aztoLnJ1bGVzLnB1c2goZSl9ZWxzZSJ9Ij09PWNbZl0mJihlLmVuZD1mKzEsZT1lLnBhcmVudHx8ZCk7cmV0dXJuIGIoZCxhKX0KZnVuY3Rpb24gaGYoYSxiKXt2YXIgYz1iLnN1YnN0cmluZyhhLnN0YXJ0LGEuZW5kLTEpO2EucGFyc2VkQ3NzVGV4dD1hLmNzc1RleHQ9Yy50cmltKCk7YS5wYXJlbnQmJihjPWIuc3Vic3RyaW5nKGEucHJldmlvdXM/YS5wcmV2aW91cy5lbmQ6YS5wYXJlbnQuc3RhcnQsYS5zdGFydC0xKSxjPWpmKGMpLGM9Yy5yZXBsYWNlKGtmLCIgIiksYz1jLnN1YnN0cmluZyhjLmxhc3RJbmRleE9mKCI7IikrMSksYz1hLnBhcnNlZFNlbGVjdG9yPWEuc2VsZWN0b3I9Yy50cmltKCksYS5hdFJ1bGU9MD09PWMuaW5kZXhPZigiQCIpLGEuYXRSdWxlPzA9PT1jLmluZGV4T2YoIkBtZWRpYSIpP2EudHlwZT1sZjpjLm1hdGNoKHJmKSYmKGEudHlwZT1zZixhLmtleWZyYW1lc05hbWU9YS5zZWxlY3Rvci5zcGxpdChrZikucG9wKCkpOmEudHlwZT0wPT09Yy5pbmRleE9mKCItLSIpP3RmOnVmKTtpZihjPWEucnVsZXMpZm9yKHZhciBkPTAsZT1jLmxlbmd0aCxmO2Q8ZSYmKGY9Y1tkXSk7ZCsrKWhmKGYsCmIpO3JldHVybiBhfWZ1bmN0aW9uIGpmKGEpe3JldHVybiBhLnJlcGxhY2UoL1xcKFswLTlhLWZdezEsNn0pXHMvZ2ksZnVuY3Rpb24oYSxjKXthPWM7Zm9yKGM9Ni1hLmxlbmd0aDtjLS07KWE9IjAiK2E7cmV0dXJuIlxcIithfSl9CmZ1bmN0aW9uIHZmKGEsYixjKXtjPXZvaWQgMD09PWM/IiI6Yzt2YXIgZD0iIjtpZihhLmNzc1RleHR8fGEucnVsZXMpe3ZhciBlPWEucnVsZXMsZjtpZihmPWUpZj1lWzBdLGY9IShmJiZmLnNlbGVjdG9yJiYwPT09Zi5zZWxlY3Rvci5pbmRleE9mKCItLSIpKTtpZihmKXtmPTA7Zm9yKHZhciBnPWUubGVuZ3RoLGg7ZjxnJiYoaD1lW2ZdKTtmKyspZD12ZihoLGIsZCl9ZWxzZSBiP2I9YS5jc3NUZXh0OihiPWEuY3NzVGV4dCxiPWIucmVwbGFjZSh3ZiwiIikucmVwbGFjZSh4ZiwiIiksYj1iLnJlcGxhY2UoeWYsIiIpLnJlcGxhY2UoemYsIiIpKSwoZD1iLnRyaW0oKSkmJihkPSIgICIrZCsiXG4iKX1kJiYoYS5zZWxlY3RvciYmKGMrPWEuc2VsZWN0b3IrIiB7XG4iKSxjKz1kLGEuc2VsZWN0b3ImJihjKz0ifVxuXG4iKSk7cmV0dXJuIGN9CnZhciB1Zj0xLHNmPTcsbGY9NCx0Zj0xRTMsZmY9L1wvXCpbXipdKlwqKyhbXi8qXVteKl0qXCorKSpcLy9naW0sZ2Y9L0BpbXBvcnRbXjtdKjsvZ2ltLHdmPS8oPzpeW147XC1cc31dKyk/LS1bXjt7fV0qPzpbXnt9O10qPyg/Ols7XG5dfCQpL2dpbSx4Zj0vKD86XlteO1wtXHN9XSspPy0tW147e31dKj86W157fTtdKj97W159XSo/fSg/Ols7XG5dfCQpPy9naW0seWY9L0BhcHBseVxzKlwoP1teKTtdKlwpP1xzKig/Ols7XG5dfCQpPy9naW0semY9L1teOzpdKj86W147XSo/dmFyXChbXjtdKlwpKD86Wztcbl18JCk/L2dpbSxyZj0vXkBbXlxzXSprZXlmcmFtZXMvLGtmPS9ccysvZzt2YXIgVD0hKHdpbmRvdy5TaGFkeURPTSYmd2luZG93LlNoYWR5RE9NLmluVXNlKSxBZjtmdW5jdGlvbiBCZihhKXtBZj1hJiZhLnNoaW1jc3Nwcm9wZXJ0aWVzPyExOlR8fCEobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQXBwbGVXZWJLaXRcLzYwMXxFZGdlXC8xNS8pfHwhd2luZG93LkNTU3x8IUNTUy5zdXBwb3J0c3x8IUNTUy5zdXBwb3J0cygiYm94LXNoYWRvdyIsIjAgMCAwIHZhcigtLWZvbykiKSl9d2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzP0FmPXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M6d2luZG93LlNoYWR5Q1NTPyhCZih3aW5kb3cuU2hhZHlDU1MpLHdpbmRvdy5TaGFkeUNTUz12b2lkIDApOkJmKHdpbmRvdy5XZWJDb21wb25lbnRzJiZ3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncyk7dmFyIFY9QWY7dmFyIENmPS8oPzpefFs7XHN7XVxzKikoLS1bXHctXSo/KVxzKjpccyooPzooKD86Jyg/OlxcJ3wuKSo/J3wiKD86XFwifC4pKj8ifFwoW14pXSo/XCl8W159O3tdKSspfFx7KFtefV0qKVx9KD86KD89Wztcc31dKXwkKSkvZ2ksRGY9Lyg/Ol58XFcrKUBhcHBseVxzKlwoPyhbXik7XG5dKilcKT8vZ2ksRWY9LygtLVtcdy1dKylccyooWzosOyldfCQpL2dpLEZmPS8oYW5pbWF0aW9uXHMqOil8KGFuaW1hdGlvbi1uYW1lXHMqOikvLEdmPS9AbWVkaWFccyguKikvLEhmPS9ce1tefV0qXH0vZzt2YXIgSWY9bmV3IFNldDtmdW5jdGlvbiBKZihhLGIpe2lmKCFhKXJldHVybiIiOyJzdHJpbmciPT09dHlwZW9mIGEmJihhPWVmKGEpKTtiJiZLZihhLGIpO3JldHVybiB2ZihhLFYpfWZ1bmN0aW9uIExmKGEpeyFhLl9fY3NzUnVsZXMmJmEudGV4dENvbnRlbnQmJihhLl9fY3NzUnVsZXM9ZWYoYS50ZXh0Q29udGVudCkpO3JldHVybiBhLl9fY3NzUnVsZXN8fG51bGx9ZnVuY3Rpb24gTWYoYSl7cmV0dXJuISFhLnBhcmVudCYmYS5wYXJlbnQudHlwZT09PXNmfWZ1bmN0aW9uIEtmKGEsYixjLGQpe2lmKGEpe3ZhciBlPSExLGY9YS50eXBlO2lmKGQmJmY9PT1sZil7dmFyIGc9YS5zZWxlY3Rvci5tYXRjaChHZik7ZyYmKHdpbmRvdy5tYXRjaE1lZGlhKGdbMV0pLm1hdGNoZXN8fChlPSEwKSl9Zj09PXVmP2IoYSk6YyYmZj09PXNmP2MoYSk6Zj09PXRmJiYoZT0hMCk7aWYoKGE9YS5ydWxlcykmJiFlKXtlPTA7Zj1hLmxlbmd0aDtmb3IodmFyIGg7ZTxmJiYoaD1hW2VdKTtlKyspS2YoaCxiLGMsZCl9fX0KZnVuY3Rpb24gTmYoYSxiLGMsZCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtiJiZlLnNldEF0dHJpYnV0ZSgic2NvcGUiLGIpO2UudGV4dENvbnRlbnQ9YTtPZihlLGMsZCk7cmV0dXJuIGV9dmFyIFBmPW51bGw7ZnVuY3Rpb24gT2YoYSxiLGMpe2I9Ynx8ZG9jdW1lbnQuaGVhZDtiLmluc2VydEJlZm9yZShhLGMmJmMubmV4dFNpYmxpbmd8fGIuZmlyc3RDaGlsZCk7UGY/YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihQZik9PT1Ob2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORyYmKFBmPWEpOlBmPWF9CmZ1bmN0aW9uIFFmKGEsYil7dmFyIGM9YS5pbmRleE9mKCJ2YXIoIik7aWYoLTE9PT1jKXJldHVybiBiKGEsIiIsIiIsIiIpO2E6e3ZhciBkPTA7dmFyIGU9YyszO2Zvcih2YXIgZj1hLmxlbmd0aDtlPGY7ZSsrKWlmKCIoIj09PWFbZV0pZCsrO2Vsc2UgaWYoIikiPT09YVtlXSYmMD09PS0tZClicmVhayBhO2U9LTF9ZD1hLnN1YnN0cmluZyhjKzQsZSk7Yz1hLnN1YnN0cmluZygwLGMpO2E9UWYoYS5zdWJzdHJpbmcoZSsxKSxiKTtlPWQuaW5kZXhPZigiLCIpO3JldHVybi0xPT09ZT9iKGMsZC50cmltKCksIiIsYSk6YihjLGQuc3Vic3RyaW5nKDAsZSkudHJpbSgpLGQuc3Vic3RyaW5nKGUrMSkudHJpbSgpLGEpfWZ1bmN0aW9uIFJmKGEsYil7VD9hLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGIpOndpbmRvdy5TaGFkeURPTS5uYXRpdmVNZXRob2RzLnNldEF0dHJpYnV0ZS5jYWxsKGEsImNsYXNzIixiKX0KZnVuY3Rpb24gU2YoYSl7dmFyIGI9YS5sb2NhbE5hbWUsYz0iIjtiPy0xPGIuaW5kZXhPZigiLSIpfHwoYz1iLGI9YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJpcyIpfHwiIik6KGI9YS5pcyxjPWEuZXh0ZW5kcyk7cmV0dXJue2lzOmIsWDpjfX07ZnVuY3Rpb24gVGYoKXt9ZnVuY3Rpb24gVWYoYSxiLGMpe3ZhciBkPVZmO2EuX19zdHlsZVNjb3BlZD9hLl9fc3R5bGVTY29wZWQ9bnVsbDpXZihkLGEsYnx8IiIsYyl9ZnVuY3Rpb24gV2YoYSxiLGMsZCl7Yi5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZYZihiLGMsZCk7aWYoYj0idGVtcGxhdGUiPT09Yi5sb2NhbE5hbWU/KGIuY29udGVudHx8Yi5qYikuY2hpbGROb2RlczpiLmNoaWxkcmVufHxiLmNoaWxkTm9kZXMpZm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspV2YoYSxiW2VdLGMsZCl9CmZ1bmN0aW9uIFhmKGEsYixjKXtpZihiKWlmKGEuY2xhc3NMaXN0KWM/KGEuY2xhc3NMaXN0LnJlbW92ZSgic3R5bGUtc2NvcGUiKSxhLmNsYXNzTGlzdC5yZW1vdmUoYikpOihhLmNsYXNzTGlzdC5hZGQoInN0eWxlLXNjb3BlIiksYS5jbGFzc0xpc3QuYWRkKGIpKTtlbHNlIGlmKGEuZ2V0QXR0cmlidXRlKXt2YXIgZD1hLmdldEF0dHJpYnV0ZShZZik7Yz9kJiYoYj1kLnJlcGxhY2UoInN0eWxlLXNjb3BlIiwiIikucmVwbGFjZShiLCIiKSxSZihhLGIpKTpSZihhLChkP2QrIiAiOiIiKSsic3R5bGUtc2NvcGUgIitiKX19ZnVuY3Rpb24gWmYoYSxiLGMpe3ZhciBkPVZmLGU9YS5fX2Nzc0J1aWxkO1R8fCJzaGFkeSI9PT1lP2I9SmYoYixjKTooYT1TZihhKSxiPSRmKGQsYixhLmlzLGEuWCxjKSsiXG5cbiIpO3JldHVybiBiLnRyaW0oKX0KZnVuY3Rpb24gJGYoYSxiLGMsZCxlKXt2YXIgZj1hZyhjLGQpO2M9Yz9iZytjOiIiO3JldHVybiBKZihiLGZ1bmN0aW9uKGIpe2IuY3x8KGIuc2VsZWN0b3I9Yi5HPWNnKGEsYixhLmIsYyxmKSxiLmM9ITApO2UmJmUoYixjLGYpfSl9ZnVuY3Rpb24gYWcoYSxiKXtyZXR1cm4gYj8iW2lzPSIrYSsiXSI6YX1mdW5jdGlvbiBjZyhhLGIsYyxkLGUpe3ZhciBmPWIuc2VsZWN0b3Iuc3BsaXQoZGcpO2lmKCFNZihiKSl7Yj0wO2Zvcih2YXIgZz1mLmxlbmd0aCxoO2I8ZyYmKGg9ZltiXSk7YisrKWZbYl09Yy5jYWxsKGEsaCxkLGUpfXJldHVybiBmLmpvaW4oZGcpfWZ1bmN0aW9uIGVnKGEpe3JldHVybiBhLnJlcGxhY2UoZmcsZnVuY3Rpb24oYSxjLGQpey0xPGQuaW5kZXhPZigiKyIpP2Q9ZC5yZXBsYWNlKC9cKy9nLCJfX18iKTotMTxkLmluZGV4T2YoIl9fXyIpJiYoZD1kLnJlcGxhY2UoL19fXy9nLCIrIikpO3JldHVybiI6IitjKyIoIitkKyIpIn0pfQpUZi5wcm90b3R5cGUuYj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9ITE7YT1hLnRyaW0oKTt2YXIgZT1mZy50ZXN0KGEpO2UmJihhPWEucmVwbGFjZShmZyxmdW5jdGlvbihhLGIsYyl7cmV0dXJuIjoiK2IrIigiK2MucmVwbGFjZSgvXHMvZywiIikrIikifSksYT1lZyhhKSk7YT1hLnJlcGxhY2UoZ2csaGcrIiAkMSIpO2E9YS5yZXBsYWNlKGlnLGZ1bmN0aW9uKGEsZSxoKXtkfHwoYT1qZyhoLGUsYixjKSxkPWR8fGEuc3RvcCxlPWEuU2EsaD1hLnZhbHVlKTtyZXR1cm4gZStofSk7ZSYmKGE9ZWcoYSkpO3JldHVybiBhfTsKZnVuY3Rpb24gamcoYSxiLGMsZCl7dmFyIGU9YS5pbmRleE9mKGtnKTswPD1hLmluZGV4T2YoaGcpP2E9bGcoYSxkKTowIT09ZSYmKGE9Yz9tZyhhLGMpOmEpO2M9ITE7MDw9ZSYmKGI9IiIsYz0hMCk7aWYoYyl7dmFyIGY9ITA7YyYmKGE9YS5yZXBsYWNlKG5nLGZ1bmN0aW9uKGEsYil7cmV0dXJuIiA+ICIrYn0pKX1hPWEucmVwbGFjZShvZyxmdW5jdGlvbihhLGIsYyl7cmV0dXJuJ1tkaXI9IicrYysnIl0gJytiKyIsICIrYisnW2Rpcj0iJytjKyciXSd9KTtyZXR1cm57dmFsdWU6YSxTYTpiLHN0b3A6Zn19ZnVuY3Rpb24gbWcoYSxiKXthPWEuc3BsaXQocGcpO2FbMF0rPWI7cmV0dXJuIGEuam9pbihwZyl9CmZ1bmN0aW9uIGxnKGEsYil7dmFyIGM9YS5tYXRjaChxZyk7cmV0dXJuKGM9YyYmY1syXS50cmltKCl8fCIiKT9jWzBdLm1hdGNoKHJnKT9hLnJlcGxhY2UocWcsZnVuY3Rpb24oYSxjLGYpe3JldHVybiBiK2Z9KTpjLnNwbGl0KHJnKVswXT09PWI/YzpzZzphLnJlcGxhY2UoaGcsYil9ZnVuY3Rpb24gdGcoYSl7YS5zZWxlY3Rvcj09PXVnJiYoYS5zZWxlY3Rvcj0iaHRtbCIpfVRmLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLm1hdGNoKGtnKT90aGlzLmIoYSx2Zyk6bWcoYS50cmltKCksdmcpfTthYS5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhUZi5wcm90b3R5cGUse2E6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiJzdHlsZS1zY29wZSJ9fX0pOwp2YXIgZmc9LzoobnRoWy1cd10rKVwoKFteKV0rKVwpLyx2Zz0iOm5vdCguc3R5bGUtc2NvcGUpIixkZz0iLCIsaWc9LyhefFtccz4rfl0rKSgoPzpcWy4rP1xdfFteXHM+K349W10pKykvZyxyZz0vW1suOiMqXS8saGc9Ijpob3N0Iix1Zz0iOnJvb3QiLGtnPSI6OnNsb3R0ZWQiLGdnPW5ldyBSZWdFeHAoIl4oIitrZysiKSIpLHFnPS8oOmhvc3QpKD86XCgoKD86XChbXikoXSpcKXxbXikoXSopKz8pXCkpLyxuZz0vKD86OjpzbG90dGVkKSg/OlwoKCg/OlwoW14pKF0qXCl8W14pKF0qKSs/KVwpKS8sb2c9LyguKik6ZGlyXCgoPzoobHRyfHJ0bCkpXCkvLGJnPSIuIixwZz0iOiIsWWY9ImNsYXNzIixzZz0ic2hvdWxkX25vdF9tYXRjaCIsVmY9bmV3IFRmO2Z1bmN0aW9uIHdnKGEsYixjLGQpe3RoaXMuSz1hfHxudWxsO3RoaXMuYj1ifHxudWxsO3RoaXMuc2E9Y3x8W107dGhpcy5UPW51bGw7dGhpcy5YPWR8fCIiO3RoaXMuYT10aGlzLkg9dGhpcy5PPW51bGx9ZnVuY3Rpb24geGcoYSl7cmV0dXJuIGE/YS5fX3N0eWxlSW5mbzpudWxsfWZ1bmN0aW9uIHlnKGEsYil7cmV0dXJuIGEuX19zdHlsZUluZm89Yn13Zy5wcm90b3R5cGUuYz1mdW5jdGlvbigpe3JldHVybiB0aGlzLkt9O3dnLnByb3RvdHlwZS5fZ2V0U3R5bGVSdWxlcz13Zy5wcm90b3R5cGUuYztmdW5jdGlvbiB6ZyhhKXt2YXIgYj10aGlzLm1hdGNoZXN8fHRoaXMubWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm1vek1hdGNoZXNTZWxlY3Rvcnx8dGhpcy5tc01hdGNoZXNTZWxlY3Rvcnx8dGhpcy5vTWF0Y2hlc1NlbGVjdG9yfHx0aGlzLndlYmtpdE1hdGNoZXNTZWxlY3RvcjtyZXR1cm4gYiYmYi5jYWxsKHRoaXMsYSl9dmFyIEFnPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goIlRyaWRlbnQiKTtmdW5jdGlvbiBCZygpe31mdW5jdGlvbiBDZyhhKXt2YXIgYj17fSxjPVtdLGQ9MDtLZihhLGZ1bmN0aW9uKGEpe0RnKGEpO2EuaW5kZXg9ZCsrO2E9YS5CLmNzc1RleHQ7Zm9yKHZhciBjO2M9RWYuZXhlYyhhKTspe3ZhciBlPWNbMV07IjoiIT09Y1syXSYmKGJbZV09ITApfX0sZnVuY3Rpb24oYSl7Yy5wdXNoKGEpfSk7YS5iPWM7YT1bXTtmb3IodmFyIGUgaW4gYilhLnB1c2goZSk7cmV0dXJuIGF9CmZ1bmN0aW9uIERnKGEpe2lmKCFhLkIpe3ZhciBiPXt9LGM9e307RWcoYSxjKSYmKGIuSj1jLGEucnVsZXM9bnVsbCk7Yi5jc3NUZXh0PWEucGFyc2VkQ3NzVGV4dC5yZXBsYWNlKEhmLCIiKS5yZXBsYWNlKENmLCIiKTthLkI9Yn19ZnVuY3Rpb24gRWcoYSxiKXt2YXIgYz1hLkI7aWYoYyl7aWYoYy5KKXJldHVybiBPYmplY3QuYXNzaWduKGIsYy5KKSwhMH1lbHNle2M9YS5wYXJzZWRDc3NUZXh0O2Zvcih2YXIgZDthPUNmLmV4ZWMoYyk7KXtkPShhWzJdfHxhWzNdKS50cmltKCk7aWYoImluaGVyaXQiIT09ZHx8InVuc2V0IiE9PWQpYlthWzFdLnRyaW0oKV09ZDtkPSEwfXJldHVybiBkfX0KZnVuY3Rpb24gRmcoYSxiLGMpe2ImJihiPTA8PWIuaW5kZXhPZigiOyIpP0dnKGEsYixjKTpRZihiLGZ1bmN0aW9uKGIsZSxmLGcpe2lmKCFlKXJldHVybiBiK2c7KGU9RmcoYSxjW2VdLGMpKSYmImluaXRpYWwiIT09ZT8iYXBwbHktc2hpbS1pbmhlcml0Ij09PWUmJihlPSJpbmhlcml0Iik6ZT1GZyhhLGNbZl18fGYsYyl8fGY7cmV0dXJuIGIrKGV8fCIiKStnfSkpO3JldHVybiBiJiZiLnRyaW0oKXx8IiJ9CmZ1bmN0aW9uIEdnKGEsYixjKXtiPWIuc3BsaXQoIjsiKTtmb3IodmFyIGQ9MCxlLGY7ZDxiLmxlbmd0aDtkKyspaWYoZT1iW2RdKXtEZi5sYXN0SW5kZXg9MDtpZihmPURmLmV4ZWMoZSkpZT1GZyhhLGNbZlsxXV0sYyk7ZWxzZSBpZihmPWUuaW5kZXhPZigiOiIpLC0xIT09Zil7dmFyIGc9ZS5zdWJzdHJpbmcoZik7Zz1nLnRyaW0oKTtnPUZnKGEsZyxjKXx8ZztlPWUuc3Vic3RyaW5nKDAsZikrZ31iW2RdPWUmJmUubGFzdEluZGV4T2YoIjsiKT09PWUubGVuZ3RoLTE/ZS5zbGljZSgwLC0xKTplfHwiIn1yZXR1cm4gYi5qb2luKCI7Iil9CmZ1bmN0aW9uIEhnKGEsYil7dmFyIGM9e30sZD1bXTtLZihhLGZ1bmN0aW9uKGEpe2EuQnx8RGcoYSk7dmFyIGU9YS5HfHxhLnBhcnNlZFNlbGVjdG9yO2ImJmEuQi5KJiZlJiZ6Zy5jYWxsKGIsZSkmJihFZyhhLGMpLGE9YS5pbmRleCxlPXBhcnNlSW50KGEvMzIsMTApLGRbZV09KGRbZV18fDApfDE8PGElMzIpfSxudWxsLCEwKTtyZXR1cm57SjpjLGtleTpkfX0KZnVuY3Rpb24gSWcoYSxiLGMsZCl7Yi5CfHxEZyhiKTtpZihiLkIuSil7dmFyIGU9U2YoYSk7YT1lLmlzO2U9ZS5YO2U9YT9hZyhhLGUpOiJodG1sIjt2YXIgZj1iLnBhcnNlZFNlbGVjdG9yLGc9Ijpob3N0ID4gKiI9PT1mfHwiaHRtbCI9PT1mLGg9MD09PWYuaW5kZXhPZigiOmhvc3QiKSYmIWc7InNoYWR5Ij09PWMmJihnPWY9PT1lKyIgPiAqLiIrZXx8LTEhPT1mLmluZGV4T2YoImh0bWwiKSxoPSFnJiYwPT09Zi5pbmRleE9mKGUpKTsic2hhZG93Ij09PWMmJihnPSI6aG9zdCA+ICoiPT09Znx8Imh0bWwiPT09ZixoPWgmJiFnKTtpZihnfHxoKWM9ZSxoJiYoYi5HfHwoYi5HPWNnKFZmLGIsVmYuYixhP2JnK2E6IiIsZSkpLGM9Yi5HfHxlKSxkKHtaYTpjLFdhOmgsd2I6Z30pfX0KZnVuY3Rpb24gSmcoYSxiKXt2YXIgYz17fSxkPXt9LGU9YiYmYi5fX2Nzc0J1aWxkO0tmKGIsZnVuY3Rpb24oYil7SWcoYSxiLGUsZnVuY3Rpb24oZSl7emcuY2FsbChhLmtifHxhLGUuWmEpJiYoZS5XYT9FZyhiLGMpOkVnKGIsZCkpfSl9LG51bGwsITApO3JldHVybntZYTpkLFZhOmN9fQpmdW5jdGlvbiBLZyhhLGIsYyxkKXt2YXIgZT1TZihiKSxmPWFnKGUuaXMsZS5YKSxnPW5ldyBSZWdFeHAoIig/Ol58W14uI1s6XSkiKyhiLmV4dGVuZHM/IlxcIitmLnNsaWNlKDAsLTEpKyJcXF0iOmYpKyIoJHxbLjpbXFxzPit+XSkiKTtlPXhnKGIpLks7dmFyIGg9TGcoZSxkKTtyZXR1cm4gWmYoYixlLGZ1bmN0aW9uKGIpe3ZhciBlPSIiO2IuQnx8RGcoYik7Yi5CLmNzc1RleHQmJihlPUdnKGEsYi5CLmNzc1RleHQsYykpO2IuY3NzVGV4dD1lO2lmKCFUJiYhTWYoYikmJmIuY3NzVGV4dCl7dmFyIGs9ZT1iLmNzc1RleHQ7bnVsbD09Yi56YSYmKGIuemE9RmYudGVzdChlKSk7aWYoYi56YSlpZihudWxsPT1iLmVhKXtiLmVhPVtdO2Zvcih2YXIgciBpbiBoKWs9aFtyXSxrPWsoZSksZSE9PWsmJihlPWssYi5lYS5wdXNoKHIpKX1lbHNle2ZvcihyPTA7cjxiLmVhLmxlbmd0aDsrK3Ipaz1oW2IuZWFbcl1dLGU9ayhlKTtrPWV9Yi5jc3NUZXh0PWs7Yi5HPWIuR3x8Yi5zZWxlY3RvcjsKZT0iLiIrZDtyPWIuRy5zcGxpdCgiLCIpO2s9MDtmb3IodmFyIEc9ci5sZW5ndGgseDtrPEcmJih4PXJba10pO2srKylyW2tdPXgubWF0Y2goZyk/eC5yZXBsYWNlKGYsZSk6ZSsiICIreDtiLnNlbGVjdG9yPXIuam9pbigiLCIpfX0pfWZ1bmN0aW9uIExnKGEsYil7YT1hLmI7dmFyIGM9e307aWYoIVQmJmEpZm9yKHZhciBkPTAsZT1hW2RdO2Q8YS5sZW5ndGg7ZT1hWysrZF0pe3ZhciBmPWUsZz1iO2YuRj1uZXcgUmVnRXhwKCJcXGIiK2Yua2V5ZnJhbWVzTmFtZSsiKD8hXFxCfC0pIiwiZyIpO2YuYT1mLmtleWZyYW1lc05hbWUrIi0iK2c7Zi5HPWYuR3x8Zi5zZWxlY3RvcjtmLnNlbGVjdG9yPWYuRy5yZXBsYWNlKGYua2V5ZnJhbWVzTmFtZSxmLmEpO2NbZS5rZXlmcmFtZXNOYW1lXT1NZyhlKX1yZXR1cm4gY31mdW5jdGlvbiBNZyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGIucmVwbGFjZShhLkYsYS5hKX19CmZ1bmN0aW9uIE5nKGEsYil7dmFyIGM9T2csZD1MZihhKTthLnRleHRDb250ZW50PUpmKGQsZnVuY3Rpb24oYSl7dmFyIGQ9YS5jc3NUZXh0PWEucGFyc2VkQ3NzVGV4dDthLkImJmEuQi5jc3NUZXh0JiYoZD1kLnJlcGxhY2Uod2YsIiIpLnJlcGxhY2UoeGYsIiIpLGEuY3NzVGV4dD1HZyhjLGQsYikpfSl9YWEuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQmcucHJvdG90eXBlLHthOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4ieC1zY29wZSJ9fX0pO3ZhciBPZz1uZXcgQmc7dmFyIFBnPXt9LFFnPXdpbmRvdy5jdXN0b21FbGVtZW50cztpZihRZyYmIVQpe3ZhciBSZz1RZy5kZWZpbmU7UWcuZGVmaW5lPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1kb2N1bWVudC5jcmVhdGVDb21tZW50KCIgU2hhZHkgRE9NIHN0eWxlcyBmb3IgIithKyIgIiksZT1kb2N1bWVudC5oZWFkO2UuaW5zZXJ0QmVmb3JlKGQsKFBmP1BmLm5leHRTaWJsaW5nOm51bGwpfHxlLmZpcnN0Q2hpbGQpO1BmPWQ7UGdbYV09ZDtSZy5jYWxsKFFnLGEsYixjKX19O2Z1bmN0aW9uIFNnKCl7dGhpcy5jYWNoZT17fX1TZy5wcm90b3R5cGUuc3RvcmU9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9dGhpcy5jYWNoZVthXXx8W107ZS5wdXNoKHtKOmIsc3R5bGVFbGVtZW50OmMsSDpkfSk7MTAwPGUubGVuZ3RoJiZlLnNoaWZ0KCk7dGhpcy5jYWNoZVthXT1lfTtTZy5wcm90b3R5cGUuZmV0Y2g9ZnVuY3Rpb24oYSxiLGMpe2lmKGE9dGhpcy5jYWNoZVthXSlmb3IodmFyIGQ9YS5sZW5ndGgtMTswPD1kO2QtLSl7dmFyIGU9YVtkXSxmO2E6e2ZvcihmPTA7ZjxjLmxlbmd0aDtmKyspe3ZhciBnPWNbZl07aWYoZS5KW2ddIT09YltnXSl7Zj0hMTticmVhayBhfX1mPSEwfWlmKGYpcmV0dXJuIGV9fTtmdW5jdGlvbiBUZygpe30KZnVuY3Rpb24gVWcoYSl7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBjPWFbYl07aWYoYy50YXJnZXQhPT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJmMudGFyZ2V0IT09ZG9jdW1lbnQuaGVhZClmb3IodmFyIGQ9MDtkPGMuYWRkZWROb2Rlcy5sZW5ndGg7ZCsrKXt2YXIgZT1jLmFkZGVkTm9kZXNbZF07aWYoZS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXt2YXIgZj1lLmdldFJvb3ROb2RlKCk7dmFyIGc9ZTt2YXIgaD1bXTtnLmNsYXNzTGlzdD9oPUFycmF5LmZyb20oZy5jbGFzc0xpc3QpOmcgaW5zdGFuY2VvZiB3aW5kb3cuU1ZHRWxlbWVudCYmZy5oYXNBdHRyaWJ1dGUoImNsYXNzIikmJihoPWcuZ2V0QXR0cmlidXRlKCJjbGFzcyIpLnNwbGl0KC9ccysvKSk7Zz1oO2g9Zy5pbmRleE9mKFZmLmEpO2lmKChnPS0xPGg/Z1toKzFdOiIiKSYmZj09PWUub3duZXJEb2N1bWVudClVZihlLGcsITApO2Vsc2UgaWYoZi5ub2RlVHlwZT09PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSYmCihmPWYuaG9zdCkpaWYoZj1TZihmKS5pcyxnPT09Zilmb3IoZT13aW5kb3cuU2hhZHlET00ubmF0aXZlTWV0aG9kcy5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoZSwiOm5vdCguIitWZi5hKyIpIiksZj0wO2Y8ZS5sZW5ndGg7ZisrKVhmKGVbZl0sZyk7ZWxzZSBnJiZVZihlLGcsITApLFVmKGUsZil9fX19CmlmKCFUKXt2YXIgVmc9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoVWcpLFdnPWZ1bmN0aW9uKGEpe1ZnLm9ic2VydmUoYSx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KX07aWYod2luZG93LmN1c3RvbUVsZW1lbnRzJiYhd2luZG93LmN1c3RvbUVsZW1lbnRzLnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2spV2coZG9jdW1lbnQpO2Vsc2V7dmFyIFhnPWZ1bmN0aW9uKCl7V2coZG9jdW1lbnQuYm9keSl9O3dpbmRvdy5IVE1MSW1wb3J0cz93aW5kb3cuSFRNTEltcG9ydHMud2hlblJlYWR5KFhnKTpyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXtpZigibG9hZGluZyI9PT1kb2N1bWVudC5yZWFkeVN0YXRlKXt2YXIgYT1mdW5jdGlvbigpe1hnKCk7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsYSl9O2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGEpfWVsc2UgWGcoKX0pfVRnPWZ1bmN0aW9uKCl7VWcoVmcudGFrZVJlY29yZHMoKSl9fQp2YXIgWWc9VGc7dmFyIFpnPXt9O3ZhciAkZz1Qcm9taXNlLnJlc29sdmUoKTtmdW5jdGlvbiBhaChhKXtpZihhPVpnW2FdKWEuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPWEuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9ufHwwLGEuX2FwcGx5U2hpbVZhbGlkYXRpbmdWZXJzaW9uPWEuX2FwcGx5U2hpbVZhbGlkYXRpbmdWZXJzaW9ufHwwLGEuX2FwcGx5U2hpbU5leHRWZXJzaW9uPShhLl9hcHBseVNoaW1OZXh0VmVyc2lvbnx8MCkrMX1mdW5jdGlvbiBiaChhKXtyZXR1cm4gYS5fYXBwbHlTaGltQ3VycmVudFZlcnNpb249PT1hLl9hcHBseVNoaW1OZXh0VmVyc2lvbn1mdW5jdGlvbiBjaChhKXthLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbj1hLl9hcHBseVNoaW1OZXh0VmVyc2lvbjthLmJ8fChhLmI9ITAsJGcudGhlbihmdW5jdGlvbigpe2EuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuYj0hMX0pKX07dmFyIGRoPW5ldyBTZztmdW5jdGlvbiBXKCl7dGhpcy5BYT17fTt0aGlzLmM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O3ZhciBhPW5ldyBkZjthLnJ1bGVzPVtdO3RoaXMuRj15Zyh0aGlzLmMsbmV3IHdnKGEpKTt0aGlzLk09ITE7dGhpcy5iPXRoaXMuYT1udWxsfXE9Vy5wcm90b3R5cGU7cS5HYT1mdW5jdGlvbigpe1lnKCl9O3EuVGE9ZnVuY3Rpb24oYSl7cmV0dXJuIExmKGEpfTtxLmFiPWZ1bmN0aW9uKGEpe3JldHVybiBKZihhKX07CnEucHJlcGFyZVRlbXBsYXRlPWZ1bmN0aW9uKGEsYixjKXtpZighYS5GKXthLkY9ITA7YS5uYW1lPWI7YS5leHRlbmRzPWM7WmdbYl09YTt2YXIgZD0oZD1hLmNvbnRlbnQucXVlcnlTZWxlY3Rvcigic3R5bGUiKSk/ZC5nZXRBdHRyaWJ1dGUoImNzcy1idWlsZCIpfHwiIjoiIjt2YXIgZT1bXTtmb3IodmFyIGY9YS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlIiksZz0wO2c8Zi5sZW5ndGg7ZysrKXt2YXIgaD1mW2ddO2lmKGguaGFzQXR0cmlidXRlKCJzaGFkeS11bnNjb3BlZCIpKXtpZighVCl7dmFyIGs9aC50ZXh0Q29udGVudDtJZi5oYXMoayl8fChJZi5hZGQoayksaz1oLmNsb25lTm9kZSghMCksZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKSk7aC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGgpfX1lbHNlIGUucHVzaChoLnRleHRDb250ZW50KSxoLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaCl9ZT1lLmpvaW4oIiIpLnRyaW0oKTtjPXtpczpiLGV4dGVuZHM6YyxoYjpkfTsKVHx8VWYoYS5jb250ZW50LGIpO2VoKHRoaXMpO2Y9RGYudGVzdChlKXx8Q2YudGVzdChlKTtEZi5sYXN0SW5kZXg9MDtDZi5sYXN0SW5kZXg9MDtlPWVmKGUpO2YmJlYmJnRoaXMuYSYmdGhpcy5hLnRyYW5zZm9ybVJ1bGVzKGUsYik7YS5fc3R5bGVBc3Q9ZTthLk09ZDtkPVtdO1Z8fChkPUNnKGEuX3N0eWxlQXN0KSk7aWYoIWQubGVuZ3RofHxWKWU9VD9hLmNvbnRlbnQ6bnVsbCxiPVBnW2JdLGY9WmYoYyxhLl9zdHlsZUFzdCksYj1mLmxlbmd0aD9OZihmLGMuaXMsZSxiKTp2b2lkIDAsYS5hPWI7YS5jPWR9fTsKZnVuY3Rpb24gZmgoYSl7IWEuYiYmd2luZG93LlNoYWR5Q1NTJiZ3aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2UmJihhLmI9d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlLGEuYi50cmFuc2Zvcm1DYWxsYmFjaz1mdW5jdGlvbihiKXthLkVhKGIpfSxhLmIudmFsaWRhdGVDYWxsYmFjaz1mdW5jdGlvbigpe3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpeyhhLmIuZW5xdWV1ZWR8fGEuTSkmJmEuZmx1c2hDdXN0b21TdHlsZXMoKX0pfSl9ZnVuY3Rpb24gZWgoYSl7IWEuYSYmd2luZG93LlNoYWR5Q1NTJiZ3aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltJiYoYS5hPXdpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW0sYS5hLmludmFsaWRDYWxsYmFjaz1haCk7ZmgoYSl9CnEuZmx1c2hDdXN0b21TdHlsZXM9ZnVuY3Rpb24oKXtlaCh0aGlzKTtpZih0aGlzLmIpe3ZhciBhPXRoaXMuYi5wcm9jZXNzU3R5bGVzKCk7aWYodGhpcy5iLmVucXVldWVkKXtpZihWKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLmIuZ2V0U3R5bGVGb3JDdXN0b21TdHlsZShhW2JdKTtpZihjJiZWJiZ0aGlzLmEpe3ZhciBkPUxmKGMpO2VoKHRoaXMpO3RoaXMuYS50cmFuc2Zvcm1SdWxlcyhkKTtjLnRleHRDb250ZW50PUpmKGQpfX1lbHNlIGZvcihnaCh0aGlzLHRoaXMuYyx0aGlzLkYpLGI9MDtiPGEubGVuZ3RoO2IrKykoYz10aGlzLmIuZ2V0U3R5bGVGb3JDdXN0b21TdHlsZShhW2JdKSkmJk5nKGMsdGhpcy5GLk8pO3RoaXMuYi5lbnF1ZXVlZD0hMTt0aGlzLk0mJiFWJiZ0aGlzLnN0eWxlRG9jdW1lbnQoKX19fTsKcS5zdHlsZUVsZW1lbnQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz1TZihhKS5pcyxkPXhnKGEpO2lmKCFkKXt2YXIgZT1TZihhKTtkPWUuaXM7ZT1lLlg7dmFyIGY9UGdbZF07ZD1aZ1tkXTtpZihkKXt2YXIgZz1kLl9zdHlsZUFzdDt2YXIgaD1kLmN9ZD15ZyhhLG5ldyB3ZyhnLGYsaCxlKSl9YSE9PXRoaXMuYyYmKHRoaXMuTT0hMCk7YiYmKGQuVD1kLlR8fHt9LE9iamVjdC5hc3NpZ24oZC5ULGIpKTtpZihWKXtpZihkLlQpe2I9ZC5UO2Zvcih2YXIgayBpbiBiKW51bGw9PT1rP2Euc3R5bGUucmVtb3ZlUHJvcGVydHkoayk6YS5zdHlsZS5zZXRQcm9wZXJ0eShrLGJba10pfWlmKCgoaz1aZ1tjXSl8fGE9PT10aGlzLmMpJiZrJiZrLmEmJiFiaChrKSl7aWYoYmgoayl8fGsuX2FwcGx5U2hpbVZhbGlkYXRpbmdWZXJzaW9uIT09ay5fYXBwbHlTaGltTmV4dFZlcnNpb24pZWgodGhpcyksdGhpcy5hJiZ0aGlzLmEudHJhbnNmb3JtUnVsZXMoay5fc3R5bGVBc3QsYyksay5hLnRleHRDb250ZW50PQpaZihhLGQuSyksY2goayk7VCYmKGM9YS5zaGFkb3dSb290KSYmKGMucXVlcnlTZWxlY3Rvcigic3R5bGUiKS50ZXh0Q29udGVudD1aZihhLGQuSykpO2QuSz1rLl9zdHlsZUFzdH19ZWxzZSBpZihnaCh0aGlzLGEsZCksZC5zYSYmZC5zYS5sZW5ndGgpe2M9ZDtrPVNmKGEpLmlzO2Q9KGI9ZGguZmV0Y2goayxjLk8sYy5zYSkpP2Iuc3R5bGVFbGVtZW50Om51bGw7Zz1jLkg7KGg9YiYmYi5IKXx8KGg9dGhpcy5BYVtrXT0odGhpcy5BYVtrXXx8MCkrMSxoPWsrIi0iK2gpO2MuSD1oO2g9Yy5IO2U9T2c7ZT1kP2QudGV4dENvbnRlbnR8fCIiOktnKGUsYSxjLk8saCk7Zj14ZyhhKTt2YXIgbT1mLmE7bSYmIVQmJm0hPT1kJiYobS5fdXNlQ291bnQtLSwwPj1tLl91c2VDb3VudCYmbS5wYXJlbnROb2RlJiZtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobSkpO1Q/Zi5hPyhmLmEudGV4dENvbnRlbnQ9ZSxkPWYuYSk6ZSYmKGQ9TmYoZSxoLGEuc2hhZG93Um9vdCxmLmIpKTpkP2QucGFyZW50Tm9kZXx8CihBZyYmLTE8ZS5pbmRleE9mKCJAbWVkaWEiKSYmKGQudGV4dENvbnRlbnQ9ZSksT2YoZCxudWxsLGYuYikpOmUmJihkPU5mKGUsaCxudWxsLGYuYikpO2QmJihkLl91c2VDb3VudD1kLl91c2VDb3VudHx8MCxmLmEhPWQmJmQuX3VzZUNvdW50KyssZi5hPWQpO2g9ZDtUfHwoZD1jLkgsZj1lPWEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIixnJiYoZj1lLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFxzKngtc2NvcGVcXHMqIitnKyJcXHMqIiwiZyIpLCIgIikpLGYrPShmPyIgIjoiIikrIngtc2NvcGUgIitkLGUhPT1mJiZSZihhLGYpKTtifHxkaC5zdG9yZShrLGMuTyxoLGMuSCl9fTtmdW5jdGlvbiBoaChhLGIpe3JldHVybihiPWIuZ2V0Um9vdE5vZGUoKS5ob3N0KT94ZyhiKT9iOmhoKGEsYik6YS5jfQpmdW5jdGlvbiBnaChhLGIsYyl7YT1oaChhLGIpO3ZhciBkPXhnKGEpO2E9T2JqZWN0LmNyZWF0ZShkLk98fG51bGwpO3ZhciBlPUpnKGIsYy5LKTtiPUhnKGQuSyxiKS5KO09iamVjdC5hc3NpZ24oYSxlLlZhLGIsZS5ZYSk7Yj1jLlQ7Zm9yKHZhciBmIGluIGIpaWYoKGU9YltmXSl8fDA9PT1lKWFbZl09ZTtmPU9nO2I9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYSk7Zm9yKGU9MDtlPGIubGVuZ3RoO2UrKylkPWJbZV0sYVtkXT1GZyhmLGFbZF0sYSk7Yy5PPWF9cS5zdHlsZURvY3VtZW50PWZ1bmN0aW9uKGEpe3RoaXMuc3R5bGVTdWJ0cmVlKHRoaXMuYyxhKX07CnEuc3R5bGVTdWJ0cmVlPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zaGFkb3dSb290OyhjfHxhPT09dGhpcy5jKSYmdGhpcy5zdHlsZUVsZW1lbnQoYSxiKTtpZihiPWMmJihjLmNoaWxkcmVufHxjLmNoaWxkTm9kZXMpKWZvcihhPTA7YTxiLmxlbmd0aDthKyspdGhpcy5zdHlsZVN1YnRyZWUoYlthXSk7ZWxzZSBpZihhPWEuY2hpbGRyZW58fGEuY2hpbGROb2Rlcylmb3IoYj0wO2I8YS5sZW5ndGg7YisrKXRoaXMuc3R5bGVTdWJ0cmVlKGFbYl0pfTtxLkVhPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1MZihhKTtLZihjLGZ1bmN0aW9uKGEpe2lmKFQpdGcoYSk7ZWxzZXt2YXIgYz1WZjthLnNlbGVjdG9yPWEucGFyc2VkU2VsZWN0b3I7dGcoYSk7YS5zZWxlY3Rvcj1hLkc9Y2coYyxhLGMuYyx2b2lkIDAsdm9pZCAwKX1WJiYoZWgoYiksYi5hJiZiLmEudHJhbnNmb3JtUnVsZShhKSl9KTtWP2EudGV4dENvbnRlbnQ9SmYoYyk6dGhpcy5GLksucnVsZXMucHVzaChjKX07CnEuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlPWZ1bmN0aW9uKGEsYil7dmFyIGM7Vnx8KGM9KHhnKGEpfHx4ZyhoaCh0aGlzLGEpKSkuT1tiXSk7cmV0dXJuKGM9Y3x8d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkuZ2V0UHJvcGVydHlWYWx1ZShiKSk/Yy50cmltKCk6IiJ9O3EuJGE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldFJvb3ROb2RlKCk7Yj1iP2Iuc3BsaXQoL1xzLyk6W107Yz1jLmhvc3QmJmMuaG9zdC5sb2NhbE5hbWU7aWYoIWMpe3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpO2lmKGQpe2Q9ZC5zcGxpdCgvXHMvKTtmb3IodmFyIGU9MDtlPGQubGVuZ3RoO2UrKylpZihkW2VdPT09VmYuYSl7Yz1kW2UrMV07YnJlYWt9fX1jJiZiLnB1c2goVmYuYSxjKTtWfHwoYz14ZyhhKSkmJmMuSCYmYi5wdXNoKE9nLmEsYy5IKTtSZihhLGIuam9pbigiICIpKX07cS5RYT1mdW5jdGlvbihhKXtyZXR1cm4geGcoYSl9O1cucHJvdG90eXBlLmZsdXNoPVcucHJvdG90eXBlLkdhOwpXLnByb3RvdHlwZS5wcmVwYXJlVGVtcGxhdGU9Vy5wcm90b3R5cGUucHJlcGFyZVRlbXBsYXRlO1cucHJvdG90eXBlLnN0eWxlRWxlbWVudD1XLnByb3RvdHlwZS5zdHlsZUVsZW1lbnQ7Vy5wcm90b3R5cGUuc3R5bGVEb2N1bWVudD1XLnByb3RvdHlwZS5zdHlsZURvY3VtZW50O1cucHJvdG90eXBlLnN0eWxlU3VidHJlZT1XLnByb3RvdHlwZS5zdHlsZVN1YnRyZWU7Vy5wcm90b3R5cGUuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlPVcucHJvdG90eXBlLmdldENvbXB1dGVkU3R5bGVWYWx1ZTtXLnByb3RvdHlwZS5zZXRFbGVtZW50Q2xhc3M9Vy5wcm90b3R5cGUuJGE7Vy5wcm90b3R5cGUuX3N0eWxlSW5mb0Zvck5vZGU9Vy5wcm90b3R5cGUuUWE7Vy5wcm90b3R5cGUudHJhbnNmb3JtQ3VzdG9tU3R5bGVGb3JEb2N1bWVudD1XLnByb3RvdHlwZS5FYTtXLnByb3RvdHlwZS5nZXRTdHlsZUFzdD1XLnByb3RvdHlwZS5UYTtXLnByb3RvdHlwZS5zdHlsZUFzdFRvU3RyaW5nPVcucHJvdG90eXBlLmFiOwpXLnByb3RvdHlwZS5mbHVzaEN1c3RvbVN0eWxlcz1XLnByb3RvdHlwZS5mbHVzaEN1c3RvbVN0eWxlcztPYmplY3QuZGVmaW5lUHJvcGVydGllcyhXLnByb3RvdHlwZSx7bmF0aXZlU2hhZG93OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVH19LG5hdGl2ZUNzczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFZ9fX0pO3ZhciBYPW5ldyBXLGloLGpoO3dpbmRvdy5TaGFkeUNTUyYmKGloPXdpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW0samg9d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlKTsKd2luZG93LlNoYWR5Q1NTPXtTY29waW5nU2hpbTpYLHByZXBhcmVUZW1wbGF0ZTpmdW5jdGlvbihhLGIsYyl7WC5mbHVzaEN1c3RvbVN0eWxlcygpO1gucHJlcGFyZVRlbXBsYXRlKGEsYixjKX0sc3R5bGVTdWJ0cmVlOmZ1bmN0aW9uKGEsYil7WC5mbHVzaEN1c3RvbVN0eWxlcygpO1guc3R5bGVTdWJ0cmVlKGEsYil9LHN0eWxlRWxlbWVudDpmdW5jdGlvbihhKXtYLmZsdXNoQ3VzdG9tU3R5bGVzKCk7WC5zdHlsZUVsZW1lbnQoYSl9LHN0eWxlRG9jdW1lbnQ6ZnVuY3Rpb24oYSl7WC5mbHVzaEN1c3RvbVN0eWxlcygpO1guc3R5bGVEb2N1bWVudChhKX0sZmx1c2hDdXN0b21TdHlsZXM6ZnVuY3Rpb24oKXtYLmZsdXNoQ3VzdG9tU3R5bGVzKCl9LGdldENvbXB1dGVkU3R5bGVWYWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBYLmdldENvbXB1dGVkU3R5bGVWYWx1ZShhLGIpfSxuYXRpdmVDc3M6VixuYXRpdmVTaGFkb3c6VH07aWgmJih3aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltPWloKTsKamgmJih3aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2U9amgpOyhmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpeyIiPT1hJiYoZi5jYWxsKHRoaXMpLHRoaXMuaD0hMCk7cmV0dXJuIGEudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBjKGEpe3ZhciBiPWEuY2hhckNvZGVBdCgwKTtyZXR1cm4gMzI8YiYmMTI3PmImJi0xPT1bMzQsMzUsNjAsNjIsNjMsOTZdLmluZGV4T2YoYik/YTplbmNvZGVVUklDb21wb25lbnQoYSl9ZnVuY3Rpb24gZChhKXt2YXIgYj1hLmNoYXJDb2RlQXQoMCk7cmV0dXJuIDMyPGImJjEyNz5iJiYtMT09WzM0LDM1LDYwLDYyLDk2XS5pbmRleE9mKGIpP2E6ZW5jb2RlVVJJQ29tcG9uZW50KGEpfWZ1bmN0aW9uIGUoYSxlLGcpe2Z1bmN0aW9uIGgoYSl7a2IucHVzaChhKX12YXIgaz1lfHwic2NoZW1lIHN0YXJ0Iix2PTAscD0iIix4PSExLFU9ITEsa2I9W107YTpmb3IoOyh2b2lkIDAhPWFbdi0xXXx8MD09dikmJiF0aGlzLmg7KXt2YXIgbD1hW3ZdO3N3aXRjaChrKXtjYXNlICJzY2hlbWUgc3RhcnQiOmlmKGwmJnIudGVzdChsKSlwKz0KbC50b0xvd2VyQ2FzZSgpLGs9InNjaGVtZSI7ZWxzZSBpZihlKXtoKCJJbnZhbGlkIHNjaGVtZS4iKTticmVhayBhfWVsc2V7cD0iIjtrPSJubyBzY2hlbWUiO2NvbnRpbnVlfWJyZWFrO2Nhc2UgInNjaGVtZSI6aWYobCYmRy50ZXN0KGwpKXArPWwudG9Mb3dlckNhc2UoKTtlbHNlIGlmKCI6Ij09bCl7dGhpcy5nPXA7cD0iIjtpZihlKWJyZWFrIGE7dm9pZCAwIT09bVt0aGlzLmddJiYodGhpcy5EPSEwKTtrPSJmaWxlIj09dGhpcy5nPyJyZWxhdGl2ZSI6dGhpcy5EJiZnJiZnLmc9PXRoaXMuZz8icmVsYXRpdmUgb3IgYXV0aG9yaXR5Ijp0aGlzLkQ/ImF1dGhvcml0eSBmaXJzdCBzbGFzaCI6InNjaGVtZSBkYXRhIn1lbHNlIGlmKGUpe3ZvaWQgMCE9bCYmaCgiQ29kZSBwb2ludCBub3QgYWxsb3dlZCBpbiBzY2hlbWU6ICIrbCk7YnJlYWsgYX1lbHNle3A9IiI7dj0wO2s9Im5vIHNjaGVtZSI7Y29udGludWV9YnJlYWs7Y2FzZSAic2NoZW1lIGRhdGEiOiI/Ij09bD8odGhpcy51PSI/IiwKaz0icXVlcnkiKToiIyI9PWw/KHRoaXMuQz0iIyIsaz0iZnJhZ21lbnQiKTp2b2lkIDAhPWwmJiJcdCIhPWwmJiJcbiIhPWwmJiJcciIhPWwmJih0aGlzLnFhKz1jKGwpKTticmVhaztjYXNlICJubyBzY2hlbWUiOmlmKGcmJnZvaWQgMCE9PW1bZy5nXSl7az0icmVsYXRpdmUiO2NvbnRpbnVlfWVsc2UgaCgiTWlzc2luZyBzY2hlbWUuIiksZi5jYWxsKHRoaXMpLHRoaXMuaD0hMDticmVhaztjYXNlICJyZWxhdGl2ZSBvciBhdXRob3JpdHkiOmlmKCIvIj09bCYmIi8iPT1hW3YrMV0paz0iYXV0aG9yaXR5IGlnbm9yZSBzbGFzaGVzIjtlbHNle2goIkV4cGVjdGVkIC8sIGdvdDogIitsKTtrPSJyZWxhdGl2ZSI7Y29udGludWV9YnJlYWs7Y2FzZSAicmVsYXRpdmUiOnRoaXMuRD0hMDsiZmlsZSIhPXRoaXMuZyYmKHRoaXMuZz1nLmcpO2lmKHZvaWQgMD09bCl7dGhpcy5pPWcuaTt0aGlzLnM9Zy5zO3RoaXMuaj1nLmouc2xpY2UoKTt0aGlzLnU9Zy51O3RoaXMudj1nLnY7dGhpcy5mPWcuZjsKYnJlYWsgYX1lbHNlIGlmKCIvIj09bHx8IlxcIj09bCkiXFwiPT1sJiZoKCJcXCBpcyBhbiBpbnZhbGlkIGNvZGUgcG9pbnQuIiksaz0icmVsYXRpdmUgc2xhc2giO2Vsc2UgaWYoIj8iPT1sKXRoaXMuaT1nLmksdGhpcy5zPWcucyx0aGlzLmo9Zy5qLnNsaWNlKCksdGhpcy51PSI/Iix0aGlzLnY9Zy52LHRoaXMuZj1nLmYsaz0icXVlcnkiO2Vsc2UgaWYoIiMiPT1sKXRoaXMuaT1nLmksdGhpcy5zPWcucyx0aGlzLmo9Zy5qLnNsaWNlKCksdGhpcy51PWcudSx0aGlzLkM9IiMiLHRoaXMudj1nLnYsdGhpcy5mPWcuZixrPSJmcmFnbWVudCI7ZWxzZXtrPWFbdisxXTt2YXIgRj1hW3YrMl07aWYoImZpbGUiIT10aGlzLmd8fCFyLnRlc3QobCl8fCI6IiE9ayYmInwiIT1rfHx2b2lkIDAhPUYmJiIvIiE9RiYmIlxcIiE9RiYmIj8iIT1GJiYiIyIhPUYpdGhpcy5pPWcuaSx0aGlzLnM9Zy5zLHRoaXMudj1nLnYsdGhpcy5mPWcuZix0aGlzLmo9Zy5qLnNsaWNlKCksdGhpcy5qLnBvcCgpO2s9CiJyZWxhdGl2ZSBwYXRoIjtjb250aW51ZX1icmVhaztjYXNlICJyZWxhdGl2ZSBzbGFzaCI6aWYoIi8iPT1sfHwiXFwiPT1sKSJcXCI9PWwmJmgoIlxcIGlzIGFuIGludmFsaWQgY29kZSBwb2ludC4iKSxrPSJmaWxlIj09dGhpcy5nPyJmaWxlIGhvc3QiOiJhdXRob3JpdHkgaWdub3JlIHNsYXNoZXMiO2Vsc2V7ImZpbGUiIT10aGlzLmcmJih0aGlzLmk9Zy5pLHRoaXMucz1nLnMsdGhpcy52PWcudix0aGlzLmY9Zy5mKTtrPSJyZWxhdGl2ZSBwYXRoIjtjb250aW51ZX1icmVhaztjYXNlICJhdXRob3JpdHkgZmlyc3Qgc2xhc2giOmlmKCIvIj09bClrPSJhdXRob3JpdHkgc2Vjb25kIHNsYXNoIjtlbHNle2goIkV4cGVjdGVkICcvJywgZ290OiAiK2wpO2s9ImF1dGhvcml0eSBpZ25vcmUgc2xhc2hlcyI7Y29udGludWV9YnJlYWs7Y2FzZSAiYXV0aG9yaXR5IHNlY29uZCBzbGFzaCI6az0iYXV0aG9yaXR5IGlnbm9yZSBzbGFzaGVzIjtpZigiLyIhPWwpe2goIkV4cGVjdGVkICcvJywgZ290OiAiKwpsKTtjb250aW51ZX1icmVhaztjYXNlICJhdXRob3JpdHkgaWdub3JlIHNsYXNoZXMiOmlmKCIvIiE9bCYmIlxcIiE9bCl7az0iYXV0aG9yaXR5Ijtjb250aW51ZX1lbHNlIGgoIkV4cGVjdGVkIGF1dGhvcml0eSwgZ290OiAiK2wpO2JyZWFrO2Nhc2UgImF1dGhvcml0eSI6aWYoIkAiPT1sKXt4JiYoaCgiQCBhbHJlYWR5IHNlZW4uIikscCs9IiU0MCIpO3g9ITA7Zm9yKGw9MDtsPHAubGVuZ3RoO2wrKylGPXBbbF0sIlx0Ij09Rnx8IlxuIj09Rnx8IlxyIj09Rj9oKCJJbnZhbGlkIHdoaXRlc3BhY2UgaW4gYXV0aG9yaXR5LiIpOiI6Ij09RiYmbnVsbD09PXRoaXMuZj90aGlzLmY9IiI6KEY9YyhGKSxudWxsIT09dGhpcy5mP3RoaXMuZis9Rjp0aGlzLnYrPUYpO3A9IiJ9ZWxzZSBpZih2b2lkIDA9PWx8fCIvIj09bHx8IlxcIj09bHx8Ij8iPT1sfHwiIyI9PWwpe3YtPXAubGVuZ3RoO3A9IiI7az0iaG9zdCI7Y29udGludWV9ZWxzZSBwKz1sO2JyZWFrO2Nhc2UgImZpbGUgaG9zdCI6aWYodm9pZCAwPT0KbHx8Ii8iPT1sfHwiXFwiPT1sfHwiPyI9PWx8fCIjIj09bCl7MiE9cC5sZW5ndGh8fCFyLnRlc3QocFswXSl8fCI6IiE9cFsxXSYmInwiIT1wWzFdPygwIT1wLmxlbmd0aCYmKHRoaXMuaT1iLmNhbGwodGhpcyxwKSxwPSIiKSxrPSJyZWxhdGl2ZSBwYXRoIHN0YXJ0Iik6az0icmVsYXRpdmUgcGF0aCI7Y29udGludWV9ZWxzZSJcdCI9PWx8fCJcbiI9PWx8fCJcciI9PWw/aCgiSW52YWxpZCB3aGl0ZXNwYWNlIGluIGZpbGUgaG9zdC4iKTpwKz1sO2JyZWFrO2Nhc2UgImhvc3QiOmNhc2UgImhvc3RuYW1lIjppZigiOiIhPWx8fFUpaWYodm9pZCAwPT1sfHwiLyI9PWx8fCJcXCI9PWx8fCI/Ij09bHx8IiMiPT1sKXt0aGlzLmk9Yi5jYWxsKHRoaXMscCk7cD0iIjtrPSJyZWxhdGl2ZSBwYXRoIHN0YXJ0IjtpZihlKWJyZWFrIGE7Y29udGludWV9ZWxzZSJcdCIhPWwmJiJcbiIhPWwmJiJcciIhPWw/KCJbIj09bD9VPSEwOiJdIj09bCYmKFU9ITEpLHArPWwpOmgoIkludmFsaWQgY29kZSBwb2ludCBpbiBob3N0L2hvc3RuYW1lOiAiKwpsKTtlbHNlIGlmKHRoaXMuaT1iLmNhbGwodGhpcyxwKSxwPSIiLGs9InBvcnQiLCJob3N0bmFtZSI9PWUpYnJlYWsgYTticmVhaztjYXNlICJwb3J0IjppZigvWzAtOV0vLnRlc3QobCkpcCs9bDtlbHNlIGlmKHZvaWQgMD09bHx8Ii8iPT1sfHwiXFwiPT1sfHwiPyI9PWx8fCIjIj09bHx8ZSl7IiIhPXAmJihwPXBhcnNlSW50KHAsMTApLHAhPW1bdGhpcy5nXSYmKHRoaXMucz1wKyIiKSxwPSIiKTtpZihlKWJyZWFrIGE7az0icmVsYXRpdmUgcGF0aCBzdGFydCI7Y29udGludWV9ZWxzZSJcdCI9PWx8fCJcbiI9PWx8fCJcciI9PWw/aCgiSW52YWxpZCBjb2RlIHBvaW50IGluIHBvcnQ6ICIrbCk6KGYuY2FsbCh0aGlzKSx0aGlzLmg9ITApO2JyZWFrO2Nhc2UgInJlbGF0aXZlIHBhdGggc3RhcnQiOiJcXCI9PWwmJmgoIidcXCcgbm90IGFsbG93ZWQgaW4gcGF0aC4iKTtrPSJyZWxhdGl2ZSBwYXRoIjtpZigiLyIhPWwmJiJcXCIhPWwpY29udGludWU7YnJlYWs7Y2FzZSAicmVsYXRpdmUgcGF0aCI6aWYodm9pZCAwIT0KbCYmIi8iIT1sJiYiXFwiIT1sJiYoZXx8Ij8iIT1sJiYiIyIhPWwpKSJcdCIhPWwmJiJcbiIhPWwmJiJcciIhPWwmJihwKz1jKGwpKTtlbHNleyJcXCI9PWwmJmgoIlxcIG5vdCBhbGxvd2VkIGluIHJlbGF0aXZlIHBhdGguIik7aWYoRj1uW3AudG9Mb3dlckNhc2UoKV0pcD1GOyIuLiI9PXA/KHRoaXMuai5wb3AoKSwiLyIhPWwmJiJcXCIhPWwmJnRoaXMuai5wdXNoKCIiKSk6Ii4iPT1wJiYiLyIhPWwmJiJcXCIhPWw/dGhpcy5qLnB1c2goIiIpOiIuIiE9cCYmKCJmaWxlIj09dGhpcy5nJiYwPT10aGlzLmoubGVuZ3RoJiYyPT1wLmxlbmd0aCYmci50ZXN0KHBbMF0pJiYifCI9PXBbMV0mJihwPXBbMF0rIjoiKSx0aGlzLmoucHVzaChwKSk7cD0iIjsiPyI9PWw/KHRoaXMudT0iPyIsaz0icXVlcnkiKToiIyI9PWwmJih0aGlzLkM9IiMiLGs9ImZyYWdtZW50Iil9YnJlYWs7Y2FzZSAicXVlcnkiOmV8fCIjIiE9bD92b2lkIDAhPWwmJiJcdCIhPWwmJiJcbiIhPWwmJiJcciIhPWwmJih0aGlzLnUrPQpkKGwpKToodGhpcy5DPSIjIixrPSJmcmFnbWVudCIpO2JyZWFrO2Nhc2UgImZyYWdtZW50Ijp2b2lkIDAhPWwmJiJcdCIhPWwmJiJcbiIhPWwmJiJcciIhPWwmJih0aGlzLkMrPWwpfXYrK319ZnVuY3Rpb24gZigpe3RoaXMudj10aGlzLnFhPXRoaXMuZz0iIjt0aGlzLmY9bnVsbDt0aGlzLnM9dGhpcy5pPSIiO3RoaXMuaj1bXTt0aGlzLkM9dGhpcy51PSIiO3RoaXMuRD10aGlzLmg9ITF9ZnVuY3Rpb24gZyhhLGIpe3ZvaWQgMD09PWJ8fGIgaW5zdGFuY2VvZiBnfHwoYj1uZXcgZyhTdHJpbmcoYikpKTt0aGlzLlJhPWE7Zi5jYWxsKHRoaXMpO2E9YS5yZXBsYWNlKC9eWyBcdFxyXG5cZl0rfFsgXHRcclxuXGZdKyQvZywiIik7ZS5jYWxsKHRoaXMsYSxudWxsLGIpfXZhciBoPSExO2lmKCFhLnFiKXRyeXt2YXIgaz1uZXcgVVJMKCJiIiwiaHR0cDovL2EiKTtrLnBhdGhuYW1lPSJjJTIwZCI7aD0iaHR0cDovL2EvYyUyMGQiPT09ay5ocmVmfWNhdGNoKHYpe31pZighaCl7dmFyIG09T2JqZWN0LmNyZWF0ZShudWxsKTsKbS5mdHA9MjE7bS5maWxlPTA7bS5nb3BoZXI9NzA7bS5odHRwPTgwO20uaHR0cHM9NDQzO20ud3M9ODA7bS53c3M9NDQzO3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCk7blsiJTJlIl09Ii4iO25bIi4lMmUiXT0iLi4iO25bIiUyZS4iXT0iLi4iO25bIiUyZSUyZSJdPSIuLiI7dmFyIHI9L1thLXpBLVpdLyxHPS9bYS16QS1aMC05XCtcLVwuXS87Zy5wcm90b3R5cGU9e3RvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaHJlZn0sZ2V0IGhyZWYoKXtpZih0aGlzLmgpcmV0dXJuIHRoaXMuUmE7dmFyIGE9IiI7aWYoIiIhPXRoaXMudnx8bnVsbCE9dGhpcy5mKWE9dGhpcy52KyhudWxsIT10aGlzLmY/IjoiK3RoaXMuZjoiIikrIkAiO3JldHVybiB0aGlzLnByb3RvY29sKyh0aGlzLkQ/Ii8vIithK3RoaXMuaG9zdDoiIikrdGhpcy5wYXRobmFtZSt0aGlzLnUrdGhpcy5DfSxzZXQgaHJlZihhKXtmLmNhbGwodGhpcyk7ZS5jYWxsKHRoaXMsYSl9LGdldCBwcm90b2NvbCgpe3JldHVybiB0aGlzLmcrCiI6In0sc2V0IHByb3RvY29sKGEpe3RoaXMuaHx8ZS5jYWxsKHRoaXMsYSsiOiIsInNjaGVtZSBzdGFydCIpfSxnZXQgaG9zdCgpe3JldHVybiB0aGlzLmg/IiI6dGhpcy5zP3RoaXMuaSsiOiIrdGhpcy5zOnRoaXMuaX0sc2V0IGhvc3QoYSl7IXRoaXMuaCYmdGhpcy5EJiZlLmNhbGwodGhpcyxhLCJob3N0Iil9LGdldCBob3N0bmFtZSgpe3JldHVybiB0aGlzLml9LHNldCBob3N0bmFtZShhKXshdGhpcy5oJiZ0aGlzLkQmJmUuY2FsbCh0aGlzLGEsImhvc3RuYW1lIil9LGdldCBwb3J0KCl7cmV0dXJuIHRoaXMuc30sc2V0IHBvcnQoYSl7IXRoaXMuaCYmdGhpcy5EJiZlLmNhbGwodGhpcyxhLCJwb3J0Iil9LGdldCBwYXRobmFtZSgpe3JldHVybiB0aGlzLmg/IiI6dGhpcy5EPyIvIit0aGlzLmouam9pbigiLyIpOnRoaXMucWF9LHNldCBwYXRobmFtZShhKXshdGhpcy5oJiZ0aGlzLkQmJih0aGlzLmo9W10sZS5jYWxsKHRoaXMsYSwicmVsYXRpdmUgcGF0aCBzdGFydCIpKX0sZ2V0IHNlYXJjaCgpe3JldHVybiB0aGlzLmh8fAohdGhpcy51fHwiPyI9PXRoaXMudT8iIjp0aGlzLnV9LHNldCBzZWFyY2goYSl7IXRoaXMuaCYmdGhpcy5EJiYodGhpcy51PSI/IiwiPyI9PWFbMF0mJihhPWEuc2xpY2UoMSkpLGUuY2FsbCh0aGlzLGEsInF1ZXJ5IikpfSxnZXQgaGFzaCgpe3JldHVybiB0aGlzLmh8fCF0aGlzLkN8fCIjIj09dGhpcy5DPyIiOnRoaXMuQ30sc2V0IGhhc2goYSl7dGhpcy5ofHwodGhpcy5DPSIjIiwiIyI9PWFbMF0mJihhPWEuc2xpY2UoMSkpLGUuY2FsbCh0aGlzLGEsImZyYWdtZW50IikpfSxnZXQgb3JpZ2luKCl7dmFyIGE7aWYodGhpcy5ofHwhdGhpcy5nKXJldHVybiIiO3N3aXRjaCh0aGlzLmcpe2Nhc2UgImRhdGEiOmNhc2UgImZpbGUiOmNhc2UgImphdmFzY3JpcHQiOmNhc2UgIm1haWx0byI6cmV0dXJuIm51bGwifXJldHVybihhPXRoaXMuaG9zdCk/dGhpcy5nKyI6Ly8iK2E6IiJ9fTt2YXIgeD1hLlVSTDt4JiYoZy5jcmVhdGVPYmplY3RVUkw9ZnVuY3Rpb24oYSl7cmV0dXJuIHguY3JlYXRlT2JqZWN0VVJMLmFwcGx5KHgsCmFyZ3VtZW50cyl9LGcucmV2b2tlT2JqZWN0VVJMPWZ1bmN0aW9uKGEpe3gucmV2b2tlT2JqZWN0VVJMKGEpfSk7YS5VUkw9Z319KSh3aW5kb3cpO3ZhciBraD17fSxsaD1PYmplY3QuY3JlYXRlLG1oPU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLG5oPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTtmdW5jdGlvbiBZKGEsYil7Yj12b2lkIDA9PT1iP3t9OmI7cmV0dXJue3ZhbHVlOmEsY29uZmlndXJhYmxlOiEhYi55YSx3cml0YWJsZTohIWIuY2IsZW51bWVyYWJsZTohIWIuZX19dmFyIG9oPXZvaWQgMDt0cnl7b2g9MT09PW5oKHt9LCJ5Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDF9fSkueX1jYXRjaChhKXtvaD0hMX12YXIgcGg9e307ZnVuY3Rpb24gcWgoYSl7YT1TdHJpbmcoYSk7Zm9yKHZhciBiPSIiLGM9MDtwaFthK2JdOyliPWMrPTE7cGhbYStiXT0xO3ZhciBkPSJTeW1ib2woIithKyIiK2IrIikiO29oJiZuaChPYmplY3QucHJvdG90eXBlLGQse2dldDp2b2lkIDAsc2V0OmZ1bmN0aW9uKGEpe25oKHRoaXMsZCxZKGEse3lhOiEwLGNiOiEwfSkpfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMX0pO3JldHVybiBkfQp2YXIgcmg9bGgobnVsbCk7ZnVuY3Rpb24gWihhKXtpZih0aGlzIGluc3RhbmNlb2YgWil0aHJvdyBuZXcgVHlwZUVycm9yKCJTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IiKTthPXZvaWQgMD09PWE/IiI6U3RyaW5nKGEpO3ZhciBiPXFoKGEpO3JldHVybiBvaD9saChyaCx7dWE6WShhKSxLYTpZKGIpfSk6Yn1taChaLHsiZm9yIjpZKGZ1bmN0aW9uKGEpe2E9U3RyaW5nKGEpO2lmKGtoW2FdKXJldHVybiBraFthXTt2YXIgYj1aKGEpO3JldHVybiBraFthXT1ifSksa2V5Rm9yOlkoZnVuY3Rpb24oYSl7aWYob2gmJighYXx8IlN5bWJvbCIhPT1hW1oudG9TdHJpbmdUYWddKSl0aHJvdyBuZXcgVHlwZUVycm9yKCIiK2ErIiBpcyBub3QgYSBzeW1ib2wiKTtmb3IodmFyIGIgaW4ga2gpaWYoa2hbYl09PT1hKXJldHVybiBvaD9raFtiXS51YTpraFtiXS5zdWJzdHIoNyxraFtiXS5sZW5ndGgtOCl9KX0pOwptaChaLHt1YjpZKFooImhhc0luc3RhbmNlIikpLHZiOlkoWigiaXNDb25jYXRTcHJlYWRhYmxlIikpLGl0ZXJhdG9yOlkoWigiaXRlcmF0b3IiKSksbWF0Y2g6WShaKCJtYXRjaCIpKSxyZXBsYWNlOlkoWigicmVwbGFjZSIpKSxzZWFyY2g6WShaKCJzZWFyY2giKSksQWI6WShaKCJzcGVjaWVzIikpLHNwbGl0OlkoWigic3BsaXQiKSksQmI6WShaKCJ0b1ByaW1pdGl2ZSIpKSx0b1N0cmluZ1RhZzpZKFooInRvU3RyaW5nVGFnIikpLHVuc2NvcGFibGVzOlkoWigidW5zY29wYWJsZXMiKSl9KTttaChyaCx7Y29uc3RydWN0b3I6WShaKSx0b1N0cmluZzpZKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS2F9KSx2YWx1ZU9mOlkoZnVuY3Rpb24oKXtyZXR1cm4iU3ltYm9sKCIrdGhpcy51YSsiKSJ9KX0pO29oJiZuaChyaCxaLnRvU3RyaW5nVGFnLFkoIlN5bWJvbCIse3lhOiEwfSkpO3ZhciBzaD0iZnVuY3Rpb24iPT09dHlwZW9mIFN5bWJvbD9TeW1ib2w6WjsvKgoKQ29weXJpZ2h0IChjKSAyMDE4IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8Kd2luZG93LlN5bWJvbHx8KHdpbmRvdy5TeW1ib2w9c2gsQXJyYXkucHJvdG90eXBlW3NoLml0ZXJhdG9yXT1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxlLGgpe2Zvcig7Oylzd2l0Y2goYil7Y2FzZSAwOmM9MDtjYXNlIDE6aWYoIShjPGQubGVuZ3RoKSl7Yj0zO2JyZWFrfWI9NDtyZXR1cm57dmFsdWU6ZFtjXSxkb25lOiExfTtjYXNlIDQ6aWYoMSE9YSl7Yj01O2JyZWFrfWI9LTE7dGhyb3cgaDtjYXNlIDU6Y2FzZSAyOmMrKztiPTE7YnJlYWs7Y2FzZSAzOmI9LTE7ZGVmYXVsdDpyZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9fX12YXIgYj0wLGMsZD10aGlzLGU9e25leHQ6ZnVuY3Rpb24oYil7cmV0dXJuIGEoMCxiLHZvaWQgMCl9LHRocm93OmZ1bmN0aW9uKGIpe3JldHVybiBhKDEsdm9pZCAwLGIpfSxyZXR1cm46ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiTm90IHlldCBpbXBsZW1lbnRlZCIpO319O2VhKCk7ZVtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9OwpyZXR1cm4gZX0sU2V0LnByb3RvdHlwZVtzaC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsZixrKXtmb3IoOzspc3dpdGNoKGIpe2Nhc2UgMDpkPVtdLGUuZm9yRWFjaChmdW5jdGlvbihhKXtkLnB1c2goYSl9KSxjPTA7Y2FzZSAxOmlmKCEoYzxkLmxlbmd0aCkpe2I9MzticmVha31iPTQ7cmV0dXJue3ZhbHVlOmRbY10sZG9uZTohMX07Y2FzZSA0OmlmKDEhPWEpe2I9NTticmVha31iPS0xO3Rocm93IGs7Y2FzZSA1OmNhc2UgMjpjKys7Yj0xO2JyZWFrO2Nhc2UgMzpiPS0xO2RlZmF1bHQ6cmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX19dmFyIGI9MCxjLGQsZT10aGlzLGY9e25leHQ6ZnVuY3Rpb24oYil7cmV0dXJuIGEoMCxiLHZvaWQgMCl9LHRocm93OmZ1bmN0aW9uKGIpe3JldHVybiBhKDEsdm9pZCAwLGIpfSxyZXR1cm46ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiTm90IHlldCBpbXBsZW1lbnRlZCIpO319O2VhKCk7ZltTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9OwpyZXR1cm4gZn0sTWFwLnByb3RvdHlwZVtzaC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsZixrKXtmb3IoOzspc3dpdGNoKGIpe2Nhc2UgMDpkPVtdLGUuZm9yRWFjaChmdW5jdGlvbihhLGIpe2QucHVzaChbYixhXSl9KSxjPTA7Y2FzZSAxOmlmKCEoYzxkLmxlbmd0aCkpe2I9MzticmVha31iPTQ7cmV0dXJue3ZhbHVlOmRbY10sZG9uZTohMX07Y2FzZSA0OmlmKDEhPWEpe2I9NTticmVha31iPS0xO3Rocm93IGs7Y2FzZSA1OmNhc2UgMjpjKys7Yj0xO2JyZWFrO2Nhc2UgMzpiPS0xO2RlZmF1bHQ6cmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX19dmFyIGI9MCxjLGQsZT10aGlzLGY9e25leHQ6ZnVuY3Rpb24oYil7cmV0dXJuIGEoMCxiLHZvaWQgMCl9LHRocm93OmZ1bmN0aW9uKGIpe3JldHVybiBhKDEsdm9pZCAwLGIpfSxyZXR1cm46ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiTm90IHlldCBpbXBsZW1lbnRlZCIpO319O2VhKCk7ZltTeW1ib2wuaXRlcmF0b3JdPQpmdW5jdGlvbigpe3JldHVybiB0aGlzfTtyZXR1cm4gZn0sU3RyaW5nLnByb3RvdHlwZVtzaC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsZSxoKXtmb3IoOzspc3dpdGNoKGIpe2Nhc2UgMDpjPTA7Y2FzZSAxOmlmKCEoYzxkLmxlbmd0aCkpe2I9MzticmVha31iPTQ7cmV0dXJue3ZhbHVlOmRbY10sZG9uZTohMX07Y2FzZSA0OmlmKDEhPWEpe2I9NTticmVha31iPS0xO3Rocm93IGg7Y2FzZSA1OmNhc2UgMjpjKys7Yj0xO2JyZWFrO2Nhc2UgMzpiPS0xO2RlZmF1bHQ6cmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX19dmFyIGI9MCxjLGQ9dGhpcyxlPXtuZXh0OmZ1bmN0aW9uKGIpe3JldHVybiBhKDAsYix2b2lkIDApfSx0aHJvdzpmdW5jdGlvbihiKXtyZXR1cm4gYSgxLHZvaWQgMCxiKX0scmV0dXJuOmZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIk5vdCB5ZXQgaW1wbGVtZW50ZWQiKTt9fTtlYSgpO2VbU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTsKcmV0dXJuIGV9KTt2YXIgdGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTt0aC50ZXh0Q29udGVudD0iYm9keSB7dHJhbnNpdGlvbjogb3BhY2l0eSBlYXNlLWluIDAuMnM7IH0gXG5ib2R5W3VucmVzb2x2ZWRdIHtvcGFjaXR5OiAwOyBkaXNwbGF5OiBibG9jazsgb3ZlcmZsb3c6IGhpZGRlbjsgcG9zaXRpb246IHJlbGF0aXZlOyB9IFxuIjt2YXIgdWg9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiaGVhZCIpO3VoLmluc2VydEJlZm9yZSh0aCx1aC5maXJzdENoaWxkKTt2YXIgdmg9d2luZG93LmN1c3RvbUVsZW1lbnRzLHdoPSExLHhoPW51bGw7dmgucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjayYmdmgucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjayhmdW5jdGlvbihhKXt4aD1hO3doJiZhKCl9KTtmdW5jdGlvbiB5aCgpe3dpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50LmJvb3RzdHJhcCYmd2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQuYm9vdHN0cmFwKHdpbmRvdy5kb2N1bWVudCk7eGgmJnhoKCk7d2g9ITA7d2luZG93LldlYkNvbXBvbmVudHMucmVhZHk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIldlYkNvbXBvbmVudHNSZWFkeSIse2J1YmJsZXM6ITB9KSl9CiJjb21wbGV0ZSIhPT1kb2N1bWVudC5yZWFkeVN0YXRlPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIseWgpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIix5aCk7eWgoKX0pKTp5aCgpO30pLmNhbGwodGhpcyk7Cn0K"></script>
<script src="data:application/javascript;base64,ZnVuY3Rpb24gbG9hZF9kaXN0aWxsX2ZyYW1ld29yaygpIHsKCihmdW5jdGlvbihlLHQpeydvYmplY3QnPT10eXBlb2YgZXhwb3J0cyYmJ3VuZGVmaW5lZCchPXR5cGVvZiBtb2R1bGU/dCgpOidmdW5jdGlvbic9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKHQpOnQoKX0pKHRoaXMsZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7ZnVuY3Rpb24gZShlLHQpe2UudGl0bGU9dC50aXRsZSx0LnB1Ymxpc2hlZCYmKHQucHVibGlzaGVkIGluc3RhbmNlb2YgRGF0ZT9lLnB1Ymxpc2hlZERhdGU9dC5wdWJsaXNoZWQ6dC5wdWJsaXNoZWQuY29uc3RydWN0b3I9PT1TdHJpbmcmJihlLnB1Ymxpc2hlZERhdGU9bmV3IERhdGUodC5wdWJsaXNoZWQpKSksdC5wdWJsaXNoZWREYXRlJiYodC5wdWJsaXNoZWREYXRlIGluc3RhbmNlb2YgRGF0ZT9lLnB1Ymxpc2hlZERhdGU9dC5wdWJsaXNoZWREYXRlOnQucHVibGlzaGVkRGF0ZS5jb25zdHJ1Y3Rvcj09PVN0cmluZz9lLnB1Ymxpc2hlZERhdGU9bmV3IERhdGUodC5wdWJsaXNoZWREYXRlKTpjb25zb2xlLmVycm9yKCdEb25cJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggcHVibGlzaGVkIGRhdGU6ICcrdC5wdWJsaXNoZWREYXRlKSksZS5kZXNjcmlwdGlvbj10LmRlc2NyaXB0aW9uLGUuYXV0aG9ycz10LmF1dGhvcnMubWFwKChlKT0+bmV3IEpuKGUpKSxlLmthdGV4PXQua2F0ZXgsZS5wYXNzd29yZD10LnBhc3N3b3JkfWZ1bmN0aW9uIHQoZT1kb2N1bWVudCl7Y29uc3QgdD1uZXcgU2V0LG49ZS5xdWVyeVNlbGVjdG9yQWxsKCdkLWNpdGUnKTtmb3IoY29uc3QgYSBvZiBuKXtjb25zdCBlPWEuZ2V0QXR0cmlidXRlKCdrZXknKS5zcGxpdCgnLCcpO2Zvcihjb25zdCBuIG9mIGUpdC5hZGQobil9cmV0dXJuWy4uLnRdfWZ1bmN0aW9uIG4oZSx0LG4sYSl7aWYobnVsbD09ZS5hdXRob3IpcmV0dXJuJyc7dmFyIGk9ZS5hdXRob3Iuc3BsaXQoJyBhbmQgJyk7bGV0IGQ9aS5tYXAoKGUpPT57aWYoZT1lLnRyaW0oKSwtMSE9ZS5pbmRleE9mKCcsJykpdmFyIG49ZS5zcGxpdCgnLCcpWzBdLnRyaW0oKSxhPWUuc3BsaXQoJywnKVsxXTtlbHNlIHZhciBuPWUuc3BsaXQoJyAnKS5zbGljZSgtMSlbMF0udHJpbSgpLGE9ZS5zcGxpdCgnICcpLnNsaWNlKDAsLTEpLmpvaW4oJyAnKTt2YXIgaT0nJztyZXR1cm4gdm9pZCAwIT1hJiYoaT1hLnRyaW0oKS5zcGxpdCgnICcpLm1hcCgoZSk9PmUudHJpbSgpWzBdKSxpPWkuam9pbignLicpKycuJyksdC5yZXBsYWNlKCcke0Z9JyxhKS5yZXBsYWNlKCcke0x9JyxuKS5yZXBsYWNlKCcke0l9JyxpKX0pO2lmKDE8aS5sZW5ndGgpe3ZhciByPWQuc2xpY2UoMCxpLmxlbmd0aC0xKS5qb2luKG4pO3JldHVybiByKz0oYXx8bikrZFtpLmxlbmd0aC0xXSxyfXJldHVybiBkWzBdfWZ1bmN0aW9uIGEoZSl7dmFyIHQ9ZS5qb3VybmFsfHxlLmJvb2t0aXRsZXx8Jyc7aWYoJ3ZvbHVtZSdpbiBlKXt2YXIgbj1lLmlzc3VlfHxlLm51bWJlcjtuPXZvaWQgMD09bj8nJzonKCcrbisnKScsdCs9JywgVm9sICcrZS52b2x1bWUrbn1yZXR1cm4ncGFnZXMnaW4gZSYmKHQrPScsIHBwLiAnK2UucGFnZXMpLCcnIT10JiYodCs9Jy4gJyksJ3B1Ymxpc2hlcidpbiBlJiYodCs9ZS5wdWJsaXNoZXIsJy4nIT10W3QubGVuZ3RoLTFdJiYodCs9Jy4nKSksdH1mdW5jdGlvbiBpKGUpe2lmKCd1cmwnaW4gZSl7dmFyIHQ9ZS51cmwsbj0vYXJ4aXZcLm9yZ1wvYWJzXC8oWzAtOVwuXSopLy5leGVjKHQpO2lmKG51bGwhPW4mJih0PWBodHRwOi8vYXJ4aXYub3JnL3BkZi8ke25bMV19LnBkZmApLCcucGRmJz09dC5zbGljZSgtNCkpdmFyIGE9J1BERic7ZWxzZSBpZignLmh0bWwnPT10LnNsaWNlKC01KSl2YXIgYT0nSFRNTCc7cmV0dXJuYCAmZW5zcDs8YSBocmVmPSIke3R9Ij5bJHthfHwnbGluayd9XTwvYT5gfXJldHVybicnfWZ1bmN0aW9uIGQoZSx0KXtyZXR1cm4nZG9pJ2luIGU/YCR7dD8nPGJyPic6Jyd9IDxhIGhyZWY9Imh0dHBzOi8vZG9pLm9yZy8ke2UuZG9pfSIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjppbmhlcml0OyI+RE9JOiAke2UuZG9pfTwvYT5gOicnfWZ1bmN0aW9uIHIoZSl7cmV0dXJuJzxzcGFuIGNsYXNzPSJ0aXRsZSI+JytlLnRpdGxlKyc8L3NwYW4+ICd9ZnVuY3Rpb24gbyhlKXtpZihlKXt2YXIgdD1yKGUpO3JldHVybiB0Kz1pKGUpKyc8YnI+JyxlLmF1dGhvciYmKHQrPW4oZSwnJHtMfSwgJHtJfScsJywgJywnIGFuZCAnKSwoZS55ZWFyfHxlLmRhdGUpJiYodCs9JywgJykpLHQrPWUueWVhcnx8ZS5kYXRlPyhlLnllYXJ8fGUuZGF0ZSkrJy4gJzonLiAnLHQrPWEoZSksdCs9ZChlKSx0fXJldHVybic/J31mdW5jdGlvbiBsKGUpe2lmKGUpe3ZhciB0PScnO3QrPSc8c3Ryb25nPicrZS50aXRsZSsnPC9zdHJvbmc+Jyx0Kz1pKGUpLHQrPSc8YnI+Jzt2YXIgcj1uKGUsJyR7SX0gJHtMfScsJywgJykrJy4nLG89YShlKS50cmltKCkrJyAnK2UueWVhcisnLiAnK2QoZSwhMCk7cmV0dXJuIHQrPShyK28pLmxlbmd0aDxJbig0MCxlLnRpdGxlLmxlbmd0aCk/cisnICcrbzpyKyc8YnI+JytvLHR9cmV0dXJuJz8nfWZ1bmN0aW9uIHMoZSl7Y29uc3QgdD1lLnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdCcpO2lmKHQpe2NvbnN0IGU9dC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKTtpZignanNvbic9PWUuc3BsaXQoJy8nKVsxXSl7Y29uc3QgZT10LnRleHRDb250ZW50O3JldHVybiBKU09OLnBhcnNlKGUpfWNvbnNvbGUuZXJyb3IoJ0Rpc3RpbGwgb25seSBzdXBwb3J0cyBKU09OIGZyb250bWF0dGVyIHRhZ3MgYW55bW9yZTsgbm8gbW9yZSBZQU1MLicpfWVsc2UgY29uc29sZS5lcnJvcignWW91IGFkZGVkIGEgZnJvbnRtYXR0ZXIgdGFnIGJ1dCBkaWQgbm90IHByb3ZpZGUgYSBzY3JpcHQgdGFnIHdpdGggZnJvbnQgbWF0dGVyIGRhdGEgaW4gaXQuIFBsZWFzZSB0YWtlIGEgbG9vayBhdCBvdXIgdGVtcGxhdGVzLicpO3JldHVybnt9fWZ1bmN0aW9uIGMoKXtyZXR1cm4tMSE9PVsnaW50ZXJhY3RpdmUnLCdjb21wbGV0ZSddLmluZGV4T2YoZG9jdW1lbnQucmVhZHlTdGF0ZSl9ZnVuY3Rpb24gdShlKXtjb25zdCB0PSdkaXN0aWxsLXByZXJlbmRlcmVkLXN0eWxlcycsbj1lLmdldEVsZW1lbnRCeUlkKHQpO2lmKCFuKXtjb25zdCBuPWUuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtuLmlkPXQsbi50eXBlPSd0ZXh0L2Nzcyc7Y29uc3QgYT1lLmNyZWF0ZVRleHROb2RlKGJhKTtuLmFwcGVuZENoaWxkKGEpO2NvbnN0IGk9ZS5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdCcpO2UuaGVhZC5pbnNlcnRCZWZvcmUobixpKX19ZnVuY3Rpb24gcChlLHQpe2NvbnNvbGUuaW5mbygnUnVubGV2ZWwgMDogUG9seWZpbGwgcmVxdWlyZWQ6ICcrZS5uYW1lKTtjb25zdCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO24uc3JjPWUudXJsLG4uYXN5bmM9ITEsdCYmKG4ub25sb2FkPWZ1bmN0aW9uKCl7dChlKX0pLG4ub25lcnJvcj1mdW5jdGlvbigpe25ldyBFcnJvcignUnVubGV2ZWwgMDogUG9seWZpbGxzIGZhaWxlZCB0byBsb2FkIHNjcmlwdCAnK2UubmFtZSl9LGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobil9ZnVuY3Rpb24gZyhlLHQpe3JldHVybiB0PXtleHBvcnRzOnt9fSxlKHQsdC5leHBvcnRzKSx0LmV4cG9ydHN9ZnVuY3Rpb24gZihlKXtyZXR1cm4gZS5yZXBsYWNlKC9bXHRcbiBdKy9nLCcgJykucmVwbGFjZSgve1xcWyJeYC4nYWN1fkh2c10oICk/KFthLXpBLVpdKX0vZywoZSx0LG4pPT5uKS5yZXBsYWNlKC97XFwoW2EtekEtWl0pfS9nLChlLHQpPT50KX1mdW5jdGlvbiBiKGUpe2NvbnN0IHQ9bmV3IE1hcCxuPVRhLnRvSlNPTihlKTtmb3IoY29uc3QgYSBvZiBuKXtmb3IoY29uc3RbZSx0XW9mIE9iamVjdC5lbnRyaWVzKGEuZW50cnlUYWdzKSlhLmVudHJ5VGFnc1tlLnRvTG93ZXJDYXNlKCldPWYodCk7YS5lbnRyeVRhZ3MudHlwZT1hLmVudHJ5VHlwZSx0LnNldChhLmNpdGF0aW9uS2V5LGEuZW50cnlUYWdzKX1yZXR1cm4gdH1mdW5jdGlvbiBoKGUpe3JldHVybmBAYXJ0aWNsZXske2Uuc2x1Z30sCiAgYXV0aG9yID0geyR7ZS5iaWJ0ZXhBdXRob3JzfX0sCiAgdGl0bGUgPSB7JHtlLnRpdGxlfX0sCiAgam91cm5hbCA9IHske2Uuam91cm5hbC50aXRsZX19LAogIHllYXIgPSB7JHtlLnB1Ymxpc2hlZFllYXJ9fSwKICBub3RlID0geyR7ZS51cmx9fSwKICBkb2kgPSB7JHtlLmRvaX19Cn1gfWZ1bmN0aW9uIG0oZSl7cmV0dXJuYAogIDxkaXYgY2xhc3M9ImJ5bGluZSBncmlkIj4KICAgIDxkaXYgY2xhc3M9ImF1dGhvcnMtYWZmaWxpYXRpb25zIGdyaWQiPgogICAgICA8aDM+QXV0aG9yczwvaDM+CiAgICAgIDxoMz5BZmZpbGlhdGlvbnM8L2gzPgogICAgICAke2UuYXV0aG9ycy5tYXAoKGUpPT5gCiAgICAgICAgPHAgY2xhc3M9ImF1dGhvciI+CiAgICAgICAgICAke2UucGVyc29uYWxVUkw/YAogICAgICAgICAgICA8YSBjbGFzcz0ibmFtZSIgaHJlZj0iJHtlLnBlcnNvbmFsVVJMfSI+JHtlLm5hbWV9PC9hPmA6YAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJuYW1lIj4ke2UubmFtZX08L2Rpdj5gfQogICAgICAgIDwvcD4KICAgICAgICA8cCBjbGFzcz0iYWZmaWxpYXRpb24iPgogICAgICAgICAgJHtlLmFmZmlsaWF0aW9uVVJMP2AKICAgICAgICAgICAgPGEgY2xhc3M9ImFmZmlsaWF0aW9uIiBocmVmPSIke2UuYWZmaWxpYXRpb25VUkx9Ij4ke2UuYWZmaWxpYXRpb259PC9hPmA6YAogICAgICAgICAgICA8ZGl2IGNsYXNzPSJhZmZpbGlhdGlvbiI+JHtlLmFmZmlsaWF0aW9ufTwvZGl2PmB9CiAgICAgICAgPC9wPgogICAgICBgKS5qb2luKCcnKX0KICAgIDwvZGl2PgogICAgPGRpdj4KICAgICAgPGgzPlB1Ymxpc2hlZDwvaDM+CiAgICAgICR7ZS5wdWJsaXNoZWREYXRlP2AKICAgICAgICA8cD4ke2UucHVibGlzaGVkTW9udGh9ICR7ZS5wdWJsaXNoZWREYXl9LCAke2UucHVibGlzaGVkWWVhcn08L3A+IGA6YAogICAgICAgIDxwPjxlbT5Ob3QgcHVibGlzaGVkIHlldC48L2VtPjwvcD5gfQogICAgPC9kaXY+CiAgICA8ZGl2PgogICAgICA8aDM+RE9JPC9oMz4KICAgICAgJHtlLmRvaT9gCiAgICAgICAgPHA+PGEgaHJlZj0iaHR0cHM6Ly9kb2kub3JnLyR7ZS5kb2l9Ij4ke2UuZG9pfTwvYT48L3A+YDpgCiAgICAgICAgPHA+PGVtPk5vIERPSSB5ZXQuPC9lbT48L3A+YH0KICAgIDwvZGl2PgogIDwvZGl2PgpgfWZ1bmN0aW9uIHkoZSx0LG49ZG9jdW1lbnQpe2lmKDA8dC5zaXplKXtlLnN0eWxlLmRpc3BsYXk9Jyc7bGV0IGE9ZS5xdWVyeVNlbGVjdG9yKCcucmVmZXJlbmNlcycpO2lmKGEpYS5pbm5lckhUTUw9Jyc7ZWxzZXtjb25zdCB0PW4uY3JlYXRlRWxlbWVudCgnc3R5bGUnKTt0LmlubmVySFRNTD1MYSxlLmFwcGVuZENoaWxkKHQpO2NvbnN0IGk9bi5jcmVhdGVFbGVtZW50KCdoMycpO2kuaWQ9J3JlZmVyZW5jZXMnLGkudGV4dENvbnRlbnQ9J1JlZmVyZW5jZXMnLGUuYXBwZW5kQ2hpbGQoaSksYT1uLmNyZWF0ZUVsZW1lbnQoJ29sJyksYS5pZD0ncmVmZXJlbmNlcy1saXN0JyxhLmNsYXNzTmFtZT0ncmVmZXJlbmNlcycsZS5hcHBlbmRDaGlsZChhKX1mb3IoY29uc3RbZSxpXW9mIHQpe2NvbnN0IHQ9bi5jcmVhdGVFbGVtZW50KCdsaScpO3QuaWQ9ZSx0LmlubmVySFRNTD1vKGkpLGEuYXBwZW5kQ2hpbGQodCl9fWVsc2UgZS5zdHlsZS5kaXNwbGF5PSdub25lJ31mdW5jdGlvbiB4KGUsdCl7bGV0IG49YAogIDxzdHlsZT4KCiAgZC10b2MgewogICAgY29udGFpbjogbGF5b3V0IHN0eWxlOwogICAgZGlzcGxheTogYmxvY2s7CiAgfQoKICBkLXRvYyB1bCB7CiAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgfQoKICBkLXRvYyB1bCA+IHVsIHsKICAgIHBhZGRpbmctbGVmdDogMjRweDsKICB9CgogIGQtdG9jIGEgewogICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICB9CgogIDwvc3R5bGU+CiAgPG5hdiByb2xlPSJuYXZpZ2F0aW9uIiBjbGFzcz0idGFibGUtb2YtY29udGVudHMiPjwvbmF2PgogIDxoMj5UYWJsZSBvZiBjb250ZW50czwvaDI+CiAgPHVsPmA7Zm9yKGNvbnN0IGEgb2YgdCl7Y29uc3QgZT0nRC1USVRMRSc9PWEucGFyZW50RWxlbWVudC50YWdOYW1lLHQ9YS5nZXRBdHRyaWJ1dGUoJ25vLXRvYycpO2lmKGV8fHQpY29udGludWU7Y29uc3QgaT1hLnRleHRDb250ZW50LGQ9JyMnK2EuZ2V0QXR0cmlidXRlKCdpZCcpO2xldCByPSc8bGk+PGEgaHJlZj0iJytkKyciPicraSsnPC9hPjwvbGk+JzsnSDMnPT1hLnRhZ05hbWU/cj0nPHVsPicrcisnPC91bD4nOnIrPSc8YnI+JyxuKz1yfW4rPSc8L3VsPjwvbmF2PicsZS5pbm5lckhUTUw9bn1mdW5jdGlvbiBrKGUpe3JldHVybiBmdW5jdGlvbih0LG4pe3JldHVybiBLYShlKHQpLG4pfX1mdW5jdGlvbiB2KGUsdCxuKXt2YXIgYT0odC1lKS9ObigwLG4pLGk9Rm4oUm4oYSkvcW4pLGQ9YS9PbigxMCxpKTtyZXR1cm4gMDw9aT8oZD49WmE/MTA6ZD49R2E/NTpkPj1laT8yOjEpKk9uKDEwLGkpOi1PbigxMCwtaSkvKGQ+PVphPzEwOmQ+PUdhPzU6ZD49ZWk/MjoxKX1mdW5jdGlvbiB3KGUsdCxuKXt2YXIgYT1qbih0LWUpL05uKDAsbiksaT1PbigxMCxGbihSbihhKS9xbikpLGQ9YS9pO3JldHVybiBkPj1aYT9pKj0xMDpkPj1HYT9pKj01OmQ+PWVpJiYoaSo9MiksdDxlPy1pOml9ZnVuY3Rpb24gXyhlLHQpe3ZhciBuPU9iamVjdC5jcmVhdGUoZS5wcm90b3R5cGUpO2Zvcih2YXIgYSBpbiB0KW5bYV09dFthXTtyZXR1cm4gbn1mdW5jdGlvbiBTKCl7fWZ1bmN0aW9uIE0oZSl7dmFyIHQ7cmV0dXJuIGU9KGUrJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLCh0PWxpLmV4ZWMoZSkpPyh0PXBhcnNlSW50KHRbMV0sMTYpLG5ldyBxKDE1JnQ+Pjh8MjQwJnQ+PjQsMTUmdD4+NHwyNDAmdCwoMTUmdCk8PDR8MTUmdCwxKSk6KHQ9c2kuZXhlYyhlKSk/TChwYXJzZUludCh0WzFdLDE2KSk6KHQ9Y2kuZXhlYyhlKSk/bmV3IHEodFsxXSx0WzJdLHRbM10sMSk6KHQ9dWkuZXhlYyhlKSk/bmV3IHEoMjU1KnRbMV0vMTAwLDI1NSp0WzJdLzEwMCwyNTUqdFszXS8xMDAsMSk6KHQ9cGkuZXhlYyhlKSk/VSh0WzFdLHRbMl0sdFszXSx0WzRdKToodD1naS5leGVjKGUpKT9VKDI1NSp0WzFdLzEwMCwyNTUqdFsyXS8xMDAsMjU1KnRbM10vMTAwLHRbNF0pOih0PWZpLmV4ZWMoZSkpP1IodFsxXSx0WzJdLzEwMCx0WzNdLzEwMCwxKToodD1iaS5leGVjKGUpKT9SKHRbMV0sdFsyXS8xMDAsdFszXS8xMDAsdFs0XSk6aGkuaGFzT3duUHJvcGVydHkoZSk/TChoaVtlXSk6J3RyYW5zcGFyZW50Jz09PWU/bmV3IHEoTmFOLE5hTixOYU4sMCk6bnVsbH1mdW5jdGlvbiBMKGUpe3JldHVybiBuZXcgcSgyNTUmZT4+MTYsMjU1JmU+PjgsMjU1JmUsMSl9ZnVuY3Rpb24gVShlLHQsbixpKXtyZXR1cm4gMD49aSYmKGU9dD1uPU5hTiksbmV3IHEoZSx0LG4saSl9ZnVuY3Rpb24gaihlKXtyZXR1cm4oZSBpbnN0YW5jZW9mIFN8fChlPU0oZSkpLCFlKT9uZXcgcTooZT1lLnJnYigpLG5ldyBxKGUucixlLmcsZS5iLGUub3BhY2l0eSkpfWZ1bmN0aW9uIE8oZSx0LG4sYSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2ooZSk6bmV3IHEoZSx0LG4sbnVsbD09YT8xOmEpfWZ1bmN0aW9uIHEoZSx0LG4sYSl7dGhpcy5yPStlLHRoaXMuZz0rdCx0aGlzLmI9K24sdGhpcy5vcGFjaXR5PSthfWZ1bmN0aW9uIFIoZSx0LG4saSl7cmV0dXJuIDA+PWk/ZT10PW49TmFOOjA+PW58fDE8PW4/ZT10PU5hTjowPj10JiYoZT1OYU4pLG5ldyBQKGUsdCxuLGkpfWZ1bmN0aW9uIE4oZSl7aWYoZSBpbnN0YW5jZW9mIFApcmV0dXJuIG5ldyBQKGUuaCxlLnMsZS5sLGUub3BhY2l0eSk7aWYoZSBpbnN0YW5jZW9mIFN8fChlPU0oZSkpLCFlKXJldHVybiBuZXcgUDtpZihlIGluc3RhbmNlb2YgUClyZXR1cm4gZTtlPWUucmdiKCk7dmFyIHQ9ZS5yLzI1NSxuPWUuZy8yNTUsYT1lLmIvMjU1LGk9SW4odCxuLGEpLGQ9Tm4odCxuLGEpLHI9TmFOLGM9ZC1pLHM9KGQraSkvMjtyZXR1cm4gYz8ocj10PT09ZD8obi1hKS9jKzYqKG48YSk6bj09PWQ/KGEtdCkvYysyOih0LW4pL2MrNCxjLz0wLjU+cz9kK2k6Mi1kLWkscio9NjApOmM9MDxzJiYxPnM/MDpyLG5ldyBQKHIsYyxzLGUub3BhY2l0eSl9ZnVuY3Rpb24gUChlLHQsbixhKXt0aGlzLmg9K2UsdGhpcy5zPSt0LHRoaXMubD0rbix0aGlzLm9wYWNpdHk9K2F9ZnVuY3Rpb24gRihlLHQsbil7cmV0dXJuIDI1NSooNjA+ZT90KyhuLXQpKmUvNjA6MTgwPmU/bjoyNDA+ZT90KyhuLXQpKigyNDAtZSkvNjA6dCl9ZnVuY3Rpb24gSShlKXtpZihlIGluc3RhbmNlb2YgSClyZXR1cm4gbmV3IEgoZS5sLGUuYSxlLmIsZS5vcGFjaXR5KTtpZihlIGluc3RhbmNlb2YgSyl7dmFyIHQ9ZS5oKm1pO3JldHVybiBuZXcgSChlLmwsTG4odCkqZS5jLERuKHQpKmUuYyxlLm9wYWNpdHkpfWUgaW5zdGFuY2VvZiBxfHwoZT1qKGUpKTt2YXIgbj0kKGUuciksaT0kKGUuZyksYT0kKGUuYiksZD1ZKCgwLjQxMjQ1NjQqbiswLjM1NzU3NjEqaSswLjE4MDQzNzUqYSkvS24pLHI9WSgoMC4yMTI2NzI5Km4rMC43MTUxNTIyKmkrMC4wNzIxNzUqYSkvWG4pLG89WSgoMC4wMTkzMzM5Km4rMC4xMTkxOTIqaSswLjk1MDMwNDEqYSkvWW4pO3JldHVybiBuZXcgSCgxMTYqci0xNiw1MDAqKGQtciksMjAwKihyLW8pLGUub3BhY2l0eSl9ZnVuY3Rpb24gSChlLHQsbixpKXt0aGlzLmw9K2UsdGhpcy5hPSt0LHRoaXMuYj0rbix0aGlzLm9wYWNpdHk9K2l9ZnVuY3Rpb24gWShlKXtyZXR1cm4gZT53aT9PbihlLDEvMyk6ZS92aStabn1mdW5jdGlvbiBXKGUpe3JldHVybiBlPmtpP2UqZSplOnZpKihlLVpuKX1mdW5jdGlvbiBWKGUpe3JldHVybiAyNTUqKDAuMDAzMTMwOD49ZT8xMi45MiplOjEuMDU1Kk9uKGUsMS8yLjQpLTAuMDU1KX1mdW5jdGlvbiAkKGUpe3JldHVybiAwLjA0MDQ1Pj0oZS89MjU1KT9lLzEyLjkyOk9uKChlKzAuMDU1KS8xLjA1NSwyLjQpfWZ1bmN0aW9uIHooZSl7aWYoZSBpbnN0YW5jZW9mIEspcmV0dXJuIG5ldyBLKGUuaCxlLmMsZS5sLGUub3BhY2l0eSk7ZSBpbnN0YW5jZW9mIEh8fChlPUkoZSkpO3ZhciB0PUVuKGUuYixlLmEpKnlpO3JldHVybiBuZXcgSygwPnQ/dCszNjA6dCxNbihlLmEqZS5hK2UuYiplLmIpLGUubCxlLm9wYWNpdHkpfWZ1bmN0aW9uIEsoZSx0LG4sYSl7dGhpcy5oPStlLHRoaXMuYz0rdCx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PSthfWZ1bmN0aW9uIFgoZSl7aWYoZSBpbnN0YW5jZW9mIFEpcmV0dXJuIG5ldyBRKGUuaCxlLnMsZS5sLGUub3BhY2l0eSk7ZSBpbnN0YW5jZW9mIHF8fChlPWooZSkpO3ZhciB0PWUuci8yNTUsbj1lLmcvMjU1LGE9ZS5iLzI1NSxpPShUaSphK0UqdC1faSpuKS8oVGkrRS1faSksZD1hLWkscj0oRCoobi1pKS1CKmQpL0Msbz1NbihyKnIrZCpkKS8oRCppKigxLWkpKSxsPW8/RW4ocixkKSp5aS0xMjA6TmFOO3JldHVybiBuZXcgUSgwPmw/bCszNjA6bCxvLGksZS5vcGFjaXR5KX1mdW5jdGlvbiBKKGUsdCxuLGEpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9YKGUpOm5ldyBRKGUsdCxuLG51bGw9PWE/MTphKX1mdW5jdGlvbiBRKGUsdCxuLGEpe3RoaXMuaD0rZSx0aGlzLnM9K3QsdGhpcy5sPStuLHRoaXMub3BhY2l0eT0rYX1mdW5jdGlvbiBaKGUsbil7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBlK2Eqbn19ZnVuY3Rpb24gRyhlLG4sYSl7cmV0dXJuIGU9T24oZSxhKSxuPU9uKG4sYSktZSxhPTEvYSxmdW5jdGlvbihpKXtyZXR1cm4gT24oZStpKm4sYSl9fWZ1bmN0aW9uIGVlKGUpe3JldHVybiAxPT0oZT0rZSk/dGU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gbi10P0codCxuLGUpOlNpKGlzTmFOKHQpP246dCl9fWZ1bmN0aW9uIHRlKGUsdCl7dmFyIG49dC1lO3JldHVybiBuP1ooZSxuKTpTaShpc05hTihlKT90OmUpfWZ1bmN0aW9uIG5lKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlfX1mdW5jdGlvbiBhZShlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGUobikrJyd9fWZ1bmN0aW9uIGllKGUpe3JldHVybiBmdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGEoYSx0KXt2YXIgaT1lKChhPUooYSkpLmgsKHQ9Sih0KSkuaCksZD10ZShhLnMsdC5zKSxyPXRlKGEubCx0LmwpLG89dGUoYS5vcGFjaXR5LHQub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBhLmg9aShlKSxhLnM9ZChlKSxhLmw9cihPbihlLG4pKSxhLm9wYWNpdHk9byhlKSxhKycnfX1yZXR1cm4gbj0rbixhLmdhbW1hPXQsYX0oMSl9ZnVuY3Rpb24gZGUoZSx0KXtyZXR1cm4odC09ZT0rZSk/ZnVuY3Rpb24obil7cmV0dXJuKG4tZSkvdH06RmkodCl9ZnVuY3Rpb24gb2UoZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7dmFyIGk9ZSh0PSt0LG49K24pO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZTw9dD8wOmU+PW4/MTppKGUpfX19ZnVuY3Rpb24gbGUoZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSl7dmFyIGQ9ZShuPStuLGk9K2kpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gMD49ZT9uOjE8PWU/aTpkKGUpfX19ZnVuY3Rpb24gc2UoZSx0LG4sYSl7dmFyIGk9ZVswXSxkPWVbMV0scj10WzBdLG89dFsxXTtyZXR1cm4gZDxpPyhpPW4oZCxpKSxyPWEobyxyKSk6KGk9bihpLGQpLHI9YShyLG8pKSxmdW5jdGlvbihlKXtyZXR1cm4gcihpKGUpKX19ZnVuY3Rpb24gY2UoZSx0LG4sYSl7dmFyIG89SW4oZS5sZW5ndGgsdC5sZW5ndGgpLTEsbD1BcnJheShvKSxkPUFycmF5KG8pLHI9LTE7Zm9yKGVbb108ZVswXSYmKGU9ZS5zbGljZSgpLnJldmVyc2UoKSx0PXQuc2xpY2UoKS5yZXZlcnNlKCkpOysrcjxvOylsW3JdPW4oZVtyXSxlW3IrMV0pLGRbcl09YSh0W3JdLHRbcisxXSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPUphKGUsdCwxLG8pLTE7cmV0dXJuIGRbbl0obFtuXSh0KSl9fWZ1bmN0aW9uIHVlKGUsdCl7cmV0dXJuIHQuZG9tYWluKGUuZG9tYWluKCkpLnJhbmdlKGUucmFuZ2UoKSkuaW50ZXJwb2xhdGUoZS5pbnRlcnBvbGF0ZSgpKS5jbGFtcChlLmNsYW1wKCkpfWZ1bmN0aW9uIHBlKGUsdCl7ZnVuY3Rpb24gbigpe3JldHVybiBpPTI8SW4oby5sZW5ndGgsbC5sZW5ndGgpP2NlOnNlLGQ9cj1udWxsLGF9ZnVuY3Rpb24gYSh0KXtyZXR1cm4oZHx8KGQ9aShvLGwsYz9vZShlKTplLHMpKSkoK3QpfXZhciBpLGQscixvPXppLGw9emkscz1xaSxjPSExO3JldHVybiBhLmludmVydD1mdW5jdGlvbihlKXtyZXR1cm4ocnx8KHI9aShsLG8sZGUsYz9sZSh0KTp0KSkpKCtlKX0sYS5kb21haW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89YWkuY2FsbChlLElpKSxuKCkpOm8uc2xpY2UoKX0sYS5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1paS5jYWxsKGUpLG4oKSk6bC5zbGljZSgpfSxhLnJhbmdlUm91bmQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGw9aWkuY2FsbChlKSxzPVJpLG4oKX0sYS5jbGFtcD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0hIWUsbigpKTpjfSxhLmludGVycG9sYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPWUsbigpKTpzfSxuKCl9ZnVuY3Rpb24gZ2UoZSl7cmV0dXJuIG5ldyBmZShlKX1mdW5jdGlvbiBmZShlKXtpZighKHQ9S2kuZXhlYyhlKSkpdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGZvcm1hdDogJytlKTt2YXIgdCxuPXRbMV18fCcgJyxhPXRbMl18fCc+JyxpPXRbM118fCctJyxkPXRbNF18fCcnLHI9ISF0WzVdLG89dFs2XSYmK3RbNl0sbD0hIXRbN10scz10WzhdJiYrdFs4XS5zbGljZSgxKSxjPXRbOV18fCcnOyduJz09PWM/KGw9ITAsYz0nZycpOiEkaVtjXSYmKGM9JycpLChyfHwnMCc9PT1uJiYnPSc9PT1hKSYmKHI9ITAsbj0nMCcsYT0nPScpLHRoaXMuZmlsbD1uLHRoaXMuYWxpZ249YSx0aGlzLnNpZ249aSx0aGlzLnN5bWJvbD1kLHRoaXMuemVybz1yLHRoaXMud2lkdGg9byx0aGlzLmNvbW1hPWwsdGhpcy5wcmVjaXNpb249cyx0aGlzLnR5cGU9Y31mdW5jdGlvbiBiZShlKXt2YXIgdD1lLmRvbWFpbjtyZXR1cm4gZS50aWNrcz1mdW5jdGlvbihlKXt2YXIgbj10KCk7cmV0dXJuIHRpKG5bMF0sbltuLmxlbmd0aC0xXSxudWxsPT1lPzEwOmUpfSxlLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gYWQodCgpLGUsbil9LGUubmljZT1mdW5jdGlvbihuKXtudWxsPT1uJiYobj0xMCk7dmFyIGEsaT10KCksZD0wLHI9aS5sZW5ndGgtMSxvPWlbZF0sbD1pW3JdO3JldHVybiBsPG8mJihhPW8sbz1sLGw9YSxhPWQsZD1yLHI9YSksYT12KG8sbCxuKSwwPGE/KG89Rm4oby9hKSphLGw9UG4obC9hKSphLGE9dihvLGwsbikpOjA+YSYmKG89UG4obyphKS9hLGw9Rm4obCphKS9hLGE9dihvLGwsbikpLDA8YT8oaVtkXT1GbihvL2EpKmEsaVtyXT1QbihsL2EpKmEsdChpKSk6MD5hJiYoaVtkXT1QbihvKmEpL2EsaVtyXT1GbihsKmEpL2EsdChpKSksZX0sZX1mdW5jdGlvbiBoZSgpe3ZhciBlPXBlKGRlLExpKTtyZXR1cm4gZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHVlKGUsaGUoKSl9LGJlKGUpfWZ1bmN0aW9uIG1lKGUsdCxuLGEpe2Z1bmN0aW9uIGkodCl7cmV0dXJuIGUodD1uZXcgRGF0ZSgrdCkpLHR9cmV0dXJuIGkuZmxvb3I9aSxpLmNlaWw9ZnVuY3Rpb24obil7cmV0dXJuIGUobj1uZXcgRGF0ZShuLTEpKSx0KG4sMSksZShuKSxufSxpLnJvdW5kPWZ1bmN0aW9uKGUpe3ZhciB0PWkoZSksbj1pLmNlaWwoZSk7cmV0dXJuIGUtdDxuLWU/dDpufSxpLm9mZnNldD1mdW5jdGlvbihlLG4pe3JldHVybiB0KGU9bmV3IERhdGUoK2UpLG51bGw9PW4/MTpGbihuKSksZX0saS5yYW5nZT1mdW5jdGlvbihuLGEsZCl7dmFyIHI9W107aWYobj1pLmNlaWwobiksZD1udWxsPT1kPzE6Rm4oZCksIShuPGEpfHwhKDA8ZCkpcmV0dXJuIHI7ZG8gci5wdXNoKG5ldyBEYXRlKCtuKSk7d2hpbGUoKHQobixkKSxlKG4pLG48YSkpO3JldHVybiByfSxpLmZpbHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbWUoZnVuY3Rpb24odCl7aWYodD49dClmb3IoO2UodCksIW4odCk7KXQuc2V0VGltZSh0LTEpfSxmdW5jdGlvbihlLGEpe2lmKGU+PWUpaWYoMD5hKWZvcig7MD49KythOylmb3IoO3QoZSwtMSksIW4oZSk7KTtlbHNlIGZvcig7MDw9LS1hOylmb3IoO3QoZSwxKSwhbihlKTspO30pfSxuJiYoaS5jb3VudD1mdW5jdGlvbih0LGEpe3JldHVybiBpZC5zZXRUaW1lKCt0KSxkZC5zZXRUaW1lKCthKSxlKGlkKSxlKGRkKSxGbihuKGlkLGRkKSl9LGkuZXZlcnk9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9Rm4oZSksaXNGaW5pdGUoZSkmJjA8ZT8xPGU/aS5maWx0ZXIoYT9mdW5jdGlvbih0KXtyZXR1cm4gMD09YSh0KSVlfTpmdW5jdGlvbih0KXtyZXR1cm4gMD09aS5jb3VudCgwLHQpJWV9KTppOm51bGx9KSxpfWZ1bmN0aW9uIHllKGUpe3JldHVybiBtZShmdW5jdGlvbih0KXt0LnNldERhdGUodC5nZXREYXRlKCktKHQuZ2V0RGF5KCkrNy1lKSU3KSx0LnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihlLHQpe2Uuc2V0RGF0ZShlLmdldERhdGUoKSs3KnQpfSxmdW5jdGlvbihlLHQpe3JldHVybih0LWUtKHQuZ2V0VGltZXpvbmVPZmZzZXQoKS1lLmdldFRpbWV6b25lT2Zmc2V0KCkpKmxkKS91ZH0pfWZ1bmN0aW9uIHhlKGUpe3JldHVybiBtZShmdW5jdGlvbih0KXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCktKHQuZ2V0VVRDRGF5KCkrNy1lKSU3KSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihlLHQpe2Uuc2V0VVRDRGF0ZShlLmdldFVUQ0RhdGUoKSs3KnQpfSxmdW5jdGlvbihlLHQpe3JldHVybih0LWUpL3VkfSl9ZnVuY3Rpb24ga2UoZSl7aWYoMDw9ZS55JiYxMDA+ZS55KXt2YXIgdD1uZXcgRGF0ZSgtMSxlLm0sZS5kLGUuSCxlLk0sZS5TLGUuTCk7cmV0dXJuIHQuc2V0RnVsbFllYXIoZS55KSx0fXJldHVybiBuZXcgRGF0ZShlLnksZS5tLGUuZCxlLkgsZS5NLGUuUyxlLkwpfWZ1bmN0aW9uIHZlKGUpe2lmKDA8PWUueSYmMTAwPmUueSl7dmFyIHQ9bmV3IERhdGUoRGF0ZS5VVEMoLTEsZS5tLGUuZCxlLkgsZS5NLGUuUyxlLkwpKTtyZXR1cm4gdC5zZXRVVENGdWxsWWVhcihlLnkpLHR9cmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKGUueSxlLm0sZS5kLGUuSCxlLk0sZS5TLGUuTCkpfWZ1bmN0aW9uIHdlKGUpe3JldHVybnt5OmUsbTowLGQ6MSxIOjAsTTowLFM6MCxMOjB9fWZ1bmN0aW9uIENlKGUpe2Z1bmN0aW9uIHQoZSx0KXtyZXR1cm4gZnVuY3Rpb24oYSl7dmFyIGQscixvLGw9W10scz0tMSxpPTAsYz1lLmxlbmd0aDtmb3IoYSBpbnN0YW5jZW9mIERhdGV8fChhPW5ldyBEYXRlKCthKSk7KytzPGM7KTM3PT09ZS5jaGFyQ29kZUF0KHMpJiYobC5wdXNoKGUuc2xpY2UoaSxzKSksbnVsbD09KHI9SWRbZD1lLmNoYXJBdCgrK3MpXSk/cj0nZSc9PT1kPycgJzonMCc6ZD1lLmNoYXJBdCgrK3MpLChvPXRbZF0pJiYoZD1vKGEscikpLGwucHVzaChkKSxpPXMrMSk7cmV0dXJuIGwucHVzaChlLnNsaWNlKGkscykpLGwuam9pbignJyl9fWZ1bmN0aW9uIG4oZSx0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIHI9d2UoMTkwMCksZD1hKHIsZSxuKz0nJywwKTtpZihkIT1uLmxlbmd0aClyZXR1cm4gbnVsbDtpZigncCdpbiByJiYoci5IPXIuSCUxMisxMipyLnApLCdXJ2luIHJ8fCdVJ2luIHIpeyd3J2luIHJ8fChyLnc9J1cnaW4gcj8xOjApO3ZhciBpPSdaJ2luIHI/dmUod2Uoci55KSkuZ2V0VVRDRGF5KCk6dCh3ZShyLnkpKS5nZXREYXkoKTtyLm09MCxyLmQ9J1cnaW4gcj8oci53KzYpJTcrNypyLlctKGkrNSklNzpyLncrNypyLlUtKGkrNiklN31yZXR1cm4nWidpbiByPyhyLkgrPTB8ci5aLzEwMCxyLk0rPXIuWiUxMDAsdmUocikpOnQocil9fWZ1bmN0aW9uIGEoZSx0LGEsZCl7Zm9yKHZhciByLG8sbD0wLGk9dC5sZW5ndGgsbj1hLmxlbmd0aDtsPGk7KXtpZihkPj1uKXJldHVybi0xO2lmKHI9dC5jaGFyQ29kZUF0KGwrKyksMzc9PT1yKXtpZihyPXQuY2hhckF0KGwrKyksbz1fW3IgaW4gSWQ/dC5jaGFyQXQobCsrKTpyXSwhb3x8MD4oZD1vKGUsYSxkKSkpcmV0dXJuLTE7fWVsc2UgaWYociE9YS5jaGFyQ29kZUF0KGQrKykpcmV0dXJuLTF9cmV0dXJuIGR9dmFyIHI9ZS5kYXRlVGltZSxvPWUuZGF0ZSxsPWUudGltZSxpPWUucGVyaW9kcyxzPWUuZGF5cyxjPWUuc2hvcnREYXlzLHU9ZS5tb250aHMscD1lLnNob3J0TW9udGhzLGc9U2UoaSksZj1NZShpKSxiPVNlKHMpLGg9TWUocyksbT1TZShjKSx5PU1lKGMpLHg9U2UodSksaz1NZSh1KSx2PVNlKHApLHc9TWUocCksZD17YTpmdW5jdGlvbihlKXtyZXR1cm4gY1tlLmdldERheSgpXX0sQTpmdW5jdGlvbihlKXtyZXR1cm4gc1tlLmdldERheSgpXX0sYjpmdW5jdGlvbihlKXtyZXR1cm4gcFtlLmdldE1vbnRoKCldfSxCOmZ1bmN0aW9uKGUpe3JldHVybiB1W2UuZ2V0TW9udGgoKV19LGM6bnVsbCxkOkhlLGU6SGUsSDpZZSxJOkJlLGo6V2UsTDpWZSxtOiRlLE06S2UscDpmdW5jdGlvbihlKXtyZXR1cm4gaVsrKDEyPD1lLmdldEhvdXJzKCkpXX0sUzpYZSxVOkplLHc6UWUsVzpaZSx4Om51bGwsWDpudWxsLHk6R2UsWTpldCxaOnR0LCIlIjpodH0sQz17YTpmdW5jdGlvbihlKXtyZXR1cm4gY1tlLmdldFVUQ0RheSgpXX0sQTpmdW5jdGlvbihlKXtyZXR1cm4gc1tlLmdldFVUQ0RheSgpXX0sYjpmdW5jdGlvbihlKXtyZXR1cm4gcFtlLmdldFVUQ01vbnRoKCldfSxCOmZ1bmN0aW9uKGUpe3JldHVybiB1W2UuZ2V0VVRDTW9udGgoKV19LGM6bnVsbCxkOm50LGU6bnQsSDphdCxJOml0LGo6ZHQsTDpydCxtOm90LE06bHQscDpmdW5jdGlvbihlKXtyZXR1cm4gaVsrKDEyPD1lLmdldFVUQ0hvdXJzKCkpXX0sUzpzdCxVOmN0LHc6dXQsVzpwdCx4Om51bGwsWDpudWxsLHk6Z3QsWTpmdCxaOmJ0LCIlIjpodH0sXz17YTpmdW5jdGlvbihlLHQsYSl7dmFyIGk9bS5leGVjKHQuc2xpY2UoYSkpO3JldHVybiBpPyhlLnc9eVtpWzBdLnRvTG93ZXJDYXNlKCldLGEraVswXS5sZW5ndGgpOi0xfSxBOmZ1bmN0aW9uKGUsdCxhKXt2YXIgaT1iLmV4ZWModC5zbGljZShhKSk7cmV0dXJuIGk/KGUudz1oW2lbMF0udG9Mb3dlckNhc2UoKV0sYStpWzBdLmxlbmd0aCk6LTF9LGI6ZnVuY3Rpb24oZSx0LGEpe3ZhciBpPXYuZXhlYyh0LnNsaWNlKGEpKTtyZXR1cm4gaT8oZS5tPXdbaVswXS50b0xvd2VyQ2FzZSgpXSxhK2lbMF0ubGVuZ3RoKTotMX0sQjpmdW5jdGlvbihlLHQsYSl7dmFyIGk9eC5leGVjKHQuc2xpY2UoYSkpO3JldHVybiBpPyhlLm09a1tpWzBdLnRvTG93ZXJDYXNlKCldLGEraVswXS5sZW5ndGgpOi0xfSxjOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gYShlLHIsdCxuKX0sZDpxZSxlOnFlLEg6TmUsSTpOZSxqOlJlLEw6SWUsbTpPZSxNOlBlLHA6ZnVuY3Rpb24oZSx0LGEpe3ZhciBpPWcuZXhlYyh0LnNsaWNlKGEpKTtyZXR1cm4gaT8oZS5wPWZbaVswXS50b0xvd2VyQ2FzZSgpXSxhK2lbMF0ubGVuZ3RoKTotMX0sUzpGZSxVOkRlLHc6RWUsVzpMZSx4OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gYShlLG8sdCxuKX0sWDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGEoZSxsLHQsbil9LHk6QWUsWTpVZSxaOmplLCIlIjp6ZX07cmV0dXJuIGQueD10KG8sZCksZC5YPXQobCxkKSxkLmM9dChyLGQpLEMueD10KG8sQyksQy5YPXQobCxDKSxDLmM9dChyLEMpLHtmb3JtYXQ6ZnVuY3Rpb24oZSl7dmFyIG49dChlKz0nJyxkKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBlfSxufSxwYXJzZTpmdW5jdGlvbihlKXt2YXIgdD1uKGUrPScnLGtlKTtyZXR1cm4gdC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBlfSx0fSx1dGNGb3JtYXQ6ZnVuY3Rpb24oZSl7dmFyIG49dChlKz0nJyxDKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBlfSxufSx1dGNQYXJzZTpmdW5jdGlvbihlKXt2YXIgdD1uKGUsdmUpO3JldHVybiB0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHR9fX1mdW5jdGlvbiBfZShlLHQsbil7dmFyIGE9MD5lPyctJzonJyxpPShhPy1lOmUpKycnLGQ9aS5sZW5ndGg7cmV0dXJuIGErKGQ8bj9BcnJheShuLWQrMSkuam9pbih0KStpOmkpfWZ1bmN0aW9uIFRlKGUpe3JldHVybiBlLnJlcGxhY2UoWWQsJ1xcJCYnKX1mdW5jdGlvbiBTZShlKXtyZXR1cm4gbmV3IFJlZ0V4cCgnXig/OicrZS5tYXAoVGUpLmpvaW4oJ3wnKSsnKScsJ2knKX1mdW5jdGlvbiBNZShlKXtmb3IodmFyIHQ9e30sYT0tMSxpPWUubGVuZ3RoOysrYTxpOyl0W2VbYV0udG9Mb3dlckNhc2UoKV09YTtyZXR1cm4gdH1mdW5jdGlvbiBFZShlLHQsYSl7dmFyIGk9emQuZXhlYyh0LnNsaWNlKGEsYSsxKSk7cmV0dXJuIGk/KGUudz0raVswXSxhK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBEZShlLHQsYSl7dmFyIGk9emQuZXhlYyh0LnNsaWNlKGEpKTtyZXR1cm4gaT8oZS5VPStpWzBdLGEraVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIExlKGUsdCxhKXt2YXIgaT16ZC5leGVjKHQuc2xpY2UoYSkpO3JldHVybiBpPyhlLlc9K2lbMF0sYStpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gVWUoZSx0LGEpe3ZhciBpPXpkLmV4ZWModC5zbGljZShhLGErNCkpO3JldHVybiBpPyhlLnk9K2lbMF0sYStpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gQWUoZSx0LGEpe3ZhciBpPXpkLmV4ZWModC5zbGljZShhLGErMikpO3JldHVybiBpPyhlLnk9K2lbMF0rKDY4PCtpWzBdPzE5MDA6MmUzKSxhK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBqZShlLHQsYSl7dmFyIGk9L14oWil8KFsrLV1cZFxkKSg/Olw6PyhcZFxkKSk/Ly5leGVjKHQuc2xpY2UoYSxhKzYpKTtyZXR1cm4gaT8oZS5aPWlbMV0/MDotKGlbMl0rKGlbM118fCcwMCcpKSxhK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBPZShlLHQsYSl7dmFyIGk9emQuZXhlYyh0LnNsaWNlKGEsYSsyKSk7cmV0dXJuIGk/KGUubT1pWzBdLTEsYStpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcWUoZSx0LGEpe3ZhciBpPXpkLmV4ZWModC5zbGljZShhLGErMikpO3JldHVybiBpPyhlLmQ9K2lbMF0sYStpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gUmUoZSx0LGEpe3ZhciBpPXpkLmV4ZWModC5zbGljZShhLGErMykpO3JldHVybiBpPyhlLm09MCxlLmQ9K2lbMF0sYStpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gTmUoZSx0LGEpe3ZhciBpPXpkLmV4ZWModC5zbGljZShhLGErMikpO3JldHVybiBpPyhlLkg9K2lbMF0sYStpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gUGUoZSx0LGEpe3ZhciBpPXpkLmV4ZWModC5zbGljZShhLGErMikpO3JldHVybiBpPyhlLk09K2lbMF0sYStpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gRmUoZSx0LGEpe3ZhciBpPXpkLmV4ZWModC5zbGljZShhLGErMikpO3JldHVybiBpPyhlLlM9K2lbMF0sYStpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gSWUoZSx0LGEpe3ZhciBpPXpkLmV4ZWModC5zbGljZShhLGErMykpO3JldHVybiBpPyhlLkw9K2lbMF0sYStpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gemUoZSx0LGEpe3ZhciBpPUhkLmV4ZWModC5zbGljZShhLGErMSkpO3JldHVybiBpP2EraVswXS5sZW5ndGg6LTF9ZnVuY3Rpb24gSGUoZSx0KXtyZXR1cm4gX2UoZS5nZXREYXRlKCksdCwyKX1mdW5jdGlvbiBZZShlLHQpe3JldHVybiBfZShlLmdldEhvdXJzKCksdCwyKX1mdW5jdGlvbiBCZShlLHQpe3JldHVybiBfZShlLmdldEhvdXJzKCklMTJ8fDEyLHQsMil9ZnVuY3Rpb24gV2UoZSx0KXtyZXR1cm4gX2UoMStiZC5jb3VudChfZChlKSxlKSx0LDMpfWZ1bmN0aW9uIFZlKGUsdCl7cmV0dXJuIF9lKGUuZ2V0TWlsbGlzZWNvbmRzKCksdCwzKX1mdW5jdGlvbiAkZShlLHQpe3JldHVybiBfZShlLmdldE1vbnRoKCkrMSx0LDIpfWZ1bmN0aW9uIEtlKGUsdCl7cmV0dXJuIF9lKGUuZ2V0TWludXRlcygpLHQsMil9ZnVuY3Rpb24gWGUoZSx0KXtyZXR1cm4gX2UoZS5nZXRTZWNvbmRzKCksdCwyKX1mdW5jdGlvbiBKZShlLHQpe3JldHVybiBfZShoZC5jb3VudChfZChlKSxlKSx0LDIpfWZ1bmN0aW9uIFFlKGUpe3JldHVybiBlLmdldERheSgpfWZ1bmN0aW9uIFplKGUsdCl7cmV0dXJuIF9lKG1kLmNvdW50KF9kKGUpLGUpLHQsMil9ZnVuY3Rpb24gR2UoZSx0KXtyZXR1cm4gX2UoZS5nZXRGdWxsWWVhcigpJTEwMCx0LDIpfWZ1bmN0aW9uIGV0KGUsdCl7cmV0dXJuIF9lKGUuZ2V0RnVsbFllYXIoKSUxZTQsdCw0KX1mdW5jdGlvbiB0dChlKXt2YXIgdD1lLmdldFRpbWV6b25lT2Zmc2V0KCk7cmV0dXJuKDA8dD8nLSc6KHQqPS0xLCcrJykpK19lKDB8dC82MCwnMCcsMikrX2UodCU2MCwnMCcsMil9ZnVuY3Rpb24gbnQoZSx0KXtyZXR1cm4gX2UoZS5nZXRVVENEYXRlKCksdCwyKX1mdW5jdGlvbiBhdChlLHQpe3JldHVybiBfZShlLmdldFVUQ0hvdXJzKCksdCwyKX1mdW5jdGlvbiBpdChlLHQpe3JldHVybiBfZShlLmdldFVUQ0hvdXJzKCklMTJ8fDEyLHQsMil9ZnVuY3Rpb24gZHQoZSx0KXtyZXR1cm4gX2UoMStNZC5jb3VudChSZChlKSxlKSx0LDMpfWZ1bmN0aW9uIHJ0KGUsdCl7cmV0dXJuIF9lKGUuZ2V0VVRDTWlsbGlzZWNvbmRzKCksdCwzKX1mdW5jdGlvbiBvdChlLHQpe3JldHVybiBfZShlLmdldFVUQ01vbnRoKCkrMSx0LDIpfWZ1bmN0aW9uIGx0KGUsdCl7cmV0dXJuIF9lKGUuZ2V0VVRDTWludXRlcygpLHQsMil9ZnVuY3Rpb24gc3QoZSx0KXtyZXR1cm4gX2UoZS5nZXRVVENTZWNvbmRzKCksdCwyKX1mdW5jdGlvbiBjdChlLHQpe3JldHVybiBfZShFZC5jb3VudChSZChlKSxlKSx0LDIpfWZ1bmN0aW9uIHV0KGUpe3JldHVybiBlLmdldFVUQ0RheSgpfWZ1bmN0aW9uIHB0KGUsdCl7cmV0dXJuIF9lKERkLmNvdW50KFJkKGUpLGUpLHQsMil9ZnVuY3Rpb24gZ3QoZSx0KXtyZXR1cm4gX2UoZS5nZXRVVENGdWxsWWVhcigpJTEwMCx0LDIpfWZ1bmN0aW9uIGZ0KGUsdCl7cmV0dXJuIF9lKGUuZ2V0VVRDRnVsbFllYXIoKSUxZTQsdCw0KX1mdW5jdGlvbiBidCgpe3JldHVybicrMDAwMCd9ZnVuY3Rpb24gaHQoKXtyZXR1cm4nJSd9ZnVuY3Rpb24gbXQoZSl7dmFyIGE9ZS5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBlW05uKDAsSW4oYS0xLEZuKG4qYSkpKV19fWZ1bmN0aW9uIHl0KCl7Zm9yKHZhciBlLHQ9MCxhPWFyZ3VtZW50cy5sZW5ndGgsbj17fTt0PGE7Kyt0KXtpZighKGU9YXJndW1lbnRzW3RdKycnKXx8ZSBpbiBuKXRocm93IG5ldyBFcnJvcignaWxsZWdhbCB0eXBlOiAnK2UpO25bZV09W119cmV0dXJuIG5ldyB4dChuKX1mdW5jdGlvbiB4dChlKXt0aGlzLl89ZX1mdW5jdGlvbiBrdChlLG4pe3JldHVybiBlLnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24oZSl7dmFyIGE9JycsZD1lLmluZGV4T2YoJy4nKTtpZigwPD1kJiYoYT1lLnNsaWNlKGQrMSksZT1lLnNsaWNlKDAsZCkpLGUmJiFuLmhhc093blByb3BlcnR5KGUpKXRocm93IG5ldyBFcnJvcigndW5rbm93biB0eXBlOiAnK2UpO3JldHVybnt0eXBlOmUsbmFtZTphfX0pfWZ1bmN0aW9uIHZ0KGUsdCl7Zm9yKHZhciBhLGQ9MCxpPWUubGVuZ3RoO2Q8aTsrK2QpaWYoKGE9ZVtkXSkubmFtZT09PXQpcmV0dXJuIGEudmFsdWV9ZnVuY3Rpb24gd3QoZSx0LGEpe2Zvcih2YXIgZD0wLGk9ZS5sZW5ndGg7ZDxpOysrZClpZihlW2RdLm5hbWU9PT10KXtlW2RdPWVyLGU9ZS5zbGljZSgwLGQpLmNvbmNhdChlLnNsaWNlKGQrMSkpO2JyZWFrfXJldHVybiBudWxsIT1hJiZlLnB1c2goe25hbWU6dCx2YWx1ZTphfSksZX1mdW5jdGlvbiBDdChlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLm93bmVyRG9jdW1lbnQsbj10aGlzLm5hbWVzcGFjZVVSSTtyZXR1cm4gbj09PXRyJiZ0LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkk9PT10cj90LmNyZWF0ZUVsZW1lbnQoZSk6dC5jcmVhdGVFbGVtZW50TlMobixlKX19ZnVuY3Rpb24gX3QoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZS5zcGFjZSxlLmxvY2FsKX19ZnVuY3Rpb24gVHQoZSx0LG4pe3JldHVybiBlPVN0KGUsdCxuKSxmdW5jdGlvbih0KXt2YXIgbj10LnJlbGF0ZWRUYXJnZXQ7biYmKG49PT10aGlzfHw4Jm4uY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcykpfHxlLmNhbGwodGhpcyx0KX19ZnVuY3Rpb24gU3QoZSx0LG4pe3JldHVybiBmdW5jdGlvbihhKXt2YXIgaT1jcjtjcj1hO3RyeXtlLmNhbGwodGhpcyx0aGlzLl9fZGF0YV9fLHQsbil9ZmluYWxseXtjcj1pfX19ZnVuY3Rpb24gTXQoZSl7cmV0dXJuIGUudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcChmdW5jdGlvbihlKXt2YXIgbj0nJyxhPWUuaW5kZXhPZignLicpO3JldHVybiAwPD1hJiYobj1lLnNsaWNlKGErMSksZT1lLnNsaWNlKDAsYSkpLHt0eXBlOmUsbmFtZTpufX0pfWZ1bmN0aW9uIEV0KGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRoaXMuX19vbjtpZih0KXtmb3IodmFyIG4sYT0wLGQ9LTEsaT10Lmxlbmd0aDthPGk7KythKShuPXRbYV0sKCFlLnR5cGV8fG4udHlwZT09PWUudHlwZSkmJm4ubmFtZT09PWUubmFtZSk/dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG4udHlwZSxuLmxpc3RlbmVyLG4uY2FwdHVyZSk6dFsrK2RdPW47KytkP3QubGVuZ3RoPWQ6ZGVsZXRlIHRoaXMuX19vbn19fWZ1bmN0aW9uIER0KGUsdCxuKXt2YXIgYT1zci5oYXNPd25Qcm9wZXJ0eShlLnR5cGUpP1R0OlN0O3JldHVybiBmdW5jdGlvbihyLGQsaSl7dmFyIGwsbz10aGlzLl9fb24scz1hKHQsZCxpKTtpZihvKWZvcih2YXIgYz0wLHU9by5sZW5ndGg7Yzx1OysrYylpZigobD1vW2NdKS50eXBlPT09ZS50eXBlJiZsLm5hbWU9PT1lLm5hbWUpcmV0dXJuIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihsLnR5cGUsbC5saXN0ZW5lcixsLmNhcHR1cmUpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihsLnR5cGUsbC5saXN0ZW5lcj1zLGwuY2FwdHVyZT1uKSx2b2lkKGwudmFsdWU9dCk7dGhpcy5hZGRFdmVudExpc3RlbmVyKGUudHlwZSxzLG4pLGw9e3R5cGU6ZS50eXBlLG5hbWU6ZS5uYW1lLHZhbHVlOnQsbGlzdGVuZXI6cyxjYXB0dXJlOm59LG8/by5wdXNoKGwpOnRoaXMuX19vbj1bbF19fWZ1bmN0aW9uIEx0KGUsdCxuLGEpe3ZhciBpPWNyO2Uuc291cmNlRXZlbnQ9Y3IsY3I9ZTt0cnl7cmV0dXJuIHQuYXBwbHkobixhKX1maW5hbGx5e2NyPWl9fWZ1bmN0aW9uIFV0KCl7fWZ1bmN0aW9uIEF0KCl7cmV0dXJuW119ZnVuY3Rpb24ganQoZSx0KXt0aGlzLm93bmVyRG9jdW1lbnQ9ZS5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPWUubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9ZSx0aGlzLl9fZGF0YV9fPXR9ZnVuY3Rpb24gT3QoZSx0LG4sYSxkLHIpe2Zvcih2YXIgbyxsPTAsaT10Lmxlbmd0aCxzPXIubGVuZ3RoO2w8czsrK2wpKG89dFtsXSk/KG8uX19kYXRhX189cltsXSxhW2xdPW8pOm5bbF09bmV3IGp0KGUscltsXSk7Zm9yKDtsPGk7KytsKShvPXRbbF0pJiYoZFtsXT1vKX1mdW5jdGlvbiBxdChlLHQsbixhLGQscixvKXt2YXIgbCxpLHMsYz17fSx1PXQubGVuZ3RoLHA9ci5sZW5ndGgsZz1BcnJheSh1KTtmb3IobD0wO2w8dTsrK2wpKGk9dFtsXSkmJihnW2xdPXM9eHIrby5jYWxsKGksaS5fX2RhdGFfXyxsLHQpLHMgaW4gYz9kW2xdPWk6Y1tzXT1pKTtmb3IobD0wO2w8cDsrK2wpcz14citvLmNhbGwoZSxyW2xdLGwsciksKGk9Y1tzXSk/KGFbbF09aSxpLl9fZGF0YV9fPXJbbF0sY1tzXT1udWxsKTpuW2xdPW5ldyBqdChlLHJbbF0pO2ZvcihsPTA7bDx1OysrbCkoaT10W2xdKSYmY1tnW2xdXT09PWkmJihkW2xdPWkpfWZ1bmN0aW9uIFJ0KGUsdCl7cmV0dXJuIGU8dD8tMTplPnQ/MTplPj10PzA6TmFOfWZ1bmN0aW9uIE50KGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKGUpfX1mdW5jdGlvbiBQdChlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGUuc3BhY2UsZS5sb2NhbCl9fWZ1bmN0aW9uIEZ0KGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUoZSx0KX19ZnVuY3Rpb24gSXQoZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZU5TKGUuc3BhY2UsZS5sb2NhbCx0KX19ZnVuY3Rpb24genQoZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP3RoaXMucmVtb3ZlQXR0cmlidXRlKGUpOnRoaXMuc2V0QXR0cmlidXRlKGUsbil9fWZ1bmN0aW9uIEh0KGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGUuc3BhY2UsZS5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyhlLnNwYWNlLGUubG9jYWwsbil9fWZ1bmN0aW9uIFl0KGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkoZSl9fWZ1bmN0aW9uIEJ0KGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KGUsdCxuKX19ZnVuY3Rpb24gV3QoZSx0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBhPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWE/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShlKTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KGUsYSxuKX19ZnVuY3Rpb24gVnQoZSx0KXtyZXR1cm4gZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKHQpfHxrcihlKS5nZXRDb21wdXRlZFN0eWxlKGUsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSh0KX1mdW5jdGlvbiAkdChlKXtyZXR1cm4gZnVuY3Rpb24oKXtkZWxldGUgdGhpc1tlXX19ZnVuY3Rpb24gS3QoZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzW2VdPXR9fWZ1bmN0aW9uIFh0KGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj9kZWxldGUgdGhpc1tlXTp0aGlzW2VdPW59fWZ1bmN0aW9uIEp0KGUpe3JldHVybiBlLnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiBRdChlKXtyZXR1cm4gZS5jbGFzc0xpc3R8fG5ldyBadChlKX1mdW5jdGlvbiBadChlKXt0aGlzLl9ub2RlPWUsdGhpcy5fbmFtZXM9SnQoZS5nZXRBdHRyaWJ1dGUoJ2NsYXNzJyl8fCcnKX1mdW5jdGlvbiBHdChlLHQpe2Zvcih2YXIgYT1RdChlKSxkPS0xLGk9dC5sZW5ndGg7KytkPGk7KWEuYWRkKHRbZF0pfWZ1bmN0aW9uIGVuKGUsdCl7Zm9yKHZhciBhPVF0KGUpLGQ9LTEsaT10Lmxlbmd0aDsrK2Q8aTspYS5yZW1vdmUodFtkXSl9ZnVuY3Rpb24gdG4oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7R3QodGhpcyxlKX19ZnVuY3Rpb24gbm4oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7ZW4odGhpcyxlKX19ZnVuY3Rpb24gYW4oZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXsodC5hcHBseSh0aGlzLGFyZ3VtZW50cyk/R3Q6ZW4pKHRoaXMsZSl9fWZ1bmN0aW9uIGRuKCl7dGhpcy50ZXh0Q29udGVudD0nJ31mdW5jdGlvbiBybihlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PWV9fWZ1bmN0aW9uIG9uKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09dD8nJzp0fX1mdW5jdGlvbiBsbigpe3RoaXMuaW5uZXJIVE1MPScnfWZ1bmN0aW9uIHNuKGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPWV9fWZ1bmN0aW9uIGNuKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPW51bGw9PXQ/Jyc6dH19ZnVuY3Rpb24gdW4oKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gcG4oKXt0aGlzLnByZXZpb3VzU2libGluZyYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX1mdW5jdGlvbiBnbigpe3JldHVybiBudWxsfWZ1bmN0aW9uIGZuKCl7dmFyIGU9dGhpcy5wYXJlbnROb2RlO2UmJmUucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gYm4oZSx0LG4pe3ZhciBhPWtyKGUpLGk9YS5DdXN0b21FdmVudDsnZnVuY3Rpb24nPT10eXBlb2YgaT9pPW5ldyBpKHQsbik6KGk9YS5kb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKSxuPyhpLmluaXRFdmVudCh0LG4uYnViYmxlcyxuLmNhbmNlbGFibGUpLGkuZGV0YWlsPW4uZGV0YWlsKTppLmluaXRFdmVudCh0LCExLCExKSksZS5kaXNwYXRjaEV2ZW50KGkpfWZ1bmN0aW9uIGhuKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGJuKHRoaXMsZSx0KX19ZnVuY3Rpb24gbW4oZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYm4odGhpcyxlLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpKX19ZnVuY3Rpb24geW4oZSx0KXt0aGlzLl9ncm91cHM9ZSx0aGlzLl9wYXJlbnRzPXR9ZnVuY3Rpb24geG4oKXtjci5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBrbihlLHQpe3ZhciBuPWUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGE9d3IoZSkub24oJ2RyYWdzdGFydC5kcmFnJyxudWxsKTt0JiYoYS5vbignY2xpY2suZHJhZycsX3IsITApLHNldFRpbWVvdXQoZnVuY3Rpb24oKXthLm9uKCdjbGljay5kcmFnJyxudWxsKX0sMCkpLCdvbnNlbGVjdHN0YXJ0J2luIG4/YS5vbignc2VsZWN0c3RhcnQuZHJhZycsbnVsbCk6KG4uc3R5bGUuTW96VXNlclNlbGVjdD1uLl9fbm9zZWxlY3QsZGVsZXRlIG4uX19ub3NlbGVjdCl9ZnVuY3Rpb24gdm4oZSx0LG4sYSxpLGQscixvLGwscyl7dGhpcy50YXJnZXQ9ZSx0aGlzLnR5cGU9dCx0aGlzLnN1YmplY3Q9bix0aGlzLmlkZW50aWZpZXI9YSx0aGlzLmFjdGl2ZT1pLHRoaXMueD1kLHRoaXMueT1yLHRoaXMuZHg9byx0aGlzLmR5PWwsdGhpcy5fPXN9ZnVuY3Rpb24gd24oKXtyZXR1cm4hY3IuYnV0dG9ufWZ1bmN0aW9uIENuKCl7cmV0dXJuIHRoaXMucGFyZW50Tm9kZX1mdW5jdGlvbiBfbihlKXtyZXR1cm4gbnVsbD09ZT97eDpjci54LHk6Y3IueX06ZX1mdW5jdGlvbiBUbigpe3JldHVybidvbnRvdWNoc3RhcnQnaW4gdGhpc31mdW5jdGlvbiBTbihlKXtsZXQgdD1PcjsndW5kZWZpbmVkJyE9dHlwZW9mIGUuZ2l0aHViVXJsJiYodCs9YAogICAgPGgzIGlkPSJ1cGRhdGVzLWFuZC1jb3JyZWN0aW9ucyI+VXBkYXRlcyBhbmQgQ29ycmVjdGlvbnM8L2gzPgogICAgPHA+YCxlLmdpdGh1YkNvbXBhcmVVcGRhdGVzVXJsJiYodCs9YDxhIGhyZWY9IiR7ZS5naXRodWJDb21wYXJlVXBkYXRlc1VybH0iPlZpZXcgYWxsIGNoYW5nZXM8L2E+IHRvIHRoaXMgYXJ0aWNsZSBzaW5jZSBpdCB3YXMgZmlyc3QgcHVibGlzaGVkLmApLHQrPWAKICAgIElmIHlvdSBzZWUgbWlzdGFrZXMgb3Igd2FudCB0byBzdWdnZXN0IGNoYW5nZXMsIHBsZWFzZSA8YSBocmVmPSIke2UuZ2l0aHViVXJsKycvaXNzdWVzL25ldyd9Ij5jcmVhdGUgYW4gaXNzdWUgb24gR2l0SHViPC9hPi4gPC9wPgogICAgYCk7Y29uc3Qgbj1lLmpvdXJuYWw7cmV0dXJuJ3VuZGVmaW5lZCchPXR5cGVvZiBuJiYnRGlzdGlsbCc9PT1uLnRpdGxlJiYodCs9YAogICAgPGgzIGlkPSJyZXVzZSI+UmV1c2U8L2gzPgogICAgPHA+RGlhZ3JhbXMgYW5kIHRleHQgYXJlIGxpY2Vuc2VkIHVuZGVyIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gPGEgaHJlZj0iaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzQuMC8iPkNDLUJZIDQuMDwvYT4gd2l0aCB0aGUgPGEgY2xhc3M9ImdpdGh1YiIgaHJlZj0iJHtlLmdpdGh1YlVybH0iPnNvdXJjZSBhdmFpbGFibGUgb24gR2l0SHViPC9hPiwgdW5sZXNzIG5vdGVkIG90aGVyd2lzZS4gVGhlIGZpZ3VyZXMgdGhhdCBoYXZlIGJlZW4gcmV1c2VkIGZyb20gb3RoZXIgc291cmNlcyBkb27igJl0IGZhbGwgdW5kZXIgdGhpcyBsaWNlbnNlIGFuZCBjYW4gYmUgcmVjb2duaXplZCBieSBhIG5vdGUgaW4gdGhlaXIgY2FwdGlvbjog4oCcRmlndXJlIGZyb20g4oCm4oCdLjwvcD4KICAgIGApLCd1bmRlZmluZWQnIT10eXBlb2YgZS5wdWJsaXNoZWREYXRlJiYodCs9YAogICAgPGgzIGlkPSJjaXRhdGlvbiI+Q2l0YXRpb248L2gzPgogICAgPHA+Rm9yIGF0dHJpYnV0aW9uIGluIGFjYWRlbWljIGNvbnRleHRzLCBwbGVhc2UgY2l0ZSB0aGlzIHdvcmsgYXM8L3A+CiAgICA8cHJlIGNsYXNzPSJjaXRhdGlvbiBzaG9ydCI+JHtlLmNvbmNhdGVuYXRlZEF1dGhvcnN9LCAiJHtlLnRpdGxlfSIsIERpc3RpbGwsICR7ZS5wdWJsaXNoZWRZZWFyfS48L3ByZT4KICAgIDxwPkJpYlRlWCBjaXRhdGlvbjwvcD4KICAgIDxwcmUgY2xhc3M9ImNpdGF0aW9uIGxvbmciPiR7aChlKX08L3ByZT4KICAgIGApLHR9dmFyIE1uPU1hdGguc3FydCxFbj1NYXRoLmF0YW4yLERuPU1hdGguc2luLExuPU1hdGguY29zLFVuPU1hdGguUEksQW49TWF0aC5yb3VuZCxqbj1NYXRoLmFicyxPbj1NYXRoLnBvdyxxbj1NYXRoLkxOMTAsUm49TWF0aC5sb2csTm49TWF0aC5tYXgsUG49TWF0aC5jZWlsLEZuPU1hdGguZmxvb3IsSW49TWF0aC5taW47Y29uc3Qgem49WydTdW5kYXknLCdNb25kYXknLCdUdWVzZGF5JywnV2VkbmVzZGF5JywnVGh1cnNkYXknLCdGcmlkYXknLCdTYXR1cmRheSddLEhuPVsnSmFuLicsJ0ZlYi4nLCdNYXJjaCcsJ0FwcmlsJywnTWF5JywnSnVuZScsJ0p1bHknLCdBdWcuJywnU2VwdC4nLCdPY3QuJywnTm92LicsJ0RlYy4nXSxCbj0oZSk9PjEwPmU/JzAnK2U6ZSxXbj1mdW5jdGlvbihlKXtjb25zdCB0PXpuW2UuZ2V0RGF5KCldLnN1YnN0cmluZygwLDMpLG49Qm4oZS5nZXREYXRlKCkpLGE9SG5bZS5nZXRNb250aCgpXS5zdWJzdHJpbmcoMCwzKSxpPWUuZ2V0RnVsbFllYXIoKS50b1N0cmluZygpLGQ9ZS5nZXRVVENIb3VycygpLnRvU3RyaW5nKCkscj1lLmdldFVUQ01pbnV0ZXMoKS50b1N0cmluZygpLG89ZS5nZXRVVENTZWNvbmRzKCkudG9TdHJpbmcoKTtyZXR1cm5gJHt0fSwgJHtufSAke2F9ICR7aX0gJHtkfToke3J9OiR7b30gWmB9LFZuPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9QXJyYXkuZnJvbShlKS5yZWR1Y2UoKGUsW3Qsbl0pPT5PYmplY3QuYXNzaWduKGUse1t0XTpufSkse30pO3JldHVybiB0fSwkbj1mdW5jdGlvbihlKXtjb25zdCB0PW5ldyBNYXA7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmdC5zZXQobixlW25dKTtyZXR1cm4gdH07Y2xhc3MgSm57Y29uc3RydWN0b3IoZSl7dGhpcy5uYW1lPWUuYXV0aG9yLHRoaXMucGVyc29uYWxVUkw9ZS5hdXRob3JVUkwsdGhpcy5hZmZpbGlhdGlvbj1lLmFmZmlsaWF0aW9uLHRoaXMuYWZmaWxpYXRpb25VUkw9ZS5hZmZpbGlhdGlvblVSTH1nZXQgZmlyc3ROYW1lKCl7Y29uc3QgZT10aGlzLm5hbWUuc3BsaXQoJyAnKTtyZXR1cm4gZS5zbGljZSgwLGUubGVuZ3RoLTEpLmpvaW4oJyAnKX1nZXQgbGFzdE5hbWUoKXtjb25zdCBlPXRoaXMubmFtZS5zcGxpdCgnICcpO3JldHVybiBlW2UubGVuZ3RoLTFdfX1jbGFzcyBRbntjb25zdHJ1Y3Rvcigpe3RoaXMudGl0bGU9J3VubmFtZWQgYXJ0aWNsZScsdGhpcy5kZXNjcmlwdGlvbj0nJyx0aGlzLmF1dGhvcnM9W10sdGhpcy5iaWJsaW9ncmFwaHk9bmV3IE1hcCx0aGlzLmJpYmxpb2dyYXBoeVBhcnNlZD0hMSx0aGlzLmNpdGF0aW9ucz1bXSx0aGlzLmNpdGF0aW9uc0NvbGxlY3RlZD0hMSx0aGlzLmpvdXJuYWw9e30sdGhpcy5rYXRleD17fSx0aGlzLnB1Ymxpc2hlZERhdGU9dm9pZCAwfXNldCB1cmwoZSl7dGhpcy5fdXJsPWV9Z2V0IHVybCgpe2lmKHRoaXMuX3VybClyZXR1cm4gdGhpcy5fdXJsO3JldHVybiB0aGlzLmRpc3RpbGxQYXRoJiZ0aGlzLmpvdXJuYWwudXJsP3RoaXMuam91cm5hbC51cmwrJy8nK3RoaXMuZGlzdGlsbFBhdGg6dGhpcy5qb3VybmFsLnVybD90aGlzLmpvdXJuYWwudXJsOnZvaWQgMH1nZXQgZ2l0aHViVXJsKCl7cmV0dXJuIHRoaXMuZ2l0aHViUGF0aD8naHR0cHM6Ly9naXRodWIuY29tLycrdGhpcy5naXRodWJQYXRoOnZvaWQgMH1zZXQgcHJldmlld1VSTChlKXt0aGlzLl9wcmV2aWV3VVJMPWV9Z2V0IHByZXZpZXdVUkwoKXtyZXR1cm4gdGhpcy5fcHJldmlld1VSTD90aGlzLl9wcmV2aWV3VVJMOnRoaXMudXJsKycvdGh1bWJuYWlsLmpwZyd9Z2V0IHB1Ymxpc2hlZERhdGVSRkMoKXtyZXR1cm4gV24odGhpcy5wdWJsaXNoZWREYXRlKX1nZXQgdXBkYXRlZERhdGVSRkMoKXtyZXR1cm4gV24odGhpcy51cGRhdGVkRGF0ZSl9Z2V0IHB1Ymxpc2hlZFllYXIoKXtyZXR1cm4gdGhpcy5wdWJsaXNoZWREYXRlLmdldEZ1bGxZZWFyKCl9Z2V0IHB1Ymxpc2hlZE1vbnRoKCl7cmV0dXJuIEhuW3RoaXMucHVibGlzaGVkRGF0ZS5nZXRNb250aCgpXX1nZXQgcHVibGlzaGVkRGF5KCl7cmV0dXJuIHRoaXMucHVibGlzaGVkRGF0ZS5nZXREYXRlKCl9Z2V0IHB1Ymxpc2hlZE1vbnRoUGFkZGVkKCl7cmV0dXJuIEJuKHRoaXMucHVibGlzaGVkRGF0ZS5nZXRNb250aCgpKzEpfWdldCBwdWJsaXNoZWREYXlQYWRkZWQoKXtyZXR1cm4gQm4odGhpcy5wdWJsaXNoZWREYXRlLmdldERhdGUoKSl9Z2V0IHB1Ymxpc2hlZElTT0RhdGVPbmx5KCl7cmV0dXJuIHRoaXMucHVibGlzaGVkRGF0ZS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF19Z2V0IHZvbHVtZSgpe2NvbnN0IGU9dGhpcy5wdWJsaXNoZWRZZWFyLTIwMTU7aWYoMT5lKXRocm93IG5ldyBFcnJvcignSW52YWxpZCBwdWJsaXNoIGRhdGUgZGV0ZWN0ZWQgZHVyaW5nIGNvbXB1dGluZyB2b2x1bWUnKTtyZXR1cm4gZX1nZXQgaXNzdWUoKXtyZXR1cm4gdGhpcy5wdWJsaXNoZWREYXRlLmdldE1vbnRoKCkrMX1nZXQgY29uY2F0ZW5hdGVkQXV0aG9ycygpe2lmKDI8dGhpcy5hdXRob3JzLmxlbmd0aClyZXR1cm4gdGhpcy5hdXRob3JzWzBdLmxhc3ROYW1lKycsIGV0IGFsLic7cmV0dXJuIDI9PT10aGlzLmF1dGhvcnMubGVuZ3RoP3RoaXMuYXV0aG9yc1swXS5sYXN0TmFtZSsnICYgJyt0aGlzLmF1dGhvcnNbMV0ubGFzdE5hbWU6MT09PXRoaXMuYXV0aG9ycy5sZW5ndGg/dGhpcy5hdXRob3JzWzBdLmxhc3ROYW1lOnZvaWQgMH1nZXQgYmlidGV4QXV0aG9ycygpe3JldHVybiB0aGlzLmF1dGhvcnMubWFwKChlKT0+e3JldHVybiBlLmxhc3ROYW1lKycsICcrZS5maXJzdE5hbWV9KS5qb2luKCcgYW5kICcpfWdldCBzbHVnKCl7bGV0IGU9Jyc7cmV0dXJuIHRoaXMuYXV0aG9ycy5sZW5ndGgmJihlKz10aGlzLmF1dGhvcnNbMF0ubGFzdE5hbWUudG9Mb3dlckNhc2UoKSxlKz10aGlzLnB1Ymxpc2hlZFllYXIsZSs9dGhpcy50aXRsZS5zcGxpdCgnICcpWzBdLnRvTG93ZXJDYXNlKCkpLGV8fCdVbnRpdGxlZCd9Z2V0IGJpYmxpb2dyYXBoeUVudHJpZXMoKXtyZXR1cm4gbmV3IE1hcCh0aGlzLmNpdGF0aW9ucy5tYXAoKGUpPT57Y29uc3QgdD10aGlzLmJpYmxpb2dyYXBoeS5nZXQoZSk7cmV0dXJuW2UsdF19KSl9c2V0IGJpYmxpb2dyYXBoeShlKXtlIGluc3RhbmNlb2YgTWFwP3RoaXMuX2JpYmxpb2dyYXBoeT1lOidvYmplY3QnPT10eXBlb2YgZSYmKHRoaXMuX2JpYmxpb2dyYXBoeT0kbihlKSl9Z2V0IGJpYmxpb2dyYXBoeSgpe3JldHVybiB0aGlzLl9iaWJsaW9ncmFwaHl9c3RhdGljIGZyb21PYmplY3QoZSl7Y29uc3QgdD1uZXcgUW47cmV0dXJuIE9iamVjdC5hc3NpZ24odCxlKSx0fWFzc2lnblRvT2JqZWN0KGUpe09iamVjdC5hc3NpZ24oZSx0aGlzKSxlLmJpYmxpb2dyYXBoeT1Wbih0aGlzLmJpYmxpb2dyYXBoeUVudHJpZXMpLGUudXJsPXRoaXMudXJsLGUuZ2l0aHViVXJsPXRoaXMuZ2l0aHViVXJsLGUucHJldmlld1VSTD10aGlzLnByZXZpZXdVUkwsdGhpcy5wdWJsaXNoZWREYXRlJiYoZS52b2x1bWU9dGhpcy52b2x1bWUsZS5pc3N1ZT10aGlzLmlzc3VlLGUucHVibGlzaGVkRGF0ZVJGQz10aGlzLnB1Ymxpc2hlZERhdGVSRkMsZS5wdWJsaXNoZWRZZWFyPXRoaXMucHVibGlzaGVkWWVhcixlLnB1Ymxpc2hlZE1vbnRoPXRoaXMucHVibGlzaGVkTW9udGgsZS5wdWJsaXNoZWREYXk9dGhpcy5wdWJsaXNoZWREYXksZS5wdWJsaXNoZWRNb250aFBhZGRlZD10aGlzLnB1Ymxpc2hlZE1vbnRoUGFkZGVkLGUucHVibGlzaGVkRGF5UGFkZGVkPXRoaXMucHVibGlzaGVkRGF5UGFkZGVkKSx0aGlzLnVwZGF0ZWREYXRlJiYoZS51cGRhdGVkRGF0ZVJGQz10aGlzLnVwZGF0ZWREYXRlUkZDKSxlLmNvbmNhdGVuYXRlZEF1dGhvcnM9dGhpcy5jb25jYXRlbmF0ZWRBdXRob3JzLGUuYmlidGV4QXV0aG9ycz10aGlzLmJpYnRleEF1dGhvcnMsZS5zbHVnPXRoaXMuc2x1Z319Y29uc3QgR249KGUpPT57cmV0dXJuIGNsYXNzIGV4dGVuZHMgZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7Y29uc3QgZT17Y2hpbGRMaXN0OiEwLGNoYXJhY3RlckRhdGE6ITAsc3VidHJlZTohMH0sdD1uZXcgTXV0YXRpb25PYnNlcnZlcigoKT0+e3QuZGlzY29ubmVjdCgpLHRoaXMucmVuZGVySWZQb3NzaWJsZSgpLHQub2JzZXJ2ZSh0aGlzLGUpfSk7dC5vYnNlcnZlKHRoaXMsZSl9Y29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLHRoaXMucmVuZGVySWZQb3NzaWJsZSgpfXJlbmRlcklmUG9zc2libGUoKXt0aGlzLnRleHRDb250ZW50JiZ0aGlzLnJvb3QmJnRoaXMucmVuZGVyQ29udGVudCgpfXJlbmRlckNvbnRlbnQoKXtjb25zb2xlLmVycm9yKGBZb3VyIGNsYXNzICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSBtdXN0IHByb3ZpZGUgYSBjdXN0b20gcmVuZGVyQ29udGVudCgpIG1ldGhvZCFgKX19fSxlYT0oZSx0LG49ITApPT57cmV0dXJuKGEpPT57Y29uc3QgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO3JldHVybiBpLmlubmVySFRNTD10LG4mJidTaGFkeUNTUydpbiB3aW5kb3cmJlNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZShpLGUpLGNsYXNzIGV4dGVuZHMgYXtzdGF0aWMgZ2V0IGlzKCl7cmV0dXJuIGV9Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuY2xvbmU9ZG9jdW1lbnQuaW1wb3J0Tm9kZShpLmNvbnRlbnQsITApLG4mJih0aGlzLmF0dGFjaFNoYWRvdyh7bW9kZTonb3Blbid9KSx0aGlzLnNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQodGhpcy5jbG9uZSkpfWNvbm5lY3RlZENhbGxiYWNrKCl7bj8nU2hhZHlDU1MnaW4gd2luZG93JiZTaGFkeUNTUy5zdHlsZUVsZW1lbnQodGhpcyk6dGhpcy5pbnNlcnRCZWZvcmUodGhpcy5jbG9uZSx0aGlzLmZpcnN0Q2hpbGQpfWdldCByb290KCl7cmV0dXJuIG4/dGhpcy5zaGFkb3dSb290OnRoaXN9JChlKXtyZXR1cm4gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoZSl9JCQoZSl7cmV0dXJuIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKGUpfX19fTt2YXIgdGE9J3NwYW4ua2F0ZXgtZGlzcGxheSB7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIHBhZGRpbmc6IDhweCAwIDhweCAwO1xuICBtYXJnaW46IDAuNWVtIDAgMC41ZW0gMWVtO1xufVxuXG5zcGFuLmthdGV4IHtcbiAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuOCk7XG4gIGZvbnQtc2l6ZTogMS4xOGVtO1xufVxuJztjb25zdCBuYT1mdW5jdGlvbihlLHQsbil7bGV0IGE9bixpPTA7Zm9yKGNvbnN0IGQ9ZS5sZW5ndGg7YTx0Lmxlbmd0aDspe2NvbnN0IG49dFthXTtpZigwPj1pJiZ0LnNsaWNlKGEsYStkKT09PWUpcmV0dXJuIGE7J1xcJz09PW4/YSsrOid7Jz09PW4/aSsrOid9Jz09PW4mJmktLTthKyt9cmV0dXJuLTF9LGFhPWZ1bmN0aW9uKGUsdCxuLGEpe2NvbnN0IGQ9W107Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspaWYoJ3RleHQnPT09ZVtyXS50eXBlKXtjb25zdCBpPWVbcl0uZGF0YTtsZXQgbyxsPSEwLHM9MDtmb3Iobz1pLmluZGV4T2YodCksLTEhPT1vJiYocz1vLGQucHVzaCh7dHlwZTondGV4dCcsZGF0YTppLnNsaWNlKDAscyl9KSxsPSExKTs7KXtpZihsKXtpZihvPWkuaW5kZXhPZih0LHMpLC0xPT09bylicmVhaztkLnB1c2goe3R5cGU6J3RleHQnLGRhdGE6aS5zbGljZShzLG8pfSkscz1vfWVsc2V7aWYobz1uYShuLGkscyt0Lmxlbmd0aCksLTE9PT1vKWJyZWFrO2QucHVzaCh7dHlwZTonbWF0aCcsZGF0YTppLnNsaWNlKHMrdC5sZW5ndGgsbykscmF3RGF0YTppLnNsaWNlKHMsbytuLmxlbmd0aCksZGlzcGxheTphfSkscz1vK24ubGVuZ3RofWw9IWx9ZC5wdXNoKHt0eXBlOid0ZXh0JyxkYXRhOmkuc2xpY2Uocyl9KX1lbHNlIGQucHVzaChlW3JdKTtyZXR1cm4gZH0saWE9ZnVuY3Rpb24oZSx0KXtsZXQgbj1be3R5cGU6J3RleHQnLGRhdGE6ZX1dO2ZvcihsZXQgYT0wO2E8dC5sZW5ndGg7YSsrKXtjb25zdCBlPXRbYV07bj1hYShuLGUubGVmdCxlLnJpZ2h0LGUuZGlzcGxheXx8ITEpfXJldHVybiBufSxkYT1mdW5jdGlvbihlLHQpe2NvbnN0IG49aWEoZSx0LmRlbGltaXRlcnMpLGE9ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2ZvcihsZXQgZD0wO2Q8bi5sZW5ndGg7ZCsrKWlmKCd0ZXh0Jz09PW5bZF0udHlwZSlhLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG5bZF0uZGF0YSkpO2Vsc2V7Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkLW1hdGgnKSxpPW5bZF0uZGF0YTt0LmRpc3BsYXlNb2RlPW5bZF0uZGlzcGxheTt0cnl7ZS50ZXh0Q29udGVudD1pLHQuZGlzcGxheU1vZGUmJmUuc2V0QXR0cmlidXRlKCdibG9jaycsJycpfWNhdGNoKGkpe2lmKCEoaSBpbnN0YW5jZW9mIGthdGV4LlBhcnNlRXJyb3IpKXRocm93IGk7dC5lcnJvckNhbGxiYWNrKCdLYVRlWCBhdXRvLXJlbmRlcjogRmFpbGVkIHRvIHBhcnNlIGAnK25bZF0uZGF0YSsnYCB3aXRoICcsaSksYS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuW2RdLnJhd0RhdGEpKTtjb250aW51ZX1hLmFwcGVuZENoaWxkKGUpfXJldHVybiBhfSxyYT1mdW5jdGlvbihlLHQpe2ZvcihsZXQgbj0wO248ZS5jaGlsZE5vZGVzLmxlbmd0aDtuKyspe2NvbnN0IGE9ZS5jaGlsZE5vZGVzW25dO2lmKDM9PT1hLm5vZGVUeXBlKXtjb25zdCBpPWRhKGEudGV4dENvbnRlbnQsdCk7bis9aS5jaGlsZE5vZGVzLmxlbmd0aC0xLGUucmVwbGFjZUNoaWxkKGksYSl9ZWxzZSBpZigxPT09YS5ub2RlVHlwZSl7Y29uc3QgZT0tMT09PXQuaWdub3JlZFRhZ3MuaW5kZXhPZihhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO2UmJnJhKGEsdCl9fX0sb2E9e2RlbGltaXRlcnM6W3tsZWZ0OickJCcscmlnaHQ6JyQkJyxkaXNwbGF5OiEwfSx7bGVmdDonXFxbJyxyaWdodDonXFxdJyxkaXNwbGF5OiEwfSx7bGVmdDonXFwoJyxyaWdodDonXFwpJyxkaXNwbGF5OiExfV0saWdub3JlZFRhZ3M6WydzY3JpcHQnLCdub3NjcmlwdCcsJ3N0eWxlJywndGV4dGFyZWEnLCdwcmUnLCdjb2RlJywnc3ZnJ10sZXJyb3JDYWxsYmFjazpmdW5jdGlvbihlLHQpe2NvbnNvbGUuZXJyb3IoZSx0KX19LGxhPWZ1bmN0aW9uKGUsdCl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCdObyBlbGVtZW50IHByb3ZpZGVkIHRvIHJlbmRlcicpO2NvbnN0IG49T2JqZWN0LmFzc2lnbih7fSxvYSx0KTtyYShlLG4pfSxzYT0nPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Rpc3RpbGwucHViL3RoaXJkLXBhcnR5L2thdGV4L2thdGV4Lm1pbi5jc3MiIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiPicsY2E9ZWEoJ2QtbWF0aCcsYAoke3NhfQo8c3R5bGU+Cgo6aG9zdCB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGNvbnRhaW46IGNvbnRlbnQ7Cn0KCjpob3N0KFtibG9ja10pIHsKICBkaXNwbGF5OiBibG9jazsKfQoKJHt0YX0KPC9zdHlsZT4KPHNwYW4gaWQ9J2thdGV4LWNvbnRhaW5lcic+PC9zcGFuPgpgKTtjbGFzcyBUIGV4dGVuZHMgR24oY2EoSFRNTEVsZW1lbnQpKXtzdGF0aWMgc2V0IGthdGV4T3B0aW9ucyhlKXtULl9rYXRleE9wdGlvbnM9ZSxULmthdGV4T3B0aW9ucy5kZWxpbWl0ZXJzJiYoVC5rYXRleEFkZGVkP1Qua2F0ZXhMb2FkZWRDYWxsYmFjaygpOlQuYWRkS2F0ZXgoKSl9c3RhdGljIGdldCBrYXRleE9wdGlvbnMoKXtyZXR1cm4gVC5fa2F0ZXhPcHRpb25zfHwoVC5fa2F0ZXhPcHRpb25zPXtkZWxpbWl0ZXJzOlt7bGVmdDonJCQnLHJpZ2h0OickJCcsZGlzcGxheTohMX1dfSksVC5fa2F0ZXhPcHRpb25zfXN0YXRpYyBrYXRleExvYWRlZENhbGxiYWNrKCl7Y29uc3QgZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkLW1hdGgnKTtmb3IoY29uc3QgdCBvZiBlKXQucmVuZGVyQ29udGVudCgpO2lmKFQua2F0ZXhPcHRpb25zLmRlbGltaXRlcnMpe2NvbnN0IGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignZC1hcnRpY2xlJyk7bGEoZSxULmthdGV4T3B0aW9ucyl9fXN0YXRpYyBhZGRLYXRleCgpe2RvY3VtZW50LmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLHNhKTtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO2Uuc3JjPSdodHRwczovL2Rpc3RpbGwucHViL3RoaXJkLXBhcnR5L2thdGV4L2thdGV4Lm1pbi5qcycsZS5hc3luYz0hMCxlLm9ubG9hZD1ULmthdGV4TG9hZGVkQ2FsbGJhY2ssZS5jcm9zc29yaWdpbj0nYW5vbnltb3VzJyxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGUpLFQua2F0ZXhBZGRlZD0hMH1nZXQgb3B0aW9ucygpe2NvbnN0IGU9e2Rpc3BsYXlNb2RlOnRoaXMuaGFzQXR0cmlidXRlKCdibG9jaycpfTtyZXR1cm4gT2JqZWN0LmFzc2lnbihlLFQua2F0ZXhPcHRpb25zKX1jb25uZWN0ZWRDYWxsYmFjaygpe3N1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCksVC5rYXRleEFkZGVkfHxULmFkZEthdGV4KCl9cmVuZGVyQ29udGVudCgpe2lmKCd1bmRlZmluZWQnIT10eXBlb2Yga2F0ZXgpe2NvbnN0IGU9dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJyNrYXRleC1jb250YWluZXInKTtrYXRleC5yZW5kZXIodGhpcy50ZXh0Q29udGVudCxlLHRoaXMub3B0aW9ucyl9fX1ULmthdGV4QWRkZWQ9ITEsVC5pbmxpbmVNYXRoUmVuZGVyZWQ9ITEsd2luZG93LkRNYXRoPVQ7Y2xhc3MgdWEgZXh0ZW5kcyBIVE1MRWxlbWVudHtzdGF0aWMgZ2V0IGlzKCl7cmV0dXJuJ2QtZnJvbnQtbWF0dGVyJ31jb25zdHJ1Y3Rvcigpe3N1cGVyKCk7Y29uc3QgZT1uZXcgTXV0YXRpb25PYnNlcnZlcigoZSk9Pntmb3IoY29uc3QgdCBvZiBlKWlmKCdTQ1JJUFQnPT09dC50YXJnZXQubm9kZU5hbWV8fCdjaGFyYWN0ZXJEYXRhJz09PXQudHlwZSl7Y29uc3QgZT1zKHRoaXMpO3RoaXMubm90aWZ5KGUpfX0pO2Uub2JzZXJ2ZSh0aGlzLHtjaGlsZExpc3Q6ITAsY2hhcmFjdGVyRGF0YTohMCxzdWJ0cmVlOiEwfSl9bm90aWZ5KGUpe2NvbnN0IHQ9bmV3IEN1c3RvbUV2ZW50KCdvbkZyb250TWF0dGVyQ2hhbmdlZCcse2RldGFpbDplLGJ1YmJsZXM6ITB9KTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHQpfX12YXIgcGE9ZnVuY3Rpb24oZSx0KXtjb25zdCBuPWUuYm9keSxhPW4ucXVlcnlTZWxlY3RvcignZC1hcnRpY2xlJyk7aWYoIWEpcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCdObyBkLWFydGljbGUgdGFnIGZvdW5kOyBza2lwcGluZyBhZGRpbmcgb3B0aW9uYWwgY29tcG9uZW50cyEnKTtsZXQgaT1lLnF1ZXJ5U2VsZWN0b3IoJ2QtYnlsaW5lJyk7aXx8KHQuYXV0aG9ycz8oaT1lLmNyZWF0ZUVsZW1lbnQoJ2QtYnlsaW5lJyksbi5pbnNlcnRCZWZvcmUoaSxhKSk6Y29uc29sZS53YXJuKCdObyBhdXRob3JzIGZvdW5kIGluIGZyb250IG1hdHRlcjsgcGxlYXNlIGFkZCB0aGVtIGJlZm9yZSBzdWJtaXNzaW9uIScpKTtsZXQgZD1lLnF1ZXJ5U2VsZWN0b3IoJ2QtdGl0bGUnKTtpZighZCl7bGV0IHQ9ZS5jcmVhdGVFbGVtZW50KCdkLXRpdGxlJyk7bi5pbnNlcnRCZWZvcmUodCxpKX1sZXQgcj1kLnF1ZXJ5U2VsZWN0b3IoJ2gxJyk7cnx8KHI9ZS5jcmVhdGVFbGVtZW50KCdoMScpLHIudGV4dENvbnRlbnQ9dC50aXRsZSxkLmluc2VydEJlZm9yZShyLGQuZmlyc3RDaGlsZCkpO2NvbnN0IG89J3VuZGVmaW5lZCchPXR5cGVvZiB0LnBhc3N3b3JkO2xldCBsPW4ucXVlcnlTZWxlY3RvcignZC1pbnRlcnN0aXRpYWwnKTtpZihvJiYhbCl7Y29uc3QgYT0ndW5kZWZpbmVkJyE9dHlwZW9mIHdpbmRvdyxpPWEmJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZS5pbmNsdWRlcygnbG9jYWxob3N0Jyk7YSYmaXx8KGw9ZS5jcmVhdGVFbGVtZW50KCdkLWludGVyc3RpdGlhbCcpLGwucGFzc3dvcmQ9dC5wYXNzd29yZCxuLmluc2VydEJlZm9yZShsLG4uZmlyc3RDaGlsZCkpfWVsc2UhbyYmbCYmbC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMpO2xldCBzPWUucXVlcnlTZWxlY3RvcignZC1hcHBlbmRpeCcpO3N8fChzPWUuY3JlYXRlRWxlbWVudCgnZC1hcHBlbmRpeCcpLGUuYm9keS5hcHBlbmRDaGlsZChzKSk7bGV0IGM9ZS5xdWVyeVNlbGVjdG9yKCdkLWZvb3Rub3RlLWxpc3QnKTtjfHwoYz1lLmNyZWF0ZUVsZW1lbnQoJ2QtZm9vdG5vdGUtbGlzdCcpLHMuYXBwZW5kQ2hpbGQoYykpO2xldCB1PWUucXVlcnlTZWxlY3RvcignZC1jaXRhdGlvbi1saXN0Jyk7dXx8KHU9ZS5jcmVhdGVFbGVtZW50KCdkLWNpdGF0aW9uLWxpc3QnKSxzLmFwcGVuZENoaWxkKHUpKX07Y29uc3QgZ2E9bmV3IFFuLGZhPXtmcm9udE1hdHRlcjpnYSx3YWl0aW5nT246e2JpYmxpb2dyYXBoeTpbXSxjaXRhdGlvbnM6W119LGxpc3RlbmVyczp7b25DaXRlS2V5Q3JlYXRlZChlKXtjb25zdFt0LG5dPWUuZGV0YWlsO2lmKCFnYS5jaXRhdGlvbnNDb2xsZWN0ZWQpcmV0dXJuIHZvaWQgZmEud2FpdGluZ09uLmNpdGF0aW9ucy5wdXNoKCgpPT5mYS5saXN0ZW5lcnMub25DaXRlS2V5Q3JlYXRlZChlKSk7aWYoIWdhLmJpYmxpb2dyYXBoeVBhcnNlZClyZXR1cm4gdm9pZCBmYS53YWl0aW5nT24uYmlibGlvZ3JhcGh5LnB1c2goKCk9PmZhLmxpc3RlbmVycy5vbkNpdGVLZXlDcmVhdGVkKGUpKTtjb25zdCBhPW4ubWFwKChlKT0+Z2EuY2l0YXRpb25zLmluZGV4T2YoZSkpO3QubnVtYmVycz1hO2NvbnN0IGk9bi5tYXAoKGUpPT5nYS5iaWJsaW9ncmFwaHkuZ2V0KGUpKTt0LmVudHJpZXM9aX0sb25DaXRlS2V5Q2hhbmdlZCgpe2dhLmNpdGF0aW9ucz10KCksZ2EuY2l0YXRpb25zQ29sbGVjdGVkPSEwO2Zvcihjb25zdCBlIG9mIGZhLndhaXRpbmdPbi5jaXRhdGlvbnMuc2xpY2UoKSllKCk7Y29uc3QgZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdkLWNpdGF0aW9uLWxpc3QnKSxuPW5ldyBNYXAoZ2EuY2l0YXRpb25zLm1hcCgoZSk9PntyZXR1cm5bZSxnYS5iaWJsaW9ncmFwaHkuZ2V0KGUpXX0pKTtlLmNpdGF0aW9ucz1uO2NvbnN0IGE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZC1jaXRlJyk7Zm9yKGNvbnN0IGUgb2YgYSl7Y29uc3QgdD1lLmtleXMsbj10Lm1hcCgoZSk9PmdhLmNpdGF0aW9ucy5pbmRleE9mKGUpKTtlLm51bWJlcnM9bjtjb25zdCBhPXQubWFwKChlKT0+Z2EuYmlibGlvZ3JhcGh5LmdldChlKSk7ZS5lbnRyaWVzPWF9fSxvbkNpdGVLZXlSZW1vdmVkKGUpe2ZhLmxpc3RlbmVycy5vbkNpdGVLZXlDaGFuZ2VkKGUpfSxvbkJpYmxpb2dyYXBoeUNoYW5nZWQoZSl7Y29uc3QgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdkLWNpdGF0aW9uLWxpc3QnKSxuPWUuZGV0YWlsO2dhLmJpYmxpb2dyYXBoeT1uLGdhLmJpYmxpb2dyYXBoeVBhcnNlZD0hMDtmb3IoY29uc3QgdCBvZiBmYS53YWl0aW5nT24uYmlibGlvZ3JhcGh5LnNsaWNlKCkpdCgpO2lmKCFnYS5jaXRhdGlvbnNDb2xsZWN0ZWQpcmV0dXJuIHZvaWQgZmEud2FpdGluZ09uLmNpdGF0aW9ucy5wdXNoKGZ1bmN0aW9uKCl7ZmEubGlzdGVuZXJzLm9uQmlibGlvZ3JhcGh5Q2hhbmdlZCh7dGFyZ2V0OmUudGFyZ2V0LGRldGFpbDplLmRldGFpbH0pfSk7aWYodC5oYXNBdHRyaWJ1dGUoJ2Rpc3RpbGwtcHJlcmVuZGVyZWQnKSljb25zb2xlLmluZm8oJ0NpdGF0aW9uIGxpc3Qgd2FzIHByZXJlbmRlcmVkOyBub3QgdXBkYXRpbmcgaXQuJyk7ZWxzZXtjb25zdCBlPW5ldyBNYXAoZ2EuY2l0YXRpb25zLm1hcCgoZSk9PntyZXR1cm5bZSxnYS5iaWJsaW9ncmFwaHkuZ2V0KGUpXX0pKTt0LmNpdGF0aW9ucz1lfX0sb25Gb290bm90ZUNoYW5nZWQoKXtjb25zdCBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2QtZm9vdG5vdGUtbGlzdCcpO2lmKGUpe2NvbnN0IHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZC1mb290bm90ZScpO2UuZm9vdG5vdGVzPXR9fSxvbkZyb250TWF0dGVyQ2hhbmdlZCh0KXtjb25zdCBuPXQuZGV0YWlsO2UoZ2Esbik7Y29uc3QgYT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdkLWludGVyc3RpdGlhbCcpO2EmJigndW5kZWZpbmVkJz09dHlwZW9mIGdhLnBhc3N3b3JkP2EucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhKTphLnBhc3N3b3JkPWdhLnBhc3N3b3JkKTtjb25zdCBpPWRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCdkaXN0aWxsLXByZXJlbmRlcmVkJyk7aWYoIWkmJmMoKSl7cGEoZG9jdW1lbnQsZ2EpO2NvbnN0IGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignZGlzdGlsbC1hcHBlbmRpeCcpO2UmJihlLmZyb250TWF0dGVyPWdhKTtjb25zdCB0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2QtYnlsaW5lJyk7dCYmKHQuZnJvbnRNYXR0ZXI9Z2EpLG4ua2F0ZXgmJihULmthdGV4T3B0aW9ucz1uLmthdGV4KX19LERPTUNvbnRlbnRMb2FkZWQoKXtpZihmYS5sb2FkZWQpcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKCdDb250cm9sbGVyIHJlY2VpdmVkIERPTUNvbnRlbnRMb2FkZWQgYnV0IHdhcyBhbHJlYWR5IGxvYWRlZCEnKTtpZighYygpKXJldHVybiB2b2lkIGNvbnNvbGUud2FybignQ29udHJvbGxlciByZWNlaXZlZCBET01Db250ZW50TG9hZGVkIGJlZm9yZSBhcHByb3ByaWF0ZSBkb2N1bWVudC5yZWFkeVN0YXRlIScpO2ZhLmxvYWRlZD0hMCxjb25zb2xlLmxvZygnUnVubGV2ZWwgNDogQ29udHJvbGxlciBydW5uaW5nIERPTUNvbnRlbnRMb2FkZWQnKTtjb25zdCBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2QtZnJvbnQtbWF0dGVyJyksbj1zKGUpO2ZhLmxpc3RlbmVycy5vbkZyb250TWF0dGVyQ2hhbmdlZCh7ZGV0YWlsOm59KSxnYS5jaXRhdGlvbnM9dCgpLGdhLmNpdGF0aW9uc0NvbGxlY3RlZD0hMDtmb3IoY29uc3QgZSBvZiBmYS53YWl0aW5nT24uY2l0YXRpb25zLnNsaWNlKCkpZSgpO2lmKGdhLmJpYmxpb2dyYXBoeVBhcnNlZClmb3IoY29uc3QgZSBvZiBmYS53YWl0aW5nT24uYmlibGlvZ3JhcGh5LnNsaWNlKCkpZSgpO2NvbnN0IGE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignZC1mb290bm90ZS1saXN0Jyk7aWYoYSl7Y29uc3QgZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkLWZvb3Rub3RlJyk7YS5mb290bm90ZXM9ZX19fX07Y29uc3QgYmE9J2h0bWwge1xuICBmb250LXNpemU6IDE0cHg7XG5cdGxpbmUtaGVpZ2h0OiAxLjZlbTtcbiAgLyogZm9udC1mYW1pbHk6ICJMaWJyZSBGcmFua2xpbiIsICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7ICovXG4gIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICJTZWdvZSBVSSIsIFJvYm90bywgT3h5Z2VuLCBVYnVudHUsIENhbnRhcmVsbCwgIkZpcmEgU2FucyIsICJEcm9pZCBTYW5zIiwgIkhlbHZldGljYSBOZXVlIiwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIC8qLCAiQXBwbGUgQ29sb3IgRW1vamkiLCAiU2Vnb2UgVUkgRW1vamkiLCAiU2Vnb2UgVUkgU3ltYm9sIjsqL1xuICB0ZXh0LXNpemUtYWRqdXN0OiAxMDAlO1xuICAtbXMtdGV4dC1zaXplLWFkanVzdDogMTAwJTtcbiAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlO1xufVxuXG5AbWVkaWEobWluLXdpZHRoOiA3NjhweCkge1xuICBodG1sIHtcbiAgICBmb250LXNpemU6IDE2cHg7XG4gIH1cbn1cblxuYm9keSB7XG4gIG1hcmdpbjogMDtcbn1cblxuYSB7XG4gIGNvbG9yOiAjMDA0Mjc2O1xufVxuXG5maWd1cmUge1xuICBtYXJnaW46IDA7XG59XG5cbnRhYmxlIHtcblx0Ym9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcblx0Ym9yZGVyLXNwYWNpbmc6IDA7XG59XG5cbnRhYmxlIHRoIHtcblx0dGV4dC1hbGlnbjogbGVmdDtcbn1cblxudGFibGUgdGhlYWQge1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjA1KTtcbn1cblxudGFibGUgdGhlYWQgdGgge1xuICBwYWRkaW5nLWJvdHRvbTogMC41ZW07XG59XG5cbnRhYmxlIHRib2R5IDpmaXJzdC1jaGlsZCB0ZCB7XG4gIHBhZGRpbmctdG9wOiAwLjVlbTtcbn1cblxucHJlIHtcbiAgb3ZlcmZsb3c6IGF1dG87XG4gIG1heC13aWR0aDogMTAwJTtcbn1cblxucCB7XG4gIG1hcmdpbi10b3A6IDA7XG4gIG1hcmdpbi1ib3R0b206IDFlbTtcbn1cblxuc3VwLCBzdWIge1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdG9wOiAtMC40ZW07XG4gIGxpbmUtaGVpZ2h0OiAxZW07XG59XG5cbnN1YiB7XG4gIHRvcDogMC40ZW07XG59XG5cbi5raWNrZXIsXG4ubWFya2VyIHtcbiAgZm9udC1zaXplOiAxNXB4O1xuICBmb250LXdlaWdodDogNjAwO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjUpO1xufVxuXG5cbi8qIEhlYWRsaW5lICovXG5cbkBtZWRpYShtaW4td2lkdGg6IDEwMjRweCkge1xuICBkLXRpdGxlIGgxIHNwYW4ge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG59XG5cbi8qIEZpZ3VyZSAqL1xuXG5maWd1cmUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIG1hcmdpbi1ib3R0b206IDIuNWVtO1xuICBtYXJnaW4tdG9wOiAxLjVlbTtcbn1cblxuZmlnY2FwdGlvbitmaWd1cmUge1xuXG59XG5cbmZpZ3VyZSBpbWcge1xuICB3aWR0aDogMTAwJTtcbn1cblxuZmlndXJlIHN2ZyB0ZXh0LFxuZmlndXJlIHN2ZyB0c3BhbiB7XG59XG5cbmZpZ2NhcHRpb24sXG4uZmlnY2FwdGlvbiB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNik7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGluZS1oZWlnaHQ6IDEuNWVtO1xufVxuXG5AbWVkaWEobWluLXdpZHRoOiAxMDI0cHgpIHtcbmZpZ2NhcHRpb24sXG4uZmlnY2FwdGlvbiB7XG4gICAgZm9udC1zaXplOiAxM3B4O1xuICB9XG59XG5cbmZpZ3VyZS5leHRlcm5hbCBpbWcge1xuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEpO1xuICBib3gtc2hhZG93OiAwIDFweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEpO1xuICBwYWRkaW5nOiAxOHB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG5maWdjYXB0aW9uIGEge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjYpO1xufVxuXG5maWdjYXB0aW9uIGIsXG5maWdjYXB0aW9uIHN0cm9uZywge1xuICBmb250LXdlaWdodDogNjAwO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAxLjApO1xufVxuJysnQHN1cHBvcnRzIG5vdCAoZGlzcGxheTogZ3JpZCkge1xuICAuYmFzZS1ncmlkLFxuICBkaXN0aWxsLWhlYWRlcixcbiAgZC10aXRsZSxcbiAgZC1hYnN0cmFjdCxcbiAgZC1hcnRpY2xlLFxuICBkLWFwcGVuZGl4LFxuICBkaXN0aWxsLWFwcGVuZGl4LFxuICBkLWJ5bGluZSxcbiAgZC1mb290bm90ZS1saXN0LFxuICBkLWNpdGF0aW9uLWxpc3QsXG4gIGRpc3RpbGwtZm9vdGVyIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwYWRkaW5nOiA4cHg7XG4gIH1cbn1cblxuLmJhc2UtZ3JpZCxcbmRpc3RpbGwtaGVhZGVyLFxuZC10aXRsZSxcbmQtYWJzdHJhY3QsXG5kLWFydGljbGUsXG5kLWFwcGVuZGl4LFxuZGlzdGlsbC1hcHBlbmRpeCxcbmQtYnlsaW5lLFxuZC1mb290bm90ZS1saXN0LFxuZC1jaXRhdGlvbi1saXN0LFxuZGlzdGlsbC1mb290ZXIge1xuICBkaXNwbGF5OiBncmlkO1xuICBqdXN0aWZ5LWl0ZW1zOiBzdHJldGNoO1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IFtzY3JlZW4tc3RhcnRdIDhweCBbcGFnZS1zdGFydCBraWNrZXItc3RhcnQgdGV4dC1zdGFydCBndXR0ZXItc3RhcnQgbWlkZGxlLXN0YXJ0XSAxZnIgMWZyIDFmciAxZnIgMWZyIDFmciAxZnIgMWZyIFt0ZXh0LWVuZCBwYWdlLWVuZCBndXR0ZXItZW5kIGtpY2tlci1lbmQgbWlkZGxlLWVuZF0gOHB4IFtzY3JlZW4tZW5kXTtcbiAgZ3JpZC1jb2x1bW4tZ2FwOiA4cHg7XG59XG5cbi5ncmlkIHtcbiAgZGlzcGxheTogZ3JpZDtcbiAgZ3JpZC1jb2x1bW4tZ2FwOiA4cHg7XG59XG5cbkBtZWRpYShtaW4td2lkdGg6IDc2OHB4KSB7XG4gIC5iYXNlLWdyaWQsXG4gIGRpc3RpbGwtaGVhZGVyLFxuICBkLXRpdGxlLFxuICBkLWFic3RyYWN0LFxuICBkLWFydGljbGUsXG4gIGQtYXBwZW5kaXgsXG4gIGRpc3RpbGwtYXBwZW5kaXgsXG4gIGQtYnlsaW5lLFxuICBkLWZvb3Rub3RlLWxpc3QsXG4gIGQtY2l0YXRpb24tbGlzdCxcbiAgZGlzdGlsbC1mb290ZXIge1xuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogW3NjcmVlbi1zdGFydF0gMWZyIFtwYWdlLXN0YXJ0IGtpY2tlci1zdGFydCBtaWRkbGUtc3RhcnQgdGV4dC1zdGFydF0gNDVweCA0NXB4IDQ1cHggNDVweCA0NXB4IDQ1cHggNDVweCA0NXB4IFsga2lja2VyLWVuZCB0ZXh0LWVuZCBndXR0ZXItc3RhcnRdIDQ1cHggW21pZGRsZS1lbmRdIDQ1cHggW3BhZ2UtZW5kIGd1dHRlci1lbmRdIDFmciBbc2NyZWVuLWVuZF07XG4gICAgZ3JpZC1jb2x1bW4tZ2FwOiAxNnB4O1xuICB9XG5cbiAgLmdyaWQge1xuICAgIGdyaWQtY29sdW1uLWdhcDogMTZweDtcbiAgfVxufVxuXG5AbWVkaWEobWluLXdpZHRoOiAxMDAwcHgpIHtcbiAgLmJhc2UtZ3JpZCxcbiAgZGlzdGlsbC1oZWFkZXIsXG4gIGQtdGl0bGUsXG4gIGQtYWJzdHJhY3QsXG4gIGQtYXJ0aWNsZSxcbiAgZC1hcHBlbmRpeCxcbiAgZGlzdGlsbC1hcHBlbmRpeCxcbiAgZC1ieWxpbmUsXG4gIGQtZm9vdG5vdGUtbGlzdCxcbiAgZC1jaXRhdGlvbi1saXN0LFxuICBkaXN0aWxsLWZvb3RlciB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBbc2NyZWVuLXN0YXJ0XSAxZnIgW3BhZ2Utc3RhcnQga2lja2VyLXN0YXJ0XSA1MHB4IFttaWRkbGUtc3RhcnRdIDUwcHggW3RleHQtc3RhcnQga2lja2VyLWVuZF0gNTBweCA1MHB4IDUwcHggNTBweCA1MHB4IDUwcHggNTBweCA1MHB4IFt0ZXh0LWVuZCBndXR0ZXItc3RhcnRdIDUwcHggW21pZGRsZS1lbmRdIDUwcHggW3BhZ2UtZW5kIGd1dHRlci1lbmRdIDFmciBbc2NyZWVuLWVuZF07XG4gICAgZ3JpZC1jb2x1bW4tZ2FwOiAxNnB4O1xuICB9XG5cbiAgLmdyaWQge1xuICAgIGdyaWQtY29sdW1uLWdhcDogMTZweDtcbiAgfVxufVxuXG5AbWVkaWEobWluLXdpZHRoOiAxMTgwcHgpIHtcbiAgLmJhc2UtZ3JpZCxcbiAgZGlzdGlsbC1oZWFkZXIsXG4gIGQtdGl0bGUsXG4gIGQtYWJzdHJhY3QsXG4gIGQtYXJ0aWNsZSxcbiAgZC1hcHBlbmRpeCxcbiAgZGlzdGlsbC1hcHBlbmRpeCxcbiAgZC1ieWxpbmUsXG4gIGQtZm9vdG5vdGUtbGlzdCxcbiAgZC1jaXRhdGlvbi1saXN0LFxuICBkaXN0aWxsLWZvb3RlciB7XG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiBbc2NyZWVuLXN0YXJ0XSAxZnIgW3BhZ2Utc3RhcnQga2lja2VyLXN0YXJ0XSA2MHB4IFttaWRkbGUtc3RhcnRdIDYwcHggW3RleHQtc3RhcnQga2lja2VyLWVuZF0gNjBweCA2MHB4IDYwcHggNjBweCA2MHB4IDYwcHggNjBweCA2MHB4IFt0ZXh0LWVuZCBndXR0ZXItc3RhcnRdIDYwcHggW21pZGRsZS1lbmRdIDYwcHggW3BhZ2UtZW5kIGd1dHRlci1lbmRdIDFmciBbc2NyZWVuLWVuZF07XG4gICAgZ3JpZC1jb2x1bW4tZ2FwOiAzMnB4O1xuICB9XG5cbiAgLmdyaWQge1xuICAgIGdyaWQtY29sdW1uLWdhcDogMzJweDtcbiAgfVxufVxuXG5cblxuXG4uYmFzZS1ncmlkIHtcbiAgZ3JpZC1jb2x1bW46IHNjcmVlbjtcbn1cblxuLyogLmwtYm9keSxcbmQtYXJ0aWNsZSA+ICogIHtcbiAgZ3JpZC1jb2x1bW46IHRleHQ7XG59XG5cbi5sLXBhZ2UsXG5kLXRpdGxlID4gKixcbmQtZmlndXJlIHtcbiAgZ3JpZC1jb2x1bW46IHBhZ2U7XG59ICovXG5cbi5sLWd1dHRlciB7XG4gIGdyaWQtY29sdW1uOiBndXR0ZXI7XG59XG5cbi5sLXRleHQsXG4ubC1ib2R5IHtcbiAgZ3JpZC1jb2x1bW46IHRleHQ7XG59XG5cbi5sLXBhZ2Uge1xuICBncmlkLWNvbHVtbjogcGFnZTtcbn1cblxuLmwtYm9keS1vdXRzZXQge1xuICBncmlkLWNvbHVtbjogbWlkZGxlO1xufVxuXG4ubC1wYWdlLW91dHNldCB7XG4gIGdyaWQtY29sdW1uOiBwYWdlO1xufVxuXG4ubC1zY3JlZW4ge1xuICBncmlkLWNvbHVtbjogc2NyZWVuO1xufVxuXG4ubC1zY3JlZW4taW5zZXQge1xuICBncmlkLWNvbHVtbjogc2NyZWVuO1xuICBwYWRkaW5nLWxlZnQ6IDE2cHg7XG4gIHBhZGRpbmctbGVmdDogMTZweDtcbn1cblxuXG4vKiBBc2lkZSAqL1xuXG5kLWFydGljbGUgYXNpZGUge1xuICBncmlkLWNvbHVtbjogZ3V0dGVyO1xuICBmb250LXNpemU6IDEycHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjZlbTtcbiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC42KVxufVxuXG5AbWVkaWEobWluLXdpZHRoOiA3NjhweCkge1xuICBhc2lkZSB7XG4gICAgZ3JpZC1jb2x1bW46IGd1dHRlcjtcbiAgfVxuXG4gIC5zaWRlIHtcbiAgICBncmlkLWNvbHVtbjogZ3V0dGVyO1xuICB9XG59XG4nKydkLXRpdGxlIHtcbiAgcGFkZGluZzogMnJlbSAwIDEuNXJlbTtcbiAgY29udGFpbjogbGF5b3V0IHN0eWxlO1xuICBvdmVyZmxvdy14OiBoaWRkZW47XG59XG5cbkBtZWRpYShtaW4td2lkdGg6IDc2OHB4KSB7XG4gIGQtdGl0bGUge1xuICAgIHBhZGRpbmc6IDRyZW0gMCAxLjVyZW07XG4gIH1cbn1cblxuZC10aXRsZSBoMSB7XG4gIGdyaWQtY29sdW1uOiB0ZXh0O1xuICBmb250LXNpemU6IDQwcHg7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGxpbmUtaGVpZ2h0OiAxLjFlbTtcbiAgbWFyZ2luOiAwIDAgMC41cmVtO1xufVxuXG5AbWVkaWEobWluLXdpZHRoOiA3NjhweCkge1xuICBkLXRpdGxlIGgxIHtcbiAgICBmb250LXNpemU6IDUwcHg7XG4gIH1cbn1cblxuZC10aXRsZSBwIHtcbiAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgZm9udC1zaXplOiAxLjJyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjU1ZW07XG4gIGdyaWQtY29sdW1uOiB0ZXh0O1xufVxuXG5kLXRpdGxlIC5zdGF0dXMge1xuICBtYXJnaW4tdG9wOiAwcHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6ICMwMDk2ODg7XG4gIG9wYWNpdHk6IDAuODtcbiAgZ3JpZC1jb2x1bW46IGtpY2tlcjtcbn1cblxuZC10aXRsZSAuc3RhdHVzIHNwYW4ge1xuICBsaW5lLWhlaWdodDogMTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwYWRkaW5nOiA2cHggMDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM4MGNiYzQ7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbn1cbicrJ2QtYnlsaW5lIHtcbiAgY29udGFpbjogY29udGVudDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xKTtcbiAgZm9udC1zaXplOiAwLjhyZW07XG4gIGxpbmUtaGVpZ2h0OiAxLjhlbTtcbiAgcGFkZGluZzogMS41cmVtIDA7XG4gIG1pbi1oZWlnaHQ6IDEuOGVtO1xufVxuXG5cbmQtYnlsaW5lIC5ieWxpbmUge1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7XG4gIGdyaWQtY29sdW1uOiB0ZXh0O1xufVxuXG5AbWVkaWEobWluLXdpZHRoOiA3NjhweCkge1xuICBkLWJ5bGluZSAuYnlsaW5lIHtcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnIgMWZyIDFmcjtcbiAgfVxufVxuXG5kLWJ5bGluZSAuYXV0aG9ycy1hZmZpbGlhdGlvbnMge1xuICBncmlkLWNvbHVtbi1lbmQ6IHNwYW4gMjtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyO1xuICBtYXJnaW4tYm90dG9tOiAxZW07XG59XG5cbkBtZWRpYShtaW4td2lkdGg6IDc2OHB4KSB7XG4gIGQtYnlsaW5lIC5hdXRob3JzLWFmZmlsaWF0aW9ucyB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgfVxufVxuXG5kLWJ5bGluZSBoMyB7XG4gIGZvbnQtc2l6ZTogMC42cmVtO1xuICBmb250LXdlaWdodDogNDAwO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjUpO1xuICBtYXJnaW46IDA7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG59XG5cbmQtYnlsaW5lIHAge1xuICBtYXJnaW46IDA7XG59XG5cbmQtYnlsaW5lIGEsXG5kLWFydGljbGUgZC1ieWxpbmUgYSB7XG4gIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuOCk7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbn1cblxuZC1hcnRpY2xlIGQtYnlsaW5lIGE6aG92ZXIge1xuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgYm9yZGVyLWJvdHRvbTogbm9uZTtcbn1cblxuZC1ieWxpbmUgcC5hdXRob3Ige1xuICBmb250LXdlaWdodDogNTAwO1xufVxuXG5kLWJ5bGluZSAuYWZmaWxpYXRpb25zIHtcblxufVxuJysnZC1hcnRpY2xlIHtcbiAgY29udGFpbjogbGF5b3V0IHN0eWxlO1xuICBvdmVyZmxvdy14OiBoaWRkZW47XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMSk7XG4gIHBhZGRpbmctdG9wOiAycmVtO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjgpO1xufVxuXG5kLWFydGljbGUgPiAqIHtcbiAgZ3JpZC1jb2x1bW46IHRleHQ7XG59XG5cbkBtZWRpYShtaW4td2lkdGg6IDc2OHB4KSB7XG4gIGQtYXJ0aWNsZSB7XG4gICAgZm9udC1zaXplOiAxNnB4O1xuICB9XG59XG5cbkBtZWRpYShtaW4td2lkdGg6IDEwMjRweCkge1xuICBkLWFydGljbGUge1xuICAgIGZvbnQtc2l6ZTogMS4wNnJlbTtcbiAgICBsaW5lLWhlaWdodDogMS43ZW07XG4gIH1cbn1cblxuXG4vKiBIMiAqL1xuXG5cbmQtYXJ0aWNsZSAubWFya2VyIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBib3JkZXI6IG5vbmU7XG4gIGNvdW50ZXItcmVzZXQ6IHNlY3Rpb247XG4gIGdyaWQtY29sdW1uOiBraWNrZXI7XG4gIGxpbmUtaGVpZ2h0OiAxLjdlbTtcbn1cblxuZC1hcnRpY2xlIC5tYXJrZXI6aG92ZXIge1xuICBib3JkZXI6IG5vbmU7XG59XG5cbmQtYXJ0aWNsZSAubWFya2VyIHNwYW4ge1xuICBwYWRkaW5nOiAwIDNweCA0cHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMik7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdG9wOiA0cHg7XG59XG5cbmQtYXJ0aWNsZSAubWFya2VyOmhvdmVyIHNwYW4ge1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjcpO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjcpO1xufVxuXG5kLWFydGljbGUgaDIge1xuICBmb250LXdlaWdodDogNjAwO1xuICBmb250LXNpemU6IDI0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjI1ZW07XG4gIG1hcmdpbjogMnJlbSAwIDEuNXJlbSAwO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEpO1xuICBwYWRkaW5nLWJvdHRvbTogMXJlbTtcbn1cblxuQG1lZGlhKG1pbi13aWR0aDogMTAyNHB4KSB7XG4gIGQtYXJ0aWNsZSBoMiB7XG4gICAgZm9udC1zaXplOiAzNnB4O1xuICB9XG59XG5cbi8qIEgzICovXG5cbmQtYXJ0aWNsZSBoMyB7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIGZvbnQtc2l6ZTogMThweDtcbiAgbGluZS1oZWlnaHQ6IDEuNGVtO1xuICBtYXJnaW4tYm90dG9tOiAxZW07XG4gIG1hcmdpbi10b3A6IDJlbTtcbn1cblxuQG1lZGlhKG1pbi13aWR0aDogMTAyNHB4KSB7XG4gIGQtYXJ0aWNsZSBoMyB7XG4gICAgZm9udC1zaXplOiAyMHB4O1xuICB9XG59XG5cbi8qIEg0ICovXG5cbmQtYXJ0aWNsZSBoNCB7XG4gIGZvbnQtd2VpZ2h0OiA2MDA7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDEuNGVtO1xufVxuXG5kLWFydGljbGUgYSB7XG4gIGNvbG9yOiBpbmhlcml0O1xufVxuXG5kLWFydGljbGUgcCxcbmQtYXJ0aWNsZSB1bCxcbmQtYXJ0aWNsZSBvbCxcbmQtYXJ0aWNsZSBibG9ja3F1b3RlIHtcbiAgbWFyZ2luLXRvcDogMDtcbiAgbWFyZ2luLWJvdHRvbTogMWVtO1xuICBtYXJnaW4tbGVmdDogMDtcbiAgbWFyZ2luLXJpZ2h0OiAwO1xufVxuXG5kLWFydGljbGUgYmxvY2txdW90ZSB7XG4gIGJvcmRlci1sZWZ0OiAycHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjIpO1xuICBwYWRkaW5nLWxlZnQ6IDJlbTtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xuICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjYpO1xufVxuXG5kLWFydGljbGUgYSB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuNCk7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cblxuZC1hcnRpY2xlIGE6aG92ZXIge1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjgpO1xufVxuXG5kLWFydGljbGUgLmxpbmsge1xuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5kLWFydGljbGUgdWwsXG5kLWFydGljbGUgb2wge1xuICBwYWRkaW5nLWxlZnQ6IDI0cHg7XG59XG5cbmQtYXJ0aWNsZSBsaSB7XG4gIG1hcmdpbi1ib3R0b206IDFlbTtcbiAgbWFyZ2luLWxlZnQ6IDA7XG4gIHBhZGRpbmctbGVmdDogMDtcbn1cblxuZC1hcnRpY2xlIGxpOmxhc3QtY2hpbGQge1xuICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG5kLWFydGljbGUgcHJlIHtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG5kLWFydGljbGUgaHIge1xuICBncmlkLWNvbHVtbjogc2NyZWVuO1xuICB3aWR0aDogMTAwJTtcbiAgYm9yZGVyOiBub25lO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEpO1xuICBtYXJnaW4tdG9wOiA2MHB4O1xuICBtYXJnaW4tYm90dG9tOiA2MHB4O1xufVxuXG5kLWFydGljbGUgc2VjdGlvbiB7XG4gIG1hcmdpbi10b3A6IDYwcHg7XG4gIG1hcmdpbi1ib3R0b206IDYwcHg7XG59XG5cbmQtYXJ0aWNsZSBzcGFuLmVxdWF0aW9uLW1pbWljIHtcbiAgZm9udC1mYW1pbHk6IGdlb3JnaWE7XG4gIGZvbnQtc2l6ZTogMTE1JTtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xufVxuXG5kLWFydGljbGUgPiBkLWNvZGUsXG5kLWFydGljbGUgc2VjdGlvbiA+IGQtY29kZSAge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuZC1hcnRpY2xlID4gZC1tYXRoW2Jsb2NrXSxcbmQtYXJ0aWNsZSBzZWN0aW9uID4gZC1tYXRoW2Jsb2NrXSAge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XG4gIGQtYXJ0aWNsZSA+IGQtY29kZSxcbiAgZC1hcnRpY2xlIHNlY3Rpb24gPiBkLWNvZGUsXG4gIGQtYXJ0aWNsZSA+IGQtbWF0aFtibG9ja10sXG4gIGQtYXJ0aWNsZSBzZWN0aW9uID4gZC1tYXRoW2Jsb2NrXSB7XG4gICAgICBvdmVyZmxvdy14OiBzY3JvbGw7XG4gICAgICAtbXMtb3ZlcmZsb3ctc3R5bGU6IG5vbmU7ICAvLyBJRSAxMCtcbiAgICAgIG92ZXJmbG93OiAtbW96LXNjcm9sbGJhcnMtbm9uZTsgIC8vIEZpcmVmb3hcbiAgfVxuXG4gIGQtYXJ0aWNsZSA+IGQtY29kZTo6LXdlYmtpdC1zY3JvbGxiYXIsXG4gIGQtYXJ0aWNsZSBzZWN0aW9uID4gZC1jb2RlOjotd2Via2l0LXNjcm9sbGJhcixcbiAgZC1hcnRpY2xlID4gZC1tYXRoW2Jsb2NrXTo6LXdlYmtpdC1zY3JvbGxiYXIsXG4gIGQtYXJ0aWNsZSBzZWN0aW9uID4gZC1tYXRoW2Jsb2NrXTo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICAgIGRpc3BsYXk6IG5vbmU7ICAvLyBTYWZhcmkgYW5kIENocm9tZVxuICB9XG59XG5cbmQtYXJ0aWNsZSAuY2l0YXRpb24ge1xuICBjb2xvcjogIzY2ODtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5kLWluY2x1ZGUge1xuICB3aWR0aDogYXV0bztcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbmQtZmlndXJlIHtcbiAgY29udGFpbjogbGF5b3V0IHN0eWxlO1xufVxuXG4vKiBLYVRlWCAqL1xuXG4ua2F0ZXgsIC5rYXRleC1wcmVyZW5kZXJlZCB7XG4gIGNvbnRhaW46IGNvbnRlbnQ7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuLyogVGFibGVzICovXG5cbmQtYXJ0aWNsZSB0YWJsZSB7XG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gIG1hcmdpbi1ib3R0b206IDEuNXJlbTtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4yKTtcbn1cblxuZC1hcnRpY2xlIHRhYmxlIHRoIHtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4yKTtcbn1cblxuZC1hcnRpY2xlIHRhYmxlIHRkIHtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4wNSk7XG59XG5cbmQtYXJ0aWNsZSB0YWJsZSB0cjpsYXN0LW9mLXR5cGUgdGQge1xuICBib3JkZXItYm90dG9tOiBub25lO1xufVxuXG5kLWFydGljbGUgdGFibGUgdGgsXG5kLWFydGljbGUgdGFibGUgdGQge1xuICBmb250LXNpemU6IDE1cHg7XG4gIHBhZGRpbmc6IDJweCA4cHg7XG59XG5cbmQtYXJ0aWNsZSB0YWJsZSB0Ym9keSA6Zmlyc3QtY2hpbGQgdGQge1xuICBwYWRkaW5nLXRvcDogMnB4O1xufVxuJyt0YSsnQG1lZGlhIHByaW50IHtcblxuICBAcGFnZSB7XG4gICAgc2l6ZTogOGluIDExaW47XG4gICAgQGJvdHRvbS1yaWdodCB7XG4gICAgICBjb250ZW50OiBjb3VudGVyKHBhZ2UpICIgb2YgIiBjb3VudGVyKHBhZ2VzKTtcbiAgICB9XG4gIH1cblxuICBodG1sIHtcbiAgICAvKiBubyBnZW5lcmFsIG1hcmdpbnMgLS0gQ1NTIEdyaWQgdGFrZXMgY2FyZSBvZiB0aG9zZSAqL1xuICB9XG5cbiAgcCwgY29kZSB7XG4gICAgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkO1xuICB9XG5cbiAgaDIsIGgzIHtcbiAgICBwYWdlLWJyZWFrLWFmdGVyOiBhdm9pZDtcbiAgfVxuXG4gIGQtaGVhZGVyIHtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIH1cblxuICBkLWZvb3RlciB7XG4gICAgZGlzcGxheTogbm9uZSFpbXBvcnRhbnQ7XG4gIH1cblxufVxuJyxoYT1be25hbWU6J1dlYkNvbXBvbmVudHMnLHN1cHBvcnQ6ZnVuY3Rpb24oKXtyZXR1cm4nY3VzdG9tRWxlbWVudHMnaW4gd2luZG93JiYnYXR0YWNoU2hhZG93J2luIEVsZW1lbnQucHJvdG90eXBlJiYnZ2V0Um9vdE5vZGUnaW4gRWxlbWVudC5wcm90b3R5cGUmJidjb250ZW50J2luIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJykmJidQcm9taXNlJ2luIHdpbmRvdyYmJ2Zyb20naW4gQXJyYXl9LHVybDonaHR0cHM6Ly9kaXN0aWxsLnB1Yi90aGlyZC1wYXJ0eS9wb2x5ZmlsbHMvd2ViY29tcG9uZW50cy1saXRlLmpzJ30se25hbWU6J0ludGVyc2VjdGlvbk9ic2VydmVyJyxzdXBwb3J0OmZ1bmN0aW9uKCl7cmV0dXJuJ0ludGVyc2VjdGlvbk9ic2VydmVyJ2luIHdpbmRvdyYmJ0ludGVyc2VjdGlvbk9ic2VydmVyRW50cnknaW4gd2luZG93fSx1cmw6J2h0dHBzOi8vZGlzdGlsbC5wdWIvdGhpcmQtcGFydHkvcG9seWZpbGxzL2ludGVyc2VjdGlvbi1vYnNlcnZlci5qcyd9XTtjbGFzcyBtYXtzdGF0aWMgYnJvd3NlclN1cHBvcnRzQWxsRmVhdHVyZXMoKXtyZXR1cm4gaGEuZXZlcnkoKGUpPT5lLnN1cHBvcnQoKSl9c3RhdGljIGxvYWQoZSl7Y29uc3QgdD1mdW5jdGlvbih0KXt0LmxvYWRlZD0hMCxjb25zb2xlLmluZm8oJ1J1bmxldmVsIDA6IFBvbHlmaWxsIGhhcyBmaW5pc2hlZCBsb2FkaW5nOiAnK3QubmFtZSksbWEubmVlZGVkUG9seWZpbGxzLmV2ZXJ5KChlKT0+ZS5sb2FkZWQpJiYoY29uc29sZS5pbmZvKCdSdW5sZXZlbCAwOiBBbGwgcmVxdWlyZWQgcG9seWZpbGxzIGhhdmUgZmluaXNoZWQgbG9hZGluZy4nKSxjb25zb2xlLmluZm8oJ1J1bmxldmVsIDAtPjEuJyksd2luZG93LmRpc3RpbGxSdW5sZXZlbD0xLGUoKSl9O2Zvcihjb25zdCBuIG9mIG1hLm5lZWRlZFBvbHlmaWxscylwKG4sdCl9c3RhdGljIGdldCBuZWVkZWRQb2x5ZmlsbHMoKXtyZXR1cm4gbWEuX25lZWRlZFBvbHlmaWxsc3x8KG1hLl9uZWVkZWRQb2x5ZmlsbHM9aGEuZmlsdGVyKChlKT0+IWUuc3VwcG9ydCgpKSksbWEuX25lZWRlZFBvbHlmaWxsc319Y29uc3QgeWE9ZWEoJ2QtYWJzdHJhY3QnLGAKPHN0eWxlPgogIDpob3N0IHsKICAgIGZvbnQtc2l6ZTogMS4yNXJlbTsKICAgIGxpbmUtaGVpZ2h0OiAxLjZlbTsKICAgIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNyk7CiAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICB9CgogIDo6c2xvdHRlZChwKSB7CiAgICBtYXJnaW4tdG9wOiAwOwogICAgbWFyZ2luLWJvdHRvbTogMWVtOwogICAgZ3JpZC1jb2x1bW46IHRleHQtc3RhcnQgLyBtaWRkbGUtZW5kOwogIH0KICAke2Z1bmN0aW9uKGUpe3JldHVybmAke2V9IHsKICAgICAgZ3JpZC1jb2x1bW46IGxlZnQgLyB0ZXh0OwogICAgfQogIGB9KCdkLWFic3RyYWN0Jyl9Cjwvc3R5bGU+Cgo8c2xvdD48L3Nsb3Q+CmApO2NsYXNzIHhhIGV4dGVuZHMgeWEoSFRNTEVsZW1lbnQpe31jb25zdCBrYT1lYSgnZC1hcHBlbmRpeCcsYAo8c3R5bGU+CgpkLWFwcGVuZGl4IHsKICBjb250YWluOiBsYXlvdXQgc3R5bGU7CiAgZm9udC1zaXplOiAwLjhlbTsKICBsaW5lLWhlaWdodDogMS43ZW07CiAgbWFyZ2luLXRvcDogNjBweDsKICBtYXJnaW4tYm90dG9tOiAwOwogIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMSk7CiAgY29sb3I6IHJnYmEoMCwwLDAsMC41KTsKICBwYWRkaW5nLXRvcDogNjBweDsKICBwYWRkaW5nLWJvdHRvbTogNDhweDsKfQoKZC1hcHBlbmRpeCBoMyB7CiAgZ3JpZC1jb2x1bW46IHBhZ2Utc3RhcnQgLyB0ZXh0LXN0YXJ0OwogIGZvbnQtc2l6ZTogMTVweDsKICBmb250LXdlaWdodDogNTAwOwogIG1hcmdpbi10b3A6IDFlbTsKICBtYXJnaW4tYm90dG9tOiAwOwogIGNvbG9yOiByZ2JhKDAsMCwwLDAuNjUpOwp9CgpkLWFwcGVuZGl4IGgzICsgKiB7CiAgbWFyZ2luLXRvcDogMWVtOwp9CgpkLWFwcGVuZGl4IG9sIHsKICBwYWRkaW5nOiAwIDAgMCAxNXB4Owp9CgpAbWVkaWEgKG1pbi13aWR0aDogNzY4cHgpIHsKICBkLWFwcGVuZGl4IG9sIHsKICAgIHBhZGRpbmc6IDAgMCAwIDMwcHg7CiAgICBtYXJnaW4tbGVmdDogLTMwcHg7CiAgfQp9CgpkLWFwcGVuZGl4IGxpIHsKICBtYXJnaW4tYm90dG9tOiAxZW07Cn0KCmQtYXBwZW5kaXggYSB7CiAgY29sb3I6IHJnYmEoMCwgMCwgMCwgMC42KTsKfQoKZC1hcHBlbmRpeCA+ICogewogIGdyaWQtY29sdW1uOiB0ZXh0Owp9CgpkLWFwcGVuZGl4ID4gZC1mb290bm90ZS1saXN0LApkLWFwcGVuZGl4ID4gZC1jaXRhdGlvbi1saXN0LApkLWFwcGVuZGl4ID4gZGlzdGlsbC1hcHBlbmRpeCB7CiAgZ3JpZC1jb2x1bW46IHNjcmVlbjsKfQoKPC9zdHlsZT4KCmAsITEpO2NsYXNzIHZhIGV4dGVuZHMga2EoSFRNTEVsZW1lbnQpe31jb25zdCB3YT0vXlxzKiQvO2NsYXNzIENhIGV4dGVuZHMgSFRNTEVsZW1lbnR7c3RhdGljIGdldCBpcygpe3JldHVybidkLWFydGljbGUnfWNvbnN0cnVjdG9yKCl7c3VwZXIoKSxuZXcgTXV0YXRpb25PYnNlcnZlcigoZSk9Pntmb3IoY29uc3QgdCBvZiBlKWZvcihjb25zdCBlIG9mIHQuYWRkZWROb2Rlcylzd2l0Y2goZS5ub2RlTmFtZSl7Y2FzZScjdGV4dCc6e2NvbnN0IHQ9ZS5ub2RlVmFsdWU7aWYoIXdhLnRlc3QodCkpe2NvbnNvbGUud2FybignVXNlIG9mIHVud3JhcHBlZCB0ZXh0IGluIGRpc3RpbGwgYXJ0aWNsZXMgaXMgZGlzY291cmFnZWQgYXMgaXQgYnJlYWtzIGxheW91dCEgUGxlYXNlIHdyYXAgYW55IHRleHQgaW4gYSA8c3Bhbj4gb3IgPHA+IHRhZy4gV2UgZm91bmQgdGhlIGZvbGxvd2luZyB0ZXh0OiAnK3QpO2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO24uaW5uZXJIVE1MPWUubm9kZVZhbHVlLGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobixlKSxlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSl9fX19KS5vYnNlcnZlKHRoaXMse2NoaWxkTGlzdDohMH0pfX12YXIgX2E9J3VuZGVmaW5lZCc9PXR5cGVvZiB3aW5kb3c/J3VuZGVmaW5lZCc9PXR5cGVvZiBnbG9iYWw/J3VuZGVmaW5lZCc9PXR5cGVvZiBzZWxmP3t9OnNlbGY6Z2xvYmFsOndpbmRvdyxUYT1nKGZ1bmN0aW9uKGUsdCl7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt0aGlzLm1vbnRocz1bJ2phbicsJ2ZlYicsJ21hcicsJ2FwcicsJ21heScsJ2p1bicsJ2p1bCcsJ2F1ZycsJ3NlcCcsJ29jdCcsJ25vdicsJ2RlYyddLHRoaXMubm90S2V5PVsnLCcsJ3snLCd9JywnICcsJz0nXSx0aGlzLnBvcz0wLHRoaXMuaW5wdXQ9JycsdGhpcy5lbnRyaWVzPVtdLHRoaXMuY3VycmVudEVudHJ5PScnLHRoaXMuc2V0SW5wdXQ9ZnVuY3Rpb24oZSl7dGhpcy5pbnB1dD1lfSx0aGlzLmdldEVudHJpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbnRyaWVzfSx0aGlzLmlzV2hpdGVzcGFjZT1mdW5jdGlvbihlKXtyZXR1cm4nICc9PWV8fCdccic9PWV8fCdcdCc9PWV8fCdcbic9PWV9LHRoaXMubWF0Y2g9ZnVuY3Rpb24oZSx0KXtpZigodm9pZCAwPT10fHxudWxsPT10KSYmKHQ9ITApLHRoaXMuc2tpcFdoaXRlc3BhY2UodCksdGhpcy5pbnB1dC5zdWJzdHJpbmcodGhpcy5wb3MsdGhpcy5wb3MrZS5sZW5ndGgpPT1lKXRoaXMucG9zKz1lLmxlbmd0aDtlbHNlIHRocm93J1Rva2VuIG1pc21hdGNoLCBleHBlY3RlZCAnK2UrJywgZm91bmQgJyt0aGlzLmlucHV0LnN1YnN0cmluZyh0aGlzLnBvcyk7dGhpcy5za2lwV2hpdGVzcGFjZSh0KX0sdGhpcy50cnlNYXRjaD1mdW5jdGlvbihlLHQpe3JldHVybih2b2lkIDA9PXR8fG51bGw9PXQpJiYodD0hMCksdGhpcy5za2lwV2hpdGVzcGFjZSh0KSx0aGlzLmlucHV0LnN1YnN0cmluZyh0aGlzLnBvcyx0aGlzLnBvcytlLmxlbmd0aCk9PWV9LHRoaXMubWF0Y2hBdD1mdW5jdGlvbigpe2Zvcig7dGhpcy5pbnB1dC5sZW5ndGg+dGhpcy5wb3MmJidAJyE9dGhpcy5pbnB1dFt0aGlzLnBvc107KXRoaXMucG9zKys7cmV0dXJuISgnQCchPXRoaXMuaW5wdXRbdGhpcy5wb3NdKX0sdGhpcy5za2lwV2hpdGVzcGFjZT1mdW5jdGlvbihlKXtmb3IoO3RoaXMuaXNXaGl0ZXNwYWNlKHRoaXMuaW5wdXRbdGhpcy5wb3NdKTspdGhpcy5wb3MrKztpZignJSc9PXRoaXMuaW5wdXRbdGhpcy5wb3NdJiYhMD09ZSl7Zm9yKDsnXG4nIT10aGlzLmlucHV0W3RoaXMucG9zXTspdGhpcy5wb3MrKzt0aGlzLnNraXBXaGl0ZXNwYWNlKGUpfX0sdGhpcy52YWx1ZV9icmFjZXM9ZnVuY3Rpb24oKXt2YXIgZT0wO3RoaXMubWF0Y2goJ3snLCExKTtmb3IodmFyIHQ9dGhpcy5wb3Msbj0hMTs7KXtpZighbilpZignfSc9PXRoaXMuaW5wdXRbdGhpcy5wb3NdKXtpZigwPGUpZS0tO2Vsc2V7dmFyIGE9dGhpcy5wb3M7cmV0dXJuIHRoaXMubWF0Y2goJ30nLCExKSx0aGlzLmlucHV0LnN1YnN0cmluZyh0LGEpfX1lbHNlIGlmKCd7Jz09dGhpcy5pbnB1dFt0aGlzLnBvc10pZSsrO2Vsc2UgaWYodGhpcy5wb3M+PXRoaXMuaW5wdXQubGVuZ3RoLTEpdGhyb3cnVW50ZXJtaW5hdGVkIHZhbHVlJztuPSdcXCc9PXRoaXMuaW5wdXRbdGhpcy5wb3NdJiYhMT09bix0aGlzLnBvcysrfX0sdGhpcy52YWx1ZV9jb21tZW50PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPScnLHQ9MDshKHRoaXMudHJ5TWF0Y2goJ30nLCExKSYmMD09dCk7KXtpZihlKz10aGlzLmlucHV0W3RoaXMucG9zXSwneyc9PXRoaXMuaW5wdXRbdGhpcy5wb3NdJiZ0KyssJ30nPT10aGlzLmlucHV0W3RoaXMucG9zXSYmdC0tLHRoaXMucG9zPj10aGlzLmlucHV0Lmxlbmd0aC0xKXRocm93J1VudGVybWluYXRlZCB2YWx1ZTonK3RoaXMuaW5wdXQuc3Vic3RyaW5nKHN0YXJ0KTt0aGlzLnBvcysrfXJldHVybiBlfSx0aGlzLnZhbHVlX3F1b3Rlcz1mdW5jdGlvbigpe3RoaXMubWF0Y2goJyInLCExKTtmb3IodmFyIGU9dGhpcy5wb3MsdD0hMTs7KXtpZighdCl7aWYoJyInPT10aGlzLmlucHV0W3RoaXMucG9zXSl7dmFyIG49dGhpcy5wb3M7cmV0dXJuIHRoaXMubWF0Y2goJyInLCExKSx0aGlzLmlucHV0LnN1YnN0cmluZyhlLG4pfWlmKHRoaXMucG9zPj10aGlzLmlucHV0Lmxlbmd0aC0xKXRocm93J1VudGVybWluYXRlZCB2YWx1ZTonK3RoaXMuaW5wdXQuc3Vic3RyaW5nKGUpfXQ9J1xcJz09dGhpcy5pbnB1dFt0aGlzLnBvc10mJiExPT10LHRoaXMucG9zKyt9fSx0aGlzLnNpbmdsZV92YWx1ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMucG9zO2lmKHRoaXMudHJ5TWF0Y2goJ3snKSlyZXR1cm4gdGhpcy52YWx1ZV9icmFjZXMoKTtpZih0aGlzLnRyeU1hdGNoKCciJykpcmV0dXJuIHRoaXMudmFsdWVfcXVvdGVzKCk7dmFyIHQ9dGhpcy5rZXkoKTtpZih0Lm1hdGNoKCdeWzAtOV0rJCcpKXJldHVybiB0O2lmKDA8PXRoaXMubW9udGhzLmluZGV4T2YodC50b0xvd2VyQ2FzZSgpKSlyZXR1cm4gdC50b0xvd2VyQ2FzZSgpO3Rocm93J1ZhbHVlIGV4cGVjdGVkOicrdGhpcy5pbnB1dC5zdWJzdHJpbmcoZSkrJyBmb3Iga2V5OiAnK3R9LHRoaXMudmFsdWU9ZnVuY3Rpb24oKXtmb3IodmFyIGU9W3RoaXMuc2luZ2xlX3ZhbHVlKCldO3RoaXMudHJ5TWF0Y2goJyMnKTspdGhpcy5tYXRjaCgnIycpLGUucHVzaCh0aGlzLnNpbmdsZV92YWx1ZSgpKTtyZXR1cm4gZS5qb2luKCcnKX0sdGhpcy5rZXk9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5wb3M7Oyl7aWYodGhpcy5wb3M+PXRoaXMuaW5wdXQubGVuZ3RoKXRocm93J1J1bmF3YXkga2V5JztpZigwPD10aGlzLm5vdEtleS5pbmRleE9mKHRoaXMuaW5wdXRbdGhpcy5wb3NdKSlyZXR1cm4gdGhpcy5pbnB1dC5zdWJzdHJpbmcoZSx0aGlzLnBvcyk7dGhpcy5wb3MrK319LHRoaXMua2V5X2VxdWFsc192YWx1ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMua2V5KCk7aWYodGhpcy50cnlNYXRjaCgnPScpKXt0aGlzLm1hdGNoKCc9Jyk7dmFyIHQ9dGhpcy52YWx1ZSgpO3JldHVybltlLHRdfXRocm93Jy4uLiA9IHZhbHVlIGV4cGVjdGVkLCBlcXVhbHMgc2lnbiBtaXNzaW5nOicrdGhpcy5pbnB1dC5zdWJzdHJpbmcodGhpcy5wb3MpfSx0aGlzLmtleV92YWx1ZV9saXN0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5rZXlfZXF1YWxzX3ZhbHVlKCk7Zm9yKHRoaXMuY3VycmVudEVudHJ5LmVudHJ5VGFncz17fSx0aGlzLmN1cnJlbnRFbnRyeS5lbnRyeVRhZ3NbZVswXV09ZVsxXTt0aGlzLnRyeU1hdGNoKCcsJykmJih0aGlzLm1hdGNoKCcsJyksIXRoaXMudHJ5TWF0Y2goJ30nKSk7KWU9dGhpcy5rZXlfZXF1YWxzX3ZhbHVlKCksdGhpcy5jdXJyZW50RW50cnkuZW50cnlUYWdzW2VbMF1dPWVbMV19LHRoaXMuZW50cnlfYm9keT1mdW5jdGlvbihlKXt0aGlzLmN1cnJlbnRFbnRyeT17fSx0aGlzLmN1cnJlbnRFbnRyeS5jaXRhdGlvbktleT10aGlzLmtleSgpLHRoaXMuY3VycmVudEVudHJ5LmVudHJ5VHlwZT1lLnN1YnN0cmluZygxKSx0aGlzLm1hdGNoKCcsJyksdGhpcy5rZXlfdmFsdWVfbGlzdCgpLHRoaXMuZW50cmllcy5wdXNoKHRoaXMuY3VycmVudEVudHJ5KX0sdGhpcy5kaXJlY3RpdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXRjaCgnQCcpLCdAJyt0aGlzLmtleSgpfSx0aGlzLnByZWFtYmxlPWZ1bmN0aW9uKCl7dGhpcy5jdXJyZW50RW50cnk9e30sdGhpcy5jdXJyZW50RW50cnkuZW50cnlUeXBlPSdQUkVBTUJMRScsdGhpcy5jdXJyZW50RW50cnkuZW50cnk9dGhpcy52YWx1ZV9jb21tZW50KCksdGhpcy5lbnRyaWVzLnB1c2godGhpcy5jdXJyZW50RW50cnkpfSx0aGlzLmNvbW1lbnQ9ZnVuY3Rpb24oKXt0aGlzLmN1cnJlbnRFbnRyeT17fSx0aGlzLmN1cnJlbnRFbnRyeS5lbnRyeVR5cGU9J0NPTU1FTlQnLHRoaXMuY3VycmVudEVudHJ5LmVudHJ5PXRoaXMudmFsdWVfY29tbWVudCgpLHRoaXMuZW50cmllcy5wdXNoKHRoaXMuY3VycmVudEVudHJ5KX0sdGhpcy5lbnRyeT1mdW5jdGlvbihlKXt0aGlzLmVudHJ5X2JvZHkoZSl9LHRoaXMuYmlidGV4PWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLm1hdGNoQXQoKTspe3ZhciBlPXRoaXMuZGlyZWN0aXZlKCk7dGhpcy5tYXRjaCgneycpLCdAU1RSSU5HJz09ZT90aGlzLnN0cmluZygpOidAUFJFQU1CTEUnPT1lP3RoaXMucHJlYW1ibGUoKTonQENPTU1FTlQnPT1lP3RoaXMuY29tbWVudCgpOnRoaXMuZW50cnkoZSksdGhpcy5tYXRjaCgnfScpfX19ZS50b0pTT049ZnVuY3Rpb24oZSl7dmFyIG49bmV3IHQ7cmV0dXJuIG4uc2V0SW5wdXQoZSksbi5iaWJ0ZXgoKSxuLmVudHJpZXN9LGUudG9CaWJ0ZXg9ZnVuY3Rpb24oZSl7dmFyIHQ9Jyc7Zm9yKHZhciBuIGluIGUpe2lmKHQrPSdAJytlW25dLmVudHJ5VHlwZSx0Kz0neycsZVtuXS5jaXRhdGlvbktleSYmKHQrPWVbbl0uY2l0YXRpb25LZXkrJywgJyksZVtuXS5lbnRyeSYmKHQrPWVbbl0uZW50cnkpLGVbbl0uZW50cnlUYWdzKXt2YXIgYT0nJztmb3IodmFyIGkgaW4gZVtuXS5lbnRyeVRhZ3MpMCE9YS5sZW5ndGgmJihhKz0nLCAnKSxhKz1pKyc9IHsnK2Vbbl0uZW50cnlUYWdzW2ldKyd9Jzt0Kz1hfXQrPSd9XG5cbid9cmV0dXJuIHR9fSkodCl9KTtjbGFzcyBTYSBleHRlbmRzIEhUTUxFbGVtZW50e3N0YXRpYyBnZXQgaXMoKXtyZXR1cm4nZC1iaWJsaW9ncmFwaHknfWNvbnN0cnVjdG9yKCl7c3VwZXIoKTtjb25zdCBlPW5ldyBNdXRhdGlvbk9ic2VydmVyKChlKT0+e2Zvcihjb25zdCB0IG9mIGUpKCdTQ1JJUFQnPT09dC50YXJnZXQubm9kZU5hbWV8fCdjaGFyYWN0ZXJEYXRhJz09PXQudHlwZSkmJnRoaXMucGFyc2VJZlBvc3NpYmxlKCl9KTtlLm9ic2VydmUodGhpcyx7Y2hpbGRMaXN0OiEwLGNoYXJhY3RlckRhdGE6ITAsc3VidHJlZTohMH0pfWNvbm5lY3RlZENhbGxiYWNrKCl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5wYXJzZUlmUG9zc2libGUoKX0pfXBhcnNlSWZQb3NzaWJsZSgpe2NvbnN0IGU9dGhpcy5xdWVyeVNlbGVjdG9yKCdzY3JpcHQnKTtpZihlKWlmKCd0ZXh0L2JpYnRleCc9PWUudHlwZSl7Y29uc3QgdD1lLnRleHRDb250ZW50O2lmKHRoaXMuYmlidGV4IT09dCl7dGhpcy5iaWJ0ZXg9dDtjb25zdCBlPWIodGhpcy5iaWJ0ZXgpO3RoaXMubm90aWZ5KGUpfX1lbHNlIGlmKCd0ZXh0L2pzb24nPT1lLnR5cGUpe2NvbnN0IHQ9bmV3IE1hcChKU09OLnBhcnNlKGUudGV4dENvbnRlbnQpKTt0aGlzLm5vdGlmeSh0KX1lbHNlIGNvbnNvbGUud2FybignVW5zdXBwb3J0ZWQgYmlibGlvZ3JhcGh5IHNjcmlwdCB0YWcgdHlwZTogJytlLnR5cGUpfW5vdGlmeShlKXtjb25zdCB0PW5ldyBDdXN0b21FdmVudCgnb25CaWJsaW9ncmFwaHlDaGFuZ2VkJyx7ZGV0YWlsOmUsYnViYmxlczohMH0pO3RoaXMuZGlzcGF0Y2hFdmVudCh0KX1zdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpe3JldHVyblsnc3JjJ119cmVjZWl2ZWRCaWJ0ZXgoZSl7Y29uc3QgdD1iKGUudGFyZ2V0LnJlc3BvbnNlKTt0aGlzLm5vdGlmeSh0KX1hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soZSx0LG4pe3ZhciBhPW5ldyBYTUxIdHRwUmVxdWVzdDthLm9ubG9hZD0odCk9PnRoaXMucmVjZWl2ZWRCaWJ0ZXgodCksYS5vbmVycm9yPSgpPT5jb25zb2xlLndhcm4oYENvdWxkIG5vdCBsb2FkIEJpYnRleCEgKHRyaWVkICR7bn0pYCksYS5yZXNwb25zZVR5cGU9J3RleHQnLGEub3BlbignR0VUJyxuLCEwKSxhLnNlbmQoKX19Y2xhc3MgTWEgZXh0ZW5kcyBIVE1MRWxlbWVudHtzdGF0aWMgZ2V0IGlzKCl7cmV0dXJuJ2QtYnlsaW5lJ31zZXQgZnJvbnRNYXR0ZXIoZSl7dGhpcy5pbm5lckhUTUw9bShlKX19Y29uc3QgRWE9ZWEoJ2QtY2l0ZScsYAo8c3R5bGU+Cgo6aG9zdCB7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9CgouY2l0YXRpb24gewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBjb2xvcjogaHNsYSgyMDYsIDkwJSwgMjAlLCAwLjcpOwp9CgouY2l0YXRpb24tbnVtYmVyIHsKICBjdXJzb3I6IGRlZmF1bHQ7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiUm9ib3RvIiwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwogIGZvbnQtc2l6ZTogNzUlOwogIGNvbG9yOiBoc2xhKDIwNiwgOTAlLCAyMCUsIDAuNyk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGxpbmUtaGVpZ2h0OiAxLjFlbTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHRvcDogLTJweDsKICBtYXJnaW46IDAgMnB4Owp9CgpmaWdjYXB0aW9uIC5jaXRhdGlvbi1udW1iZXIgewogIGZvbnQtc2l6ZTogMTFweDsKICBmb250LXdlaWdodDogbm9ybWFsOwogIHRvcDogLTJweDsKICBsaW5lLWhlaWdodDogMWVtOwp9CgpkLWhvdmVyLWJveCB7CiAgbWFyZ2luLXRvcDogMS45ZW07Cn0KCnVsIHsKICBtYXJnaW46IDA7CiAgcGFkZGluZzogMDsKICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7Cn0KCnVsIGxpIHsKICBwYWRkaW5nOiAxNXB4IDEwcHggMTVweCAxMHB4OwogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDAsMCwwLDAuMSkKfQoKdWwgbGk6bGFzdC1vZi10eXBlIHsKICBib3JkZXItYm90dG9tOiBub25lOwp9Cgo8L3N0eWxlPgoKPGQtaG92ZXItYm94IGlkPSJob3Zlci1ib3giPjwvZC1ob3Zlci1ib3g+Cgo8ZGl2IGlkPSJjaXRhdGlvbi0iIGNsYXNzPSJjaXRhdGlvbiI+PHNsb3Q+PC9zbG90PjxzcGFuIGNsYXNzPSJjaXRhdGlvbi1udW1iZXIiPjwvc3Bhbj48L2Rpdj4KYCk7Y2xhc3MgRGEgZXh0ZW5kcyBFYShIVE1MRWxlbWVudCl7Y29ubmVjdGVkQ2FsbGJhY2soKXt0aGlzLm91dGVyU3Bhbj10aGlzLnJvb3QucXVlcnlTZWxlY3RvcignI2NpdGF0aW9uLScpLHRoaXMuaW5uZXJTcGFuPXRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCcuY2l0YXRpb24tbnVtYmVyJyksdGhpcy5ob3ZlckJveD10aGlzLnJvb3QucXVlcnlTZWxlY3RvcignZC1ob3Zlci1ib3gnKSx3aW5kb3cuY3VzdG9tRWxlbWVudHMud2hlbkRlZmluZWQoJ2QtaG92ZXItYm94JykudGhlbigoKT0+e3RoaXMuaG92ZXJCb3gubGlzdGVuKHRoaXMpfSl9c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKXtyZXR1cm5bJ2tleSddfWF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhlLHQsbil7Y29uc3QgYT10PydvbkNpdGVLZXlDaGFuZ2VkJzonb25DaXRlS2V5Q3JlYXRlZCcsaT1uLnNwbGl0KCcsJyksZD17ZGV0YWlsOlt0aGlzLGldLGJ1YmJsZXM6ITB9LHI9bmV3IEN1c3RvbUV2ZW50KGEsZCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChyKX1zZXQga2V5KGUpe3RoaXMuc2V0QXR0cmlidXRlKCdrZXknLGUpfWdldCBrZXkoKXtyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoJ2tleScpfWdldCBrZXlzKCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCdrZXknKS5zcGxpdCgnLCcpfXNldCBudW1iZXJzKGUpe2NvbnN0IHQ9ZS5tYXAoKGUpPT57cmV0dXJuLTE9PWU/Jz8nOmUrMSsnJ30pLG49J1snK3Quam9pbignLCAnKSsnXSc7dGhpcy5pbm5lclNwYW4mJih0aGlzLmlubmVyU3Bhbi50ZXh0Q29udGVudD1uKX1zZXQgZW50cmllcyhlKXt0aGlzLmhvdmVyQm94JiYodGhpcy5ob3ZlckJveC5pbm5lckhUTUw9YDx1bD4KICAgICAgJHtlLm1hcChsKS5tYXAoKGUpPT5gPGxpPiR7ZX08L2xpPmApLmpvaW4oJ1xuJyl9CiAgICAgIDwvdWw+YCl9fWNvbnN0IExhPWAKZC1jaXRhdGlvbi1saXN0IHsKICBjb250YWluOiBsYXlvdXQgc3R5bGU7Cn0KCmQtY2l0YXRpb24tbGlzdCAucmVmZXJlbmNlcyB7CiAgZ3JpZC1jb2x1bW46IHRleHQ7Cn0KCmQtY2l0YXRpb24tbGlzdCAucmVmZXJlbmNlcyAudGl0bGUgewogIGZvbnQtd2VpZ2h0OiA1MDA7Cn0KYDtjbGFzcyBVYSBleHRlbmRzIEhUTUxFbGVtZW50e3N0YXRpYyBnZXQgaXMoKXtyZXR1cm4nZC1jaXRhdGlvbi1saXN0J31jb25uZWN0ZWRDYWxsYmFjaygpe3RoaXMuaGFzQXR0cmlidXRlKCdkaXN0aWxsLXByZXJlbmRlcmVkJyl8fCh0aGlzLnN0eWxlLmRpc3BsYXk9J25vbmUnKX1zZXQgY2l0YXRpb25zKGUpe3kodGhpcyxlKX19dmFyIEFhPWcoZnVuY3Rpb24oZSl7dmFyIHQ9J3VuZGVmaW5lZCc9PXR5cGVvZiB3aW5kb3c/J3VuZGVmaW5lZCchPXR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSYmc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlP3NlbGY6e306d2luZG93LG49ZnVuY3Rpb24oKXt2YXIgZT0vXGJsYW5nKD86dWFnZSk/LShcdyspXGIvaSxuPTAsYT10LlByaXNtPXt1dGlsOntlbmNvZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBpP25ldyBpKGUudHlwZSxhLnV0aWwuZW5jb2RlKGUuY29udGVudCksZS5hbGlhcyk6J0FycmF5Jz09PWEudXRpbC50eXBlKGUpP2UubWFwKGEudXRpbC5lbmNvZGUpOmUucmVwbGFjZSgvJi9nLCcmYW1wOycpLnJlcGxhY2UoLzwvZywnJmx0OycpLnJlcGxhY2UoL1x1MDBhMC9nLCcgJyl9LHR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5tYXRjaCgvXFtvYmplY3QgKFx3KylcXS8pWzFdfSxvYmpJZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5fX2lkfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwnX19pZCcse3ZhbHVlOisrbn0pLGUuX19pZH0sY2xvbmU6ZnVuY3Rpb24oZSl7dmFyIHQ9YS51dGlsLnR5cGUoZSk7c3dpdGNoKHQpe2Nhc2UnT2JqZWN0Jzp2YXIgbj17fTtmb3IodmFyIGkgaW4gZSllLmhhc093blByb3BlcnR5KGkpJiYobltpXT1hLnV0aWwuY2xvbmUoZVtpXSkpO3JldHVybiBuO2Nhc2UnQXJyYXknOnJldHVybiBlLm1hcCYmZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGEudXRpbC5jbG9uZShlKX0pO31yZXR1cm4gZX19LGxhbmd1YWdlczp7ZXh0ZW5kOmZ1bmN0aW9uKGUsdCl7dmFyIG49YS51dGlsLmNsb25lKGEubGFuZ3VhZ2VzW2VdKTtmb3IodmFyIGkgaW4gdCluW2ldPXRbaV07cmV0dXJuIG59LGluc2VydEJlZm9yZTpmdW5jdGlvbihlLHQsbixpKXtpPWl8fGEubGFuZ3VhZ2VzO3ZhciBkPWlbZV07aWYoMj09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciByIGluIG49YXJndW1lbnRzWzFdLG4pbi5oYXNPd25Qcm9wZXJ0eShyKSYmKGRbcl09bltyXSk7cmV0dXJuIGR9dmFyIG89e307Zm9yKHZhciBsIGluIGQpaWYoZC5oYXNPd25Qcm9wZXJ0eShsKSl7aWYobD09dClmb3IodmFyIHIgaW4gbiluLmhhc093blByb3BlcnR5KHIpJiYob1tyXT1uW3JdKTtvW2xdPWRbbF19cmV0dXJuIGEubGFuZ3VhZ2VzLkRGUyhhLmxhbmd1YWdlcyxmdW5jdGlvbih0LG4pe249PT1pW2VdJiZ0IT1lJiYodGhpc1t0XT1vKX0pLGlbZV09b30sREZTOmZ1bmN0aW9uKGUsdCxuLGQpe2Zvcih2YXIgciBpbiBkPWR8fHt9LGUpZS5oYXNPd25Qcm9wZXJ0eShyKSYmKHQuY2FsbChlLHIsZVtyXSxufHxyKSwnT2JqZWN0JyE9PWEudXRpbC50eXBlKGVbcl0pfHxkW2EudXRpbC5vYmpJZChlW3JdKV0/J0FycmF5Jz09PWEudXRpbC50eXBlKGVbcl0pJiYhZFthLnV0aWwub2JqSWQoZVtyXSldJiYoZFthLnV0aWwub2JqSWQoZVtyXSldPSEwLGEubGFuZ3VhZ2VzLkRGUyhlW3JdLHQscixkKSk6KGRbYS51dGlsLm9iaklkKGVbcl0pXT0hMCxhLmxhbmd1YWdlcy5ERlMoZVtyXSx0LG51bGwsZCkpKX19LHBsdWdpbnM6e30saGlnaGxpZ2h0QWxsOmZ1bmN0aW9uKGUsdCl7dmFyIG49e2NhbGxiYWNrOnQsc2VsZWN0b3I6J2NvZGVbY2xhc3MqPSJsYW5ndWFnZS0iXSwgW2NsYXNzKj0ibGFuZ3VhZ2UtIl0gY29kZSwgY29kZVtjbGFzcyo9ImxhbmctIl0sIFtjbGFzcyo9ImxhbmctIl0gY29kZSd9O2EuaG9va3MucnVuKCdiZWZvcmUtaGlnaGxpZ2h0YWxsJyxuKTtmb3IodmFyIGQscj1uLmVsZW1lbnRzfHxkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKG4uc2VsZWN0b3IpLG89MDtkPXJbbysrXTspYS5oaWdobGlnaHRFbGVtZW50KGQsITA9PT1lLG4uY2FsbGJhY2spfSxoaWdobGlnaHRFbGVtZW50OmZ1bmN0aW9uKG4saSxkKXtmb3IodmFyIHIsbyxsPW47bCYmIWUudGVzdChsLmNsYXNzTmFtZSk7KWw9bC5wYXJlbnROb2RlO2wmJihyPShsLmNsYXNzTmFtZS5tYXRjaChlKXx8WywnJ10pWzFdLnRvTG93ZXJDYXNlKCksbz1hLmxhbmd1YWdlc1tyXSksbi5jbGFzc05hbWU9bi5jbGFzc05hbWUucmVwbGFjZShlLCcnKS5yZXBsYWNlKC9ccysvZywnICcpKycgbGFuZ3VhZ2UtJytyLGw9bi5wYXJlbnROb2RlLC9wcmUvaS50ZXN0KGwubm9kZU5hbWUpJiYobC5jbGFzc05hbWU9bC5jbGFzc05hbWUucmVwbGFjZShlLCcnKS5yZXBsYWNlKC9ccysvZywnICcpKycgbGFuZ3VhZ2UtJytyKTt2YXIgcz1uLnRleHRDb250ZW50LGM9e2VsZW1lbnQ6bixsYW5ndWFnZTpyLGdyYW1tYXI6byxjb2RlOnN9O2lmKGEuaG9va3MucnVuKCdiZWZvcmUtc2FuaXR5LWNoZWNrJyxjKSwhYy5jb2RlfHwhYy5ncmFtbWFyKXJldHVybiBjLmNvZGUmJihjLmVsZW1lbnQudGV4dENvbnRlbnQ9Yy5jb2RlKSx2b2lkIGEuaG9va3MucnVuKCdjb21wbGV0ZScsYyk7aWYoYS5ob29rcy5ydW4oJ2JlZm9yZS1oaWdobGlnaHQnLGMpLGkmJnQuV29ya2VyKXt2YXIgdT1uZXcgV29ya2VyKGEuZmlsZW5hbWUpO3Uub25tZXNzYWdlPWZ1bmN0aW9uKGUpe2MuaGlnaGxpZ2h0ZWRDb2RlPWUuZGF0YSxhLmhvb2tzLnJ1bignYmVmb3JlLWluc2VydCcsYyksYy5lbGVtZW50LmlubmVySFRNTD1jLmhpZ2hsaWdodGVkQ29kZSxkJiZkLmNhbGwoYy5lbGVtZW50KSxhLmhvb2tzLnJ1bignYWZ0ZXItaGlnaGxpZ2h0JyxjKSxhLmhvb2tzLnJ1bignY29tcGxldGUnLGMpfSx1LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KHtsYW5ndWFnZTpjLmxhbmd1YWdlLGNvZGU6Yy5jb2RlLGltbWVkaWF0ZUNsb3NlOiEwfSkpfWVsc2UgYy5oaWdobGlnaHRlZENvZGU9YS5oaWdobGlnaHQoYy5jb2RlLGMuZ3JhbW1hcixjLmxhbmd1YWdlKSxhLmhvb2tzLnJ1bignYmVmb3JlLWluc2VydCcsYyksYy5lbGVtZW50LmlubmVySFRNTD1jLmhpZ2hsaWdodGVkQ29kZSxkJiZkLmNhbGwobiksYS5ob29rcy5ydW4oJ2FmdGVyLWhpZ2hsaWdodCcsYyksYS5ob29rcy5ydW4oJ2NvbXBsZXRlJyxjKX0saGlnaGxpZ2h0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgZD1hLnRva2VuaXplKGUsdCk7cmV0dXJuIGkuc3RyaW5naWZ5KGEudXRpbC5lbmNvZGUoZCksbil9LHRva2VuaXplOmZ1bmN0aW9uKGUsdCl7dmFyIG49YS5Ub2tlbixkPVtlXSxyPXQucmVzdDtpZihyKXtmb3IodmFyIG8gaW4gcil0W29dPXJbb107ZGVsZXRlIHQucmVzdH10b2tlbmxvb3A6Zm9yKHZhciBvIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShvKSYmdFtvXSl7dmFyIGw9dFtvXTtsPSdBcnJheSc9PT1hLnV0aWwudHlwZShsKT9sOltsXTtmb3IodmFyIHM9MDtzPGwubGVuZ3RoOysrcyl7dmFyIGM9bFtzXSx1PWMuaW5zaWRlLGc9ISFjLmxvb2tiZWhpbmQsZj0hIWMuZ3JlZWR5LGI9MCxoPWMuYWxpYXM7aWYoZiYmIWMucGF0dGVybi5nbG9iYWwpe3ZhciBtPWMucGF0dGVybi50b1N0cmluZygpLm1hdGNoKC9baW11eV0qJC8pWzBdO2MucGF0dGVybj1SZWdFeHAoYy5wYXR0ZXJuLnNvdXJjZSxtKydnJyl9Yz1jLnBhdHRlcm58fGM7Zm9yKHZhciB5LHg9MCxpPTA7eDxkLmxlbmd0aDtpKz1kW3hdLmxlbmd0aCwrK3gpe2lmKHk9ZFt4XSxkLmxlbmd0aD5lLmxlbmd0aClicmVhayB0b2tlbmxvb3A7aWYoISh5IGluc3RhbmNlb2Ygbikpe2MubGFzdEluZGV4PTA7dmFyIHY9Yy5leGVjKHkpLHc9MTtpZighdiYmZiYmeCE9ZC5sZW5ndGgtMSl7aWYoYy5sYXN0SW5kZXg9aSx2PWMuZXhlYyhlKSwhdilicmVhaztmb3IodmFyIEM9di5pbmRleCsoZz92WzFdLmxlbmd0aDowKSxfPXYuaW5kZXgrdlswXS5sZW5ndGgsVD14LGs9aSxwPWQubGVuZ3RoO1Q8cCYmazxfOysrVClrKz1kW1RdLmxlbmd0aCxDPj1rJiYoKyt4LGk9ayk7aWYoZFt4XWluc3RhbmNlb2Ygbnx8ZFtULTFdLmdyZWVkeSljb250aW51ZTt3PVQteCx5PWUuc2xpY2UoaSxrKSx2LmluZGV4LT1pfWlmKHYpe2cmJihiPXZbMV0ubGVuZ3RoKTt2YXIgQz12LmluZGV4K2Isdj12WzBdLnNsaWNlKGIpLF89Qyt2Lmxlbmd0aCxTPXkuc2xpY2UoMCxDKSxNPXkuc2xpY2UoXyksRT1beCx3XTtTJiZFLnB1c2goUyk7dmFyIEQ9bmV3IG4obyx1P2EudG9rZW5pemUodix1KTp2LGgsdixmKTtFLnB1c2goRCksTSYmRS5wdXNoKE0pLEFycmF5LnByb3RvdHlwZS5zcGxpY2UuYXBwbHkoZCxFKX19fX19cmV0dXJuIGR9LGhvb2tzOnthbGw6e30sYWRkOmZ1bmN0aW9uKGUsdCl7dmFyIG49YS5ob29rcy5hbGw7bltlXT1uW2VdfHxbXSxuW2VdLnB1c2godCl9LHJ1bjpmdW5jdGlvbihlLHQpe3ZhciBuPWEuaG9va3MuYWxsW2VdO2lmKG4mJm4ubGVuZ3RoKWZvcih2YXIgZCxyPTA7ZD1uW3IrK107KWQodCl9fX0saT1hLlRva2VuPWZ1bmN0aW9uKGUsdCxuLGEsaSl7dGhpcy50eXBlPWUsdGhpcy5jb250ZW50PXQsdGhpcy5hbGlhcz1uLHRoaXMubGVuZ3RoPTB8KGF8fCcnKS5sZW5ndGgsdGhpcy5ncmVlZHk9ISFpfTtpZihpLnN0cmluZ2lmeT1mdW5jdGlvbihlLHQsbil7aWYoJ3N0cmluZyc9PXR5cGVvZiBlKXJldHVybiBlO2lmKCdBcnJheSc9PT1hLnV0aWwudHlwZShlKSlyZXR1cm4gZS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIGkuc3RyaW5naWZ5KG4sdCxlKX0pLmpvaW4oJycpO3ZhciBkPXt0eXBlOmUudHlwZSxjb250ZW50Omkuc3RyaW5naWZ5KGUuY29udGVudCx0LG4pLHRhZzonc3BhbicsY2xhc3NlczpbJ3Rva2VuJyxlLnR5cGVdLGF0dHJpYnV0ZXM6e30sbGFuZ3VhZ2U6dCxwYXJlbnQ6bn07aWYoJ2NvbW1lbnQnPT1kLnR5cGUmJihkLmF0dHJpYnV0ZXMuc3BlbGxjaGVjaz0ndHJ1ZScpLGUuYWxpYXMpe3ZhciByPSdBcnJheSc9PT1hLnV0aWwudHlwZShlLmFsaWFzKT9lLmFsaWFzOltlLmFsaWFzXTtBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShkLmNsYXNzZXMscil9YS5ob29rcy5ydW4oJ3dyYXAnLGQpO3ZhciBsPU9iamVjdC5rZXlzKGQuYXR0cmlidXRlcykubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlKyc9IicrKGQuYXR0cmlidXRlc1tlXXx8JycpLnJlcGxhY2UoLyIvZywnJnF1b3Q7JykrJyInfSkuam9pbignICcpO3JldHVybic8JytkLnRhZysnIGNsYXNzPSInK2QuY2xhc3Nlcy5qb2luKCcgJykrJyInKyhsPycgJytsOicnKSsnPicrZC5jb250ZW50Kyc8LycrZC50YWcrJz4nfSwhdC5kb2N1bWVudClyZXR1cm4gdC5hZGRFdmVudExpc3RlbmVyPyh0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLGZ1bmN0aW9uKGUpe3ZhciBuPUpTT04ucGFyc2UoZS5kYXRhKSxpPW4ubGFuZ3VhZ2UsZD1uLmNvZGUscj1uLmltbWVkaWF0ZUNsb3NlO3QucG9zdE1lc3NhZ2UoYS5oaWdobGlnaHQoZCxhLmxhbmd1YWdlc1tpXSxpKSksciYmdC5jbG9zZSgpfSwhMSksdC5QcmlzbSk6dC5QcmlzbTt2YXIgZD1kb2N1bWVudC5jdXJyZW50U2NyaXB0fHxbXS5zbGljZS5jYWxsKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKSkucG9wKCk7cmV0dXJuIGQmJihhLmZpbGVuYW1lPWQuc3JjLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXImJiFkLmhhc0F0dHJpYnV0ZSgnZGF0YS1tYW51YWwnKSYmKCdsb2FkaW5nJz09PWRvY3VtZW50LnJlYWR5U3RhdGU/ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsYS5oaWdobGlnaHRBbGwpOndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShhLmhpZ2hsaWdodEFsbCk6d2luZG93LnNldFRpbWVvdXQoYS5oaWdobGlnaHRBbGwsMTYpKSksdC5QcmlzbX0oKTtlLmV4cG9ydHMmJihlLmV4cG9ydHM9biksJ3VuZGVmaW5lZCchPXR5cGVvZiBfYSYmKF9hLlByaXNtPW4pLG4ubGFuZ3VhZ2VzLm1hcmt1cD17Y29tbWVudDovPCEtLVtcd1xXXSo/LS0+Lyxwcm9sb2c6LzxcP1tcd1xXXSs/XD8+Lyxkb2N0eXBlOi88IURPQ1RZUEVbXHdcV10rPz4vaSxjZGF0YTovPCFcW0NEQVRBXFtbXHdcV10qP11dPi9pLHRhZzp7cGF0dGVybjovPFwvPyg/IVxkKVteXHM+XC89JDxdKyg/OlxzK1teXHM+XC89XSsoPzo9KD86KCJ8JykoPzpcXFwxfFxcPyg/IVwxKVtcd1xXXSkqXDF8W15ccyciPj1dKykpPykqXHMqXC8/Pi9pLGluc2lkZTp7dGFnOntwYXR0ZXJuOi9ePFwvP1teXHM+XC9dKy9pLGluc2lkZTp7cHVuY3R1YXRpb246L148XC8/LyxuYW1lc3BhY2U6L15bXlxzPlwvOl0rOi99fSwiYXR0ci12YWx1ZSI6e3BhdHRlcm46Lz0oPzooJ3wiKVtcd1xXXSo/KFwxKXxbXlxzPl0rKS9pLGluc2lkZTp7cHVuY3R1YXRpb246L1s9PiInXS99fSxwdW5jdHVhdGlvbjovXC8/Pi8sImF0dHItbmFtZSI6e3BhdHRlcm46L1teXHM+XC9dKy8saW5zaWRlOntuYW1lc3BhY2U6L15bXlxzPlwvOl0rOi99fX19LGVudGl0eTovJiM/W1xkYS16XXsxLDh9Oy9pfSxuLmhvb2tzLmFkZCgnd3JhcCcsZnVuY3Rpb24oZSl7J2VudGl0eSc9PT1lLnR5cGUmJihlLmF0dHJpYnV0ZXMudGl0bGU9ZS5jb250ZW50LnJlcGxhY2UoLyZhbXA7LywnJicpKX0pLG4ubGFuZ3VhZ2VzLnhtbD1uLmxhbmd1YWdlcy5tYXJrdXAsbi5sYW5ndWFnZXMuaHRtbD1uLmxhbmd1YWdlcy5tYXJrdXAsbi5sYW5ndWFnZXMubWF0aG1sPW4ubGFuZ3VhZ2VzLm1hcmt1cCxuLmxhbmd1YWdlcy5zdmc9bi5sYW5ndWFnZXMubWFya3VwLG4ubGFuZ3VhZ2VzLmNzcz17Y29tbWVudDovXC9cKltcd1xXXSo/XCpcLy8sYXRydWxlOntwYXR0ZXJuOi9AW1x3LV0rPy4qPyg7fCg/PVxzKlx7KSkvaSxpbnNpZGU6e3J1bGU6L0BbXHctXSsvfX0sdXJsOi91cmxcKCg/OihbIiddKShcXCg/OlxyXG58W1x3XFddKXwoPyFcMSlbXlxcXHJcbl0pKlwxfC4qPylcKS9pLHNlbGVjdG9yOi9bXlx7XH1cc11bXlx7XH07XSo/KD89XHMqXHspLyxzdHJpbmc6e3BhdHRlcm46LygifCcpKFxcKD86XHJcbnxbXHdcV10pfCg/IVwxKVteXFxcclxuXSkqXDEvLGdyZWVkeTohMH0scHJvcGVydHk6LyhcYnxcQilbXHctXSsoPz1ccyo6KS9pLGltcG9ydGFudDovXEIhaW1wb3J0YW50XGIvaSxmdW5jdGlvbjovWy1hLXowLTldKyg/PVwoKS9pLHB1bmN0dWF0aW9uOi9bKCl7fTs6XS99LG4ubGFuZ3VhZ2VzLmNzcy5hdHJ1bGUuaW5zaWRlLnJlc3Q9bi51dGlsLmNsb25lKG4ubGFuZ3VhZ2VzLmNzcyksbi5sYW5ndWFnZXMubWFya3VwJiYobi5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdtYXJrdXAnLCd0YWcnLHtzdHlsZTp7cGF0dGVybjovKDxzdHlsZVtcd1xXXSo/PilbXHdcV10qPyg/PTxcL3N0eWxlPikvaSxsb29rYmVoaW5kOiEwLGluc2lkZTpuLmxhbmd1YWdlcy5jc3MsYWxpYXM6J2xhbmd1YWdlLWNzcyd9fSksbi5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdpbnNpZGUnLCdhdHRyLXZhbHVlJyx7InN0eWxlLWF0dHIiOntwYXR0ZXJuOi9ccypzdHlsZT0oInwnKS4qP1wxL2ksaW5zaWRlOnsiYXR0ci1uYW1lIjp7cGF0dGVybjovXlxzKnN0eWxlL2ksaW5zaWRlOm4ubGFuZ3VhZ2VzLm1hcmt1cC50YWcuaW5zaWRlfSxwdW5jdHVhdGlvbjovXlxzKj1ccypbJyJdfFsnIl1ccyokLywiYXR0ci12YWx1ZSI6e3BhdHRlcm46Ly4rL2ksaW5zaWRlOm4ubGFuZ3VhZ2VzLmNzc319LGFsaWFzOidsYW5ndWFnZS1jc3MnfX0sbi5sYW5ndWFnZXMubWFya3VwLnRhZykpLG4ubGFuZ3VhZ2VzLmNsaWtlPXtjb21tZW50Olt7cGF0dGVybjovKF58W15cXF0pXC9cKltcd1xXXSo/XCpcLy8sbG9va2JlaGluZDohMH0se3BhdHRlcm46LyhefFteXFw6XSlcL1wvLiovLGxvb2tiZWhpbmQ6ITB9LHtwYXR0ZXJuOi8oXnxbXlxcXSkjLiovLGxvb2tiZWhpbmQ6ITB9XSxzdHJpbmc6e3BhdHRlcm46LyhbIiddKShcXCg/OlxyXG58W1xzXFNdKXwoPyFcMSlbXlxcXHJcbl0pKlwxLyxncmVlZHk6ITB9LCJjbGFzcy1uYW1lIjp7cGF0dGVybjovKCg/OlxiKD86Y2xhc3N8aW50ZXJmYWNlfGV4dGVuZHN8aW1wbGVtZW50c3x0cmFpdHxpbnN0YW5jZW9mfG5ldylccyspfCg/OmNhdGNoXHMrXCgpKVthLXowLTlfXC5cXF0rL2ksbG9va2JlaGluZDohMCxpbnNpZGU6e3B1bmN0dWF0aW9uOi8oXC58XFwpL319LGtleXdvcmQ6L1xiKGlmfGVsc2V8d2hpbGV8ZG98Zm9yfHJldHVybnxpbnxpbnN0YW5jZW9mfGZ1bmN0aW9ufG5ld3x0cnl8dGhyb3d8Y2F0Y2h8ZmluYWxseXxudWxsfGJyZWFrfGNvbnRpbnVlKVxiLyxib29sZWFuOi9cYih0cnVlfGZhbHNlKVxiLyxmdW5jdGlvbjovW2EtelwuMC05X10rKD89XCgpL2ksbnVtYmVyOi9cYi0/KD86MHhbXGRhLWZdK3xcZCpcLj9cZCsoPzplWystXT9cZCspPylcYi9pLG9wZXJhdG9yOi8tLT98XCtcKz98IT0/PT98PD0/fD49P3w9PT89P3wmJj98XHxcfD98XD98XCp8XC98fnxcXnwlLyxwdW5jdHVhdGlvbjovW3t9W1xdOygpLC46XS99LG4ubGFuZ3VhZ2VzLmphdmFzY3JpcHQ9bi5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScse2tleXdvcmQ6L1xiKGFzfGFzeW5jfGF3YWl0fGJyZWFrfGNhc2V8Y2F0Y2h8Y2xhc3N8Y29uc3R8Y29udGludWV8ZGVidWdnZXJ8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxlbnVtfGV4cG9ydHxleHRlbmRzfGZpbmFsbHl8Zm9yfGZyb218ZnVuY3Rpb258Z2V0fGlmfGltcGxlbWVudHN8aW1wb3J0fGlufGluc3RhbmNlb2Z8aW50ZXJmYWNlfGxldHxuZXd8bnVsbHxvZnxwYWNrYWdlfHByaXZhdGV8cHJvdGVjdGVkfHB1YmxpY3xyZXR1cm58c2V0fHN0YXRpY3xzdXBlcnxzd2l0Y2h8dGhpc3x0aHJvd3x0cnl8dHlwZW9mfHZhcnx2b2lkfHdoaWxlfHdpdGh8eWllbGQpXGIvLG51bWJlcjovXGItPygweFtcZEEtRmEtZl0rfDBiWzAxXSt8MG9bMC03XSt8XGQqXC4/XGQrKFtFZV1bKy1dP1xkKyk/fE5hTnxJbmZpbml0eSlcYi8sZnVuY3Rpb246L1tfJGEtekEtWlx4QTAtXHVGRkZGXVtfJGEtekEtWjAtOVx4QTAtXHVGRkZGXSooPz1cKCkvaSxvcGVyYXRvcjovLS0/fFwrXCs/fCE9Pz0/fDw9P3w+PT98PT0/PT98JiY/fFx8XHw/fFw/fFwqXCo/fFwvfH58XF58JXxcLnszfS99KSxuLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2phdmFzY3JpcHQnLCdrZXl3b3JkJyx7cmVnZXg6e3BhdHRlcm46LyhefFteL10pXC8oPyFcLykoXFsuKz9dfFxcLnxbXi9cXFxyXG5dKStcL1tnaW15dV17MCw1fSg/PVxzKigkfFtcclxuLC47fSldKSkvLGxvb2tiZWhpbmQ6ITAsZ3JlZWR5OiEwfX0pLG4ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnamF2YXNjcmlwdCcsJ3N0cmluZycseyJ0ZW1wbGF0ZS1zdHJpbmciOntwYXR0ZXJuOi9gKD86XFxcXHxcXD9bXlxcXSkqP2AvLGdyZWVkeTohMCxpbnNpZGU6e2ludGVycG9sYXRpb246e3BhdHRlcm46L1wkXHtbXn1dK1x9LyxpbnNpZGU6eyJpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uIjp7cGF0dGVybjovXlwkXHt8XH0kLyxhbGlhczoncHVuY3R1YXRpb24nfSxyZXN0Om4ubGFuZ3VhZ2VzLmphdmFzY3JpcHR9fSxzdHJpbmc6L1tcc1xTXSsvfX19KSxuLmxhbmd1YWdlcy5tYXJrdXAmJm4ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnbWFya3VwJywndGFnJyx7c2NyaXB0OntwYXR0ZXJuOi8oPHNjcmlwdFtcd1xXXSo/PilbXHdcV10qPyg/PTxcL3NjcmlwdD4pL2ksbG9va2JlaGluZDohMCxpbnNpZGU6bi5sYW5ndWFnZXMuamF2YXNjcmlwdCxhbGlhczonbGFuZ3VhZ2UtamF2YXNjcmlwdCd9fSksbi5sYW5ndWFnZXMuanM9bi5sYW5ndWFnZXMuamF2YXNjcmlwdCxmdW5jdGlvbigpeyd1bmRlZmluZWQnIT10eXBlb2Ygc2VsZiYmc2VsZi5QcmlzbSYmc2VsZi5kb2N1bWVudCYmZG9jdW1lbnQucXVlcnlTZWxlY3RvciYmKHNlbGYuUHJpc20uZmlsZUhpZ2hsaWdodD1mdW5jdGlvbigpe3ZhciBlPXtqczonamF2YXNjcmlwdCcscHk6J3B5dGhvbicscmI6J3J1YnknLHBzMToncG93ZXJzaGVsbCcscHNtMToncG93ZXJzaGVsbCcsc2g6J2Jhc2gnLGJhdDonYmF0Y2gnLGg6J2MnLHRleDonbGF0ZXgnfTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaCYmQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgncHJlW2RhdGEtc3JjXScpKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgYSxpPXQuZ2V0QXR0cmlidXRlKCdkYXRhLXNyYycpLGQ9dCxyPS9cYmxhbmcoPzp1YWdlKT8tKD8hXCopKFx3KylcYi9pO2QmJiFyLnRlc3QoZC5jbGFzc05hbWUpOylkPWQucGFyZW50Tm9kZTtpZihkJiYoYT0odC5jbGFzc05hbWUubWF0Y2gocil8fFssJyddKVsxXSksIWEpe3ZhciBvPShpLm1hdGNoKC9cLihcdyspJC8pfHxbLCcnXSlbMV07YT1lW29dfHxvfXZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NvZGUnKTtsLmNsYXNzTmFtZT0nbGFuZ3VhZ2UtJythLHQudGV4dENvbnRlbnQ9JycsbC50ZXh0Q29udGVudD0nTG9hZGluZ1x1MjAyNicsdC5hcHBlbmRDaGlsZChsKTt2YXIgcz1uZXcgWE1MSHR0cFJlcXVlc3Q7cy5vcGVuKCdHRVQnLGksITApLHMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ND09cy5yZWFkeVN0YXRlJiYoNDAwPnMuc3RhdHVzJiZzLnJlc3BvbnNlVGV4dD8obC50ZXh0Q29udGVudD1zLnJlc3BvbnNlVGV4dCxuLmhpZ2hsaWdodEVsZW1lbnQobCkpOjQwMDw9cy5zdGF0dXM/bC50ZXh0Q29udGVudD0nXHUyNzE2IEVycm9yICcrcy5zdGF0dXMrJyB3aGlsZSBmZXRjaGluZyBmaWxlOiAnK3Muc3RhdHVzVGV4dDpsLnRleHRDb250ZW50PSdcdTI3MTYgRXJyb3I6IEZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgaXMgZW1wdHknKX0scy5zZW5kKG51bGwpfSl9LGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLHNlbGYuUHJpc20uZmlsZUhpZ2hsaWdodCkpfSgpfSk7UHJpc20ubGFuZ3VhZ2VzLnB5dGhvbj17InRyaXBsZS1xdW90ZWQtc3RyaW5nIjp7cGF0dGVybjovIiIiW1xzXFNdKz8iIiJ8JycnW1xzXFNdKz8nJycvLGFsaWFzOidzdHJpbmcnfSxjb21tZW50OntwYXR0ZXJuOi8oXnxbXlxcXSkjLiovLGxvb2tiZWhpbmQ6ITB9LHN0cmluZzp7cGF0dGVybjovKCJ8JykoPzpcXFxcfFxcP1teXFxcclxuXSkqP1wxLyxncmVlZHk6ITB9LGZ1bmN0aW9uOntwYXR0ZXJuOi8oKD86XnxccylkZWZbIFx0XSspW2EtekEtWl9dW2EtekEtWjAtOV9dKig/PVwoKS9nLGxvb2tiZWhpbmQ6ITB9LCJjbGFzcy1uYW1lIjp7cGF0dGVybjovKFxiY2xhc3NccyspW2EtejAtOV9dKy9pLGxvb2tiZWhpbmQ6ITB9LGtleXdvcmQ6L1xiKD86YXN8YXNzZXJ0fGFzeW5jfGF3YWl0fGJyZWFrfGNsYXNzfGNvbnRpbnVlfGRlZnxkZWx8ZWxpZnxlbHNlfGV4Y2VwdHxleGVjfGZpbmFsbHl8Zm9yfGZyb218Z2xvYmFsfGlmfGltcG9ydHxpbnxpc3xsYW1iZGF8cGFzc3xwcmludHxyYWlzZXxyZXR1cm58dHJ5fHdoaWxlfHdpdGh8eWllbGQpXGIvLGJvb2xlYW46L1xiKD86VHJ1ZXxGYWxzZSlcYi8sbnVtYmVyOi9cYi0/KD86MFtib10pPyg/Oig/OlxkfDB4W1xkYS1mXSlbXGRhLWZdKlwuP1xkKnxcLlxkKykoPzplWystXT9cZCspP2o/XGIvaSxvcGVyYXRvcjovWy0rJT1dPT98IT18XCpcKj89P3xcL1wvPz0/fDxbPD0+XT98Pls9Pl0/fFsmfF5+XXxcYig/Om9yfGFuZHxub3QpXGIvLHB1bmN0dWF0aW9uOi9be31bXF07KCksLjpdL30sUHJpc20ubGFuZ3VhZ2VzLmNsaWtlPXtjb21tZW50Olt7cGF0dGVybjovKF58W15cXF0pXC9cKltcd1xXXSo/XCpcLy8sbG9va2JlaGluZDohMH0se3BhdHRlcm46LyhefFteXFw6XSlcL1wvLiovLGxvb2tiZWhpbmQ6ITB9LHtwYXR0ZXJuOi8oXnxbXlxcXSkjLiovLGxvb2tiZWhpbmQ6ITB9XSxzdHJpbmc6e3BhdHRlcm46LyhbIiddKShcXCg/OlxyXG58W1xzXFNdKXwoPyFcMSlbXlxcXHJcbl0pKlwxLyxncmVlZHk6ITB9LCJjbGFzcy1uYW1lIjp7cGF0dGVybjovKCg/OlxiKD86Y2xhc3N8aW50ZXJmYWNlfGV4dGVuZHN8aW1wbGVtZW50c3x0cmFpdHxpbnN0YW5jZW9mfG5ldylccyspfCg/OmNhdGNoXHMrXCgpKVthLXowLTlfXC5cXF0rL2ksbG9va2JlaGluZDohMCxpbnNpZGU6e3B1bmN0dWF0aW9uOi8oXC58XFwpL319LGtleXdvcmQ6L1xiKGlmfGVsc2V8d2hpbGV8ZG98Zm9yfHJldHVybnxpbnxpbnN0YW5jZW9mfGZ1bmN0aW9ufG5ld3x0cnl8dGhyb3d8Y2F0Y2h8ZmluYWxseXxudWxsfGJyZWFrfGNvbnRpbnVlKVxiLyxib29sZWFuOi9cYih0cnVlfGZhbHNlKVxiLyxmdW5jdGlvbjovW2EtelwuMC05X10rKD89XCgpL2ksbnVtYmVyOi9cYi0/KD86MHhbXGRhLWZdK3xcZCpcLj9cZCsoPzplWystXT9cZCspPylcYi9pLG9wZXJhdG9yOi8tLT98XCtcKz98IT0/PT98PD0/fD49P3w9PT89P3wmJj98XHxcfD98XD98XCp8XC98fnxcXnwlLyxwdW5jdHVhdGlvbjovW3t9W1xdOygpLC46XS99LFByaXNtLmxhbmd1YWdlcy5sdWE9e2NvbW1lbnQ6L14jIS4rfC0tKD86XFsoPSopXFtbXHNcU10qP1xdXDFcXXwuKikvbSxzdHJpbmc6e3BhdHRlcm46LyhbIiddKSg/Oig/IVwxKVteXFxcclxuXXxcXHooPzpcclxufFxzKXxcXCg/OlxyXG58W1xzXFNdKSkqXDF8XFsoPSopXFtbXHNcU10qP1xdXDJcXS8sZ3JlZWR5OiEwfSxudW1iZXI6L1xiMHhbYS1mXGRdK1wuP1thLWZcZF0qKD86cFsrLV0/XGQrKT9cYnxcYlxkKyg/OlwuXEJ8XC4/XGQqKD86ZVsrLV0/XGQrKT9cYil8XEJcLlxkKyg/OmVbKy1dP1xkKyk/XGIvaSxrZXl3b3JkOi9cYig/OmFuZHxicmVha3xkb3xlbHNlfGVsc2VpZnxlbmR8ZmFsc2V8Zm9yfGZ1bmN0aW9ufGdvdG98aWZ8aW58bG9jYWx8bmlsfG5vdHxvcnxyZXBlYXR8cmV0dXJufHRoZW58dHJ1ZXx1bnRpbHx3aGlsZSlcYi8sZnVuY3Rpb246Lyg/IVxkKVx3Kyg/PVxzKig/Olsoe10pKS8sb3BlcmF0b3I6Wy9bLSsqJV4mfCNdfFwvXC8/fDxbPD1dP3w+Wz49XT98Wz1+XT0/Lyx7cGF0dGVybjovKF58W14uXSlcLlwuKD8hXC4pLyxsb29rYmVoaW5kOiEwfV0scHVuY3R1YXRpb246L1tcW1xdKCl7fSw7XXxcLit8OisvfSxmdW5jdGlvbihlKXt2YXIgdD17dmFyaWFibGU6W3twYXR0ZXJuOi9cJD9cKFwoW1x3XFddKz9cKVwpLyxpbnNpZGU6e3ZhcmlhYmxlOlt7cGF0dGVybjovKF5cJFwoXChbXHdcV10rKVwpXCkvLGxvb2tiZWhpbmQ6ITB9LC9eXCRcKFwoL10sbnVtYmVyOi9cYi0/KD86MHhbXGRBLUZhLWZdK3xcZCpcLj9cZCsoPzpbRWVdLT9cZCspPylcYi8sb3BlcmF0b3I6Ly0tP3wtPXxcK1wrP3xcKz18IT0/fH58XCpcKj98XCo9fFwvPT98JT0/fDw8PT98Pj49P3w8PT98Pj0/fD09P3wmJj98Jj18XF49P3xcfFx8P3xcfD18XD98Oi8scHVuY3R1YXRpb246L1woXCg/fFwpXCk/fCx8Oy99fSx7cGF0dGVybjovXCRcKFteKV0rXCl8YFteYF0rYC8saW5zaWRlOnt2YXJpYWJsZTovXlwkXCh8XmB8XCkkfGAkL319LC9cJCg/OlthLXowLTlfI1w/XCohQF0rfFx7W159XStcfSkvaV19O2UubGFuZ3VhZ2VzLmJhc2g9e3NoZWJhbmc6e3BhdHRlcm46L14jIVxzKlwvYmluXC9iYXNofF4jIVxzKlwvYmluXC9zaC8sYWxpYXM6J2ltcG9ydGFudCd9LGNvbW1lbnQ6e3BhdHRlcm46LyhefFteIntcXF0pIy4qLyxsb29rYmVoaW5kOiEwfSxzdHJpbmc6W3twYXR0ZXJuOi8oKD86XnxbXjxdKTw8XHMqKSg/OiJ8Jyk/KFx3Kz8pKD86InwnKT9ccypccj9cbig/Oltcc1xTXSkqP1xyP1xuXDIvZyxsb29rYmVoaW5kOiEwLGdyZWVkeTohMCxpbnNpZGU6dH0se3BhdHRlcm46LyhbIiddKSg/OlxcXFx8XFw/W15cXF0pKj9cMS9nLGdyZWVkeTohMCxpbnNpZGU6dH1dLHZhcmlhYmxlOnQudmFyaWFibGUsZnVuY3Rpb246e3BhdHRlcm46LyhefFxzfDt8XHx8JikoPzphbGlhc3xhcHJvcG9zfGFwdC1nZXR8YXB0aXR1ZGV8YXNwZWxsfGF3a3xiYXNlbmFtZXxiYXNofGJjfGJnfGJ1aWx0aW58YnppcDJ8Y2FsfGNhdHxjZHxjZmRpc2t8Y2hncnB8Y2htb2R8Y2hvd258Y2hyb290fGNoa2NvbmZpZ3xja3N1bXxjbGVhcnxjbXB8Y29tbXxjb21tYW5kfGNwfGNyb258Y3JvbnRhYnxjc3BsaXR8Y3V0fGRhdGV8ZGN8ZGR8ZGRyZXNjdWV8ZGZ8ZGlmZnxkaWZmM3xkaWd8ZGlyfGRpcmNvbG9yc3xkaXJuYW1lfGRpcnN8ZG1lc2d8ZHV8ZWdyZXB8ZWplY3R8ZW5hYmxlfGVudnxldGh0b29sfGV2YWx8ZXhlY3xleHBhbmR8ZXhwZWN0fGV4cG9ydHxleHByfGZkZm9ybWF0fGZkaXNrfGZnfGZncmVwfGZpbGV8ZmluZHxmbXR8Zm9sZHxmb3JtYXR8ZnJlZXxmc2NrfGZ0cHxmdXNlcnxnYXdrfGdldG9wdHN8Z2l0fGdyZXB8Z3JvdXBhZGR8Z3JvdXBkZWx8Z3JvdXBtb2R8Z3JvdXBzfGd6aXB8aGFzaHxoZWFkfGhlbHB8aGd8aGlzdG9yeXxob3N0bmFtZXxodG9wfGljb252fGlkfGlmY29uZmlnfGlmZG93bnxpZnVwfGltcG9ydHxpbnN0YWxsfGpvYnN8am9pbnxraWxsfGtpbGxhbGx8bGVzc3xsaW5rfGxufGxvY2F0ZXxsb2duYW1lfGxvZ291dHxsb29rfGxwY3xscHJ8bHByaW50fGxwcmludGR8bHByaW50cXxscHJtfGxzfGxzb2Z8bWFrZXxtYW58bWtkaXJ8bWtmaWZvfG1raXNvZnN8bWtub2R8bW9yZXxtb3N0fG1vdW50fG10b29sc3xtdHJ8bXZ8bW12fG5hbm98bmV0c3RhdHxuaWNlfG5sfG5vaHVwfG5vdGlmeS1zZW5kfG5wbXxuc2xvb2t1cHxvcGVufG9wfHBhc3N3ZHxwYXN0ZXxwYXRoY2hrfHBpbmd8cGtpbGx8cG9wZHxwcnxwcmludGNhcHxwcmludGVudnxwcmludGZ8cHN8cHVzaGR8cHZ8cHdkfHF1b3RhfHF1b3RhY2hlY2t8cXVvdGFjdGx8cmFtfHJhcnxyY3B8cmVhZHxyZWFkYXJyYXl8cmVhZG9ubHl8cmVib290fHJlbmFtZXxyZW5pY2V8cmVtc3luY3xyZXZ8cm18cm1kaXJ8cnN5bmN8c2NyZWVufHNjcHxzZGlmZnxzZWR8c2VxfHNlcnZpY2V8c2Z0cHxzaGlmdHxzaG9wdHxzaHV0ZG93bnxzbGVlcHxzbG9jYXRlfHNvcnR8c291cmNlfHNwbGl0fHNzaHxzdGF0fHN0cmFjZXxzdXxzdWRvfHN1bXxzdXNwZW5kfHN5bmN8dGFpbHx0YXJ8dGVlfHRlc3R8dGltZXx0aW1lb3V0fHRpbWVzfHRvdWNofHRvcHx0cmFjZXJvdXRlfHRyYXB8dHJ8dHNvcnR8dHR5fHR5cGV8dWxpbWl0fHVtYXNrfHVtb3VudHx1bmFsaWFzfHVuYW1lfHVuZXhwYW5kfHVuaXF8dW5pdHN8dW5yYXJ8dW5zaGFyfHVwdGltZXx1c2VyYWRkfHVzZXJkZWx8dXNlcm1vZHx1c2Vyc3x1dWVuY29kZXx1dWRlY29kZXx2fHZkaXJ8dml8dm1zdGF0fHdhaXR8d2F0Y2h8d2N8d2dldHx3aGVyZWlzfHdoaWNofHdob3x3aG9hbWl8d3JpdGV8eGFyZ3N8eGRnLW9wZW58eWVzfHppcCkoPz0kfFxzfDt8XHx8JikvLGxvb2tiZWhpbmQ6ITB9LGtleXdvcmQ6e3BhdHRlcm46LyhefFxzfDt8XHx8JikoPzpsZXR8OnxcLnxpZnx0aGVufGVsc2V8ZWxpZnxmaXxmb3J8YnJlYWt8Y29udGludWV8d2hpbGV8aW58Y2FzZXxmdW5jdGlvbnxzZWxlY3R8ZG98ZG9uZXx1bnRpbHxlY2hvfGV4aXR8cmV0dXJufHNldHxkZWNsYXJlKSg/PSR8XHN8O3xcfHwmKS8sbG9va2JlaGluZDohMH0sYm9vbGVhbjp7cGF0dGVybjovKF58XHN8O3xcfHwmKSg/OnRydWV8ZmFsc2UpKD89JHxcc3w7fFx8fCYpLyxsb29rYmVoaW5kOiEwfSxvcGVyYXRvcjovJiY/fFx8XHw/fD09P3whPT98PDw8P3w+Pnw8PT98Pj0/fD1+LyxwdW5jdHVhdGlvbjovXCQ/XChcKD98XClcKT98XC5cLnxbe31bXF07XS99O3ZhciBuPXQudmFyaWFibGVbMV0uaW5zaWRlO25bJ2Z1bmN0aW9uJ109ZS5sYW5ndWFnZXMuYmFzaFsnZnVuY3Rpb24nXSxuLmtleXdvcmQ9ZS5sYW5ndWFnZXMuYmFzaC5rZXl3b3JkLG4uYm9vbGVhbj1lLmxhbmd1YWdlcy5iYXNoLmJvb2xlYW4sbi5vcGVyYXRvcj1lLmxhbmd1YWdlcy5iYXNoLm9wZXJhdG9yLG4ucHVuY3R1YXRpb249ZS5sYW5ndWFnZXMuYmFzaC5wdW5jdHVhdGlvbn0oUHJpc20pLFByaXNtLmxhbmd1YWdlcy5nbz1QcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScse2tleXdvcmQ6L1xiKGJyZWFrfGNhc2V8Y2hhbnxjb25zdHxjb250aW51ZXxkZWZhdWx0fGRlZmVyfGVsc2V8ZmFsbHRocm91Z2h8Zm9yfGZ1bmN8Z28odG8pP3xpZnxpbXBvcnR8aW50ZXJmYWNlfG1hcHxwYWNrYWdlfHJhbmdlfHJldHVybnxzZWxlY3R8c3RydWN0fHN3aXRjaHx0eXBlfHZhcilcYi8sYnVpbHRpbjovXGIoYm9vbHxieXRlfGNvbXBsZXgoNjR8MTI4KXxlcnJvcnxmbG9hdCgzMnw2NCl8cnVuZXxzdHJpbmd8dT9pbnQoOHwxNnwzMnw2NHwpfHVpbnRwdHJ8YXBwZW5kfGNhcHxjbG9zZXxjb21wbGV4fGNvcHl8ZGVsZXRlfGltYWd8bGVufG1ha2V8bmV3fHBhbmljfHByaW50KGxuKT98cmVhbHxyZWNvdmVyKVxiLyxib29sZWFuOi9cYihffGlvdGF8bmlsfHRydWV8ZmFsc2UpXGIvLG9wZXJhdG9yOi9bKlwvJV4hPV09P3xcK1s9K10/fC1bPS1dP3xcfFs9fF0/fCYoPzo9fCZ8XF49Pyk/fD4oPzo+PT98PSk/fDwoPzo8PT98PXwtKT98Oj18XC5cLlwuLyxudW1iZXI6L1xiKC0/KDB4W2EtZlxkXSt8KFxkK1wuP1xkKnxcLlxkKykoZVstK10/XGQrKT8paT8pXGIvaSxzdHJpbmc6LygifCd8YCkoXFw/LnxccnxcbikqP1wxL30pLGRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMuZ29bJ2NsYXNzLW5hbWUnXSxQcmlzbS5sYW5ndWFnZXMubWFya2Rvd249UHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnbWFya3VwJyx7fSksUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnbWFya2Rvd24nLCdwcm9sb2cnLHtibG9ja3F1b3RlOntwYXR0ZXJuOi9ePig/OltcdCBdKj4pKi9tLGFsaWFzOidwdW5jdHVhdGlvbid9LGNvZGU6W3twYXR0ZXJuOi9eKD86IHs0fXxcdCkuKy9tLGFsaWFzOidrZXl3b3JkJ30se3BhdHRlcm46L2BgLis/YGB8YFteYFxuXStgLyxhbGlhczona2V5d29yZCd9XSx0aXRsZTpbe3BhdHRlcm46L1x3Ky4qKD86XHI/XG58XHIpKD86PT0rfC0tKykvLGFsaWFzOidpbXBvcnRhbnQnLGluc2lkZTp7cHVuY3R1YXRpb246Lz09KyR8LS0rJC99fSx7cGF0dGVybjovKF5ccyopIysuKy9tLGxvb2tiZWhpbmQ6ITAsYWxpYXM6J2ltcG9ydGFudCcsaW5zaWRlOntwdW5jdHVhdGlvbjovXiMrfCMrJC99fV0saHI6e3BhdHRlcm46LyheXHMqKShbKi1dKShbXHQgXSpcMil7Mix9KD89XHMqJCkvbSxsb29rYmVoaW5kOiEwLGFsaWFzOidwdW5jdHVhdGlvbid9LGxpc3Q6e3BhdHRlcm46LyheXHMqKSg/OlsqKy1dfFxkK1wuKSg/PVtcdCBdLikvbSxsb29rYmVoaW5kOiEwLGFsaWFzOidwdW5jdHVhdGlvbid9LCJ1cmwtcmVmZXJlbmNlIjp7cGF0dGVybjovIT9cW1teXF1dK1xdOltcdCBdKyg/OlxTK3w8KD86XFwufFtePlxcXSkrPikoPzpbXHQgXSsoPzoiKD86XFwufFteIlxcXSkqInwnKD86XFwufFteJ1xcXSkqJ3xcKCg/OlxcLnxbXilcXF0pKlwpKSk/LyxpbnNpZGU6e3ZhcmlhYmxlOntwYXR0ZXJuOi9eKCE/XFspW15cXV0rLyxsb29rYmVoaW5kOiEwfSxzdHJpbmc6Lyg/OiIoPzpcXC58W14iXFxdKSoifCcoPzpcXC58W14nXFxdKSonfFwoKD86XFwufFteKVxcXSkqXCkpJC8scHVuY3R1YXRpb246L15bXFtcXSE6XXxbPD5dL30sYWxpYXM6J3VybCd9LGJvbGQ6e3BhdHRlcm46LyhefFteXFxdKShcKlwqfF9fKSg/Oig/OlxyP1xufFxyKSg/IVxyP1xufFxyKXwuKSs/XDIvLGxvb2tiZWhpbmQ6ITAsaW5zaWRlOntwdW5jdHVhdGlvbjovXlwqXCp8Xl9ffFwqXCokfF9fJC99fSxpdGFsaWM6e3BhdHRlcm46LyhefFteXFxdKShbKl9dKSg/Oig/OlxyP1xufFxyKSg/IVxyP1xufFxyKXwuKSs/XDIvLGxvb2tiZWhpbmQ6ITAsaW5zaWRlOntwdW5jdHVhdGlvbjovXlsqX118WypfXSQvfX0sdXJsOntwYXR0ZXJuOi8hP1xbW15cXV0rXF0oPzpcKFteXHMpXSsoPzpbXHQgXSsiKD86XFwufFteIlxcXSkqIik/XCl8ID9cW1teXF1cbl0qXF0pLyxpbnNpZGU6e3ZhcmlhYmxlOntwYXR0ZXJuOi8oIT9cWylbXlxdXSsoPz1cXSQpLyxsb29rYmVoaW5kOiEwfSxzdHJpbmc6e3BhdHRlcm46LyIoPzpcXC58W14iXFxdKSoiKD89XCkkKS99fX19KSxQcmlzbS5sYW5ndWFnZXMubWFya2Rvd24uYm9sZC5pbnNpZGUudXJsPVByaXNtLnV0aWwuY2xvbmUoUHJpc20ubGFuZ3VhZ2VzLm1hcmtkb3duLnVybCksUHJpc20ubGFuZ3VhZ2VzLm1hcmtkb3duLml0YWxpYy5pbnNpZGUudXJsPVByaXNtLnV0aWwuY2xvbmUoUHJpc20ubGFuZ3VhZ2VzLm1hcmtkb3duLnVybCksUHJpc20ubGFuZ3VhZ2VzLm1hcmtkb3duLmJvbGQuaW5zaWRlLml0YWxpYz1QcmlzbS51dGlsLmNsb25lKFByaXNtLmxhbmd1YWdlcy5tYXJrZG93bi5pdGFsaWMpLFByaXNtLmxhbmd1YWdlcy5tYXJrZG93bi5pdGFsaWMuaW5zaWRlLmJvbGQ9UHJpc20udXRpbC5jbG9uZShQcmlzbS5sYW5ndWFnZXMubWFya2Rvd24uYm9sZCksUHJpc20ubGFuZ3VhZ2VzLmp1bGlhPXtjb21tZW50OntwYXR0ZXJuOi8oXnxbXlxcXSkjLiovLGxvb2tiZWhpbmQ6ITB9LHN0cmluZzovIiIiW1xzXFNdKz8iIiJ8JycnW1xzXFNdKz8nJyd8KCJ8JykoXFw/LikqP1wxLyxrZXl3b3JkOi9cYihhYnN0cmFjdHxiYXJlbW9kdWxlfGJlZ2lufGJpdHN0eXBlfGJyZWFrfGNhdGNofGNjYWxsfGNvbnN0fGNvbnRpbnVlfGRvfGVsc2V8ZWxzZWlmfGVuZHxleHBvcnR8ZmluYWxseXxmb3J8ZnVuY3Rpb258Z2xvYmFsfGlmfGltbXV0YWJsZXxpbXBvcnR8aW1wb3J0YWxsfGxldHxsb2NhbHxtYWNyb3xtb2R1bGV8cHJpbnR8cHJpbnRsbnxxdW90ZXxyZXR1cm58dHJ5fHR5cGV8dHlwZWFsaWFzfHVzaW5nfHdoaWxlKVxiLyxib29sZWFuOi9cYih0cnVlfGZhbHNlKVxiLyxudW1iZXI6L1xiLT8oMFtib3hdKT8oPzpbXGRhLWZdK1wuP1xkKnxcLlxkKykoPzpbZWZwXVsrLV0/XGQrKT9qP1xiL2ksb3BlcmF0b3I6L1wrPT98LT0/fFwqPT98XC9bXC89XT98XFw9P3xcXj0/fCU9P3zDtz0/fCE9Pz0/fCY9P3xcfFs9Pl0/fFwkPT98PCg/Ojw9P3xbPTpdKT98Pig/Oj18Pj4/PT8pP3w9PT89P3xbfuKJoOKJpOKJpV0vLHB1bmN0dWF0aW9uOi9be31bXF07KCksLjpdL307Y29uc3QgamE9ZWEoJ2QtY29kZScsYAo8c3R5bGU+Cgpjb2RlIHsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwogIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wNCk7CiAgYm9yZGVyLXJhZGl1czogMnB4OwogIHBhZGRpbmc6IDRweCA3cHg7CiAgZm9udC1zaXplOiAxNXB4OwogIGNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNik7Cn0KCnByZSBjb2RlIHsKICBkaXNwbGF5OiBibG9jazsKICBib3JkZXItbGVmdDogMnB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgLjEpOwogIHBhZGRpbmc6IDAgMCAwIDM2cHg7Cn0KCiR7Jy8qKlxuICogcHJpc20uanMgZGVmYXVsdCB0aGVtZSBmb3IgSmF2YVNjcmlwdCwgQ1NTIGFuZCBIVE1MXG4gKiBCYXNlZCBvbiBkYWJibGV0IChodHRwOi8vZGFiYmxldC5jb20pXG4gKiBAYXV0aG9yIExlYSBWZXJvdVxuICovXG5cbmNvZGVbY2xhc3MqPSJsYW5ndWFnZS0iXSxcbnByZVtjbGFzcyo9Imxhbmd1YWdlLSJdIHtcblx0Y29sb3I6IGJsYWNrO1xuXHRiYWNrZ3JvdW5kOiBub25lO1xuXHR0ZXh0LXNoYWRvdzogMCAxcHggd2hpdGU7XG5cdGZvbnQtZmFtaWx5OiBDb25zb2xhcywgTW9uYWNvLCBcJ0FuZGFsZSBNb25vXCcsIFwnVWJ1bnR1IE1vbm9cJywgbW9ub3NwYWNlO1xuXHR0ZXh0LWFsaWduOiBsZWZ0O1xuXHR3aGl0ZS1zcGFjZTogcHJlO1xuXHR3b3JkLXNwYWNpbmc6IG5vcm1hbDtcblx0d29yZC1icmVhazogbm9ybWFsO1xuXHR3b3JkLXdyYXA6IG5vcm1hbDtcblx0bGluZS1oZWlnaHQ6IDEuNTtcblxuXHQtbW96LXRhYi1zaXplOiA0O1xuXHQtby10YWItc2l6ZTogNDtcblx0dGFiLXNpemU6IDQ7XG5cblx0LXdlYmtpdC1oeXBoZW5zOiBub25lO1xuXHQtbW96LWh5cGhlbnM6IG5vbmU7XG5cdC1tcy1oeXBoZW5zOiBub25lO1xuXHRoeXBoZW5zOiBub25lO1xufVxuXG5wcmVbY2xhc3MqPSJsYW5ndWFnZS0iXTo6LW1vei1zZWxlY3Rpb24sIHByZVtjbGFzcyo9Imxhbmd1YWdlLSJdIDo6LW1vei1zZWxlY3Rpb24sXG5jb2RlW2NsYXNzKj0ibGFuZ3VhZ2UtIl06Oi1tb3otc2VsZWN0aW9uLCBjb2RlW2NsYXNzKj0ibGFuZ3VhZ2UtIl0gOjotbW96LXNlbGVjdGlvbiB7XG5cdHRleHQtc2hhZG93OiBub25lO1xuXHRiYWNrZ3JvdW5kOiAjYjNkNGZjO1xufVxuXG5wcmVbY2xhc3MqPSJsYW5ndWFnZS0iXTo6c2VsZWN0aW9uLCBwcmVbY2xhc3MqPSJsYW5ndWFnZS0iXSA6OnNlbGVjdGlvbixcbmNvZGVbY2xhc3MqPSJsYW5ndWFnZS0iXTo6c2VsZWN0aW9uLCBjb2RlW2NsYXNzKj0ibGFuZ3VhZ2UtIl0gOjpzZWxlY3Rpb24ge1xuXHR0ZXh0LXNoYWRvdzogbm9uZTtcblx0YmFja2dyb3VuZDogI2IzZDRmYztcbn1cblxuQG1lZGlhIHByaW50IHtcblx0Y29kZVtjbGFzcyo9Imxhbmd1YWdlLSJdLFxuXHRwcmVbY2xhc3MqPSJsYW5ndWFnZS0iXSB7XG5cdFx0dGV4dC1zaGFkb3c6IG5vbmU7XG5cdH1cbn1cblxuLyogQ29kZSBibG9ja3MgKi9cbnByZVtjbGFzcyo9Imxhbmd1YWdlLSJdIHtcblx0cGFkZGluZzogMWVtO1xuXHRtYXJnaW46IC41ZW0gMDtcblx0b3ZlcmZsb3c6IGF1dG87XG59XG5cbjpub3QocHJlKSA+IGNvZGVbY2xhc3MqPSJsYW5ndWFnZS0iXSxcbnByZVtjbGFzcyo9Imxhbmd1YWdlLSJdIHtcblx0YmFja2dyb3VuZDogI2Y1ZjJmMDtcbn1cblxuLyogSW5saW5lIGNvZGUgKi9cbjpub3QocHJlKSA+IGNvZGVbY2xhc3MqPSJsYW5ndWFnZS0iXSB7XG5cdHBhZGRpbmc6IC4xZW07XG5cdGJvcmRlci1yYWRpdXM6IC4zZW07XG5cdHdoaXRlLXNwYWNlOiBub3JtYWw7XG59XG5cbi50b2tlbi5jb21tZW50LFxuLnRva2VuLnByb2xvZyxcbi50b2tlbi5kb2N0eXBlLFxuLnRva2VuLmNkYXRhIHtcblx0Y29sb3I6IHNsYXRlZ3JheTtcbn1cblxuLnRva2VuLnB1bmN0dWF0aW9uIHtcblx0Y29sb3I6ICM5OTk7XG59XG5cbi5uYW1lc3BhY2Uge1xuXHRvcGFjaXR5OiAuNztcbn1cblxuLnRva2VuLnByb3BlcnR5LFxuLnRva2VuLnRhZyxcbi50b2tlbi5ib29sZWFuLFxuLnRva2VuLm51bWJlcixcbi50b2tlbi5jb25zdGFudCxcbi50b2tlbi5zeW1ib2wsXG4udG9rZW4uZGVsZXRlZCB7XG5cdGNvbG9yOiAjOTA1O1xufVxuXG4udG9rZW4uc2VsZWN0b3IsXG4udG9rZW4uYXR0ci1uYW1lLFxuLnRva2VuLnN0cmluZyxcbi50b2tlbi5jaGFyLFxuLnRva2VuLmJ1aWx0aW4sXG4udG9rZW4uaW5zZXJ0ZWQge1xuXHRjb2xvcjogIzY5MDtcbn1cblxuLnRva2VuLm9wZXJhdG9yLFxuLnRva2VuLmVudGl0eSxcbi50b2tlbi51cmwsXG4ubGFuZ3VhZ2UtY3NzIC50b2tlbi5zdHJpbmcsXG4uc3R5bGUgLnRva2VuLnN0cmluZyB7XG5cdGNvbG9yOiAjYTY3ZjU5O1xuXHRiYWNrZ3JvdW5kOiBoc2xhKDAsIDAlLCAxMDAlLCAuNSk7XG59XG5cbi50b2tlbi5hdHJ1bGUsXG4udG9rZW4uYXR0ci12YWx1ZSxcbi50b2tlbi5rZXl3b3JkIHtcblx0Y29sb3I6ICMwN2E7XG59XG5cbi50b2tlbi5mdW5jdGlvbiB7XG5cdGNvbG9yOiAjREQ0QTY4O1xufVxuXG4udG9rZW4ucmVnZXgsXG4udG9rZW4uaW1wb3J0YW50LFxuLnRva2VuLnZhcmlhYmxlIHtcblx0Y29sb3I6ICNlOTA7XG59XG5cbi50b2tlbi5pbXBvcnRhbnQsXG4udG9rZW4uYm9sZCB7XG5cdGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuLnRva2VuLml0YWxpYyB7XG5cdGZvbnQtc3R5bGU6IGl0YWxpYztcbn1cblxuLnRva2VuLmVudGl0eSB7XG5cdGN1cnNvcjogaGVscDtcbn1cbid9Cjwvc3R5bGU+Cgo8Y29kZSBpZD0iY29kZS1jb250YWluZXIiPjwvY29kZT4KCmApO2NsYXNzIE9hIGV4dGVuZHMgR24oamEoSFRNTEVsZW1lbnQpKXtyZW5kZXJDb250ZW50KCl7aWYodGhpcy5sYW5ndWFnZU5hbWU9dGhpcy5nZXRBdHRyaWJ1dGUoJ2xhbmd1YWdlJyksIXRoaXMubGFuZ3VhZ2VOYW1lKXJldHVybiB2b2lkIGNvbnNvbGUud2FybignWW91IG5lZWQgdG8gcHJvdmlkZSBhIGxhbmd1YWdlIGF0dHJpYnV0ZSB0byB5b3VyIDxkLWNvZGU+IGJsb2NrIHRvIGxldCB1cyBrbm93IGhvdyB0byBoaWdobGlnaHQgeW91ciBjb2RlOyBlLmcuOlxuIDxkLWNvZGUgbGFuZ3VhZ2U9InB5dGhvbiI+emVyb3MgPSBucC56ZXJvcyhzaGFwZSk8L2QtY29kZT4uJyk7Y29uc3QgZT1BYS5sYW5ndWFnZXNbdGhpcy5sYW5ndWFnZU5hbWVdO2lmKHZvaWQgMD09ZSlyZXR1cm4gdm9pZCBjb25zb2xlLndhcm4oYERpc3RpbGwgZG9lcyBub3QgeWV0IHN1cHBvcnQgaGlnaGxpZ2h0aW5nIHlvdXIgY29kZSBibG9jayBpbiAiJHt0aGlzLmxhbmd1YWdlTmFtZX0nLmApO2xldCB0PXRoaXMudGV4dENvbnRlbnQ7Y29uc3Qgbj10aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignI2NvZGUtY29udGFpbmVyJyk7aWYodGhpcy5oYXNBdHRyaWJ1dGUoJ2Jsb2NrJykpe3Q9dC5yZXBsYWNlKC9cbi8sJycpO2NvbnN0IGU9dC5tYXRjaCgvXHMqLyk7aWYodD10LnJlcGxhY2UobmV3IFJlZ0V4cCgnXG4nK2UsJ2cnKSwnXG4nKSx0PXQudHJpbSgpLG4ucGFyZW50Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3Qpe2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncHJlJyk7dGhpcy5zaGFkb3dSb290LnJlbW92ZUNoaWxkKG4pLGUuYXBwZW5kQ2hpbGQobiksdGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKGUpfX1uLmNsYXNzTmFtZT1gbGFuZ3VhZ2UtJHt0aGlzLmxhbmd1YWdlTmFtZX1gLG4uaW5uZXJIVE1MPUFhLmhpZ2hsaWdodCh0LGUpfX1jb25zdCBxYT1lYSgnZC1mb290bm90ZScsYAo8c3R5bGU+CgpkLW1hdGhbYmxvY2tdIHsKICBkaXNwbGF5OiBibG9jazsKfQoKOmhvc3Qgewp9CgpzdXAgewogIGxpbmUtaGVpZ2h0OiAxZW07CiAgZm9udC1zaXplOiAwLjc1ZW07CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHRvcDogLS41ZW07CiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwp9CgpzcGFuIHsKICBjb2xvcjogaHNsYSgyMDYsIDkwJSwgMjAlLCAwLjcpOwogIGN1cnNvcjogZGVmYXVsdDsKfQoKLmNvbnRhaW5lciB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHdpZHRoOiAxMDAlOwogIGxlZnQ6IDA7CiAgei1pbmRleDogMTAwMDA7Cn0KCi5mb290bm90ZS1jb250YWluZXIgewogIHBhZGRpbmc6IDEwcHg7Cn0KCjwvc3R5bGU+Cgo8ZC1ob3Zlci1ib3g+CiAgPGRpdiBjbGFzcz0iZm9vdG5vdGUtY29udGFpbmVyIj4KICAgIDxzbG90IGlkPSJzbG90Ij48L3Nsb3Q+CiAgPC9kaXY+CjwvZC1ob3Zlci1ib3g+Cgo8c3VwPgogIDxzcGFuIGlkPSJmbi0iIGRhdGEtaG92ZXItcmVmPSIiPjwvc3Bhbj4KPC9zdXA+CgpgKTtjbGFzcyBSYSBleHRlbmRzIHFhKEhUTUxFbGVtZW50KXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7Y29uc3QgZT1uZXcgTXV0YXRpb25PYnNlcnZlcih0aGlzLm5vdGlmeSk7ZS5vYnNlcnZlKHRoaXMse2NoaWxkTGlzdDohMCxjaGFyYWN0ZXJEYXRhOiEwLHN1YnRyZWU6ITB9KX1ub3RpZnkoKXtjb25zdCBlPXtkZXRhaWw6dGhpcyxidWJibGVzOiEwfSx0PW5ldyBDdXN0b21FdmVudCgnb25Gb290bm90ZUNoYW5nZWQnLGUpO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodCl9Y29ubmVjdGVkQ2FsbGJhY2soKXt0aGlzLmhvdmVyQm94PXRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCdkLWhvdmVyLWJveCcpLHdpbmRvdy5jdXN0b21FbGVtZW50cy53aGVuRGVmaW5lZCgnZC1ob3Zlci1ib3gnKS50aGVuKCgpPT57dGhpcy5ob3ZlckJveC5saXN0ZW4odGhpcyl9KSxSYS5jdXJyZW50Rm9vdG5vdGVJZCs9MTtjb25zdCBlPVJhLmN1cnJlbnRGb290bm90ZUlkLnRvU3RyaW5nKCk7dGhpcy5yb290Lmhvc3QuaWQ9J2QtZm9vdG5vdGUtJytlO2NvbnN0IHQ9J2R0LWZuLWhvdmVyLWJveC0nK2U7dGhpcy5ob3ZlckJveC5pZD10O2NvbnN0IG49dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJyNmbi0nKTtuLnNldEF0dHJpYnV0ZSgnaWQnLCdmbi0nK2UpLG4uc2V0QXR0cmlidXRlKCdkYXRhLWhvdmVyLXJlZicsdCksbi50ZXh0Q29udGVudD1lfX1SYS5jdXJyZW50Rm9vdG5vdGVJZD0wO2NvbnN0IE5hPWVhKCdkLWZvb3Rub3RlLWxpc3QnLGAKPHN0eWxlPgoKZC1mb290bm90ZS1saXN0IHsKICBjb250YWluOiBsYXlvdXQgc3R5bGU7Cn0KCmQtZm9vdG5vdGUtbGlzdCA+ICogewogIGdyaWQtY29sdW1uOiB0ZXh0Owp9CgpkLWZvb3Rub3RlLWxpc3QgYS5mb290bm90ZS1iYWNrbGluayB7CiAgY29sb3I6IHJnYmEoMCwwLDAsMC4zKTsKICBwYWRkaW5nLWxlZnQ6IDAuNWVtOwp9Cgo8L3N0eWxlPgoKPGgzPkZvb3Rub3RlczwvaDM+CjxvbD48L29sPgpgLCExKTtjbGFzcyBQYSBleHRlbmRzIE5hKEhUTUxFbGVtZW50KXtjb25uZWN0ZWRDYWxsYmFjaygpe3N1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5saXN0PXRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCdvbCcpLHRoaXMucm9vdC5zdHlsZS5kaXNwbGF5PSdub25lJ31zZXQgZm9vdG5vdGVzKGUpe2lmKHRoaXMubGlzdC5pbm5lckhUTUw9JycsZS5sZW5ndGgpe3RoaXMucm9vdC5zdHlsZS5kaXNwbGF5PScnO2Zvcihjb25zdCB0IG9mIGUpe2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTtlLmlkPXQuaWQrJy1saXN0aW5nJyxlLmlubmVySFRNTD10LmlubmVySFRNTDtjb25zdCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtuLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCdmb290bm90ZS1iYWNrbGluaycpLG4udGV4dENvbnRlbnQ9J1tcdTIxQTldJyxuLmhyZWY9JyMnK3QuaWQsZS5hcHBlbmRDaGlsZChuKSx0aGlzLmxpc3QuYXBwZW5kQ2hpbGQoZSl9fWVsc2UgdGhpcy5yb290LnN0eWxlLmRpc3BsYXk9J25vbmUnfX1jb25zdCBGYT1lYSgnZC1ob3Zlci1ib3gnLGAKPHN0eWxlPgoKOmhvc3QgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB3aWR0aDogMTAwJTsKICBsZWZ0OiAwOwogIHotaW5kZXg6IDEwMDAwOwogIGRpc3BsYXk6IG5vbmU7Cn0KCi5jb250YWluZXIgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB3aWR0aDogNzA0cHg7CiAgbWF4LXdpZHRoOiAxMDB2dzsKICBtYXJnaW46IDAgYXV0bzsKfQoKLnBhbmVsIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgZm9udC1zaXplOiAxcmVtOwogIGxpbmUtaGVpZ2h0OiAxLjVlbTsKICB0b3A6IDA7CiAgbGVmdDogMDsKICB3aWR0aDogMTAwJTsKICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMSk7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MCwgMjUwLCAyNTApOwogIGJveC1zaGFkb3c6IDAgMCA3cHggcmdiYSgwLCAwLCAwLCAwLjEpOwogIGJvcmRlci1yYWRpdXM6IDRweDsKICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9Cgo8L3N0eWxlPgoKPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICA8ZGl2IGNsYXNzPSJwYW5lbCI+CiAgICA8c2xvdD48L3Nsb3Q+CiAgPC9kaXY+CjwvZGl2PgpgKTtjbGFzcyBJYSBleHRlbmRzIEZhKEhUTUxFbGVtZW50KXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCl9Y29ubmVjdGVkQ2FsbGJhY2soKXt9bGlzdGVuKGUpe3RoaXMuYmluZERpdkV2ZW50cyh0aGlzKSx0aGlzLmJpbmRUcmlnZ2VyRXZlbnRzKGUpfWJpbmREaXZFdmVudHMoZSl7ZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCgpPT57dGhpcy52aXNpYmxlfHx0aGlzLnNob3dBdE5vZGUoZSksdGhpcy5zdG9wVGltZW91dCgpfSksZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsKCk9Pnt0aGlzLmV4dGVuZFRpbWVvdXQoNTAwKX0pLGUuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsKGUpPT57ZS5zdG9wUHJvcGFnYXRpb24oKX0se3Bhc3NpdmU6ITB9KSxkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCgpPT57dGhpcy5oaWRlKCl9LHtwYXNzaXZlOiEwfSl9YmluZFRyaWdnZXJFdmVudHMoZSl7ZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCgpPT57dGhpcy52aXNpYmxlfHx0aGlzLnNob3dBdE5vZGUoZSksdGhpcy5zdG9wVGltZW91dCgpfSksZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsKCk9Pnt0aGlzLmV4dGVuZFRpbWVvdXQoMzAwKX0pLGUuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsKHQpPT57dGhpcy52aXNpYmxlP3RoaXMuaGlkZSgpOnRoaXMuc2hvd0F0Tm9kZShlKSx0LnN0b3BQcm9wYWdhdGlvbigpfSx7cGFzc2l2ZTohMH0pfXNob3coKXt0aGlzLnZpc2libGU9ITAsdGhpcy5zdHlsZS5kaXNwbGF5PSdibG9jayd9c2hvd0F0Tm9kZShlKXtjb25zdCB0PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGhpcy5zaG93KFt0LnJpZ2h0LHQuYm90dG9tXSl9aGlkZSgpe3RoaXMudmlzaWJsZT0hMSx0aGlzLnN0eWxlLmRpc3BsYXk9J25vbmUnLHRoaXMuc3RvcFRpbWVvdXQoKX1zdG9wVGltZW91dCgpe3RoaXMudGltZW91dCYmY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCl9ZXh0ZW5kVGltZW91dChlKXt0aGlzLnN0b3BUaW1lb3V0KCksdGhpcy50aW1lb3V0PXNldFRpbWVvdXQoKCk9Pnt0aGlzLmhpZGUoKX0sZSl9fWNsYXNzIHphIGV4dGVuZHMgSFRNTEVsZW1lbnR7c3RhdGljIGdldCBpcygpe3JldHVybidkLXRpdGxlJ319Y29uc3QgSGE9ZWEoJ2QtcmVmZXJlbmNlcycsYAo8c3R5bGU+CmQtcmVmZXJlbmNlcyB7CiAgZGlzcGxheTogYmxvY2s7Cn0KPC9zdHlsZT4KYCwhMSk7Y2xhc3MgWWEgZXh0ZW5kcyBIYShIVE1MRWxlbWVudCl7fWNsYXNzIEJhIGV4dGVuZHMgSFRNTEVsZW1lbnR7c3RhdGljIGdldCBpcygpe3JldHVybidkLXRvYyd9Y29ubmVjdGVkQ2FsbGJhY2soKXt0aGlzLmdldEF0dHJpYnV0ZSgncHJlcmVuZGVyZWQnKXx8KHdpbmRvdy5vbmxvYWQ9KCk9Pntjb25zdCBlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2QtYXJ0aWNsZScpLHQ9ZS5xdWVyeVNlbGVjdG9yQWxsKCdoMiwgaDMnKTt4KHRoaXMsdCl9KX19Y2xhc3MgV2EgZXh0ZW5kcyBIVE1MRWxlbWVudHtzdGF0aWMgZ2V0IGlzKCl7cmV0dXJuJ2QtZmlndXJlJ31zdGF0aWMgZ2V0IHJlYWR5UXVldWUoKXtyZXR1cm4gV2EuX3JlYWR5UXVldWV8fChXYS5fcmVhZHlRdWV1ZT1bXSksV2EuX3JlYWR5UXVldWV9c3RhdGljIGFkZFRvUmVhZHlRdWV1ZShlKXstMT09PVdhLnJlYWR5UXVldWUuaW5kZXhPZihlKSYmKFdhLnJlYWR5UXVldWUucHVzaChlKSxXYS5ydW5SZWFkeVF1ZXVlKCkpfXN0YXRpYyBydW5SZWFkeVF1ZXVlKCl7Y29uc3QgZT1XYS5yZWFkeVF1ZXVlLnNvcnQoKGUsdCk9PmUuX3NlZW5PblNjcmVlbi10Ll9zZWVuT25TY3JlZW4pLmZpbHRlcigoZSk9PiFlLl9yZWFkeSkucG9wKCk7ZSYmKGUucmVhZHkoKSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoV2EucnVuUmVhZHlRdWV1ZSkpfWNvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9yZWFkeT0hMSx0aGlzLl9vbnNjcmVlbj0hMSx0aGlzLl9vZmZzY3JlZW49ITB9Y29ubmVjdGVkQ2FsbGJhY2soKXt0aGlzLmxvYWRzV2hpbGVTY3JvbGxpbmc9dGhpcy5oYXNBdHRyaWJ1dGUoJ2xvYWRzV2hpbGVTY3JvbGxpbmcnKSxXYS5tYXJnaW5PYnNlcnZlci5vYnNlcnZlKHRoaXMpLFdhLmRpcmVjdE9ic2VydmVyLm9ic2VydmUodGhpcyl9ZGlzY29ubmVjdGVkQ2FsbGJhY2soKXtXYS5tYXJnaW5PYnNlcnZlci51bm9ic2VydmUodGhpcyksV2EuZGlyZWN0T2JzZXJ2ZXIudW5vYnNlcnZlKHRoaXMpfXN0YXRpYyBnZXQgbWFyZ2luT2JzZXJ2ZXIoKXtpZighV2EuX21hcmdpbk9ic2VydmVyKXtjb25zdCBlPXdpbmRvdy5pbm5lckhlaWdodCx0PUZuKDIqZSksbj1XYS5kaWRPYnNlcnZlTWFyZ2luSW50ZXJzZWN0aW9uLGE9bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKG4se3Jvb3RNYXJnaW46dCsncHggMHB4ICcrdCsncHggMHB4Jyx0aHJlc2hvbGQ6MC4wMX0pO1dhLl9tYXJnaW5PYnNlcnZlcj1hfXJldHVybiBXYS5fbWFyZ2luT2JzZXJ2ZXJ9c3RhdGljIGRpZE9ic2VydmVNYXJnaW5JbnRlcnNlY3Rpb24oZSl7Zm9yKGNvbnN0IHQgb2YgZSl7Y29uc3QgZT10LnRhcmdldDt0LmlzSW50ZXJzZWN0aW5nJiYhZS5fcmVhZHkmJldhLmFkZFRvUmVhZHlRdWV1ZShlKX19c3RhdGljIGdldCBkaXJlY3RPYnNlcnZlcigpe3JldHVybiBXYS5fZGlyZWN0T2JzZXJ2ZXJ8fChXYS5fZGlyZWN0T2JzZXJ2ZXI9bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKFdhLmRpZE9ic2VydmVEaXJlY3RJbnRlcnNlY3Rpb24se3Jvb3RNYXJnaW46JzBweCcsdGhyZXNob2xkOlswLDFdfSkpLFdhLl9kaXJlY3RPYnNlcnZlcn1zdGF0aWMgZGlkT2JzZXJ2ZURpcmVjdEludGVyc2VjdGlvbihlKXtmb3IoY29uc3QgdCBvZiBlKXtjb25zdCBlPXQudGFyZ2V0O3QuaXNJbnRlcnNlY3Rpbmc/KGUuX3NlZW5PblNjcmVlbj1uZXcgRGF0ZSxlLl9vZmZzY3JlZW4mJmUub25zY3JlZW4oKSk6ZS5fb25zY3JlZW4mJmUub2Zmc2NyZWVuKCl9fWFkZEV2ZW50TGlzdGVuZXIoZSx0KXtzdXBlci5hZGRFdmVudExpc3RlbmVyKGUsdCksJ3JlYWR5Jz09PWUmJi0xIT09V2EucmVhZHlRdWV1ZS5pbmRleE9mKHRoaXMpJiYodGhpcy5fcmVhZHk9ITEsV2EucnVuUmVhZHlRdWV1ZSgpKSwnb25zY3JlZW4nPT09ZSYmdGhpcy5vbnNjcmVlbigpfXJlYWR5KCl7dGhpcy5fcmVhZHk9ITAsV2EubWFyZ2luT2JzZXJ2ZXIudW5vYnNlcnZlKHRoaXMpO2NvbnN0IGU9bmV3IEN1c3RvbUV2ZW50KCdyZWFkeScpO3RoaXMuZGlzcGF0Y2hFdmVudChlKX1vbnNjcmVlbigpe3RoaXMuX29uc2NyZWVuPSEwLHRoaXMuX29mZnNjcmVlbj0hMTtjb25zdCBlPW5ldyBDdXN0b21FdmVudCgnb25zY3JlZW4nKTt0aGlzLmRpc3BhdGNoRXZlbnQoZSl9b2Zmc2NyZWVuKCl7dGhpcy5fb25zY3JlZW49ITEsdGhpcy5fb2Zmc2NyZWVuPSEwO2NvbnN0IGU9bmV3IEN1c3RvbUV2ZW50KCdvZmZzY3JlZW4nKTt0aGlzLmRpc3BhdGNoRXZlbnQoZSl9fWlmKCd1bmRlZmluZWQnIT10eXBlb2Ygd2luZG93KXtXYS5pc1Njcm9sbGluZz0hMTtsZXQgZTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywoKT0+e1dhLmlzU2Nyb2xsaW5nPSEwLGNsZWFyVGltZW91dChlKSxlPXNldFRpbWVvdXQoKCk9PntXYS5pc1Njcm9sbGluZz0hMSxXYS5ydW5SZWFkeVF1ZXVlKCl9LDUwMCl9LCEwKX1jb25zdCBWYT1lYSgnZC1pbnRlcnN0aXRpYWwnLGAKPHN0eWxlPgoKLm92ZXJsYXkgewogIHBvc2l0aW9uOiBmaXhlZDsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgdG9wOiAwOwogIGxlZnQ6IDA7CiAgYmFja2dyb3VuZDogd2hpdGU7CgogIG9wYWNpdHk6IDE7CiAgdmlzaWJpbGl0eTogdmlzaWJsZTsKCiAgZGlzcGxheTogZmxleDsKICBmbGV4LWZsb3c6IGNvbHVtbjsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICB6LWluZGV4OiAyMTQ3NDgzNjQ3IC8qIE1heEludDMyICovCgp9CgouY29udGFpbmVyIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgbWFyZ2luLXJpZ2h0OiBhdXRvOwogIG1heC13aWR0aDogNDIwcHg7CiAgcGFkZGluZzogMmVtOwp9CgpoMSB7CiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgdGV4dC1kZWNvcmF0aW9uLWNvbG9yOiBoc2woMCwxMDAlLDQwJSk7CiAgLXdlYmtpdC10ZXh0LWRlY29yYXRpb24tY29sb3I6IGhzbCgwLDEwMCUsNDAlKTsKICBtYXJnaW4tYm90dG9tOiAxZW07CiAgbGluZS1oZWlnaHQ6IDEuNWVtOwp9CgppbnB1dFt0eXBlPSJwYXNzd29yZCJdIHsKICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgLW1vei1hcHBlYXJhbmNlOiBub25lOwogIGFwcGVhcmFuY2U6IG5vbmU7CiAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lOwogIC1tb3otYm94LXNoYWRvdzogbm9uZTsKICBib3gtc2hhZG93OiBub25lOwogIC13ZWJraXQtYm9yZGVyLXJhZGl1czogbm9uZTsKICAtbW96LWJvcmRlci1yYWRpdXM6IG5vbmU7CiAgLW1zLWJvcmRlci1yYWRpdXM6IG5vbmU7CiAgLW8tYm9yZGVyLXJhZGl1czogbm9uZTsKICBib3JkZXItcmFkaXVzOiBub25lOwogIG91dGxpbmU6IG5vbmU7CgogIGZvbnQtc2l6ZTogMThweDsKICBiYWNrZ3JvdW5kOiBub25lOwogIHdpZHRoOiAyNSU7CiAgcGFkZGluZzogMTBweDsKICBib3JkZXI6IG5vbmU7CiAgYm9yZGVyLWJvdHRvbTogc29saWQgMnB4ICM5OTk7CiAgdHJhbnNpdGlvbjogYm9yZGVyIC4zczsKfQoKaW5wdXRbdHlwZT0icGFzc3dvcmQiXTpmb2N1cyB7CiAgYm9yZGVyLWJvdHRvbTogc29saWQgMnB4ICMzMzM7Cn0KCmlucHV0W3R5cGU9InBhc3N3b3JkIl0ud3JvbmcgewogIGJvcmRlci1ib3R0b206IHNvbGlkIDJweCBoc2woMCwxMDAlLDQwJSk7Cn0KCnAgc21hbGwgewogIGNvbG9yOiAjODg4Owp9CgoubG9nbyB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGZvbnQtc2l6ZTogMS41ZW07CiAgbWFyZ2luLWJvdHRvbTogM2VtOwp9CgoubG9nbyBzdmcgewogIHdpZHRoOiAzNnB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB0b3A6IDZweDsKICBtYXJnaW4tcmlnaHQ6IDJweDsKfQoKLmxvZ28gc3ZnIHBhdGggewogIGZpbGw6IG5vbmU7CiAgc3Ryb2tlOiBibGFjazsKICBzdHJva2Utd2lkdGg6IDJweDsKfQoKPC9zdHlsZT4KCjxkaXYgY2xhc3M9Im92ZXJsYXkiPgogIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICA8aDE+VGhpcyBhcnRpY2xlIGlzIGluIHJldmlldy48L2gxPgogICAgPHA+RG8gbm90IHNoYXJlIHRoaXMgVVJMIG9yIHRoZSBjb250ZW50cyBvZiB0aGlzIGFydGljbGUuIFRoYW5rIHlvdSE8L3A+CiAgICA8aW5wdXQgaWQ9ImludGVyc3RpdGlhbC1wYXNzd29yZC1pbnB1dCIgdHlwZT0icGFzc3dvcmQiIG5hbWU9InBhc3N3b3JkIiBhdXRvZm9jdXMvPgogICAgPHA+PHNtYWxsPkVudGVyIHRoZSBwYXNzd29yZCB3ZSBzaGFyZWQgd2l0aCB5b3UgYXMgcGFydCBvZiB0aGUgcmV2aWV3IHByb2Nlc3MgdG8gdmlldyB0aGUgYXJ0aWNsZS48L3NtYWxsPjwvcD4KICA8L2Rpdj4KPC9kaXY+CmApO2NsYXNzICRhIGV4dGVuZHMgVmEoSFRNTEVsZW1lbnQpe2Nvbm5lY3RlZENhbGxiYWNrKCl7aWYodGhpcy5zaG91bGRSZW1vdmVTZWxmKCkpdGhpcy5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMpO2Vsc2V7Y29uc3QgZT10aGlzLnJvb3QucXVlcnlTZWxlY3RvcignI2ludGVyc3RpdGlhbC1wYXNzd29yZC1pbnB1dCcpO2Uub25pbnB1dD0oZSk9PnRoaXMucGFzc3dvcmRDaGFuZ2VkKGUpfX1wYXNzd29yZENoYW5nZWQoZSl7Y29uc3QgdD1lLnRhcmdldC52YWx1ZTt0PT09dGhpcy5wYXNzd29yZCYmKGNvbnNvbGUubG9nKCdDb3JyZWN0IHBhc3N3b3JkIGVudGVyZWQuJyksdGhpcy5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMpLCd1bmRlZmluZWQnIT10eXBlb2YgU3RvcmFnZSYmKGNvbnNvbGUubG9nKCdTYXZlZCB0aGF0IGNvcnJlY3QgcGFzc3dvcmQgd2FzIGVudGVyZWQuJyksbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VJZGVudGlmaWVyKCksJ3RydWUnKSkpfXNob3VsZFJlbW92ZVNlbGYoKXtyZXR1cm4gd2luZG93JiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWU9PT0nZGlzdGlsbC5wdWInPyhjb25zb2xlLndhcm4oJ0ludGVyc3RpdGlhbCBmb3VuZCBvbiBwcm9kdWN0aW9uLCBoaWRpbmcgaXQuJyksITApOid1bmRlZmluZWQnIT10eXBlb2YgU3RvcmFnZSYmJ3RydWUnPT09bG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VJZGVudGlmaWVyKCkpJiYoY29uc29sZS5sb2coJ0xvYWRlZCB0aGF0IGNvcnJlY3QgcGFzc3dvcmQgd2FzIGVudGVyZWQgYmVmb3JlOyBza2lwcGluZyBpbnRlcnN0aXRpYWwuJyksITApfWxvY2FsU3RvcmFnZUlkZW50aWZpZXIoKXtyZXR1cm4nZGlzdGlsbC1kcmFmdHMnKyh3aW5kb3c/d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lOictJykrJ2ludGVyc3RpdGlhbC1wYXNzd29yZC1jb3JyZWN0J319dmFyIEthPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU8dD8tMTplPnQ/MTplPj10PzA6TmFOfSxYYT1mdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubGVuZ3RoJiYoZT1rKGUpKSx7bGVmdDpmdW5jdGlvbih0LG4sYSxpKXtmb3IobnVsbD09YSYmKGE9MCksbnVsbD09aSYmKGk9dC5sZW5ndGgpO2E8aTspe3ZhciBkPWEraT4+PjE7MD5lKHRbZF0sbik/YT1kKzE6aT1kfXJldHVybiBhfSxyaWdodDpmdW5jdGlvbih0LG4sYSxpKXtmb3IobnVsbD09YSYmKGE9MCksbnVsbD09aSYmKGk9dC5sZW5ndGgpO2E8aTspe3ZhciBkPWEraT4+PjE7MDxlKHRbZF0sbik/aT1kOmE9ZCsxfXJldHVybiBhfX19KEthKSxKYT1YYS5yaWdodCxRYT1mdW5jdGlvbihlLHQsYSl7ZT0rZSx0PSt0LGE9Mj4oaT1hcmd1bWVudHMubGVuZ3RoKT8odD1lLGU9MCwxKTozPmk/MTorYTtmb3IodmFyIGQ9LTEsaT0wfE5uKDAsUG4oKHQtZSkvYSkpLG49QXJyYXkoaSk7KytkPGk7KW5bZF09ZStkKmE7cmV0dXJuIG59LFphPTcuMDcxMDY3ODExODY1NDc1NSxHYT0zLjE2MjI3NzY2MDE2ODM3OTUsZWk9MS40MTQyMTM1NjIzNzMwOTUxLHRpPWZ1bmN0aW9uKGUsdCxhKXt2YXIgZCxyLG4sbyxsPS0xO2lmKHQ9K3QsZT0rZSxhPSthLGU9PT10JiYwPGEpcmV0dXJuW2VdO2lmKChkPXQ8ZSkmJihyPWUsZT10LHQ9ciksMD09PShvPXYoZSx0LGEpKXx8IWlzRmluaXRlKG8pKXJldHVybltdO2lmKDA8bylmb3IoZT1QbihlL28pLHQ9Rm4odC9vKSxuPUFycmF5KHI9UG4odC1lKzEpKTsrK2w8cjspbltsXT0oZStsKSpvO2Vsc2UgZm9yKGU9Rm4oZSpvKSx0PVBuKHQqbyksbj1BcnJheShyPVBuKGUtdCsxKSk7KytsPHI7KW5bbF09KGUtbCkvbztyZXR1cm4gZCYmbi5yZXZlcnNlKCksbn0sbmk9QXJyYXkucHJvdG90eXBlLGFpPW5pLm1hcCxpaT1uaS5zbGljZSxkaT1mdW5jdGlvbihlLHQsbil7ZS5wcm90b3R5cGU9dC5wcm90b3R5cGU9bixuLmNvbnN0cnVjdG9yPWV9LHJpPTAuNyxvaT0xL3JpLGxpPS9eIyhbMC05YS1mXXszfSkkLyxzaT0vXiMoWzAtOWEtZl17Nn0pJC8sY2k9L15yZ2JcKFxzKihbKy1dP1xkKylccyosXHMqKFsrLV0/XGQrKVxzKixccyooWystXT9cZCspXHMqXCkkLyx1aT0vXnJnYlwoXHMqKFsrLV0/XGQqXC4/XGQrKD86W2VFXVsrLV0/XGQrKT8pJVxzKixccyooWystXT9cZCpcLj9cZCsoPzpbZUVdWystXT9cZCspPyklXHMqLFxzKihbKy1dP1xkKlwuP1xkKyg/OltlRV1bKy1dP1xkKyk/KSVccypcKSQvLHBpPS9ecmdiYVwoXHMqKFsrLV0/XGQrKVxzKixccyooWystXT9cZCspXHMqLFxzKihbKy1dP1xkKylccyosXHMqKFsrLV0/XGQqXC4/XGQrKD86W2VFXVsrLV0/XGQrKT8pXHMqXCkkLyxnaT0vXnJnYmFcKFxzKihbKy1dP1xkKlwuP1xkKyg/OltlRV1bKy1dP1xkKyk/KSVccyosXHMqKFsrLV0/XGQqXC4/XGQrKD86W2VFXVsrLV0/XGQrKT8pJVxzKixccyooWystXT9cZCpcLj9cZCsoPzpbZUVdWystXT9cZCspPyklXHMqLFxzKihbKy1dP1xkKlwuP1xkKyg/OltlRV1bKy1dP1xkKyk/KVxzKlwpJC8sZmk9L15oc2xcKFxzKihbKy1dP1xkKlwuP1xkKyg/OltlRV1bKy1dP1xkKyk/KVxzKixccyooWystXT9cZCpcLj9cZCsoPzpbZUVdWystXT9cZCspPyklXHMqLFxzKihbKy1dP1xkKlwuP1xkKyg/OltlRV1bKy1dP1xkKyk/KSVccypcKSQvLGJpPS9eaHNsYVwoXHMqKFsrLV0/XGQqXC4/XGQrKD86W2VFXVsrLV0/XGQrKT8pXHMqLFxzKihbKy1dP1xkKlwuP1xkKyg/OltlRV1bKy1dP1xkKyk/KSVccyosXHMqKFsrLV0/XGQqXC4/XGQrKD86W2VFXVsrLV0/XGQrKT8pJVxzKixccyooWystXT9cZCpcLj9cZCsoPzpbZUVdWystXT9cZCspPylccypcKSQvLGhpPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O2RpKFMsTSx7ZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpKycnfX0pLGRpKHEsTyxfKFMse2JyaWdodGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlPW51bGw9PWU/b2k6T24ob2ksZSksbmV3IHEodGhpcy5yKmUsdGhpcy5nKmUsdGhpcy5iKmUsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKGUpe3JldHVybiBlPW51bGw9PWU/cmk6T24ocmksZSksbmV3IHEodGhpcy5yKmUsdGhpcy5nKmUsdGhpcy5iKmUsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIDA8PXRoaXMuciYmMjU1Pj10aGlzLnImJjA8PXRoaXMuZyYmMjU1Pj10aGlzLmcmJjA8PXRoaXMuYiYmMjU1Pj10aGlzLmImJjA8PXRoaXMub3BhY2l0eSYmMT49dGhpcy5vcGFjaXR5fSx0b1N0cmluZzpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3BhY2l0eTtyZXR1cm4gZT1pc05hTihlKT8xOk5uKDAsSW4oMSxlKSksKDE9PT1lPydyZ2IoJzoncmdiYSgnKStObigwLEluKDI1NSxBbih0aGlzLnIpfHwwKSkrJywgJytObigwLEluKDI1NSxBbih0aGlzLmcpfHwwKSkrJywgJytObigwLEluKDI1NSxBbih0aGlzLmIpfHwwKSkrKDE9PT1lPycpJzonLCAnK2UrJyknKX19KSksZGkoUCxmdW5jdGlvbihlLHQsbixhKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/TihlKTpuZXcgUChlLHQsbixudWxsPT1hPzE6YSl9LF8oUyx7YnJpZ2h0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9bnVsbD09ZT9vaTpPbihvaSxlKSxuZXcgUCh0aGlzLmgsdGhpcy5zLHRoaXMubCplLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbihlKXtyZXR1cm4gZT1udWxsPT1lP3JpOk9uKHJpLGUpLG5ldyBQKHRoaXMuaCx0aGlzLnMsdGhpcy5sKmUsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5oJTM2MCszNjAqKDA+dGhpcy5oKSx0PWlzTmFOKGUpfHxpc05hTih0aGlzLnMpPzA6dGhpcy5zLG49dGhpcy5sLGE9bisoMC41Pm4/bjoxLW4pKnQsaT0yKm4tYTtyZXR1cm4gbmV3IHEoRigyNDA8PWU/ZS0yNDA6ZSsxMjAsaSxhKSxGKGUsaSxhKSxGKDEyMD5lP2UrMjQwOmUtMTIwLGksYSksdGhpcy5vcGFjaXR5KX0sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4oMDw9dGhpcy5zJiYxPj10aGlzLnN8fGlzTmFOKHRoaXMucykpJiYwPD10aGlzLmwmJjE+PXRoaXMubCYmMDw9dGhpcy5vcGFjaXR5JiYxPj10aGlzLm9wYWNpdHl9fSkpO3ZhciBtaT1Vbi8xODAseWk9MTgwL1VuLHhpPTE4LEtuPTAuOTUwNDcsWG49MSxZbj0xLjA4ODgzLFpuPTQvMjksa2k9Ni8yOSx2aT0zKmtpKmtpLHdpPWtpKmtpKmtpO2RpKEgsZnVuY3Rpb24oZSx0LG4sYSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP0koZSk6bmV3IEgoZSx0LG4sbnVsbD09YT8xOmEpfSxfKFMse2JyaWdodGVyOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgSCh0aGlzLmwreGkqKG51bGw9PWU/MTplKSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IEgodGhpcy5sLXhpKihudWxsPT1lPzE6ZSksdGhpcy5hLHRoaXMuYix0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgZT0odGhpcy5sKzE2KS8xMTYsdD1pc05hTih0aGlzLmEpP2U6ZSt0aGlzLmEvNTAwLG49aXNOYU4odGhpcy5iKT9lOmUtdGhpcy5iLzIwMDtyZXR1cm4gZT1YbipXKGUpLHQ9S24qVyh0KSxuPVluKlcobiksbmV3IHEoVigzLjI0MDQ1NDIqdC0xLjUzNzEzODUqZS0wLjQ5ODUzMTQqbiksVigtMC45NjkyNjYqdCsxLjg3NjAxMDgqZSswLjA0MTU1NipuKSxWKDAuMDU1NjQzNCp0LTAuMjA0MDI1OSplKzEuMDU3MjI1MipuKSx0aGlzLm9wYWNpdHkpfX0pKSxkaShLLGZ1bmN0aW9uKGUsdCxuLGEpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD96KGUpOm5ldyBLKGUsdCxuLG51bGw9PWE/MTphKX0sXyhTLHticmlnaHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IEsodGhpcy5oLHRoaXMuYyx0aGlzLmwreGkqKG51bGw9PWU/MTplKSx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBLKHRoaXMuaCx0aGlzLmMsdGhpcy5sLXhpKihudWxsPT1lPzE6ZSksdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIEkodGhpcykucmdiKCl9fSkpO3ZhciBDaT0tMC4xNDg2MSxBPSsxLjc4Mjc3LEI9LTAuMjkyMjcsQz0tMC45MDY0OSxEPSsxLjk3Mjk0LEU9RCpDLF9pPUQqQSxUaT1BKkItQypDaTtkaShRLEosXyhTLHticmlnaHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZT1udWxsPT1lP29pOk9uKG9pLGUpLG5ldyBRKHRoaXMuaCx0aGlzLnMsdGhpcy5sKmUsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKGUpe3JldHVybiBlPW51bGw9PWU/cmk6T24ocmksZSksbmV3IFEodGhpcy5oLHRoaXMucyx0aGlzLmwqZSx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgZT1pc05hTih0aGlzLmgpPzA6KHRoaXMuaCsxMjApKm1pLHQ9K3RoaXMubCxuPWlzTmFOKHRoaXMucyk/MDp0aGlzLnMqdCooMS10KSxhPUxuKGUpLGk9RG4oZSk7cmV0dXJuIG5ldyBxKDI1NSoodCtuKihDaSphK0EqaSkpLDI1NSoodCtuKihCKmErQyppKSksMjU1Kih0K24qKEQqYSkpLHRoaXMub3BhY2l0eSl9fSkpO3ZhciBTaT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZX19LE1pPWZ1bmN0aW9uIGUodCl7ZnVuY3Rpb24gbihlLHQpe3ZhciBuPWEoKGU9TyhlKSkuciwodD1PKHQpKS5yKSxpPWEoZS5nLHQuZyksZD1hKGUuYix0LmIpLHI9dGUoZS5vcGFjaXR5LHQub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiBlLnI9bihhKSxlLmc9aShhKSxlLmI9ZChhKSxlLm9wYWNpdHk9cihhKSxlKycnfX12YXIgYT1lZSh0KTtyZXR1cm4gbi5nYW1tYT1lLG59KDEpLEVpPWZ1bmN0aW9uKGUsdCl7dmFyIG4sYT10P3QubGVuZ3RoOjAsaT1lP0luKGEsZS5sZW5ndGgpOjAsZD1BcnJheShhKSxyPUFycmF5KGEpO2ZvcihuPTA7bjxpOysrbilkW25dPXFpKGVbbl0sdFtuXSk7Zm9yKDtuPGE7KytuKXJbbl09dFtuXTtyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKG49MDtuPGk7KytuKXJbbl09ZFtuXShlKTtyZXR1cm4gcn19LERpPWZ1bmN0aW9uKGUsbil7dmFyIGk9bmV3IERhdGU7cmV0dXJuIGU9K2Usbi09ZSxmdW5jdGlvbihhKXtyZXR1cm4gaS5zZXRUaW1lKGUrbiphKSxpfX0sTGk9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gZT0rZSxuLT1lLGZ1bmN0aW9uKGEpe3JldHVybiBlK24qYX19LFVpPWZ1bmN0aW9uKGUsdCl7dmFyIG4sZD17fSxpPXt9O2ZvcihuIGluKG51bGw9PT1lfHwnb2JqZWN0JyE9dHlwZW9mIGUpJiYoZT17fSksKG51bGw9PT10fHwnb2JqZWN0JyE9dHlwZW9mIHQpJiYodD17fSksdCluIGluIGU/ZFtuXT1xaShlW25dLHRbbl0pOmlbbl09dFtuXTtyZXR1cm4gZnVuY3Rpb24oZSl7Zm9yKG4gaW4gZClpW25dPWRbbl0oZSk7cmV0dXJuIGl9fSxBaT0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2csamk9bmV3IFJlZ0V4cChBaS5zb3VyY2UsJ2cnKSxPaT1mdW5jdGlvbihlLG4pe3ZhciB0LGEsZCxyPUFpLmxhc3RJbmRleD1qaS5sYXN0SW5kZXg9MCxvPS0xLGw9W10scz1bXTtmb3IoZSs9Jycsbis9Jyc7KHQ9QWkuZXhlYyhlKSkmJihhPWppLmV4ZWMobikpOykoZD1hLmluZGV4KT5yJiYoZD1uLnNsaWNlKHIsZCksbFtvXT9sW29dKz1kOmxbKytvXT1kKSwodD10WzBdKT09PShhPWFbMF0pP2xbb10/bFtvXSs9YTpsWysrb109YToobFsrK29dPW51bGwscy5wdXNoKHtpOm8seDpMaSh0LGEpfSkpLHI9amkubGFzdEluZGV4O3JldHVybiByPG4ubGVuZ3RoJiYoZD1uLnNsaWNlKHIpLGxbb10/bFtvXSs9ZDpsWysrb109ZCksMj5sLmxlbmd0aD9zWzBdP2FlKHNbMF0ueCk6bmUobik6KG49cy5sZW5ndGgsZnVuY3Rpb24oZSl7Zm9yKHZhciB0LGE9MDthPG47KythKWxbKHQ9c1thXSkuaV09dC54KGUpO3JldHVybiBsLmpvaW4oJycpfSl9LHFpPWZ1bmN0aW9uKGUsbil7dmFyIGEsaT10eXBlb2YgbjtyZXR1cm4gbnVsbD09bnx8J2Jvb2xlYW4nPT1pP1NpKG4pOignbnVtYmVyJz09aT9MaTonc3RyaW5nJz09aT8oYT1NKG4pKT8obj1hLE1pKTpPaTpuIGluc3RhbmNlb2YgTT9NaTpuIGluc3RhbmNlb2YgRGF0ZT9EaTpBcnJheS5pc0FycmF5KG4pP0VpOidmdW5jdGlvbichPXR5cGVvZiBuLnZhbHVlT2YmJidmdW5jdGlvbichPXR5cGVvZiBuLnRvU3RyaW5nfHxpc05hTihuKT9VaTpMaSkoZSxuKX0sUmk9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gZT0rZSxuLT1lLGZ1bmN0aW9uKGEpe3JldHVybiBBbihlK24qYSl9fTtpZShmdW5jdGlvbihlLHQpe3ZhciBuPXQtZTtyZXR1cm4gbj9aKGUsMTgwPG58fC0xODA+bj9uLTM2MCpBbihuLzM2MCk6bik6U2koaXNOYU4oZSk/dDplKX0pO3ZhciBOaSxQaT1pZSh0ZSksRmk9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGV9fSxJaT1mdW5jdGlvbihlKXtyZXR1cm4rZX0semk9WzAsMV0sSGk9ZnVuY3Rpb24oZSx0KXtpZigwPihuPShlPXQ/ZS50b0V4cG9uZW50aWFsKHQtMSk6ZS50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoJ2UnKSkpcmV0dXJuIG51bGw7dmFyIG4sYT1lLnNsaWNlKDAsbik7cmV0dXJuWzE8YS5sZW5ndGg/YVswXSthLnNsaWNlKDIpOmEsK2Uuc2xpY2UobisxKV19LFlpPWZ1bmN0aW9uKGUpe3JldHVybiBlPUhpKGpuKGUpKSxlP2VbMV06TmFOfSxCaT1mdW5jdGlvbihlLG4pe3JldHVybiBmdW5jdGlvbihhLGQpe2Zvcih2YXIgcj1hLmxlbmd0aCxpPVtdLHQ9MCxvPWVbMF0sbD0wOzA8ciYmMDxvJiYobCtvKzE+ZCYmKG89Tm4oMSxkLWwpKSxpLnB1c2goYS5zdWJzdHJpbmcoci09byxyK28pKSwhKChsKz1vKzEpPmQpKTspbz1lW3Q9KHQrMSklZS5sZW5ndGhdO3JldHVybiBpLnJldmVyc2UoKS5qb2luKG4pfX0sV2k9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcGxhY2UoL1swLTldL2csZnVuY3Rpb24odCl7cmV0dXJuIGVbK3RdfSl9fSxWaT1mdW5jdGlvbihlLHQpe3ZhciBuPUhpKGUsdCk7aWYoIW4pcmV0dXJuIGUrJyc7dmFyIGE9blswXSxpPW5bMV07cmV0dXJuIDA+aT8nMC4nK0FycmF5KC1pKS5qb2luKCcwJykrYTphLmxlbmd0aD5pKzE/YS5zbGljZSgwLGkrMSkrJy4nK2Euc2xpY2UoaSsxKTphK0FycmF5KGktYS5sZW5ndGgrMikuam9pbignMCcpfSwkaT17IiI6ZnVuY3Rpb24oZSx0KXtlPWUudG9QcmVjaXNpb24odCk7b3V0OmZvcih2YXIgYSxkPWUubGVuZ3RoLG49MSxpPS0xO248ZDsrK24pc3dpdGNoKGVbbl0pe2Nhc2UnLic6aT1hPW47YnJlYWs7Y2FzZScwJzowPT09aSYmKGk9biksYT1uO2JyZWFrO2Nhc2UnZSc6YnJlYWsgb3V0O2RlZmF1bHQ6MDxpJiYoaT0wKTt9cmV0dXJuIDA8aT9lLnNsaWNlKDAsaSkrZS5zbGljZShhKzEpOmV9LCIlIjpmdW5jdGlvbihlLHQpe3JldHVybigxMDAqZSkudG9GaXhlZCh0KX0sYjpmdW5jdGlvbihlKXtyZXR1cm4gQW4oZSkudG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUrJyd9LGQ6ZnVuY3Rpb24oZSl7cmV0dXJuIEFuKGUpLnRvU3RyaW5nKDEwKX0sZTpmdW5jdGlvbihlLHQpe3JldHVybiBlLnRvRXhwb25lbnRpYWwodCl9LGY6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS50b0ZpeGVkKHQpfSxnOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUudG9QcmVjaXNpb24odCl9LG86ZnVuY3Rpb24oZSl7cmV0dXJuIEFuKGUpLnRvU3RyaW5nKDgpfSxwOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFZpKDEwMCplLHQpfSxyOlZpLHM6ZnVuY3Rpb24oZSx0KXt2YXIgYT1IaShlLHQpO2lmKCFhKXJldHVybiBlKycnO3ZhciByPWFbMF0sbz1hWzFdLGw9by0oTmk9MypObigtOCxJbig4LEZuKG8vMykpKSkrMSxpPXIubGVuZ3RoO3JldHVybiBsPT09aT9yOmw+aT9yK0FycmF5KGwtaSsxKS5qb2luKCcwJyk6MDxsP3Iuc2xpY2UoMCxsKSsnLicrci5zbGljZShsKTonMC4nK0FycmF5KDEtbCkuam9pbignMCcpK0hpKGUsTm4oMCx0K2wtMSkpWzBdfSxYOmZ1bmN0aW9uKGUpe3JldHVybiBBbihlKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX0seDpmdW5jdGlvbihlKXtyZXR1cm4gQW4oZSkudG9TdHJpbmcoMTYpfX0sS2k9L14oPzooLik/KFs8Pj1eXSkpPyhbK1wtXCggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8oW2EteiVdKT8kL2k7Z2UucHJvdG90eXBlPWZlLnByb3RvdHlwZSxmZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxsK3RoaXMuYWxpZ24rdGhpcy5zaWduK3RoaXMuc3ltYm9sKyh0aGlzLnplcm8/JzAnOicnKSsobnVsbD09dGhpcy53aWR0aD8nJzpObigxLDB8dGhpcy53aWR0aCkpKyh0aGlzLmNvbW1hPycsJzonJykrKG51bGw9PXRoaXMucHJlY2lzaW9uPycnOicuJytObigwLDB8dGhpcy5wcmVjaXNpb24pKSt0aGlzLnR5cGV9O3ZhciByZSxYaSxKaSxRaT1mdW5jdGlvbihlKXtyZXR1cm4gZX0sWmk9Wyd5JywneicsJ2EnLCdmJywncCcsJ24nLCdceEI1JywnbScsJycsJ2snLCdNJywnRycsJ1QnLCdQJywnRScsJ1onLCdZJ10sR2k9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtmdW5jdGlvbiB0KGUpe3ZhciB0LGksbixjPWgsaz1tO2lmKCdjJz09PWIpaz15KGUpK2ssZT0nJztlbHNle2U9K2U7dmFyIHY9MD5lO2lmKGU9eShqbihlKSxmKSx2JiYwPT0rZSYmKHY9ITEpLGM9KHY/JygnPT09cz9zOictJzonLSc9PT1zfHwnKCc9PT1zPycnOnMpK2Msaz1rKygncyc9PT1iP1ppWzgrTmkvM106JycpKyh2JiYnKCc9PT1zPycpJzonJykseClmb3IodD0tMSxpPWUubGVuZ3RoOysrdDxpOylpZihuPWUuY2hhckNvZGVBdCh0KSw0OD5ufHw1NzxuKXtrPSg0Nj09PW4/ZCtlLnNsaWNlKHQrMSk6ZS5zbGljZSh0KSkrayxlPWUuc2xpY2UoMCx0KTticmVha319ZyYmIXUmJihlPWEoZSxJbmZpbml0eSkpO3ZhciB3PWMubGVuZ3RoK2UubGVuZ3RoK2subGVuZ3RoLEM9dzxwP0FycmF5KHAtdysxKS5qb2luKG8pOicnO3N3aXRjaChnJiZ1JiYoZT1hKEMrZSxDLmxlbmd0aD9wLWsubGVuZ3RoOkluZmluaXR5KSxDPScnKSxsKXtjYXNlJzwnOmU9YytlK2srQzticmVhaztjYXNlJz0nOmU9YytDK2UrazticmVhaztjYXNlJ14nOmU9Qy5zbGljZSgwLHc9Qy5sZW5ndGg+PjEpK2MrZStrK0Muc2xpY2Uodyk7YnJlYWs7ZGVmYXVsdDplPUMrYytlK2s7fXJldHVybiByKGUpfWU9Z2UoZSk7dmFyIG89ZS5maWxsLGw9ZS5hbGlnbixzPWUuc2lnbixjPWUuc3ltYm9sLHU9ZS56ZXJvLHA9ZS53aWR0aCxnPWUuY29tbWEsZj1lLnByZWNpc2lvbixiPWUudHlwZSxoPSckJz09PWM/blswXTonIyc9PT1jJiYvW2JveFhdLy50ZXN0KGIpPycwJytiLnRvTG93ZXJDYXNlKCk6JycsbT0nJCc9PT1jP25bMV06L1slcF0vLnRlc3QoYik/aTonJyx5PSRpW2JdLHg9IWJ8fC9bZGVmZ3BycyVdLy50ZXN0KGIpO3JldHVybiBmPW51bGw9PWY/Yj82OjEyOi9bZ3Byc10vLnRlc3QoYik/Tm4oMSxJbigyMSxmKSk6Tm4oMCxJbigyMCxmKSksdC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBlKycnfSx0fXZhciBhPWUuZ3JvdXBpbmcmJmUudGhvdXNhbmRzP0JpKGUuZ3JvdXBpbmcsZS50aG91c2FuZHMpOlFpLG49ZS5jdXJyZW5jeSxkPWUuZGVjaW1hbCxyPWUubnVtZXJhbHM/V2koZS5udW1lcmFscyk6UWksaT1lLnBlcmNlbnR8fCclJztyZXR1cm57Zm9ybWF0OnQsZm9ybWF0UHJlZml4OmZ1bmN0aW9uKG4sYSl7dmFyIGk9dCgobj1nZShuKSxuLnR5cGU9J2YnLG4pKSxkPTMqTm4oLTgsSW4oOCxGbihZaShhKS8zKSkpLHI9T24oMTAsLWQpLG89WmlbOCtkLzNdO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gaShyKmUpK299fX19OyhmdW5jdGlvbihlKXtyZXR1cm4gcmU9R2koZSksWGk9cmUuZm9ybWF0LEppPXJlLmZvcm1hdFByZWZpeCxyZX0pKHtkZWNpbWFsOicuJyx0aG91c2FuZHM6JywnLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbJyQnLCcnXX0pO3ZhciBlZD1mdW5jdGlvbihlKXtyZXR1cm4gTm4oMCwtWWkoam4oZSkpKX0sdGQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gTm4oMCwzKk5uKC04LEluKDgsRm4oWWkodCkvMykpKS1ZaShqbihlKSkpfSxuZD1mdW5jdGlvbihlLHQpe3JldHVybiBlPWpuKGUpLHQ9am4odCktZSxObigwLFlpKHQpLVlpKGUpKSsxfSxhZD1mdW5jdGlvbihlLHQsbil7dmFyIGEsaT1lWzBdLGQ9ZVtlLmxlbmd0aC0xXSxyPXcoaSxkLG51bGw9PXQ/MTA6dCk7c3dpdGNoKG49Z2UobnVsbD09bj8nLGYnOm4pLG4udHlwZSl7Y2FzZSdzJzp7dmFyIG89Tm4oam4oaSksam4oZCkpO3JldHVybiBudWxsIT1uLnByZWNpc2lvbnx8aXNOYU4oYT10ZChyLG8pKXx8KG4ucHJlY2lzaW9uPWEpLEppKG4sbyl9Y2FzZScnOmNhc2UnZSc6Y2FzZSdnJzpjYXNlJ3AnOmNhc2Uncic6e251bGwhPW4ucHJlY2lzaW9ufHxpc05hTihhPW5kKHIsTm4oam4oaSksam4oZCkpKSl8fChuLnByZWNpc2lvbj1hLSgnZSc9PT1uLnR5cGUpKTticmVha31jYXNlJ2YnOmNhc2UnJSc6e251bGwhPW4ucHJlY2lzaW9ufHxpc05hTihhPWVkKHIpKXx8KG4ucHJlY2lzaW9uPWEtMiooJyUnPT09bi50eXBlKSk7YnJlYWt9fXJldHVybiBYaShuKX0saWQ9bmV3IERhdGUsZGQ9bmV3IERhdGUscmQ9bWUoZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKGUsdCl7ZS5zZXRUaW1lKCtlK3QpfSxmdW5jdGlvbihlLHQpe3JldHVybiB0LWV9KTtyZC5ldmVyeT1mdW5jdGlvbihlKXtyZXR1cm4gZT1GbihlKSxpc0Zpbml0ZShlKSYmMDxlPzE8ZT9tZShmdW5jdGlvbih0KXt0LnNldFRpbWUoRm4odC9lKSplKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbiplKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS9lfSk6cmQ6bnVsbH07dmFyIG9kPTFlMyxsZD02ZTQsc2Q9MzZlNSxjZD04NjRlNSx1ZD02MDQ4ZTUscGQ9bWUoZnVuY3Rpb24oZSl7ZS5zZXRUaW1lKEZuKGUvb2QpKm9kKX0sZnVuY3Rpb24oZSx0KXtlLnNldFRpbWUoK2UrdCpvZCl9LGZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQtZSkvb2R9LGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldFVUQ1NlY29uZHMoKX0pLGdkPW1lKGZ1bmN0aW9uKGUpe2Uuc2V0VGltZShGbihlL2xkKSpsZCl9LGZ1bmN0aW9uKGUsdCl7ZS5zZXRUaW1lKCtlK3QqbGQpfSxmdW5jdGlvbihlLHQpe3JldHVybih0LWUpL2xkfSxmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRNaW51dGVzKCl9KSxmZD1tZShmdW5jdGlvbihlKXt2YXIgdD1lLmdldFRpbWV6b25lT2Zmc2V0KCkqbGQlc2Q7MD50JiYodCs9c2QpLGUuc2V0VGltZShGbigoK2UtdCkvc2QpKnNkK3QpfSxmdW5jdGlvbihlLHQpe2Uuc2V0VGltZSgrZSt0KnNkKX0sZnVuY3Rpb24oZSx0KXtyZXR1cm4odC1lKS9zZH0sZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0SG91cnMoKX0pLGJkPW1lKGZ1bmN0aW9uKGUpe2Uuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKGUsdCl7ZS5zZXREYXRlKGUuZ2V0RGF0ZSgpK3QpfSxmdW5jdGlvbihlLHQpe3JldHVybih0LWUtKHQuZ2V0VGltZXpvbmVPZmZzZXQoKS1lLmdldFRpbWV6b25lT2Zmc2V0KCkpKmxkKS9jZH0sZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0RGF0ZSgpLTF9KSxoZD15ZSgwKSxtZD15ZSgxKSx5ZD15ZSgyKSx4ZD15ZSgzKSxrZD15ZSg0KSx2ZD15ZSg1KSx3ZD15ZSg2KSxDZD1tZShmdW5jdGlvbihlKXtlLnNldERhdGUoMSksZS5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24oZSx0KXtlLnNldE1vbnRoKGUuZ2V0TW9udGgoKSt0KX0sZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5nZXRNb250aCgpLWUuZ2V0TW9udGgoKSsxMioodC5nZXRGdWxsWWVhcigpLWUuZ2V0RnVsbFllYXIoKSl9LGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldE1vbnRoKCl9KSxfZD1tZShmdW5jdGlvbihlKXtlLnNldE1vbnRoKDAsMSksZS5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24oZSx0KXtlLnNldEZ1bGxZZWFyKGUuZ2V0RnVsbFllYXIoKSt0KX0sZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5nZXRGdWxsWWVhcigpLWUuZ2V0RnVsbFllYXIoKX0sZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0RnVsbFllYXIoKX0pO19kLmV2ZXJ5PWZ1bmN0aW9uKGUpe3JldHVybiBpc0Zpbml0ZShlPUZuKGUpKSYmMDxlP21lKGZ1bmN0aW9uKHQpe3Quc2V0RnVsbFllYXIoRm4odC5nZXRGdWxsWWVhcigpL2UpKmUpLHQuc2V0TW9udGgoMCwxKSx0LnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0RnVsbFllYXIodC5nZXRGdWxsWWVhcigpK24qZSl9KTpudWxsfTt2YXIgVGQ9bWUoZnVuY3Rpb24oZSl7ZS5zZXRVVENTZWNvbmRzKDAsMCl9LGZ1bmN0aW9uKGUsdCl7ZS5zZXRUaW1lKCtlK3QqbGQpfSxmdW5jdGlvbihlLHQpe3JldHVybih0LWUpL2xkfSxmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRVVENNaW51dGVzKCl9KSxTZD1tZShmdW5jdGlvbihlKXtlLnNldFVUQ01pbnV0ZXMoMCwwLDApfSxmdW5jdGlvbihlLHQpe2Uuc2V0VGltZSgrZSt0KnNkKX0sZnVuY3Rpb24oZSx0KXtyZXR1cm4odC1lKS9zZH0sZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0VVRDSG91cnMoKX0pLE1kPW1lKGZ1bmN0aW9uKGUpe2Uuc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKGUsdCl7ZS5zZXRVVENEYXRlKGUuZ2V0VVRDRGF0ZSgpK3QpfSxmdW5jdGlvbihlLHQpe3JldHVybih0LWUpL2NkfSxmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRVVENEYXRlKCktMX0pLEVkPXhlKDApLERkPXhlKDEpLExkPXhlKDIpLFVkPXhlKDMpLEFkPXhlKDQpLGpkPXhlKDUpLE9kPXhlKDYpLHFkPW1lKGZ1bmN0aW9uKGUpe2Uuc2V0VVRDRGF0ZSgxKSxlLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihlLHQpe2Uuc2V0VVRDTW9udGgoZS5nZXRVVENNb250aCgpK3QpfSxmdW5jdGlvbihlLHQpe3JldHVybiB0LmdldFVUQ01vbnRoKCktZS5nZXRVVENNb250aCgpKzEyKih0LmdldFVUQ0Z1bGxZZWFyKCktZS5nZXRVVENGdWxsWWVhcigpKX0sZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0VVRDTW9udGgoKX0pLFJkPW1lKGZ1bmN0aW9uKGUpe2Uuc2V0VVRDTW9udGgoMCwxKSxlLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihlLHQpe2Uuc2V0VVRDRnVsbFllYXIoZS5nZXRVVENGdWxsWWVhcigpK3QpfSxmdW5jdGlvbihlLHQpe3JldHVybiB0LmdldFVUQ0Z1bGxZZWFyKCktZS5nZXRVVENGdWxsWWVhcigpfSxmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRVVENGdWxsWWVhcigpfSk7UmQuZXZlcnk9ZnVuY3Rpb24oZSl7cmV0dXJuIGlzRmluaXRlKGU9Rm4oZSkpJiYwPGU/bWUoZnVuY3Rpb24odCl7dC5zZXRVVENGdWxsWWVhcihGbih0LmdldFVUQ0Z1bGxZZWFyKCkvZSkqZSksdC5zZXRVVENNb250aCgwLDEpLHQuc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENGdWxsWWVhcih0LmdldFVUQ0Z1bGxZZWFyKCkrbiplKX0pOm51bGx9O3ZhciBOZCxQZCxGZCxJZD17MDonMCcsIi0iOicnLF86JyAnfSx6ZD0vXlxzKlxkKy8sSGQ9L14lLyxZZD0vW1xcXF5cJFwqXCtcP1x8XFtcXVwoXClcLlx7XH1dL2c7KGZ1bmN0aW9uKGUpe3JldHVybiBOZD1DZShlKSxQZD1OZC51dGNGb3JtYXQsRmQ9TmQudXRjUGFyc2UsTmR9KSh7ZGF0ZVRpbWU6JyV4LCAlWCcsZGF0ZTonJS1tLyUtZC8lWScsdGltZTonJS1JOiVNOiVTICVwJyxwZXJpb2RzOlsnQU0nLCdQTSddLGRheXM6WydTdW5kYXknLCdNb25kYXknLCdUdWVzZGF5JywnV2VkbmVzZGF5JywnVGh1cnNkYXknLCdGcmlkYXknLCdTYXR1cmRheSddLHNob3J0RGF5czpbJ1N1bicsJ01vbicsJ1R1ZScsJ1dlZCcsJ1RodScsJ0ZyaScsJ1NhdCddLG1vbnRoczpbJ0phbnVhcnknLCdGZWJydWFyeScsJ01hcmNoJywnQXByaWwnLCdNYXknLCdKdW5lJywnSnVseScsJ0F1Z3VzdCcsJ1NlcHRlbWJlcicsJ09jdG9iZXInLCdOb3ZlbWJlcicsJ0RlY2VtYmVyJ10sc2hvcnRNb250aHM6WydKYW4nLCdGZWInLCdNYXInLCdBcHInLCdNYXknLCdKdW4nLCdKdWwnLCdBdWcnLCdTZXAnLCdPY3QnLCdOb3YnLCdEZWMnXX0pO3ZhciBCZD0nJVktJW0tJWRUJUg6JU06JVMuJUxaJyxXZD1EYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZz9mdW5jdGlvbihlKXtyZXR1cm4gZS50b0lTT1N0cmluZygpfTpQZChCZCksVmQ9K25ldyBEYXRlKCcyMDAwLTAxLTAxVDAwOjAwOjAwLjAwMFonKT9mdW5jdGlvbihlKXt2YXIgdD1uZXcgRGF0ZShlKTtyZXR1cm4gaXNOYU4odCk/bnVsbDp0fTpGZChCZCksJGQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUubWF0Y2goLy57Nn0vZykubWFwKGZ1bmN0aW9uKGUpe3JldHVybicjJytlfSl9OyRkKCcxZjc3YjRmZjdmMGUyY2EwMmNkNjI3Mjg5NDY3YmQ4YzU2NGJlMzc3YzI3ZjdmN2ZiY2JkMjIxN2JlY2YnKSwkZCgnMzkzYjc5NTI1NGEzNmI2ZWNmOWM5ZWRlNjM3OTM5OGNhMjUyYjVjZjZiY2VkYjljOGM2ZDMxYmQ5ZTM5ZTdiYTUyZTdjYjk0ODQzYzM5YWQ0OTRhZDY2MTZiZTc5NjljN2I0MTczYTU1MTk0Y2U2ZGJkZGU5ZWQ2JyksJGQoJzMxODJiZDZiYWVkNjllY2FlMWM2ZGJlZmU2NTUwZGZkOGQzY2ZkYWU2YmZkZDBhMjMxYTM1NDc0YzQ3NmExZDk5YmM3ZTljMDc1NmJiMTllOWFjOGJjYmRkY2RhZGFlYjYzNjM2Mzk2OTY5NmJkYmRiZGQ5ZDlkOScpLCRkKCcxZjc3YjRhZWM3ZThmZjdmMGVmZmJiNzgyY2EwMmM5OGRmOGFkNjI3MjhmZjk4OTY5NDY3YmRjNWIwZDU4YzU2NGJjNDljOTRlMzc3YzJmN2I2ZDI3ZjdmN2ZjN2M3YzdiY2JkMjJkYmRiOGQxN2JlY2Y5ZWRhZTUnKSxQaShKKDMwMCwwLjUsMCksSigtMjQwLDAuNSwxKSk7dmFyIEtkPVBpKEooLTEwMCwwLjc1LDAuMzUpLEooODAsMS41LDAuOCkpLFhkPVBpKEooMjYwLDAuNzUsMC4zNSksSig4MCwxLjUsMC44KSksSmQ9SigpO210KCRkKCc0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMwN2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIzYjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVjOGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUzMTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZmOGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUyYTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgxOGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUyMzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDkyOGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGExZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEyN2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQzNGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRkMmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBjYWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFmYmU3MjNmZGU3MjUnKSk7dmFyIFFkPW10KCRkKCcwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMDkwMjAyMGIwMjAyMGQwMzAzMGYwMzAzMTIwNDA0MTQwNTA0MTYwNjA1MTgwNjA1MWEwNzA2MWMwODA3MWUwOTA3MjAwYTA4MjIwYjA5MjQwYzA5MjYwZDBhMjkwZTBiMmIxMDBiMmQxMTBjMmYxMjBkMzExMzBkMzQxNDBlMzYxNTBlMzgxNjBmM2IxODBmM2QxOTEwM2YxYTEwNDIxYzEwNDQxZDExNDcxZTExNDkyMDExNGIyMTExNGUyMjExNTAyNDEyNTMyNTEyNTUyNzEyNTgyOTExNWEyYTExNWMyYzExNWYyZDExNjEyZjExNjMzMTExNjUzMzEwNjczNDEwNjkzNjEwNmIzODEwNmMzOTBmNmUzYjBmNzAzZDBmNzEzZjBmNzI0MDBmNzQ0MjBmNzU0NDBmNzY0NTEwNzc0NzEwNzg0OTEwNzg0YTEwNzk0YzExN2E0ZTExN2I0ZjEyN2I1MTEyN2M1MjEzN2M1NDEzN2Q1NjE0N2Q1NzE1N2U1OTE1N2U1YTE2N2U1YzE2N2Y1ZDE3N2Y1ZjE4N2Y2MDE4ODA2MjE5ODA2NDFhODA2NTFhODA2NzFiODA2ODFjODE2YTFjODE2YjFkODE2ZDFkODE2ZTFlODE3MDFmODE3MjFmODE3MzIwODE3NTIxODE3NjIxODE3ODIyODE3OTIyODI3YjIzODI3YzIzODI3ZTI0ODI4MDI1ODI4MTI1ODE4MzI2ODE4NDI2ODE4NjI3ODE4ODI3ODE4OTI4ODE4YjI5ODE4YzI5ODE4ZTJhODE5MDJhODE5MTJiODE5MzJiODA5NDJjODA5NjJjODA5ODJkODA5OTJkODA5YjJlN2Y5YzJlN2Y5ZTJmN2ZhMDJmN2ZhMTMwN2VhMzMwN2VhNTMxN2VhNjMxN2RhODMyN2RhYTMzN2RhYjMzN2NhZDM0N2NhZTM0N2JiMDM1N2JiMjM1N2JiMzM2N2FiNTM2N2FiNzM3NzliODM3NzliYTM4NzhiYzM5NzhiZDM5NzdiZjNhNzdjMDNhNzZjMjNiNzVjNDNjNzVjNTNjNzRjNzNkNzNjODNlNzNjYTNlNzJjYzNmNzFjZDQwNzFjZjQwNzBkMDQxNmZkMjQyNmZkMzQzNmVkNTQ0NmRkNjQ1NmNkODQ1NmNkOTQ2NmJkYjQ3NmFkYzQ4NjlkZTQ5NjhkZjRhNjhlMDRjNjdlMjRkNjZlMzRlNjVlNDRmNjRlNTUwNjRlNzUyNjNlODUzNjJlOTU0NjJlYTU2NjFlYjU3NjBlYzU4NjBlZDVhNWZlZTViNWVlZjVkNWVmMDVmNWVmMTYwNWRmMjYyNWRmMjY0NWNmMzY1NWNmNDY3NWNmNDY5NWNmNTZiNWNmNjZjNWNmNjZlNWNmNzcwNWNmNzcyNWNmODc0NWNmODc2NWNmOTc4NWRmOTc5NWRmOTdiNWRmYTdkNWVmYTdmNWVmYTgxNWZmYjgzNWZmYjg1NjBmYjg3NjFmYzg5NjFmYzhhNjJmYzhjNjNmYzhlNjRmYzkwNjVmZDkyNjZmZDk0NjdmZDk2NjhmZDk4NjlmZDlhNmFmZDliNmJmZTlkNmNmZTlmNmRmZWExNmVmZWEzNmZmZWE1NzFmZWE3NzJmZWE5NzNmZWFhNzRmZWFjNzZmZWFlNzdmZWIwNzhmZWIyN2FmZWI0N2JmZWI2N2NmZWI3N2VmZWI5N2ZmZWJiODFmZWJkODJmZWJmODRmZWMxODVmZWMyODdmZWM0ODhmZWM2OGFmZWM4OGNmZWNhOGRmZWNjOGZmZWNkOTBmZWNmOTJmZWQxOTRmZWQzOTVmZWQ1OTdmZWQ3OTlmZWQ4OWFmZGRhOWNmZGRjOWVmZGRlYTBmZGUwYTFmZGUyYTNmZGUzYTVmZGU1YTdmZGU3YTlmZGU5YWFmZGViYWNmY2VjYWVmY2VlYjBmY2YwYjJmY2YyYjRmY2Y0YjZmY2Y2YjhmY2Y3YjlmY2Y5YmJmY2ZiYmRmY2ZkYmYnKSksWmQ9bXQoJGQoJzAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwYTAyMDIwYzAyMDIwZTAzMDIxMDA0MDMxMjA0MDMxNDA1MDQxNzA2MDQxOTA3MDUxYjA4MDUxZDA5MDYxZjBhMDcyMjBiMDcyNDBjMDgyNjBkMDgyOTBlMDkyYjEwMDkyZDExMGEzMDEyMGEzMjE0MGIzNDE1MGIzNzE2MGIzOTE4MGMzYzE5MGMzZTFiMGM0MTFjMGM0MzFlMGM0NTFmMGM0ODIxMGM0YTIzMGM0YzI0MGM0ZjI2MGM1MTI4MGI1MzI5MGI1NTJiMGI1NzJkMGI1OTJmMGE1YjMxMGE1YzMyMGE1ZTM0MGE1ZjM2MDk2MTM4MDk2MjM5MDk2MzNiMDk2NDNkMDk2NTNlMDk2NjQwMGE2NzQyMGE2ODQ0MGE2ODQ1MGE2OTQ3MGI2YTQ5MGI2YTRhMGM2YjRjMGM2YjRkMGQ2YzRmMGQ2YzUxMGU2YzUyMGU2ZDU0MGY2ZDU1MGY2ZDU3MTA2ZTU5MTA2ZTVhMTE2ZTVjMTI2ZTVkMTI2ZTVmMTM2ZTYxMTM2ZTYyMTQ2ZTY0MTU2ZTY1MTU2ZTY3MTY2ZTY5MTY2ZTZhMTc2ZTZjMTg2ZTZkMTg2ZTZmMTk2ZTcxMTk2ZTcyMWE2ZTc0MWE2ZTc1MWI2ZTc3MWM2ZDc4MWM2ZDdhMWQ2ZDdjMWQ2ZDdkMWU2ZDdmMWU2YzgwMWY2YzgyMjA2Yzg0MjA2Yjg1MjE2Yjg3MjE2Yjg4MjI2YThhMjI2YThjMjM2OThkMjM2OThmMjQ2OTkwMjU2ODkyMjU2ODkzMjY2Nzk1MjY2Nzk3Mjc2Njk4Mjc2NjlhMjg2NTliMjk2NDlkMjk2NDlmMmE2M2EwMmE2M2EyMmI2MmEzMmM2MWE1MmM2MGE2MmQ2MGE4MmU1ZmE5MmU1ZWFiMmY1ZWFkMzA1ZGFlMzA1Y2IwMzE1YmIxMzI1YWIzMzI1YWI0MzM1OWI2MzQ1OGI3MzU1N2I5MzU1NmJhMzY1NWJjMzc1NGJkMzg1M2JmMzk1MmMwM2E1MWMxM2E1MGMzM2I0ZmM0M2M0ZWM2M2Q0ZGM3M2U0Y2M4M2Y0YmNhNDA0YWNiNDE0OWNjNDI0OGNlNDM0N2NmNDQ0NmQwNDU0NWQyNDY0NGQzNDc0M2Q0NDg0MmQ1NGE0MWQ3NGIzZmQ4NGMzZWQ5NGQzZGRhNGUzY2RiNTAzYmRkNTEzYWRlNTIzOGRmNTMzN2UwNTUzNmUxNTYzNWUyNTczNGUzNTkzM2U0NWEzMWU1NWMzMGU2NWQyZmU3NWUyZWU4NjAyZGU5NjEyYmVhNjMyYWViNjQyOWViNjYyOGVjNjcyNmVkNjkyNWVlNmEyNGVmNmMyM2VmNmUyMWYwNmYyMGYxNzExZmYxNzMxZGYyNzQxY2YzNzYxYmYzNzgxOWY0NzkxOGY1N2IxN2Y1N2QxNWY2N2UxNGY2ODAxM2Y3ODIxMmY3ODQxMGY4ODUwZmY4ODcwZWY4ODkwY2Y5OGIwYmY5OGMwYWY5OGUwOWZhOTAwOGZhOTIwN2ZhOTQwN2ZiOTYwNmZiOTcwNmZiOTkwNmZiOWIwNmZiOWQwN2ZjOWYwN2ZjYTEwOGZjYTMwOWZjYTUwYWZjYTYwY2ZjYTgwZGZjYWEwZmZjYWMxMWZjYWUxMmZjYjAxNGZjYjIxNmZjYjQxOGZiYjYxYWZiYjgxZGZiYmExZmZiYmMyMWZiYmUyM2ZhYzAyNmZhYzIyOGZhYzQyYWZhYzYyZGY5YzcyZmY5YzkzMmY5Y2IzNWY4Y2QzN2Y4Y2YzYWY3ZDEzZGY3ZDM0MGY2ZDU0M2Y2ZDc0NmY1ZDk0OWY1ZGI0Y2Y0ZGQ0ZmY0ZGY1M2Y0ZTE1NmYzZTM1YWYzZTU1ZGYyZTY2MWYyZTg2NWYyZWE2OWYxZWM2ZGYxZWQ3MWYxZWY3NWYxZjE3OWYyZjI3ZGYyZjQ4MmYzZjU4NmYzZjY4YWY0Zjg4ZWY1Zjk5MmY2ZmE5NmY4ZmI5YWY5ZmM5ZGZhZmRhMWZjZmZhNCcpKSxHZD1tdCgkZCgnMGQwODg3MTAwNzg4MTMwNzg5MTYwNzhhMTkwNjhjMWIwNjhkMWQwNjhlMjAwNjhmMjIwNjkwMjQwNjkxMjYwNTkxMjgwNTkyMmEwNTkzMmMwNTk0MmUwNTk1MmYwNTk2MzEwNTk3MzMwNTk3MzUwNDk4MzcwNDk5MzgwNDlhM2EwNDlhM2MwNDliM2UwNDljM2YwNDljNDEwNDlkNDMwMzllNDQwMzllNDYwMzlmNDgwMzlmNDkwM2EwNGIwM2ExNGMwMmExNGUwMmEyNTAwMmEyNTEwMmEzNTMwMmEzNTUwMmE0NTYwMWE0NTgwMWE0NTkwMWE1NWIwMWE1NWMwMWE2NWUwMWE2NjAwMWE2NjEwMGE3NjMwMGE3NjQwMGE3NjYwMGE3NjcwMGE4NjkwMGE4NmEwMGE4NmMwMGE4NmUwMGE4NmYwMGE4NzEwMGE4NzIwMWE4NzQwMWE4NzUwMWE4NzcwMWE4NzgwMWE4N2EwMmE4N2IwMmE4N2QwM2E4N2UwM2E4ODAwNGE4ODEwNGE3ODMwNWE3ODQwNWE3ODYwNmE2ODcwN2E2ODgwOGE2OGEwOWE1OGIwYWE1OGQwYmE1OGUwY2E0OGYwZGE0OTEwZWEzOTIwZmEzOTQxMGEyOTUxMWExOTYxM2ExOTgxNGEwOTkxNTlmOWExNjlmOWMxNzllOWQxODlkOWUxOTlkYTAxYTljYTExYjliYTIxZDlhYTMxZTlhYTUxZjk5YTYyMDk4YTcyMTk3YTgyMjk2YWEyMzk1YWIyNDk0YWMyNjk0YWQyNzkzYWUyODkyYjAyOTkxYjEyYTkwYjIyYjhmYjMyYzhlYjQyZThkYjUyZjhjYjYzMDhiYjczMThhYjgzMjg5YmEzMzg4YmIzNDg4YmMzNTg3YmQzNzg2YmUzODg1YmYzOTg0YzAzYTgzYzEzYjgyYzIzYzgxYzMzZDgwYzQzZTdmYzU0MDdlYzY0MTdkYzc0MjdjYzg0MzdiYzk0NDdhY2E0NTdhY2I0Njc5Y2M0Nzc4Y2M0OTc3Y2Q0YTc2Y2U0Yjc1Y2Y0Yzc0ZDA0ZDczZDE0ZTcyZDI0ZjcxZDM1MTcxZDQ1MjcwZDU1MzZmZDU1NDZlZDY1NTZkZDc1NjZjZDg1NzZiZDk1ODZhZGE1YTZhZGE1YjY5ZGI1YzY4ZGM1ZDY3ZGQ1ZTY2ZGU1ZjY1ZGU2MTY0ZGY2MjYzZTA2MzYzZTE2NDYyZTI2NTYxZTI2NjYwZTM2ODVmZTQ2OTVlZTU2YTVkZTU2YjVkZTY2YzVjZTc2ZTViZTc2ZjVhZTg3MDU5ZTk3MTU4ZTk3MjU3ZWE3NDU3ZWI3NTU2ZWI3NjU1ZWM3NzU0ZWQ3OTUzZWQ3YTUyZWU3YjUxZWY3YzUxZWY3ZTUwZjA3ZjRmZjA4MDRlZjE4MTRkZjE4MzRjZjI4NDRiZjM4NTRiZjM4NzRhZjQ4ODQ5ZjQ4OTQ4ZjU4YjQ3ZjU4YzQ2ZjY4ZDQ1ZjY4ZjQ0Zjc5MDQ0Zjc5MTQzZjc5MzQyZjg5NDQxZjg5NTQwZjk5NzNmZjk5ODNlZjk5YTNlZmE5YjNkZmE5YzNjZmE5ZTNiZmI5ZjNhZmJhMTM5ZmJhMjM4ZmNhMzM4ZmNhNTM3ZmNhNjM2ZmNhODM1ZmNhOTM0ZmRhYjMzZmRhYzMzZmRhZTMyZmRhZjMxZmRiMTMwZmRiMjJmZmRiNDJmZmRiNTJlZmViNzJkZmViODJjZmViYTJjZmViYjJiZmViZDJhZmViZTJhZmVjMDI5ZmRjMjI5ZmRjMzI4ZmRjNTI3ZmRjNjI3ZmRjODI3ZmRjYTI2ZmRjYjI2ZmNjZDI1ZmNjZTI1ZmNkMDI1ZmNkMjI1ZmJkMzI0ZmJkNTI0ZmJkNzI0ZmFkODI0ZmFkYTI0ZjlkYzI0ZjlkZDI1ZjhkZjI1ZjhlMTI1ZjdlMjI1ZjdlNDI1ZjZlNjI2ZjZlODI2ZjVlOTI2ZjVlYjI3ZjRlZDI3ZjNlZTI3ZjNmMDI3ZjJmMjI3ZjFmNDI2ZjFmNTI1ZjBmNzI0ZjBmOTIxJykpLGVyPXt2YWx1ZTpmdW5jdGlvbigpe319O3h0LnByb3RvdHlwZT15dC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnh0LG9uOmZ1bmN0aW9uKGUsYSl7dmFyIGQsdD10aGlzLl8scj1rdChlKycnLHQpLG89LTEsaT1yLmxlbmd0aDtpZigyPmFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7KytvPGk7KWlmKChkPShlPXJbb10pLnR5cGUpJiYoZD12dCh0W2RdLGUubmFtZSkpKXJldHVybiBkO3JldHVybn1pZihudWxsIT1hJiYnZnVuY3Rpb24nIT10eXBlb2YgYSl0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgY2FsbGJhY2s6ICcrYSk7Zm9yKDsrK288aTspaWYoZD0oZT1yW29dKS50eXBlKXRbZF09d3QodFtkXSxlLm5hbWUsYSk7ZWxzZSBpZihudWxsPT1hKWZvcihkIGluIHQpdFtkXT13dCh0W2RdLGUubmFtZSxudWxsKTtyZXR1cm4gdGhpc30sY29weTpmdW5jdGlvbigpe3ZhciBlPXt9LG49dGhpcy5fO2Zvcih2YXIgYSBpbiBuKWVbYV09blthXS5zbGljZSgpO3JldHVybiBuZXcgeHQoZSl9LGNhbGw6ZnVuY3Rpb24oZSxhKXtpZigwPChkPWFyZ3VtZW50cy5sZW5ndGgtMikpZm9yKHZhciBkLG4sdD1BcnJheShkKSxyPTA7cjxkOysrcil0W3JdPWFyZ3VtZW50c1tyKzJdO2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkoZSkpdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHR5cGU6ICcrZSk7Zm9yKG49dGhpcy5fW2VdLHI9MCxkPW4ubGVuZ3RoO3I8ZDsrK3IpbltyXS52YWx1ZS5hcHBseShhLHQpfSxhcHBseTpmdW5jdGlvbihlLGEsZCl7aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eShlKSl0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gdHlwZTogJytlKTtmb3IodmFyIHI9dGhpcy5fW2VdLHQ9MCxpPXIubGVuZ3RoO3Q8aTsrK3Qpclt0XS52YWx1ZS5hcHBseShhLGQpfX07dmFyIHRyPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJyxucj17c3ZnOidodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycseGh0bWw6dHIseGxpbms6J2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLHhtbDonaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlJyx4bWxuczonaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8nfSxhcj1mdW5jdGlvbihlKXt2YXIgdD1lKz0nJyxuPXQuaW5kZXhPZignOicpO3JldHVybiAwPD1uJiYneG1sbnMnIT09KHQ9ZS5zbGljZSgwLG4pKSYmKGU9ZS5zbGljZShuKzEpKSxuci5oYXNPd25Qcm9wZXJ0eSh0KT97c3BhY2U6bnJbdF0sbG9jYWw6ZX06ZX0saXI9ZnVuY3Rpb24oZSl7dmFyIHQ9YXIoZSk7cmV0dXJuKHQubG9jYWw/X3Q6Q3QpKHQpfSxkcj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXRjaGVzKGUpfX07aWYoJ3VuZGVmaW5lZCchPXR5cGVvZiBkb2N1bWVudCl7dmFyIHJyPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtpZighcnIubWF0Y2hlcyl7dmFyIG9yPXJyLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8cnIubXNNYXRjaGVzU2VsZWN0b3J8fHJyLm1vek1hdGNoZXNTZWxlY3Rvcnx8cnIub01hdGNoZXNTZWxlY3Rvcjtkcj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gb3IuY2FsbCh0aGlzLGUpfX19fXZhciBscj1kcixzcj17fSxjcj1udWxsO2lmKCd1bmRlZmluZWQnIT10eXBlb2YgZG9jdW1lbnQpe3ZhciB1cj1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7J29ubW91c2VlbnRlcidpbiB1cnx8KHNyPXttb3VzZWVudGVyOidtb3VzZW92ZXInLG1vdXNlbGVhdmU6J21vdXNlb3V0J30pfXZhciBwcj1mdW5jdGlvbigpe2Zvcih2YXIgZSx0PWNyO2U9dC5zb3VyY2VFdmVudDspdD1lO3JldHVybiB0fSxncj1mdW5jdGlvbihlLHQpe3ZhciBuPWUub3duZXJTVkdFbGVtZW50fHxlO2lmKG4uY3JlYXRlU1ZHUG9pbnQpe3ZhciBhPW4uY3JlYXRlU1ZHUG9pbnQoKTtyZXR1cm4gYS54PXQuY2xpZW50WCxhLnk9dC5jbGllbnRZLGE9YS5tYXRyaXhUcmFuc2Zvcm0oZS5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpLFthLngsYS55XX12YXIgaT1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVyblt0LmNsaWVudFgtaS5sZWZ0LWUuY2xpZW50TGVmdCx0LmNsaWVudFktaS50b3AtZS5jbGllbnRUb3BdfSxmcj1mdW5jdGlvbihlKXt2YXIgdD1wcigpO3JldHVybiB0LmNoYW5nZWRUb3VjaGVzJiYodD10LmNoYW5nZWRUb3VjaGVzWzBdKSxncihlLHQpfSxicj1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9VdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IoZSl9fSxocj1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9BdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoZSl9fSxtcj1mdW5jdGlvbihlKXtyZXR1cm4gQXJyYXkoZS5sZW5ndGgpfTtqdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmp0LGFwcGVuZENoaWxkOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGUsdGhpcy5fbmV4dCl9LGluc2VydEJlZm9yZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGUsdCl9LHF1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKGUpfSxxdWVyeVNlbGVjdG9yQWxsOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChlKX19O3ZhciB5cj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZX19LHhyPSckJyxrcj1mdW5jdGlvbihlKXtyZXR1cm4gZS5vd25lckRvY3VtZW50JiZlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fGUuZG9jdW1lbnQmJmV8fGUuZGVmYXVsdFZpZXd9O1p0LnByb3RvdHlwZT17YWRkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX25hbWVzLmluZGV4T2YoZSk7MD50JiYodGhpcy5fbmFtZXMucHVzaChlKSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgnY2xhc3MnLHRoaXMuX25hbWVzLmpvaW4oJyAnKSkpfSxyZW1vdmU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbmFtZXMuaW5kZXhPZihlKTswPD10JiYodGhpcy5fbmFtZXMuc3BsaWNlKHQsMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJyx0aGlzLl9uYW1lcy5qb2luKCcgJykpKX0sY29udGFpbnM6ZnVuY3Rpb24oZSl7cmV0dXJuIDA8PXRoaXMuX25hbWVzLmluZGV4T2YoZSl9fTt2YXIgdnI9W251bGxdO3luLnByb3RvdHlwZT1mdW5jdGlvbigpe3JldHVybiBuZXcgeW4oW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSx2cil9LnByb3RvdHlwZT17Y29uc3RydWN0b3I6eW4sc2VsZWN0OmZ1bmN0aW9uKGUpeydmdW5jdGlvbichPXR5cGVvZiBlJiYoZT1icihlKSk7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxhPXQubGVuZ3RoLGQ9QXJyYXkoYSkscj0wO3I8YTsrK3IpZm9yKHZhciBvLGwscz10W3JdLGM9cy5sZW5ndGgsbj1kW3JdPUFycmF5KGMpLHU9MDt1PGM7Kyt1KShvPXNbdV0pJiYobD1lLmNhbGwobyxvLl9fZGF0YV9fLHUscykpJiYoJ19fZGF0YV9fJ2luIG8mJihsLl9fZGF0YV9fPW8uX19kYXRhX18pLG5bdV09bCk7cmV0dXJuIG5ldyB5bihkLHRoaXMuX3BhcmVudHMpfSxzZWxlY3RBbGw6ZnVuY3Rpb24oZSl7J2Z1bmN0aW9uJyE9dHlwZW9mIGUmJihlPWhyKGUpKTtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLGE9dC5sZW5ndGgsZD1bXSxyPVtdLG89MDtvPGE7KytvKWZvcih2YXIgbCxzPXRbb10sYz1zLmxlbmd0aCxuPTA7bjxjOysrbikobD1zW25dKSYmKGQucHVzaChlLmNhbGwobCxsLl9fZGF0YV9fLG4scykpLHIucHVzaChsKSk7cmV0dXJuIG5ldyB5bihkLHIpfSxmaWx0ZXI6ZnVuY3Rpb24oZSl7J2Z1bmN0aW9uJyE9dHlwZW9mIGUmJihlPWxyKGUpKTtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLGE9dC5sZW5ndGgsZD1BcnJheShhKSxyPTA7cjxhOysrcilmb3IodmFyIG8sbD10W3JdLHM9bC5sZW5ndGgsbj1kW3JdPVtdLGM9MDtjPHM7KytjKShvPWxbY10pJiZlLmNhbGwobyxvLl9fZGF0YV9fLGMsbCkmJm4ucHVzaChvKTtyZXR1cm4gbmV3IHluKGQsdGhpcy5fcGFyZW50cyl9LGRhdGE6ZnVuY3Rpb24oZSx0KXtpZighZSlyZXR1cm4gZz1BcnJheSh0aGlzLnNpemUoKSkscz0tMSx0aGlzLmVhY2goZnVuY3Rpb24oZSl7Z1srK3NdPWV9KSxnO3ZhciBuPXQ/cXQ6T3QsYT10aGlzLl9wYXJlbnRzLGk9dGhpcy5fZ3JvdXBzOydmdW5jdGlvbichPXR5cGVvZiBlJiYoZT15cihlKSk7Zm9yKHZhciBkPWkubGVuZ3RoLHI9QXJyYXkoZCksbz1BcnJheShkKSxsPUFycmF5KGQpLHM9MDtzPGQ7KytzKXt2YXIgYz1hW3NdLHU9aVtzXSxwPXUubGVuZ3RoLGc9ZS5jYWxsKGMsYyYmYy5fX2RhdGFfXyxzLGEpLGY9Zy5sZW5ndGgsYj1vW3NdPUFycmF5KGYpLGg9cltzXT1BcnJheShmKSxtPWxbc109QXJyYXkocCk7bihjLHUsYixoLG0sZyx0KTtmb3IodmFyIHkseCxrPTAsdj0wO2s8ZjsrK2spaWYoeT1iW2tdKXtmb3Ioaz49diYmKHY9aysxKTshKHg9aFt2XSkmJisrdjxmOyk7eS5fbmV4dD14fHxudWxsfX1yZXR1cm4gcj1uZXcgeW4ocixhKSxyLl9lbnRlcj1vLHIuX2V4aXQ9bCxyfSxlbnRlcjpmdW5jdGlvbigpe3JldHVybiBuZXcgeW4odGhpcy5fZW50ZXJ8fHRoaXMuX2dyb3Vwcy5tYXAobXIpLHRoaXMuX3BhcmVudHMpfSxleGl0OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB5bih0aGlzLl9leGl0fHx0aGlzLl9ncm91cHMubWFwKG1yKSx0aGlzLl9wYXJlbnRzKX0sbWVyZ2U6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxhPWUuX2dyb3VwcyxkPXQubGVuZ3RoLHI9YS5sZW5ndGgsbz1JbihkLHIpLGw9QXJyYXkoZCkscz0wO3M8bzsrK3MpZm9yKHZhciBjLHU9dFtzXSxwPWFbc10sZz11Lmxlbmd0aCxuPWxbc109QXJyYXkoZyksZj0wO2Y8ZzsrK2YpKGM9dVtmXXx8cFtmXSkmJihuW2ZdPWMpO2Zvcig7czxkOysrcylsW3NdPXRbc107cmV0dXJuIG5ldyB5bihsLHRoaXMuX3BhcmVudHMpfSxvcmRlcjpmdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLl9ncm91cHMsdD0tMSxuPWUubGVuZ3RoOysrdDxuOylmb3IodmFyIGEsZD1lW3RdLHI9ZC5sZW5ndGgtMSxpPWRbcl07MDw9LS1yOykoYT1kW3JdKSYmKGkmJmkhPT1hLm5leHRTaWJsaW5nJiZpLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsaSksaT1hKTtyZXR1cm4gdGhpc30sc29ydDpmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQsbil7cmV0dXJuIHQmJm4/ZSh0Ll9fZGF0YV9fLG4uX19kYXRhX18pOiF0LSFufWV8fChlPVJ0KTtmb3IodmFyIGE9dGhpcy5fZ3JvdXBzLGQ9YS5sZW5ndGgscj1BcnJheShkKSxvPTA7bzxkOysrbyl7Zm9yKHZhciBsLHM9YVtvXSxjPXMubGVuZ3RoLG49cltvXT1BcnJheShjKSx1PTA7dTxjOysrdSkobD1zW3VdKSYmKG5bdV09bCk7bi5zb3J0KHQpfXJldHVybiBuZXcgeW4ocix0aGlzLl9wYXJlbnRzKS5vcmRlcigpfSxjYWxsOmZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMF09dGhpcyxlLmFwcGx5KG51bGwsYXJndW1lbnRzKSx0aGlzfSxub2RlczpmdW5jdGlvbigpe3ZhciBlPUFycmF5KHRoaXMuc2l6ZSgpKSx0PS0xO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtlWysrdF09dGhpc30pLGV9LG5vZGU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLHQ9MCxhPWUubGVuZ3RoO3Q8YTsrK3QpZm9yKHZhciBkLHI9ZVt0XSxvPTAsaT1yLmxlbmd0aDtvPGk7KytvKWlmKGQ9cltvXSxkKXJldHVybiBkO3JldHVybiBudWxsfSxzaXplOmZ1bmN0aW9uKCl7dmFyIGU9MDtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7KytlfSksZX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5ub2RlKCl9LGVhY2g6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxhPTAsZD10Lmxlbmd0aDthPGQ7KythKWZvcih2YXIgcixvPXRbYV0sbD0wLGk9by5sZW5ndGg7bDxpOysrbCkocj1vW2xdKSYmZS5jYWxsKHIsci5fX2RhdGFfXyxsLG8pO3JldHVybiB0aGlzfSxhdHRyOmZ1bmN0aW9uKGUsdCl7dmFyIG49YXIoZSk7aWYoMj5hcmd1bWVudHMubGVuZ3RoKXt2YXIgYT10aGlzLm5vZGUoKTtyZXR1cm4gbi5sb2NhbD9hLmdldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCk6YS5nZXRBdHRyaWJ1dGUobil9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09dD9uLmxvY2FsP1B0Ok50OidmdW5jdGlvbic9PXR5cGVvZiB0P24ubG9jYWw/SHQ6enQ6bi5sb2NhbD9JdDpGdCkobix0KSl9LHN0eWxlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gMTxhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgobnVsbD09dD9ZdDonZnVuY3Rpb24nPT10eXBlb2YgdD9XdDpCdCkoZSx0LG51bGw9PW4/Jyc6bikpOlZ0KHRoaXMubm9kZSgpLGUpfSxwcm9wZXJ0eTpmdW5jdGlvbihlLHQpe3JldHVybiAxPGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKChudWxsPT10PyR0OidmdW5jdGlvbic9PXR5cGVvZiB0P1h0Okt0KShlLHQpKTp0aGlzLm5vZGUoKVtlXX0sY2xhc3NlZDpmdW5jdGlvbihlLHQpe3ZhciBhPUp0KGUrJycpO2lmKDI+YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBkPVF0KHRoaXMubm9kZSgpKSxyPS0xLGk9YS5sZW5ndGg7KytyPGk7KWlmKCFkLmNvbnRhaW5zKGFbcl0pKXJldHVybiExO3JldHVybiEwfXJldHVybiB0aGlzLmVhY2goKCdmdW5jdGlvbic9PXR5cGVvZiB0P2FuOnQ/dG46bm4pKGEsdCkpfSx0ZXh0OmZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT1lP2RuOignZnVuY3Rpb24nPT10eXBlb2YgZT9vbjpybikoZSkpOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT1lP2xuOignZnVuY3Rpb24nPT10eXBlb2YgZT9jbjpzbikoZSkpOnRoaXMubm9kZSgpLmlubmVySFRNTH0scmFpc2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKHVuKX0sbG93ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKHBuKX0sYXBwZW5kOmZ1bmN0aW9uKGUpe3ZhciB0PSdmdW5jdGlvbic9PXR5cGVvZiBlP2U6aXIoZSk7cmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQodC5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LGluc2VydDpmdW5jdGlvbihlLHQpe3ZhciBuPSdmdW5jdGlvbic9PXR5cGVvZiBlP2U6aXIoZSksYT1udWxsPT10P2duOidmdW5jdGlvbic9PXR5cGVvZiB0P3Q6YnIodCk7cmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfHxudWxsKX0pfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZuKX0sZGF0dW06ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgnX19kYXRhX18nLGUpOnRoaXMubm9kZSgpLl9fZGF0YV9ffSxvbjpmdW5jdGlvbihlLGEsZCl7dmFyIHIsaSx0PU10KGUrJycpLGw9dC5sZW5ndGg7aWYoMj5hcmd1bWVudHMubGVuZ3RoKXt2YXIgbj10aGlzLm5vZGUoKS5fX29uO2lmKG4pZm9yKHZhciBzLG89MCxjPW4ubGVuZ3RoO288YzsrK28pZm9yKHI9MCxzPW5bb107cjxsOysrcilpZigoaT10W3JdKS50eXBlPT09cy50eXBlJiZpLm5hbWU9PT1zLm5hbWUpcmV0dXJuIHMudmFsdWU7cmV0dXJufWZvcihuPWE/RHQ6RXQsbnVsbD09ZCYmKGQ9ITEpLHI9MDtyPGw7KytyKXRoaXMuZWFjaChuKHRbcl0sYSxkKSk7cmV0dXJuIHRoaXN9LGRpc3BhdGNoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZWFjaCgoJ2Z1bmN0aW9uJz09dHlwZW9mIHQ/bW46aG4pKGUsdCkpfX07dmFyIHdyPWZ1bmN0aW9uKGUpe3JldHVybidzdHJpbmcnPT10eXBlb2YgZT9uZXcgeW4oW1tkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUpXV0sW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pOm5ldyB5bihbW2VdXSx2cil9LENyPWZ1bmN0aW9uKGUsdCxhKXszPmFyZ3VtZW50cy5sZW5ndGgmJihhPXQsdD1wcigpLmNoYW5nZWRUb3VjaGVzKTtmb3IodmFyIGQscj0wLGk9dD90Lmxlbmd0aDowO3I8aTsrK3IpaWYoKGQ9dFtyXSkuaWRlbnRpZmllcj09PWEpcmV0dXJuIGdyKGUsZCk7cmV0dXJuIG51bGx9LF9yPWZ1bmN0aW9uKCl7Y3IucHJldmVudERlZmF1bHQoKSxjci5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX0sVHI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbj13cihlKS5vbignZHJhZ3N0YXJ0LmRyYWcnLF9yLCEwKTsnb25zZWxlY3RzdGFydCdpbiB0P24ub24oJ3NlbGVjdHN0YXJ0LmRyYWcnLF9yLCEwKToodC5fX25vc2VsZWN0PXQuc3R5bGUuTW96VXNlclNlbGVjdCx0LnN0eWxlLk1velVzZXJTZWxlY3Q9J25vbmUnKX0sU3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGV9fTt2bi5wcm90b3R5cGUub249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl8ub24uYXBwbHkodGhpcy5fLGFyZ3VtZW50cyk7cmV0dXJuIGU9PT10aGlzLl8/dGhpczplfTt2YXIgTXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2Uub24oJ21vdXNlZG93bi5kcmFnJyx0KS5maWx0ZXIoYikub24oJ3RvdWNoc3RhcnQuZHJhZycsaSkub24oJ3RvdWNobW92ZS5kcmFnJyxkKS5vbigndG91Y2hlbmQuZHJhZyB0b3VjaGNhbmNlbC5kcmFnJyxyKS5zdHlsZSgndG91Y2gtYWN0aW9uJywnbm9uZScpLnN0eWxlKCctd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3InLCdyZ2JhKDAsMCwwLDApJyl9ZnVuY3Rpb24gdCgpe2lmKCF1JiZwLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIGU9bygnbW91c2UnLGcuYXBwbHkodGhpcyxhcmd1bWVudHMpLGZyLHRoaXMsYXJndW1lbnRzKTtlJiYod3IoY3Iudmlldykub24oJ21vdXNlbW92ZS5kcmFnJyxuLCEwKS5vbignbW91c2V1cC5kcmFnJyxhLCEwKSxUcihjci52aWV3KSx4bigpLGM9ITEsbD1jci5jbGllbnRYLHM9Y3IuY2xpZW50WSxlKCdzdGFydCcpKX19ZnVuY3Rpb24gbigpe2lmKF9yKCksIWMpe3ZhciBlPWNyLmNsaWVudFgtbCx0PWNyLmNsaWVudFktcztjPWUqZSt0KnQ+eH1oLm1vdXNlKCdkcmFnJyl9ZnVuY3Rpb24gYSgpe3dyKGNyLnZpZXcpLm9uKCdtb3VzZW1vdmUuZHJhZyBtb3VzZXVwLmRyYWcnLG51bGwpLGtuKGNyLnZpZXcsYyksX3IoKSxoLm1vdXNlKCdlbmQnKX1mdW5jdGlvbiBpKCl7aWYocC5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBlLHQsYT1jci5jaGFuZ2VkVG91Y2hlcyxpPWcuYXBwbHkodGhpcyxhcmd1bWVudHMpLGQ9YS5sZW5ndGg7Zm9yKGU9MDtlPGQ7KytlKSh0PW8oYVtlXS5pZGVudGlmaWVyLGksQ3IsdGhpcyxhcmd1bWVudHMpKSYmKHhuKCksdCgnc3RhcnQnKSl9fWZ1bmN0aW9uIGQoKXt2YXIgZSx0LGE9Y3IuY2hhbmdlZFRvdWNoZXMsaT1hLmxlbmd0aDtmb3IoZT0wO2U8aTsrK2UpKHQ9aFthW2VdLmlkZW50aWZpZXJdKSYmKF9yKCksdCgnZHJhZycpKX1mdW5jdGlvbiByKCl7dmFyIGUsdCxhPWNyLmNoYW5nZWRUb3VjaGVzLGk9YS5sZW5ndGg7Zm9yKHUmJmNsZWFyVGltZW91dCh1KSx1PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt1PW51bGx9LDUwMCksZT0wO2U8aTsrK2UpKHQ9aFthW2VdLmlkZW50aWZpZXJdKSYmKHhuKCksdCgnZW5kJykpfWZ1bmN0aW9uIG8odCxhLGksZCxyKXt2YXIgbyxsLHMsYz1pKGEsdCksdT1tLmNvcHkoKTtyZXR1cm4gTHQobmV3IHZuKGUsJ2JlZm9yZXN0YXJ0JyxvLHQseSxjWzBdLGNbMV0sMCwwLHUpLGZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPShjci5zdWJqZWN0PW89Zi5hcHBseShkLHIpKSYmKGw9by54LWNbMF18fDAscz1vLnktY1sxXXx8MCwhMCl9KT9mdW5jdGlvbiBwKGcpe3ZhciBmLG49Yztzd2l0Y2goZyl7Y2FzZSdzdGFydCc6aFt0XT1wLGY9eSsrO2JyZWFrO2Nhc2UnZW5kJzpkZWxldGUgaFt0XSwtLXk7Y2FzZSdkcmFnJzpjPWkoYSx0KSxmPXk7fUx0KG5ldyB2bihlLGcsbyx0LGYsY1swXStsLGNbMV0rcyxjWzBdLW5bMF0sY1sxXS1uWzFdLHUpLHUuYXBwbHksdSxbZyxkLHJdKX06dm9pZCAwfXZhciBsLHMsYyx1LHA9d24sZz1DbixmPV9uLGI9VG4saD17fSxtPXl0KCdzdGFydCcsJ2RyYWcnLCdlbmQnKSx5PTAseD0wO3JldHVybiBlLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0nZnVuY3Rpb24nPT10eXBlb2YgdD90OlNyKCEhdCksZSk6cH0sZS5jb250YWluZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9J2Z1bmN0aW9uJz09dHlwZW9mIHQ/dDpTcih0KSxlKTpnfSxlLnN1YmplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9J2Z1bmN0aW9uJz09dHlwZW9mIHQ/dDpTcih0KSxlKTpmfSxlLnRvdWNoYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj0nZnVuY3Rpb24nPT10eXBlb2YgdD90OlNyKCEhdCksZSk6Yn0sZS5vbj1mdW5jdGlvbigpe3ZhciB0PW0ub24uYXBwbHkobSxhcmd1bWVudHMpO3JldHVybiB0PT09bT9lOnR9LGUuY2xpY2tEaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD0odD0rdCkqdCxlKTpNbih4KX0sZX07Y29uc3QgRXI9ZWEoJ2Qtc2xpZGVyJyxgCjxzdHlsZT4KICA6aG9zdCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgfQoKICA6aG9zdCg6Zm9jdXMpIHsKICAgIG91dGxpbmU6IG5vbmU7CiAgfQoKICAuYmFja2dyb3VuZCB7CiAgICBwYWRkaW5nOiA5cHggMDsKICAgIGNvbG9yOiB3aGl0ZTsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB9CgogIC50cmFjayB7CiAgICBoZWlnaHQ6IDNweDsKICAgIHdpZHRoOiAxMDAlOwogICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgYmFja2dyb3VuZC1jb2xvcjogaHNsYSgwLCAwJSwgMCUsIDAuMik7CiAgfQoKICAudHJhY2stZmlsbCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDlweDsKICAgIGhlaWdodDogM3B4OwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDI0LCAxMDAlLCA1MCUpOwogIH0KCiAgLmtub2ItY29udGFpbmVyIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMTBweDsKICB9CgogIC5rbm9iIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTZweDsKICAgIGxlZnQ6IC02cHg7CiAgICB3aWR0aDogMTNweDsKICAgIGhlaWdodDogMTNweDsKICAgIGJhY2tncm91bmQtY29sb3I6IGhzbCgyNCwgMTAwJSwgNTAlKTsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybTsKICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMThzOwogICAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2U7CiAgfQogIC5tb3VzZWRvd24gLmtub2IgewogICAgdHJhbnNmb3JtOiBzY2FsZSgxLjUpOwogIH0KCiAgLmtub2ItaGlnaGxpZ2h0IHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogLTZweDsKICAgIGxlZnQ6IC02cHg7CiAgICB3aWR0aDogMTNweDsKICAgIGhlaWdodDogMTNweDsKICAgIGJhY2tncm91bmQtY29sb3I6IGhzbGEoMCwgMCUsIDAlLCAwLjEpOwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtOwogICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4xOHM7CiAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZTsKICB9CgogIC5mb2N1cyAua25vYi1oaWdobGlnaHQgewogICAgdHJhbnNmb3JtOiBzY2FsZSgyKTsKICB9CgogIC50aWNrcyB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDE2cHg7CiAgICBoZWlnaHQ6IDRweDsKICAgIHdpZHRoOiAxMDAlOwogICAgei1pbmRleDogLTE7CiAgfQoKICAudGlja3MgLnRpY2sgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBoc2xhKDAsIDAlLCAwJSwgMC4yKTsKICB9Cgo8L3N0eWxlPgoKICA8ZGl2IGNsYXNzPSdiYWNrZ3JvdW5kJz4KICAgIDxkaXYgY2xhc3M9J3RyYWNrJz48L2Rpdj4KICAgIDxkaXYgY2xhc3M9J3RyYWNrLWZpbGwnPjwvZGl2PgogICAgPGRpdiBjbGFzcz0na25vYi1jb250YWluZXInPgogICAgICA8ZGl2IGNsYXNzPSdrbm9iLWhpZ2hsaWdodCc+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9J2tub2InPjwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSd0aWNrcyc+PC9kaXY+CiAgPC9kaXY+CmApLERyPXtsZWZ0OjM3LHVwOjM4LHJpZ2h0OjM5LGRvd246NDAscGFnZVVwOjMzLHBhZ2VEb3duOjM0LGVuZDozNSxob21lOjM2fTtjbGFzcyBMciBleHRlbmRzIEVyKEhUTUxFbGVtZW50KXtjb25uZWN0ZWRDYWxsYmFjaygpe3RoaXMuY29ubmVjdGVkPSEwLHRoaXMuc2V0QXR0cmlidXRlKCdyb2xlJywnc2xpZGVyJyksdGhpcy5oYXNBdHRyaWJ1dGUoJ3RhYmluZGV4Jyl8fHRoaXMuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsMCksdGhpcy5tb3VzZUV2ZW50PSExLHRoaXMua25vYj10aGlzLnJvb3QucXVlcnlTZWxlY3RvcignLmtub2ItY29udGFpbmVyJyksdGhpcy5iYWNrZ3JvdW5kPXRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCcuYmFja2dyb3VuZCcpLHRoaXMudHJhY2tGaWxsPXRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCcudHJhY2stZmlsbCcpLHRoaXMudHJhY2s9dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJy50cmFjaycpLHRoaXMubWluPXRoaXMubWluP3RoaXMubWluOjAsdGhpcy5tYXg9dGhpcy5tYXg/dGhpcy5tYXg6MTAwLHRoaXMuc2NhbGU9aGUoKS5kb21haW4oW3RoaXMubWluLHRoaXMubWF4XSkucmFuZ2UoWzAsMV0pLmNsYW1wKCEwKSx0aGlzLm9yaWdpbj10aGlzLm9yaWdpbj09PXZvaWQgMD90aGlzLm1pbjp0aGlzLm9yaWdpbix0aGlzLnN0ZXA9dGhpcy5zdGVwP3RoaXMuc3RlcDoxLHRoaXMudXBkYXRlKHRoaXMudmFsdWU/dGhpcy52YWx1ZTowKSx0aGlzLnRpY2tzPSEhdGhpcy50aWNrcyYmdGhpcy50aWNrcyx0aGlzLnJlbmRlclRpY2tzKCksdGhpcy5kcmFnPU1yKCkuY29udGFpbmVyKHRoaXMuYmFja2dyb3VuZCkub24oJ3N0YXJ0JywoKT0+e3RoaXMubW91c2VFdmVudD0hMCx0aGlzLmJhY2tncm91bmQuY2xhc3NMaXN0LmFkZCgnbW91c2Vkb3duJyksdGhpcy5jaGFuZ2VWYWx1ZT10aGlzLnZhbHVlLHRoaXMuZHJhZ1VwZGF0ZSgpfSkub24oJ2RyYWcnLCgpPT57dGhpcy5kcmFnVXBkYXRlKCl9KS5vbignZW5kJywoKT0+e3RoaXMubW91c2VFdmVudD0hMSx0aGlzLmJhY2tncm91bmQuY2xhc3NMaXN0LnJlbW92ZSgnbW91c2Vkb3duJyksdGhpcy5kcmFnVXBkYXRlKCksdGhpcy5jaGFuZ2VWYWx1ZSE9PXRoaXMudmFsdWUmJnRoaXMuZGlzcGF0Y2hDaGFuZ2UoKSx0aGlzLmNoYW5nZVZhbHVlPXRoaXMudmFsdWV9KSx0aGlzLmRyYWcod3IodGhpcy5iYWNrZ3JvdW5kKSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywoKT0+e3RoaXMubW91c2VFdmVudHx8dGhpcy5iYWNrZ3JvdW5kLmNsYXNzTGlzdC5hZGQoJ2ZvY3VzJyl9KSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywoKT0+e3RoaXMuYmFja2dyb3VuZC5jbGFzc0xpc3QucmVtb3ZlKCdmb2N1cycpfSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyx0aGlzLm9uS2V5RG93bil9c3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKXtyZXR1cm5bJ21pbicsJ21heCcsJ3ZhbHVlJywnc3RlcCcsJ3RpY2tzJywnb3JpZ2luJywndGlja1ZhbHVlcycsJ3RpY2tMYWJlbHMnXX1hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soZSx0LG4pe2lzTmFOKG4pfHx2b2lkIDA9PT1ufHxudWxsPT09bnx8KCdtaW4nPT1lJiYodGhpcy5taW49K24sdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVtaW4nLHRoaXMubWluKSksJ21heCc9PWUmJih0aGlzLm1heD0rbix0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW1heCcsdGhpcy5tYXgpKSwndmFsdWUnPT1lJiZ0aGlzLnVwZGF0ZSgrbiksJ29yaWdpbic9PWUmJih0aGlzLm9yaWdpbj0rbiksJ3N0ZXAnPT1lJiYwPG4mJih0aGlzLnN0ZXA9K24pLCd0aWNrcyc9PWUmJih0aGlzLnRpY2tzPSEoJychPT1uKXx8bikpfW9uS2V5RG93bihlKXt0aGlzLmNoYW5nZVZhbHVlPXRoaXMudmFsdWU7bGV0IHQ9ITE7c3dpdGNoKGUua2V5Q29kZSl7Y2FzZSBEci5sZWZ0OmNhc2UgRHIuZG93bjp0aGlzLnVwZGF0ZSh0aGlzLnZhbHVlLXRoaXMuc3RlcCksdD0hMDticmVhaztjYXNlIERyLnJpZ2h0OmNhc2UgRHIudXA6dGhpcy51cGRhdGUodGhpcy52YWx1ZSt0aGlzLnN0ZXApLHQ9ITA7YnJlYWs7Y2FzZSBEci5wYWdlVXA6dGhpcy51cGRhdGUodGhpcy52YWx1ZSsxMCp0aGlzLnN0ZXApLHQ9ITA7YnJlYWs7Y2FzZSBEci5wYWdlRG93bjp0aGlzLnVwZGF0ZSh0aGlzLnZhbHVlKzEwKnRoaXMuc3RlcCksdD0hMDticmVhaztjYXNlIERyLmhvbWU6dGhpcy51cGRhdGUodGhpcy5taW4pLHQ9ITA7YnJlYWs7Y2FzZSBEci5lbmQ6dGhpcy51cGRhdGUodGhpcy5tYXgpLHQ9ITA7YnJlYWs7ZGVmYXVsdDp9dCYmKHRoaXMuYmFja2dyb3VuZC5jbGFzc0xpc3QuYWRkKCdmb2N1cycpLGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuY2hhbmdlVmFsdWUhPT10aGlzLnZhbHVlJiZ0aGlzLmRpc3BhdGNoQ2hhbmdlKCkpfXZhbGlkYXRlVmFsdWVSYW5nZShlLHQsbil7cmV0dXJuIE5uKEluKHQsbiksZSl9cXVhbnRpemVWYWx1ZShlLHQpe3JldHVybiBBbihlL3QpKnR9ZHJhZ1VwZGF0ZSgpe2NvbnN0IGU9dGhpcy5iYWNrZ3JvdW5kLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHQ9Y3IueCxuPWUud2lkdGg7dGhpcy51cGRhdGUodGhpcy5zY2FsZS5pbnZlcnQodC9uKSl9dXBkYXRlKGUpe2xldCB0PWU7J2FueSchPT10aGlzLnN0ZXAmJih0PXRoaXMucXVhbnRpemVWYWx1ZShlLHRoaXMuc3RlcCkpLHQ9dGhpcy52YWxpZGF0ZVZhbHVlUmFuZ2UodGhpcy5taW4sdGhpcy5tYXgsdCksdGhpcy5jb25uZWN0ZWQmJih0aGlzLmtub2Iuc3R5bGUubGVmdD0xMDAqdGhpcy5zY2FsZSh0KSsnJScsdGhpcy50cmFja0ZpbGwuc3R5bGUud2lkdGg9MTAwKnRoaXMuc2NhbGUodGhpcy5taW4ram4odC10aGlzLm9yaWdpbikpKyclJyx0aGlzLnRyYWNrRmlsbC5zdHlsZS5sZWZ0PTEwMCp0aGlzLnNjYWxlKEluKHQsdGhpcy5vcmlnaW4pKSsnJScpLHRoaXMudmFsdWUhPT10JiYodGhpcy52YWx1ZT10LHRoaXMuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbm93Jyx0aGlzLnZhbHVlKSx0aGlzLmRpc3BhdGNoSW5wdXQoKSl9ZGlzcGF0Y2hDaGFuZ2UoKXtjb25zdCB0PW5ldyBFdmVudCgnY2hhbmdlJyk7dGhpcy5kaXNwYXRjaEV2ZW50KHQse30pfWRpc3BhdGNoSW5wdXQoKXtjb25zdCB0PW5ldyBFdmVudCgnaW5wdXQnKTt0aGlzLmRpc3BhdGNoRXZlbnQodCx7fSl9cmVuZGVyVGlja3MoKXtjb25zdCBlPXRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCcudGlja3MnKTtpZighMSE9PXRoaXMudGlja3Mpe2xldCB0PVtdO3Q9MDx0aGlzLnRpY2tzP3RoaXMuc2NhbGUudGlja3ModGhpcy50aWNrcyk6J2FueSc9PT10aGlzLnN0ZXA/dGhpcy5zY2FsZS50aWNrcygpOlFhKHRoaXMubWluLHRoaXMubWF4KzFlLTYsdGhpcy5zdGVwKSx0LmZvckVhY2goKHQpPT57Y29uc3Qgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtuLmNsYXNzTGlzdC5hZGQoJ3RpY2snKSxuLnN0eWxlLmxlZnQ9MTAwKnRoaXMuc2NhbGUodCkrJyUnLGUuYXBwZW5kQ2hpbGQobil9KX1lbHNlIGUuc3R5bGUuZGlzcGxheT0nbm9uZSd9fXZhciBVcj0nPHN2ZyB2aWV3Qm94PSItNjA3IDQxOSA2NCA2NCI+XG4gIDxwYXRoIGQ9Ik0tNTczLjQsNDc4LjljLTgsMC0xNC42LTYuNC0xNC42LTE0LjVzMTQuNi0yNS45LDE0LjYtNDAuOGMwLDE0LjksMTQuNiwzMi44LDE0LjYsNDAuOFMtNTY1LjQsNDc4LjktNTczLjQsNDc4Ljl6Ii8+XG48L3N2Zz5cbic7Y29uc3QgQXI9ZWEoJ2Rpc3RpbGwtaGVhZGVyJyxgCjxzdHlsZT4KZGlzdGlsbC1oZWFkZXIgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBoZWlnaHQ6IDYwcHg7CiAgYmFja2dyb3VuZC1jb2xvcjogaHNsKDIwMCwgNjAlLCAxNSUpOwogIHdpZHRoOiAxMDAlOwogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgei1pbmRleDogMjsKICBjb2xvcjogcmdiYSgwLCAwLCAwLCAwLjgpOwogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMDgpOwogIGJveC1zaGFkb3c6IDAgMXB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMDUpOwp9CmRpc3RpbGwtaGVhZGVyIC5jb250ZW50IHsKICBoZWlnaHQ6IDcwcHg7CiAgZ3JpZC1jb2x1bW46IHBhZ2U7Cn0KZGlzdGlsbC1oZWFkZXIgYSB7CiAgZm9udC1zaXplOiAxNnB4OwogIGhlaWdodDogNjBweDsKICBsaW5lLWhlaWdodDogNjBweDsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTsKICBwYWRkaW5nOiAyMnB4IDA7Cn0KZGlzdGlsbC1oZWFkZXIgYTpob3ZlciB7CiAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMSk7Cn0KZGlzdGlsbC1oZWFkZXIgc3ZnIHsKICB3aWR0aDogMjRweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdG9wOiA0cHg7CiAgbWFyZ2luLXJpZ2h0OiAycHg7Cn0KQG1lZGlhKG1pbi13aWR0aDogMTA4MHB4KSB7CiAgZGlzdGlsbC1oZWFkZXIgewogICAgaGVpZ2h0OiA3MHB4OwogIH0KICBkaXN0aWxsLWhlYWRlciBhIHsKICAgIGhlaWdodDogNzBweDsKICAgIGxpbmUtaGVpZ2h0OiA3MHB4OwogICAgcGFkZGluZzogMjhweCAwOwogIH0KICBkaXN0aWxsLWhlYWRlciAubG9nbyB7CiAgfQp9CmRpc3RpbGwtaGVhZGVyIHN2ZyBwYXRoIHsKICBmaWxsOiBub25lOwogIHN0cm9rZTogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpOwogIHN0cm9rZS13aWR0aDogM3B4Owp9CmRpc3RpbGwtaGVhZGVyIC5sb2dvIHsKICBmb250LXNpemU6IDE3cHg7CiAgZm9udC13ZWlnaHQ6IDIwMDsKfQpkaXN0aWxsLWhlYWRlciAubmF2IHsKICBmbG9hdDogcmlnaHQ7CiAgZm9udC13ZWlnaHQ6IDMwMDsKfQpkaXN0aWxsLWhlYWRlciAubmF2IGEgewogIGZvbnQtc2l6ZTogMTJweDsKICBtYXJnaW4tbGVmdDogMjRweDsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9Cjwvc3R5bGU+CjxkaXYgY2xhc3M9ImNvbnRlbnQiPgogIDxhIGhyZWY9Ii8iIGNsYXNzPSJsb2dvIj4KICAgICR7VXJ9CiAgICBEaXN0aWxsCiAgPC9hPgogIDxuYXYgY2xhc3M9Im5hdiI+CiAgICA8YSBocmVmPSIvYWJvdXQvIj5BYm91dDwvYT4KICAgIDxhIGhyZWY9Ii9wcml6ZS8iPlByaXplPC9hPgogICAgPGEgaHJlZj0iL2pvdXJuYWwvIj5TdWJtaXQ8L2E+CiAgPC9uYXY+CjwvZGl2PgpgLCExKTtjbGFzcyBqciBleHRlbmRzIEFyKEhUTUxFbGVtZW50KXt9Y29uc3QgT3I9YAo8c3R5bGU+CiAgZGlzdGlsbC1hcHBlbmRpeCB7CiAgICBjb250YWluOiBsYXlvdXQgc3R5bGU7CiAgfQoKICBkaXN0aWxsLWFwcGVuZGl4IC5jaXRhdGlvbiB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBsaW5lLWhlaWdodDogMTVweDsKICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEpOwogICAgcGFkZGluZy1sZWZ0OiAxOHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLDAsMCwwLjEpOwogICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjAyKTsKICAgIHBhZGRpbmc6IDEwcHggMThweDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIGNvbG9yOiByZ2JhKDE1MCwgMTUwLCAxNTAsIDEpOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIG1hcmdpbi10b3A6IC0xMnB4OwogICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgd29yZC13cmFwOiBicmVhay13b3JkOwogIH0KCiAgZGlzdGlsbC1hcHBlbmRpeCA+ICogewogICAgZ3JpZC1jb2x1bW46IHRleHQ7CiAgfQo8L3N0eWxlPgpgO2NsYXNzIHFyIGV4dGVuZHMgSFRNTEVsZW1lbnR7c3RhdGljIGdldCBpcygpe3JldHVybidkaXN0aWxsLWFwcGVuZGl4J31zZXQgZnJvbnRNYXR0ZXIoZSl7dGhpcy5pbm5lckhUTUw9U24oZSl9fWNvbnN0IFJyPWVhKCdkaXN0aWxsLWZvb3RlcicsYAo8c3R5bGU+Cgo6aG9zdCB7CiAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KTsKICBmb250LXdlaWdodDogMzAwOwogIHBhZGRpbmc6IDJyZW0gMDsKICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEpOwogIGJhY2tncm91bmQtY29sb3I6IGhzbCgxODAsIDUlLCAxNSUpOyAvKmhzbCgyMDAsIDYwJSwgMTUlKTsqLwogIHRleHQtYWxpZ246IGxlZnQ7CiAgY29udGFpbjogY29udGVudDsKfQoKLmxvZ28gc3ZnIHsKICB3aWR0aDogMjRweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdG9wOiA0cHg7CiAgbWFyZ2luLXJpZ2h0OiAycHg7Cn0KCi5sb2dvIHN2ZyBwYXRoIHsKICBmaWxsOiBub25lOwogIHN0cm9rZTogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjgpOwogIHN0cm9rZS13aWR0aDogM3B4Owp9CgoubG9nbyB7CiAgZm9udC1zaXplOiAxN3B4OwogIGZvbnQtd2VpZ2h0OiAyMDA7CiAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTsKICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgbWFyZ2luLXJpZ2h0OiA2cHg7Cn0KCi5jb250YWluZXIgewogIGdyaWQtY29sdW1uOiB0ZXh0Owp9CgoubmF2IHsKICBmb250LXNpemU6IDAuOWVtOwogIG1hcmdpbi10b3A6IDEuNWVtOwp9CgoubmF2IGEgewogIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7CiAgbWFyZ2luLXJpZ2h0OiA2cHg7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9Cgo8L3N0eWxlPgoKPGRpdiBjbGFzcz0nY29udGFpbmVyJz4KCiAgPGEgaHJlZj0iLyIgY2xhc3M9ImxvZ28iPgogICAgJHtVcn0KICAgIERpc3RpbGwKICA8L2E+IGlzIGRlZGljYXRlZCB0byBjbGVhciBleHBsYW5hdGlvbnMgb2YgbWFjaGluZSBsZWFybmluZwoKICA8ZGl2IGNsYXNzPSJuYXYiPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9kaXN0aWxsLnB1Yi9hYm91dC8iPkFib3V0PC9hPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9kaXN0aWxsLnB1Yi9qb3VybmFsLyI+U3VibWl0PC9hPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9kaXN0aWxsLnB1Yi9wcml6ZS8iPlByaXplPC9hPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9kaXN0aWxsLnB1Yi9hcmNoaXZlLyI+QXJjaGl2ZTwvYT4KICAgIDxhIGhyZWY9Imh0dHBzOi8vZGlzdGlsbC5wdWIvcnNzLnhtbCI+UlNTPC9hPgogICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Rpc3RpbGxwdWIiPkdpdEh1YjwvYT4KICAgIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vZGlzdGlsbHB1YiI+VHdpdHRlcjwvYT4KICAgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBJU1NOIDI0NzYtMDc1NwogIDwvZGl2PgoKPC9kaXY+CgpgKTtjbGFzcyBOciBleHRlbmRzIFJyKEhUTUxFbGVtZW50KXt9Y29uc3QgUHI9ZnVuY3Rpb24oKXtpZigxPndpbmRvdy5kaXN0aWxsUnVubGV2ZWwpdGhyb3cgbmV3IEVycm9yKCdJbnN1ZmZpY2llbnQgUnVubGV2ZWwgZm9yIERpc3RpbGwgVGVtcGxhdGUhJyk7aWYoJ2Rpc3RpbGxUZW1wbGF0ZUlzTG9hZGluZydpbiB3aW5kb3cmJndpbmRvdy5kaXN0aWxsVGVtcGxhdGVJc0xvYWRpbmcpdGhyb3cgbmV3IEVycm9yKCdSdW5sZXZlbCAxOiBEaXN0aWxsIFRlbXBsYXRlIGlzIGdldHRpbmcgbG9hZGVkIG1vcmUgdGhhbiBvbmNlLCBhYm9ydGluZyEnKTtlbHNlIHdpbmRvdy5kaXN0aWxsVGVtcGxhdGVJc0xvYWRpbmc9ITAsY29uc29sZS5pbmZvKCdSdW5sZXZlbCAxOiBEaXN0aWxsIFRlbXBsYXRlIGhhcyBzdGFydGVkIGxvYWRpbmcuJyk7dShkb2N1bWVudCksY29uc29sZS5pbmZvKCdSdW5sZXZlbCAxOiBTdGF0aWMgRGlzdGlsbCBzdHlsZXMgaGF2ZSBiZWVuIGFkZGVkLicpLGNvbnNvbGUuaW5mbygnUnVubGV2ZWwgMS0+Mi4nKSx3aW5kb3cuZGlzdGlsbFJ1bmxldmVsKz0xO2Zvcihjb25zdFtlLHRdb2YgT2JqZWN0LmVudHJpZXMoZmEubGlzdGVuZXJzKSknZnVuY3Rpb24nPT10eXBlb2YgdD9kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGUsdCk6Y29uc29sZS5lcnJvcignUnVubGV2ZWwgMjogQ29udHJvbGxlciBsaXN0ZW5lcnMgbmVlZCB0byBiZSBmdW5jdGlvbnMhJyk7Y29uc29sZS5pbmZvKCdSdW5sZXZlbCAyOiBXZSBjYW4gbm93IGxpc3RlbiB0byBjb250cm9sbGVyIGV2ZW50cy4nKSxjb25zb2xlLmluZm8oJ1J1bmxldmVsIDItPjMuJyksd2luZG93LmRpc3RpbGxSdW5sZXZlbCs9MTtpZigyPndpbmRvdy5kaXN0aWxsUnVubGV2ZWwpdGhyb3cgbmV3IEVycm9yKCdJbnN1ZmZpY2llbnQgUnVubGV2ZWwgZm9yIGFkZGluZyBjdXN0b20gZWxlbWVudHMhJyk7Y29uc3QgZT1beGEsdmEsQ2EsU2EsTWEsRGEsVWEsT2EsUmEsUGEsdWEsSWEsemEsVCxZYSxCYSxXYSxMciwkYV0uY29uY2F0KFtqcixxcixOcl0pO2Zvcihjb25zdCB0IG9mIGUpY29uc29sZS5pbmZvKCdSdW5sZXZlbCAyOiBSZWdpc3RlcmluZyBjdXN0b20gZWxlbWVudDogJyt0LmlzKSxjdXN0b21FbGVtZW50cy5kZWZpbmUodC5pcyx0KTtjb25zb2xlLmluZm8oJ1J1bmxldmVsIDM6IERpc3RpbGwgVGVtcGxhdGUgZmluaXNoZWQgcmVnaXN0ZXJpbmcgY3VzdG9tIGVsZW1lbnRzLicpLGNvbnNvbGUuaW5mbygnUnVubGV2ZWwgMy0+NC4nKSx3aW5kb3cuZGlzdGlsbFJ1bmxldmVsKz0xLGZhLmxpc3RlbmVycy5ET01Db250ZW50TG9hZGVkKCksY29uc29sZS5pbmZvKCdSdW5sZXZlbCA0OiBEaXN0aWxsIFRlbXBsYXRlIGluaXRpYWxpc2F0aW9uIGNvbXBsZXRlLicpfTt3aW5kb3cuZGlzdGlsbFJ1bmxldmVsPTAsbWEuYnJvd3NlclN1cHBvcnRzQWxsRmVhdHVyZXMoKT8oY29uc29sZS5pbmZvKCdSdW5sZXZlbCAwOiBObyBuZWVkIGZvciBwb2x5ZmlsbHMuJyksY29uc29sZS5pbmZvKCdSdW5sZXZlbCAwLT4xLicpLHdpbmRvdy5kaXN0aWxsUnVubGV2ZWwrPTEsUHIoKSk6KGNvbnNvbGUuaW5mbygnUnVubGV2ZWwgMDogRGlzdGlsbCBUZW1wbGF0ZSBpcyBsb2FkaW5nIHBvbHlmaWxscy4nKSxtYS5sb2FkKFByKSl9KTsKCn0K"></script>
<!--radix_placeholder_site_in_header-->
<!--/radix_placeholder_site_in_header-->
</head>
<body>
<!--radix_placeholder_front_matter-->
<script id="distill-front-matter" type="text/json">
{"title":"Apêndice 2","description":"Modelos populacionais matriciais aplicados à ecologia:\nUma introdução à teoria e a prática - Em preparação","authors":[{"author":"Gabriel S. Santos","authorURL":"https://gabeco.wixsite.com/home","affiliation":"Universidade do Estado do Rio de Janeiro","affiliationURL":"#"}],"publishedDate":"2021-05-24T00:00:00.000-03:00","citationText":"Santos, 2021"}
</script>
<!--/radix_placeholder_front_matter-->
<!--radix_placeholder_navigation_before_body-->
<!--/radix_placeholder_navigation_before_body-->
<!--radix_placeholder_site_before_body-->
<!--/radix_placeholder_site_before_body-->
<div class="d-title">
<h1>Apêndice 2</h1>
<p><p>Modelos populacionais matriciais aplicados à ecologia: Uma introdução à teoria e a prática - Em preparação</p></p>
</div>
<div class="d-byline">
Gabriel S. Santos <a href="https://gabeco.wixsite.com/home" class="uri">https://gabeco.wixsite.com/home</a> (Universidade do Estado do Rio de Janeiro)
<br />2021-05-24
</div>
<div class="d-article">
<p>O que você está vendo aqui é a versão preliminar do artigo “Modelos populacionais matriciais aplicados à ecologia: Uma introdução à teoria e a prática”. Clique em <a href="https://github.com/Ecosantos/MPM_Gentil">Artigo</a> ou <a href="https://github.com/Ecosantos/MPM_Gentil/blob/main/Ap%C3%AAndice%201.pdf">Apêndice 1</a> para acessar cada um dos respectivos documentos ou vá no meu repositório do Github <a href="https://github.com/Ecosantos/MPM_Gentil">aqui</a></p>
<h3 id="configurações-iniciais">Configurações iniciais</h3>
<p>Vamos começar limpando todos os dados que porventura estejam no R. Se algo muito ruim estiver acontencendo no seu R você pode sempre voltar nessa função para limpar seja lá qual erro você tiver cometido. O problema aqui é que esse comando vai limpar tudo que você fez até o momento. Seja prudente!</p>
<div class="layout-chunk" data-layout="l-body">
<pre class="r"><code>
rm(list=ls())</code></pre>
</div>
<h4 id="instalar-os-pacotes-necessáros">Instalar os pacotes necessáros</h4>
<div class="layout-chunk" data-layout="l-body">
<pre class="r"><code>
install.packages("diagram")
install.packages("popbio")
install.packages("cowplot")
install.packages("tidyverse")
install.packages("ggrepel")
install.packages("popdemo")</code></pre>
</div>
<div class="layout-chunk" data-layout="l-body">
<pre class="r"><code>
library(diagram)
library(popbio)
library(cowplot)
library(tidyverse)
library(ggrepel)
library(popdemo)</code></pre>
</div>
<div class="layout-chunk" data-layout="l-body">
</div>
<h4 id="instalando-os-bancos-de-dados-comadre-e-compadre">Instalando os bancos de dados COMADRE e COMPADRE</h4>