-
Notifications
You must be signed in to change notification settings - Fork 0
/
apresentação.html
5082 lines (5044 loc) · 516 KB
/
apresentação.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
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta name="generator" content="pandoc" />
<meta name="author" content="Guilherme Hathy" />
<title>Integrando e aproveitando o melhor de Python e R</title>
<style type="text/css">
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
span.underline{text-decoration: underline;}
div.column{display: inline-block; vertical-align: top; width: 50%;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
ul.task-list{list-style: none;}
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; }
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; }
code span.at { color: #7d9029; }
code span.bn { color: #40a070; }
code span.bu { color: #008000; }
code span.cf { color: #007020; font-weight: bold; }
code span.ch { color: #4070a0; }
code span.cn { color: #880000; }
code span.co { color: #60a0b0; font-style: italic; }
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; }
code span.do { color: #ba2121; font-style: italic; }
code span.dt { color: #902000; }
code span.dv { color: #40a070; }
code span.er { color: #ff0000; font-weight: bold; }
code span.ex { }
code span.fl { color: #40a070; }
code span.fu { color: #06287e; }
code span.im { color: #008000; font-weight: bold; }
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; }
code span.kw { color: #007020; font-weight: bold; }
code span.op { color: #666666; }
code span.ot { color: #007020; }
code span.pp { color: #bc7a00; }
code span.sc { color: #4070a0; }
code span.ss { color: #bb6688; }
code span.st { color: #4070a0; }
code span.va { color: #19177c; }
code span.vs { color: #4070a0; }
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; }
</style>
<style type="text/css">
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; }
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; }
code span.at { color: #7d9029; }
code span.bn { color: #40a070; }
code span.bu { color: #008000; }
code span.cf { color: #007020; font-weight: bold; }
code span.ch { color: #4070a0; }
code span.cn { color: #880000; }
code span.co { color: #60a0b0; font-style: italic; }
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; }
code span.do { color: #ba2121; font-style: italic; }
code span.dt { color: #902000; }
code span.dv { color: #40a070; }
code span.er { color: #ff0000; font-weight: bold; }
code span.ex { }
code span.fl { color: #40a070; }
code span.fu { color: #06287e; }
code span.im { color: #008000; font-weight: bold; }
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; }
code span.kw { color: #007020; font-weight: bold; }
code span.op { color: #666666; }
code span.ot { color: #007020; }
code span.pp { color: #bc7a00; }
code span.sc { color: #4070a0; }
code span.ss { color: #bb6688; }
code span.st { color: #4070a0; }
code span.va { color: #19177c; }
code span.vs { color: #4070a0; }
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; }
</style>
<script>// Pandoc 2.9 adds attributes on both header and div. We remove the former (to
// be compatible with the behavior of Pandoc < 2.8).
document.addEventListener('DOMContentLoaded', function(e) {
var hs = document.querySelectorAll("div.section[class*='level'] > :first-child");
var i, h, a;
for (i = 0; i < hs.length; i++) {
h = hs[i];
if (!/^h[1-6]$/i.test(h.tagName)) continue; // it should be a header h1-h6
a = h.attributes;
while (a.length > 0) h.removeAttribute(a[0].name);
}
});
</script>
<style type="text/css">
body
{
margin: 0 0 0 0;
padding: 0 0 0 0;
width: 100%;
height: 100%;
color: black;
background-color: white;
font-family: "Gill Sans MT", "Gill Sans", GillSans, sans-serif;
font-size: 14pt;
}
div.toolbar {
position: fixed; z-index: 200;
top: auto; bottom: 0; left: 0; right: 0;
height: 1.2em; text-align: right;
padding-left: 1em;
padding-right: 1em; font-size: 60%;
color: DimGray;
background-color: rgb(240,240,240);
border-top: solid 1px rgb(180,180,180);
}
div.toolbar span.copyright {
color: DimGray;
margin-left: 0.5em;
}
div.initial_prompt {
position: absolute;
z-index: 1000;
bottom: 1.2em;
width: 100%;
background-color: rgb(200,200,200);
opacity: 0.35;
background-color: rgb(200,200,200, 0.35);
cursor: pointer;
}
div.initial_prompt p.help {
text-align: center;
}
div.initial_prompt p.close {
text-align: right;
font-style: italic;
}
div.slidy_toc {
position: absolute;
z-index: 300;
width: 60%;
max-width: 30em;
height: 30em;
overflow: auto;
top: auto;
right: auto;
left: 4em;
bottom: 4em;
padding: 1em;
background: rgb(240,240,240);
border-style: solid;
border-width: 2px;
font-size: 60%;
}
div.slidy_toc .toc_heading {
text-align: center;
width: 100%;
margin: 0;
margin-bottom: 1em;
border-bottom-style: solid;
border-bottom-color: rgb(180,180,180);
border-bottom-width: 1px;
}
div.slide {
z-index: 20;
margin: 0 0 0 0;
padding-top: 0;
padding-bottom: 0;
padding-left: 20px;
padding-right: 20px;
border-width: 0;
clear: both;
top: 0;
bottom: 0;
left: 0;
right: 0;
line-height: 120%;
background-color: transparent;
}
div.background {
display: none;
}
div.handout {
margin-left: 20px;
margin-right: 20px;
}
div.slide.titlepage {
text-align: center;
}
div.slide.titlepage h1 {
padding-top: 10%;
margin-right: 0;
}
div.slide h1 {
padding-left: 0;
padding-right: 20pt;
padding-top: 4pt;
padding-bottom: 4pt;
margin-top: 0;
margin-left: 0;
margin-right: 60pt;
margin-bottom: 0.5em;
display: block; font-size: 160%;
line-height: 1.2em;
background: transparent;
}
@media screen and (max-device-width: 1024px)
{
div.slide { font-size: 100%; }
}
@media screen and (max-device-width: 800px)
{
div.slide { font-size: 200%; }
div.slidy_toc {
top: 1em;
left: 1em;
right: auto;
width: 80%;
font-size: 180%;
}
}
div.toc-heading {
width: 100%;
border-bottom: solid 1px rgb(180,180,180);
margin-bottom: 1em;
text-align: center;
}
img {
image-rendering: optimize-quality;
}
pre {
font-size: 80%;
font-weight: bold;
line-height: 120%;
padding-top: 0.2em;
padding-bottom: 0.2em;
padding-left: 1em;
padding-right: 1em;
border-style: solid;
border-left-width: 1em;
border-top-width: thin;
border-right-width: thin;
border-bottom-width: thin;
border-color: #95ABD0;
color: #00428C;
background-color: #E4E5E7;
}
li pre { margin-left: 0; }
blockquote { font-style: italic }
img { background-color: transparent }
p.copyright { font-size: smaller }
.center { text-align: center }
.footnote { font-size: smaller; margin-left: 2em; }
a img { border-width: 0; border-style: none }
a:visited { color: navy }
a:link { color: navy }
a:hover { color: red; text-decoration: underline }
a:active { color: red; text-decoration: underline }
a {text-decoration: none}
.toolbar a:link {color: blue}
.toolbar a:visited {color: blue}
.toolbar a:active {color: red}
.toolbar a:hover {color: red}
ul { list-style-type: square; }
ul ul { list-style-type: disc; }
ul ul ul { list-style-type: circle; }
ul ul ul ul { list-style-type: disc; }
li { margin-left: 0.5em; margin-top: 0.5em; }
li li { font-size: 85%; font-style: italic }
li li li { font-size: 85%; font-style: normal }
div dt
{
margin-left: 0;
margin-top: 1em;
margin-bottom: 0.5em;
font-weight: bold;
}
div dd
{
margin-left: 2em;
margin-bottom: 0.5em;
}
p,pre,ul,ol,blockquote,h2,h3,h4,h5,h6,dl,table {
margin-left: 1em;
margin-right: 1em;
}
p.subhead { font-weight: bold; margin-top: 2em; }
.smaller { font-size: smaller }
.bigger { font-size: 130% }
td,th { padding: 0.2em }
ul {
margin: 0.5em 1.5em 0.5em 1.5em;
padding: 0;
}
ol {
margin: 0.5em 1.5em 0.5em 1.5em;
padding: 0;
}
ul { list-style-type: square; }
ul ul { list-style-type: disc; }
ul ul ul { list-style-type: circle; }
ul ul ul ul { list-style-type: disc; }
ul li { list-style: square;
margin: 0.1em 0em 0.6em 0;
padding: 0 0 0 0;
line-height: 140%;
}
ol li { margin: 0.1em 0em 0.6em 1.5em;
padding: 0 0 0 0px;
line-height: 140%;
list-style-type: decimal;
}
li ul li { font-size: 85%; font-style: italic;
list-style-type: disc;
background: transparent;
padding: 0 0 0 0;
}
li li ul li { font-size: 85%; font-style: normal;
list-style-type: circle;
background: transparent;
padding: 0 0 0 0;
}
li li li ul li {
list-style-type: disc;
background: transparent;
padding: 0 0 0 0;
}
li ol li {
list-style-type: decimal;
}
li li ol li {
list-style-type: decimal;
}
ol.outline li:hover { cursor: pointer }
ol.outline li.nofold:hover { cursor: default }
ul.outline li:hover { cursor: pointer }
ul.outline li.nofold:hover { cursor: default }
ol.outline { list-style:decimal; }
ol.outline ol { list-style-type:lower-alpha }
ol.outline li.nofold {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAIACAMzMzOvr/ywAAAAACQAJAAACD4SPoRvG614Dctb4MEMcFAA7) no-repeat 0px 0.5em;
}
ol.outline li.unfolded {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAMPD/8zMzOvr/////ywAAAAACQAJAAACEYyPoivG614LAlg7ZZbxoR8UADs=) no-repeat 0px 0.5em;
}
ol.outline li.folded {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAMPD/8zMzOvr/////ywAAAAACQAJAAACFIyPoiu2sJyCyoF7W3hxz850CFIAADs=) no-repeat 0px 0.5em;
}
ol.outline li.unfolded:hover {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAAAAAAAA/8PD/////ywAAAAACQAJAAACEYSPoivG614DIlg7ZZbxoQ8UADs=) no-repeat 0px 0.5em;
}
ol.outline li.folded:hover {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAAAAAAAA/8PD/////ywAAAAACQAJAAACFISPoiu2sZyCyoV7G3hxz850CFIAADs=) no-repeat 0px 0.5em;
}
ul.outline li.nofold {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAIACAMzMzOvr/ywAAAAACQAJAAACD4SPoRvG614Dctb4MEMcFAA7) no-repeat 0px 0.5em;
}
ul.outline li.unfolded {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAMPD/8zMzOvr/////ywAAAAACQAJAAACEYyPoivG614LAlg7ZZbxoR8UADs=) no-repeat 0px 0.5em;
}
ul.outline li.folded {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAMPD/8zMzOvr/////ywAAAAACQAJAAACFIyPoiu2sJyCyoF7W3hxz850CFIAADs=) no-repeat 0px 0.5em;
}
ul.outline li.unfolded:hover {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAAAAAAAA/8PD/////ywAAAAACQAJAAACEYSPoivG614DIlg7ZZbxoQ8UADs=) no-repeat 0px 0.5em;
}
ul.outline li.folded:hover {
padding: 0 0 0 20px;
background: transparent url(data:image/gif;base64,R0lGODdhCQAJAKEDAAAAAAAA/8PD/////ywAAAAACQAJAAACFISPoiu2sZyCyoV7G3hxz850CFIAADs=) no-repeat 0px 0.5em;
}
a.titleslide { font-weight: bold; font-style: italic }
img.hidden { display: none; visibility: hidden }
div.initial_prompt { display: none; visibility: hidden }
div.slide {
visibility: visible;
position: inherit;
}
div.handout {
border-top-style: solid;
border-top-width: thin;
border-top-color: black;
}
@media screen {
.hidden { display: none; visibility: visible }
div.slide.hidden { display: block; visibility: visible }
div.handout.hidden { display: block; visibility: visible }
div.background { display: none; visibility: hidden }
body.single_slide div.initial_prompt { display: block; visibility: visible }
body.single_slide div.background { display: block; visibility: visible }
body.single_slide div.background.hidden { display: none; visibility: hidden }
body.single_slide .invisible { visibility: hidden }
body.single_slide .hidden { display: none; visibility: hidden }
body.single_slide div.slide { position: absolute }
body.single_slide div.handout { display: none; visibility: hidden }
}
@media print {
.hidden { display: block; visibility: visible }
div.slide pre { font-size: 60%; padding-left: 0.5em; }
div.toolbar { display: none; visibility: hidden; }
div.slidy_toc { display: none; visibility: hidden; }
div.background { display: none; visibility: hidden; }
div.slide { page-break-before: always }
div.slide.first-slide { page-break-before: avoid }
}
.jslider table {
margin-left: 0em;
margin-right: 0em;
}
table.dataTable, .shiny-datatable-output div {
font-size: 14pt;
}
.dataTables_info, .dataTables_paginate {
font-size: 19px;
}
pre.sourceCode, code.sourceCode {
font-size: 80%;
}
label, button, input, select, textarea {
font-size: 14pt;
}
ul.nav, ul.nav li {
list-style-type: none;
}
</style>
<script src="data:application/javascript;base64,Lyogc2xpZHkuanMKCiAgIENvcHlyaWdodCAoYykgMjAwNS0yMDEzIFczQyAoTUlULCBFUkNJTSwgS2VpbyksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgIFczQyBsaWFiaWxpdHksIHRyYWRlbWFyaywgZG9jdW1lbnQgdXNlIGFuZCBzb2Z0d2FyZSBsaWNlbnNpbmcKICAgcnVsZXMgYXBwbHksIHNlZToKCiAgIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LWRvY3VtZW50cwogICBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZQoKICAgRGVmaW5lcyBzaW5nbGUgbmFtZSAidzNjX3NsaWR5IiBpbiBnbG9iYWwgbmFtZXNwYWNlCiAgIEFkZHMgZXZlbnQgaGFuZGxlcnMgd2l0aG91dCB0cmFtcGxpbmcgb24gYW55IG90aGVycwoqLwoKLy8gdGhlIHNsaWR5IG9iamVjdCBpbXBsZW1lbnRhdGlvbgp2YXIgdzNjX3NsaWR5ID0gewogIC8vIGNsYXNzaWZ5IHdoaWNoIGtpbmQgb2YgYnJvd3NlciB3ZSdyZSBydW5uaW5nIHVuZGVyCiAgbnNfcG9zOiAodHlwZW9mIHdpbmRvdy5wYWdlWU9mZnNldCE9J3VuZGVmaW5lZCcpLAogIGtodG1sOiAoKG5hdmlnYXRvci51c2VyQWdlbnQpLmluZGV4T2YoIktIVE1MIikgPj0gMCA/IHRydWUgOiBmYWxzZSksCiAgb3BlcmE6ICgobmF2aWdhdG9yLnVzZXJBZ2VudCkuaW5kZXhPZigiT3BlcmEiKSA+PSAwID8gdHJ1ZSA6IGZhbHNlKSwKICBpcGFkOiAoKG5hdmlnYXRvci51c2VyQWdlbnQpLmluZGV4T2YoImlQYWQiKSA+PSAwID8gdHJ1ZSA6IGZhbHNlKSwKICBpcGhvbmU6ICgobmF2aWdhdG9yLnVzZXJBZ2VudCkuaW5kZXhPZigiaVBob25lIikgPj0gMCA/IHRydWUgOiBmYWxzZSksCiAgYW5kcm9pZDogKChuYXZpZ2F0b3IudXNlckFnZW50KS5pbmRleE9mKCJBbmRyb2lkIikgPj0gMCA/IHRydWUgOiBmYWxzZSksCiAgaWU6ICh0eXBlb2YgZG9jdW1lbnQuYWxsICE9ICJ1bmRlZmluZWQiICYmICF0aGlzLm9wZXJhKSwKICBpZTY6ICghdGhpcy5uc19wb3MgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIDYiKSAhPSAtMSksCiAgaWU3OiAoIXRoaXMubnNfcG9zICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSA3IikgIT0gLTEpLAogIGllODogKCF0aGlzLm5zX3BvcyAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUgOCIpICE9IC0xKSwKICBpZTk6ICghdGhpcy5uc19wb3MgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIDkiKSAhPSAtMSksCgogIC8vIGRhdGEgZm9yIHN3aXBlIGFuZCBkb3VibGUgdGFwIGRldGVjdGlvbiBvbiB0b3VjaCBzY3JlZW5zCiAgbGFzdF90YXA6IDAsCiAgcHJldl90YXA6IDAsCiAgc3RhcnRfeDogMCwKICBzdGFydF95OiAwLAogIGRlbHRhX3g6IDAsCiAgZGVsdGFfeTogMCwKCiAgLy8gYXJlIHdlIHJ1bm5pbmcgYXMgWEhUTUw/IChkb2Vzbid0IHdvcmsgb24gT3BlcmEpCiAgaXNfeGh0bWw6IC94bWwvLnRlc3QoZG9jdW1lbnQuY29udGVudFR5cGUpLAoKICBzbGlkZV9udW1iZXI6IDAsIC8vIGludGVnZXIgc2xpZGUgY291bnQ6IDAsIDEsIDIsIC4uLgogIHNsaWRlX251bWJlcl9lbGVtZW50OiBudWxsLCAvLyBlbGVtZW50IGNvbnRhaW5pbmcgc2xpZGUgbnVtYmVyCiAgc2xpZGVzOiBbXSwgLy8gc2V0IHRvIGFycmF5IG9mIHNsaWRlIGRpdidzCiAgbm90ZXM6IFtdLCAvLyBzZXQgdG8gYXJyYXkgb2YgaGFuZG91dCBkaXYncwogIGJhY2tncm91bmRzOiBbXSwgLy8gc2V0IHRvIGFycmF5IG9mIGJhY2tncm91bmQgZGl2J3MKICBvYnNlcnZlcnM6IFtdLCAvLyBsaXN0IG9mIG9ic2VydmVyIGZ1bmN0aW9ucwogIHRvb2xiYXI6IG51bGwsIC8vIGVsZW1lbnQgY29udGFpbmluZyB0b29sYmFyCiAgdGl0bGU6IG51bGwsIC8vIGRvY3VtZW50IHRpdGxlCiAgbGFzdF9zaG93bjogbnVsbCwgLy8gbGFzdCBpbmNyZW1lbnRhbGx5IHNob3duIGl0ZW0KICBlb3M6IG51bGwsICAvLyBzcGFuIGVsZW1lbnQgZm9yIGVuZCBvZiBzbGlkZSBpbmRpY2F0b3IKICB0b2M6IG51bGwsIC8vIHRhYmxlIG9mIGNvbnRlbnRzCiAgb3V0bGluZTogbnVsbCwgLy8gb3V0bGluZSBlbGVtZW50IHdpdGggdGhlIGZvY3VzCiAgc2VsZWN0ZWRfdGV4dF9sZW46IDAsIC8vIGxlbmd0aCBvZiBkcmFnIHNlbGVjdGlvbiBvbiBkb2N1bWVudAogIHZpZXdfYWxsOiAwLCAgLy8gMSB0byB2aWV3IGFsbCBzbGlkZXMgKyBoYW5kb3V0cwogIHdhbnRfdG9vbGJhcjogdHJ1ZSwgIC8vIHVzZXIgcHJlZmVyZW5jZSB0byBzaG93L2hpZGUgdG9vbGJhcgogIG1vdXNlX2NsaWNrX2VuYWJsZWQ6IHRydWUsIC8vIGVuYWJsZXMgbGVmdCBjbGljayBmb3IgbmV4dCBzbGlkZQogIHNjcm9sbF9oYWNrOiAwLCAvLyBJRSB3b3JrIGFyb3VuZCBmb3IgcG9zaXRpb246IGZpeGVkCiAgZGlzYWJsZV9zbGlkZV9jbGljazogZmFsc2UsICAvLyB1c2VkIGJ5IGNsaWNrZWQgYW5jaG9ycwoKICBsYW5nOiAiZW4iLCAvLyB1cGRhdGVkIHRvIGxhbmd1YWdlIHNwZWNpZmllZCBieSBodG1sIGZpbGUKCiAgaGVscF9hbmNob3I6IG51bGwsIC8vIHVzZWQgZm9yIGtleWJvYXJkIGZvY3VzIGhhY2sgaW4gc2hvd1Rvb2xiYXIoKQogIGhlbHBfcGFnZTogImh0dHA6Ly93d3cudzMub3JnL1RhbGtzL1Rvb2xzL1NsaWR5Mi9oZWxwL2hlbHAuaHRtbCIsCiAgaGVscF90ZXh0OiAiTmF2aWdhdGUgd2l0aCBtb3VzZSBjbGljaywgc3BhY2UgYmFyLCBDdXJzb3IgTGVmdC9SaWdodCwgIiArCiAgICAgICAgICAgICAib3IgUGcgVXAgYW5kIFBnIERuLiBVc2UgUyBhbmQgQiB0byBjaGFuZ2UgZm9udCBzaXplLiIsCgogIHNpemVfaW5kZXg6IDAsCiAgc2l6ZV9hZGp1c3RtZW50OiAwLAogIHNpemVzOiAgbmV3IEFycmF5KCIxMHB0IiwgIjEycHQiLCAiMTRwdCIsICIxNnB0IiwgIjE4cHQiLCAiMjBwdCIsCiAgICAgICAgICAgICAgICAgICAgIjIycHQiLCAiMjRwdCIsICIyNnB0IiwgIjI4cHQiLCAiMzBwdCIsICIzMnB0IiksCgogIC8vIG5lZWRlZCBmb3IgZWZmaWNpZW50IHJlc2l6aW5nCiAgbGFzdF93aWR0aDogMCwKICBsYXN0X2hlaWdodDogMCwKCgogIC8vIE5lZWRlZCBmb3IgY3Jvc3MgYnJvd3NlciBzdXBwb3J0IGZvciByZWxhdGl2ZSB3aWR0aC9oZWlnaHQgb24KICAvLyBvYmplY3QgZWxlbWVudHMuIFRoZSB3b3JrIGFyb3VuZCBpcyB0byBzYXZlIHdpZHRoL2hlaWdodCBhdHRyaWJ1dGVzCiAgLy8gYW5kIHRoZW4gdG8gcmVjb21wdXRlIGFic29sdXRlIHdpZHRoL2hlaWdodCBkaW1lbnNpb25zIG9uIHJlc2l6aW5nCiAgIG9iamVjdHM6IFtdLAoKICAvLyBhdHRhY2ggaW5pdGlhbGlhdGlvbiBldmVudCBoYW5kbGVycwogIHNldF91cDogZnVuY3Rpb24gKCkgewogICAgdmFyIGluaXQgPSBmdW5jdGlvbigpIHsgdzNjX3NsaWR5LmluaXQoKTsgfTsKICAgIGlmICh0eXBlb2Ygd2luZG93LmFkZEV2ZW50TGlzdGVuZXIgIT0gInVuZGVmaW5lZCIpCiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgaW5pdCwgZmFsc2UpOwogICAgZWxzZQogICAgICB3aW5kb3cuYXR0YWNoRXZlbnQoIm9ubG9hZCIsIGluaXQpOwogIH0sCgogIGhpZGVfc2xpZGVzOiBmdW5jdGlvbiAoKSB7CiAgICBpZiAoZG9jdW1lbnQuYm9keSAmJiAhdzNjX3NsaWR5LmluaXRpYWxpemVkKQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKICAgIGVsc2UKICAgICAgc2V0VGltZW91dCh3M2Nfc2xpZHkuaGlkZV9zbGlkZXMsIDUwKTsKICB9LAoKICAvLyBoYWNrIHRvIHBlcnN1YWRlIElFIHRvIGNvbXB1dGUgY29ycmVjdCBkb2N1bWVudCBoZWlnaHQKICAvLyBhcyBuZWVkZWQgZm9yIHNpbXVsYXRpbmcgZml4ZWQgcG9zaXRpb25pbmcgb2YgdG9vbGJhcgogIGllX2hhY2s6IGZ1bmN0aW9uICgpIHsKICAgIHdpbmRvdy5yZXNpemVCeSgwLC0xKTsKICAgIHdpbmRvdy5yZXNpemVCeSgwLCAxKTsKICB9LAoKICBpbml0OiBmdW5jdGlvbiAoKSB7CiAgICAvL2FsZXJ0KCJzbGlkeSBzdGFydGluZyB0ZXN0IDEwIik7CiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CiAgICB0aGlzLmluaXRfbG9jYWxpemF0aW9uKCk7CiAgICB0aGlzLmFkZF90b29sYmFyKCk7CiAgICB0aGlzLndyYXBfaW1wbGljaXRfc2xpZGVzKCk7CiAgICB0aGlzLmNvbGxlY3Rfc2xpZGVzKCk7CiAgICB0aGlzLmNvbGxlY3Rfbm90ZXMoKTsKICAgIHRoaXMuY29sbGVjdF9iYWNrZ3JvdW5kcygpOwogICAgdGhpcy5vYmplY3RzID0gZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0Iik7CiAgICB0aGlzLnBhdGNoX2FuY2hvcnMoKTsKICAgIHRoaXMuc2xpZGVfbnVtYmVyID0gdGhpcy5maW5kX3NsaWRlX251bWJlcihsb2NhdGlvbi5ocmVmKTsKICAgIHdpbmRvdy5vZmZzY3JlZW5idWZmZXJpbmcgPSB0cnVlOwogICAgdGhpcy5zaXplX2FkanVzdG1lbnQgPSB0aGlzLmZpbmRfc2l6ZV9hZGp1c3QoKTsKICAgIHRoaXMudGltZV9sZWZ0ID0gdGhpcy5maW5kX2R1cmF0aW9uKCk7CiAgICB0aGlzLmhpZGVfaW1hZ2VfdG9vbGJhcigpOyAgLy8gc3VwcHJlc3MgSUUgaW1hZ2UgdG9vbGJhciBwb3B1cAogICAgdGhpcy5pbml0X291dGxpbmVyKCk7ICAvLyBhY3RpdmF0ZSBmb2xkL3VuZm9sZCBzdXBwb3J0CiAgICB0aGlzLnRpdGxlID0gZG9jdW1lbnQudGl0bGU7CiAgICB0aGlzLmtleWJvYXJkbGVzcyA9ICh0aGlzLmlwYWR8fHRoaXMuaXBob25lfHx0aGlzLmFuZHJvaWQpOwoKICAgIGlmICh0aGlzLmtleWJvYXJkbGVzcykKICAgIHsKICAgICAgdzNjX3NsaWR5LnJlbW92ZV9jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpCiAgICAgIHRoaXMud2FudF90b29sYmFyID0gMDsKICAgIH0KCiAgICAvLyB3b3JrIGFyb3VuZCBmb3Igb3BlcmEgYnVnCiAgICB0aGlzLmlzX3hodG1sID0gKGRvY3VtZW50LmJvZHkudGFnTmFtZSA9PSAiQk9EWSIgPyBmYWxzZSA6IHRydWUpOwoKICAgIGlmICh0aGlzLnNsaWRlcy5sZW5ndGggPiAwKQogICAgewogICAgICB2YXIgc2xpZGUgPSB0aGlzLnNsaWRlc1t0aGlzLnNsaWRlX251bWJlcl07CiAgIAogICAgICBpZiAodGhpcy5zbGlkZV9udW1iZXIgPiAwKQogICAgICB7CiAgICAgICAgdGhpcy5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoInZpc2libGUiKTsKICAgICAgICB0aGlzLmxhc3Rfc2hvd24gPSB0aGlzLnByZXZpb3VzX2luY3JlbWVudGFsX2l0ZW0obnVsbCk7CiAgICAgICAgdGhpcy5zZXRfZW9zX3N0YXR1cyh0cnVlKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICB0aGlzLmxhc3Rfc2hvd24gPSBudWxsOwogICAgICAgIHRoaXMuc2V0X3Zpc2liaWxpdHlfYWxsX2luY3JlbWVudGFsKCJoaWRkZW4iKTsKICAgICAgICB0aGlzLnNldF9lb3Nfc3RhdHVzKCF0aGlzLm5leHRfaW5jcmVtZW50YWxfaXRlbSh0aGlzLmxhc3Rfc2hvd24pKTsKICAgICAgfQoKICAgICAgdGhpcy5zZXRfbG9jYXRpb24oKTsKICAgICAgdGhpcy5hZGRfY2xhc3ModGhpcy5zbGlkZXNbMF0sICJmaXJzdC1zbGlkZSIpOwogICAgICB3M2Nfc2xpZHkuc2hvd19zbGlkZShzbGlkZSk7CiAgICB9CgogICAgdGhpcy50b2MgPSB0aGlzLnRhYmxlX29mX2NvbnRlbnRzKCk7CgogICAgdGhpcy5hZGRfaW5pdGlhbF9wcm9tcHQoKTsKCiAgICAvLyBiaW5kIGV2ZW50IGhhbmRsZXJzIHdpdGhvdXQgaW50ZXJmZXJpbmcgd2l0aCBjdXN0b20gcGFnZSBzY3JpcHRzCiAgICAvLyBUYXAgZXZlbnRzIGJlaGF2ZSB0b28gd2VpcmRseSB0byBzdXBwb3J0IGNsaWNrcyByZWxpYWJseSBvbgogICAgLy8gaVBob25lIGFuZCBpUGFkLCBzbyBleGNsdWRlIHRoZXNlIGZyb20gY2xpY2sgaGFuZGxlcgoKICAgIGlmICghdGhpcy5rZXlib2FyZGxlc3MpCiAgICB7CiAgICAgIHRoaXMuYWRkX2xpc3RlbmVyKGRvY3VtZW50LmJvZHksICJjbGljayIsIHRoaXMubW91c2VfYnV0dG9uX2NsaWNrKTsKICAgICAgdGhpcy5hZGRfbGlzdGVuZXIoZG9jdW1lbnQuYm9keSwgIm1vdXNlZG93biIsIHRoaXMubW91c2VfYnV0dG9uX2Rvd24pOwogICAgfQoKICAgIHRoaXMuYWRkX2xpc3RlbmVyKGRvY3VtZW50LCAia2V5ZG93biIsIHRoaXMua2V5X2Rvd24pOwogICAgdGhpcy5hZGRfbGlzdGVuZXIoZG9jdW1lbnQsICJrZXlwcmVzcyIsIHRoaXMua2V5X3ByZXNzKTsKICAgIHRoaXMuYWRkX2xpc3RlbmVyKHdpbmRvdywgInJlc2l6ZSIsIHRoaXMucmVzaXplZCk7CiAgICB0aGlzLmFkZF9saXN0ZW5lcih3aW5kb3csICJzY3JvbGwiLCB0aGlzLnNjcm9sbGVkKTsKICAgIHRoaXMuYWRkX2xpc3RlbmVyKHdpbmRvdywgInVubG9hZCIsIHRoaXMudW5sb2FkZWQpOwoKICAgIHRoaXMuYWRkX2xpc3RlbmVyKGRvY3VtZW50LCAiZ2VzdHVyZWNoYW5nZSIsIGZ1bmN0aW9uICgpCiAgICB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwoKICAgIHRoaXMuYXR0YWNoX3RvdWNoX2hhbmRlcnModGhpcy5zbGlkZXMpOwoKICAgIC8vIHRoaXMgc2VlbXMgdG8gYmUgYSBkZWJ1Z2dpbmcgaGFjawogICAgLy9pZiAoIWRvY3VtZW50LmJvZHkub25jbGljaykKICAgIC8vICBkb2N1bWVudC5ib2R5Lm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7IH07CgogICAgdGhpcy5zaW5nbGVfc2xpZGVfdmlldygpOwoKICAgIC8vdGhpcy5zZXRfbG9jYXRpb24oKTsKCiAgICB0aGlzLnJlc2l6ZWQoKTsKCiAgICBpZiAodGhpcy5pZTcpCiAgICAgIHNldFRpbWVvdXQodzNjX3NsaWR5LmllX2hhY2ssIDEwMCk7CgogICAgdGhpcy5zaG93X3Rvb2xiYXIoKTsKCiAgICAvLyBmb3IgYmFjayBidXR0b24gZGV0ZWN0aW9uCiAgICBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7IHczY19zbGlkeS5jaGVja19sb2NhdGlvbigpOyB9LCAyMDApOwogICAgdzNjX3NsaWR5LmluaXRpYWxpemVkID0gdHJ1ZTsKICB9LAoKICAvLyBjcmVhdGUgZGl2IGVsZW1lbnQgd2l0aCBsaW5rcyB0byBlYWNoIHNsaWRlCiAgdGFibGVfb2ZfY29udGVudHM6IGZ1bmN0aW9uICgpIHsKICAgIHZhciB0b2MgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJkaXYiKTsKICAgIHRoaXMuYWRkX2NsYXNzKHRvYywgInNsaWR5X3RvYyBoaWRkZW4iKTsKICAgIC8vdG9jLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCAiMCIpOwoKICAgIHZhciBoZWFkaW5nID0gdGhpcy5jcmVhdGVfZWxlbWVudCgiZGl2Iik7CiAgICB0aGlzLmFkZF9jbGFzcyhoZWFkaW5nLCAidG9jLWhlYWRpbmciKTsKICAgIGhlYWRpbmcuaW5uZXJIVE1MID0gdGhpcy5sb2NhbGl6ZSgiVGFibGUgb2YgQ29udGVudHMiKTsKCiAgICB0b2MuYXBwZW5kQ2hpbGQoaGVhZGluZyk7CiAgICB2YXIgcHJldmlvdXMgPSBudWxsOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zbGlkZXMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIHZhciB0aXRsZSA9IHRoaXMuaGFzX2NsYXNzKHRoaXMuc2xpZGVzW2ldLCAidGl0bGUiKTsKICAgICAgdmFyIG51bSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKChpICsgMSkgKyAiLiAiKTsKCiAgICAgIHRvYy5hcHBlbmRDaGlsZChudW0pOwoKICAgICAgdmFyIGEgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJhIik7CiAgICAgIGEuc2V0QXR0cmlidXRlKCJocmVmIiwgIiMoIiArIChpKzEpICsgIikiKTsKCiAgICAgIGlmICh0aXRsZSkKICAgICAgICB0aGlzLmFkZF9jbGFzcyhhLCAidGl0bGVzbGlkZSIpOwoKICAgICAgdmFyIG5hbWUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLnNsaWRlX25hbWUoaSkpOwogICAgICBhLmFwcGVuZENoaWxkKG5hbWUpOwogICAgICBhLm9uY2xpY2sgPSB3M2Nfc2xpZHkudG9jX2NsaWNrOwogICAgICBhLm9ua2V5ZG93biA9IHczY19zbGlkeS50b2Nfa2V5X2Rvd247CiAgICAgIGEucHJldmlvdXMgPSBwcmV2aW91czsKCiAgICAgIGlmIChwcmV2aW91cykKICAgICAgICBwcmV2aW91cy5uZXh0ID0gYTsKCiAgICAgIHRvYy5hcHBlbmRDaGlsZChhKTsKCiAgICAgIGlmIChpID09IDApCiAgICAgICAgdG9jLmZpcnN0ID0gYTsKCiAgICAgIGlmIChpIDwgdGhpcy5zbGlkZXMubGVuZ3RoIC0gMSkKICAgICAgewogICAgICAgIHZhciBiciA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoImJyIik7CiAgICAgICAgdG9jLmFwcGVuZENoaWxkKGJyKTsKICAgICAgfQoKICAgICAgcHJldmlvdXMgPSBhOwogICAgfQoKICAgIHRvYy5mb2N1cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKHRoaXMuZmlyc3QpCiAgICAgICAgdGhpcy5maXJzdC5mb2N1cygpOwogICAgfQoKICAgIHRvYy5vbm1vdXNldXAgPSB3M2Nfc2xpZHkubW91c2VfYnV0dG9uX3VwOwoKICAgIHRvYy5vbmNsaWNrID0gZnVuY3Rpb24gKGUpIHsKICAgICAgZXx8KGU9d2luZG93LmV2ZW50KTsKCiAgICAgIGlmICh3M2Nfc2xpZHkuc2VsZWN0ZWRfdGV4dF9sZW4gPD0gMCkKICAgICAgICAgdzNjX3NsaWR5LmhpZGVfdGFibGVfb2ZfY29udGVudHModHJ1ZSk7CgogICAgICB3M2Nfc2xpZHkuc3RvcF9wcm9wYWdhdGlvbihlKTsKICAgIAogICAgICBpZiAoZS5jYW5jZWwgIT0gdW5kZWZpbmVkKQogICAgICAgIGUuY2FuY2VsID0gdHJ1ZTsKICAgICAgCiAgICAgIGlmIChlLnJldHVyblZhbHVlICE9IHVuZGVmaW5lZCkKICAgICAgICBlLnJldHVyblZhbHVlID0gZmFsc2U7CiAgICAgIAogICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwoKICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QmVmb3JlKHRvYywgZG9jdW1lbnQuYm9keS5maXJzdENoaWxkKTsKICAgIHJldHVybiB0b2M7CiAgfSwKCiAgaXNfc2hvd25fdG9jOiBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gIXczY19zbGlkeS5oYXNfY2xhc3ModzNjX3NsaWR5LnRvYywgImhpZGRlbiIpOwogIH0sCgogIHNob3dfdGFibGVfb2ZfY29udGVudHM6IGZ1bmN0aW9uICgpIHsKICAgIHczY19zbGlkeS5yZW1vdmVfY2xhc3ModzNjX3NsaWR5LnRvYywgImhpZGRlbiIpOwogICAgdmFyIHRvYyA9IHczY19zbGlkeS50b2M7CiAgICB0b2MuZm9jdXMoKTsKCiAgICBpZiAodzNjX3NsaWR5LmllNyAmJiB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyID09IDApCiAgICAgIHNldFRpbWVvdXQodzNjX3NsaWR5LmllX2hhY2ssIDEwMCk7CiAgfSwKCiAgaGlkZV90YWJsZV9vZl9jb250ZW50czogZnVuY3Rpb24gKGZvY3VzKSB7CiAgICB3M2Nfc2xpZHkuYWRkX2NsYXNzKHczY19zbGlkeS50b2MsICJoaWRkZW4iKTsKCiAgICBpZiAoZm9jdXMgJiYgIXczY19zbGlkeS5vcGVyYSAmJgogICAgICAgICF3M2Nfc2xpZHkuaGFzX2NsYXNzKHczY19zbGlkeS50b2MsICJoaWRkZW4iKSkKICAgICAgdzNjX3NsaWR5LnNldF9mb2N1cygpOwogIH0sCgogIHRvZ2dsZV90YWJsZV9vZl9jb250ZW50czogZnVuY3Rpb24gKCkgewogICAgaWYgKHczY19zbGlkeS5pc19zaG93bl90b2MoKSkKICAgICAgdzNjX3NsaWR5LmhpZGVfdGFibGVfb2ZfY29udGVudHModHJ1ZSk7CiAgICBlbHNlCiAgICAgIHczY19zbGlkeS5zaG93X3RhYmxlX29mX2NvbnRlbnRzKCk7CiAgfSwKCiAgLy8gY2FsbGVkIG9uIGNsaWNraW5nIHRvYyBlbnRyeQogIHRvY19jbGljazogZnVuY3Rpb24gKGUpIHsKICAgIGlmICghZSkKICAgICAgZSA9IHdpbmRvdy5ldmVudDsKCiAgICB2YXIgdGFyZ2V0ID0gdzNjX3NsaWR5LmdldF90YXJnZXQoZSk7CgogICAgaWYgKHRhcmdldCAmJiB0YXJnZXQubm9kZVR5cGUgPT0gMSkKICAgIHsKICAgICAgdmFyIHVyaSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKCiAgICAgIGlmICh1cmkpCiAgICAgIHsKICAgICAgICAvL2FsZXJ0KCJnb2luZyB0byAiICsgdXJpKTsKICAgICAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgICAgIHczY19zbGlkeS5oaWRlX3NsaWRlKHNsaWRlKTsKICAgICAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyID0gdzNjX3NsaWR5LmZpbmRfc2xpZGVfbnVtYmVyKHVyaSk7CiAgICAgICAgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgICAgIHczY19zbGlkeS5sYXN0X3Nob3duID0gbnVsbDsKICAgICAgICB3M2Nfc2xpZHkuc2V0X2xvY2F0aW9uKCk7CiAgICAgICAgdzNjX3NsaWR5LnNldF92aXNpYmlsaXR5X2FsbF9pbmNyZW1lbnRhbCgiaGlkZGVuIik7CiAgICAgICAgdzNjX3NsaWR5LnNldF9lb3Nfc3RhdHVzKCF3M2Nfc2xpZHkubmV4dF9pbmNyZW1lbnRhbF9pdGVtKHczY19zbGlkeS5sYXN0X3Nob3duKSk7CiAgICAgICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgICAgIC8vdGFyZ2V0LmZvY3VzKCk7CgogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgIGlmICghdzNjX3NsaWR5Lm9wZXJhKQogICAgICAgICAgICB3M2Nfc2xpZHkuc2V0X2ZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKQogICAgICAgIHsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICB3M2Nfc2xpZHkuaGlkZV90YWJsZV9vZl9jb250ZW50cyh0cnVlKTsKICAgIGlmICh3M2Nfc2xpZHkuaWU3KSB3M2Nfc2xpZHkuaWVfaGFjaygpOwogICAgdzNjX3NsaWR5LnN0b3BfcHJvcGFnYXRpb24oZSk7CiAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChlKTsKICB9LAoKICAvLyBjYWxsZWQgb25rZXlkb3duIGZvciB0b2MgZW50cnkKICB0b2Nfa2V5X2Rvd246IGZ1bmN0aW9uIChldmVudCkgewogICAgdmFyIGtleTsKCiAgICBpZiAoIWV2ZW50KQogICAgICB2YXIgZXZlbnQgPSB3aW5kb3cuZXZlbnQ7CgogICAgLy8ga2x1ZGdlIGFyb3VuZCBOUy9JRSBkaWZmZXJlbmNlcyAKICAgIGlmICh3aW5kb3cuZXZlbnQpCiAgICAgIGtleSA9IHdpbmRvdy5ldmVudC5rZXlDb2RlOwogICAgZWxzZSBpZiAoZXZlbnQud2hpY2gpCiAgICAgIGtleSA9IGV2ZW50LndoaWNoOwogICAgZWxzZQogICAgICByZXR1cm4gdHJ1ZTsgLy8gWWlrZXMhIHVua25vd24gYnJvd3NlcgoKICAgIC8vIGlnbm9yZSBldmVudCBpZiBrZXkgdmFsdWUgaXMgemVybwogICAgLy8gYXMgZm9yIGFsdCBvbiBPcGVyYSBhbmQgS29ucXVlcm9yCiAgICBpZiAoIWtleSkKICAgICAgcmV0dXJuIHRydWU7CgogICAgLy8gY2hlY2sgZm9yIGNvbmN1cnJlbnQgY29udHJvbC9jb21tYW5kL2FsdCBrZXkKICAgIC8vIGJ1dCBhcmUgdGhlc2Ugb25seSBwcmVzZW50IG9uIG1vdXNlIGV2ZW50cz8KCiAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5hbHRLZXkpCiAgICAgIHJldHVybiB0cnVlOwoKICAgIGlmIChrZXkgPT0gMTMpCiAgICB7CiAgICAgIHZhciB1cmkgPSB0aGlzLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwoKICAgICAgaWYgKHVyaSkKICAgICAgewogICAgICAgIC8vYWxlcnQoImdvaW5nIHRvICIgKyB1cmkpOwogICAgICAgdmFyIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICB3M2Nfc2xpZHkuaGlkZV9zbGlkZShzbGlkZSk7CiAgICAgICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IHczY19zbGlkeS5maW5kX3NsaWRlX251bWJlcih1cmkpOwogICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICB3M2Nfc2xpZHkubGFzdF9zaG93biA9IG51bGw7CiAgICAgICAgdzNjX3NsaWR5LnNldF9sb2NhdGlvbigpOwogICAgICAgIHczY19zbGlkeS5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoImhpZGRlbiIpOwogICAgICAgIHczY19zbGlkeS5zZXRfZW9zX3N0YXR1cyghdzNjX3NsaWR5Lm5leHRfaW5jcmVtZW50YWxfaXRlbSh3M2Nfc2xpZHkubGFzdF9zaG93bikpOwogICAgICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgICAvL3RhcmdldC5mb2N1cygpOwoKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICBpZiAoIXczY19zbGlkeS5vcGVyYSkKICAgICAgICAgICAgdzNjX3NsaWR5LnNldF9mb2N1cygpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZSkKICAgICAgICB7CiAgICAgICAgfQogICAgICB9CgogICAgICB3M2Nfc2xpZHkuaGlkZV90YWJsZV9vZl9jb250ZW50cyh0cnVlKTsKCiAgICAgIGlmIChzZWxmLmllNykKICAgICAgIHczY19zbGlkeS5pZV9oYWNrKCk7CgogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CgogICAgaWYgKGtleSA9PSA0MCAmJiB0aGlzLm5leHQpCiAgICB7CiAgICAgIHRoaXMubmV4dC5mb2N1cygpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CgogICAgaWYgKGtleSA9PSAzOCAmJiB0aGlzLnByZXZpb3VzKQogICAgewogICAgICB0aGlzLnByZXZpb3VzLmZvY3VzKCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKICB9LAoKICB0b3VjaHN0YXJ0OiBmdW5jdGlvbiAoZSkKICB7CiAgICAvLyBhIGRvdWJsZSB0b3VjaCBvZnRlbiBzdGFydHMgd2l0aCBhCiAgICAvLyBzaW5nbGUgdG91Y2ggZHVlIHRvIGZpbmdlcnMgdG91Y2hpbmcKICAgIC8vIGRvd24gYXQgc2xpZ2h0bHkgZGlmZmVyZW50IHRpbWVzCiAgICAvLyB0aHVzIGF2b2lkIGNhbGxpbmcgcHJldmVudERlZmF1bHQgaGVyZQogICAgdGhpcy5wcmV2X3RhcCA9IHRoaXMubGFzdF90YXA7CiAgICB0aGlzLmxhc3RfdGFwID0gKG5ldyBEYXRlKS5nZXRUaW1lKCk7CgogICAgdmFyIHRhcF9kZWxheSA9IHRoaXMubGFzdF90YXAgLSB0aGlzLnByZXZfdGFwOwoKICAgIGlmICh0YXBfZGVsYXkgPD0gMjAwKQogICAgewogICAgICAvLyBkb3VibGUgdGFwCiAgICB9CgogICAgdmFyIHRvdWNoID0gZS50b3VjaGVzWzBdOwoKICAgIHRoaXMucGFnZVggPSB0b3VjaC5wYWdlWDsKICAgIHRoaXMucGFnZVkgPSB0b3VjaC5wYWdlWTsKICAgIHRoaXMuc2NyZWVuWCA9IHRvdWNoLnNjcmVlblg7CiAgICB0aGlzLnNjcmVlblkgPSB0b3VjaC5zY3JlZW5ZOwogICAgdGhpcy5jbGllbnRYID0gdG91Y2guY2xpZW50WDsKICAgIHRoaXMuY2xpZW50WSA9IHRvdWNoLmNsaWVudFk7CgogICAgdGhpcy5kZWx0YV94ID0gdGhpcy5kZWx0YV95ID0gMDsKICB9LAoKICB0b3VjaG1vdmU6IGZ1bmN0aW9uIChlKQogIHsKICAgIC8vIG92ZXJyaWRlIG5hdGl2ZSBnZXN0dXJlcyBmb3Igc2luZ2xlIHRvdWNoCiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA+IDEpCiAgICAgIHJldHVybjsKCiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICB2YXIgdG91Y2ggPSBlLnRvdWNoZXNbMF07CiAgICB0aGlzLmRlbHRhX3ggPSB0b3VjaC5wYWdlWCAtIHRoaXMucGFnZVg7CiAgICB0aGlzLmRlbHRhX3kgPSB0b3VjaC5wYWdlWSAtIHRoaXMucGFnZVk7CiAgfSwKCiAgdG91Y2hlbmQ6IGZ1bmN0aW9uIChlKQogIHsKICAgIC8vIGRlZmF1bHQgYmVoYXZpb3IgZm9yIG11bHRpLXRvdWNoCiAgICBpZiAoZS50b3VjaGVzLmxlbmd0aCA+IDEpCiAgICAgIHJldHVybjsKCiAgICB2YXIgZGVsYXkgPSAobmV3IERhdGUpLmdldFRpbWUoKSAtIHRoaXMubGFzdF90YXA7CiAgICB2YXIgZHggPSB0aGlzLmRlbHRhX3g7CiAgICB2YXIgZHkgPSB0aGlzLmRlbHRhX3k7CiAgICB2YXIgYWJzX2R4ID0gTWF0aC5hYnMoZHgpOwogICAgdmFyIGFic19keSA9IE1hdGguYWJzKGR5KTsKCiAgICBpZiAoZGVsYXkgPCA1MDAgJiYgKGFic19keCA+IDEwMCB8fCBhYnNfZHkgPiAxMDApKQogICAgewogICAgICBpZiAoYWJzX2R4ID4gMC41ICogYWJzX2R5KQogICAgICB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICBpZiAoZHggPCAwKQogICAgICAgICAgdzNjX3NsaWR5Lm5leHRfc2xpZGUodHJ1ZSk7CiAgICAgICAgZWxzZQogICAgICAgICAgdzNjX3NsaWR5LnByZXZpb3VzX3NsaWRlKHRydWUpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGFic19keSA+IDIgKiBhYnNfZHgpCiAgICAgIHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgdzNjX3NsaWR5LnRvZ2dsZV90YWJsZV9vZl9jb250ZW50cygpOwogICAgICB9CiAgICB9CiAgfSwKCiAgLy8gIyMjIE9CU09MRVRFICMjIwogIGJlZm9yZV9wcmludDogZnVuY3Rpb24gKCkgewogICAgdGhpcy5zaG93X2FsbF9zbGlkZXMoKTsKICAgIHRoaXMuaGlkZV90b29sYmFyKCk7CiAgICBhbGVydCgiYmVmb3JlIHByaW50Iik7CiAgfSwKCiAgLy8gIyMjIE9CU09MRVRFICMjIwogIGFmdGVyX3ByaW50OiBmdW5jdGlvbiAoKSB7CiAgICBpZiAoIXRoaXMudmlld19hbGwpCiAgICB7CiAgICAgIHRoaXMuc2luZ2xlX3NsaWRlX3ZpZXcoKTsKICAgICAgdGhpcy5zaG93X3Rvb2xiYXIoKTsKICAgIH0KICAgIGFsZXJ0KCJhZnRlciBwcmludCIpOwogIH0sCgogIC8vICMjIyBPQlNPTEVURSAjIyMKICBwcmludF9zbGlkZXM6IGZ1bmN0aW9uICgpIHsKICAgIHRoaXMuYmVmb3JlX3ByaW50KCk7CiAgICB3aW5kb3cucHJpbnQoKTsKICAgIHRoaXMuYWZ0ZXJfcHJpbnQoKTsKICB9LAoKICAvLyAjIyMgT0JTT0xFVEUgPz8gIyMjCiAgdG9nZ2xlX3ZpZXc6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh0aGlzLnZpZXdfYWxsKQogICAgewogICAgICB0aGlzLnNpbmdsZV9zbGlkZV92aWV3KCk7CiAgICAgIHRoaXMuc2hvd190b29sYmFyKCk7CiAgICAgIHRoaXMudmlld19hbGwgPSAwOwogICAgfQogICAgZWxzZQogICAgewogICAgICB0aGlzLnNob3dfYWxsX3NsaWRlcygpOwogICAgICB0aGlzLmhpZGVfdG9vbGJhcigpOwogICAgICB0aGlzLnZpZXdfYWxsID0gMTsKICAgIH0KICB9LAoKICAvLyBwcmVwYXJlIGZvciBwcmludGluZyAgIyMjIE9CU09MRVRFICMjIwogIHNob3dfYWxsX3NsaWRlczogZnVuY3Rpb24gKCkgewogICAgdGhpcy5yZW1vdmVfY2xhc3MoZG9jdW1lbnQuYm9keSwgInNpbmdsZV9zbGlkZSIpOwogICAgdGhpcy5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoInZpc2libGUiKTsKICB9LAoKICAvLyByZXN0b3JlIGFmdGVyIHByaW50aW5nICAjIyMgT0JTT0xFVEUgIyMjCiAgc2luZ2xlX3NsaWRlX3ZpZXc6IGZ1bmN0aW9uICgpIHsKICAgIHRoaXMuYWRkX2NsYXNzKGRvY3VtZW50LmJvZHksICJzaW5nbGVfc2xpZGUiKTsKICAgIHRoaXMuc2V0X3Zpc2liaWxpdHlfYWxsX2luY3JlbWVudGFsKCJ2aXNpYmxlIik7CiAgICB0aGlzLmxhc3Rfc2hvd24gPSB0aGlzLnByZXZpb3VzX2luY3JlbWVudGFsX2l0ZW0obnVsbCk7CiAgfSwKCiAgLy8gc3VwcHJlc3MgSUUncyBpbWFnZSB0b29sYmFyIHBvcCB1cAogIGhpZGVfaW1hZ2VfdG9vbGJhcjogZnVuY3Rpb24gKCkgewogICAgaWYgKCF0aGlzLm5zX3BvcykKICAgIHsKICAgICAgdmFyIGltYWdlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJTUciKTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW1hZ2VzLmxlbmd0aDsgKytpKQogICAgICAgIGltYWdlc1tpXS5zZXRBdHRyaWJ1dGUoImdhbGxlcnlpbWciLCAibm8iKTsKICAgIH0KICB9LAoKICB1bmxvYWRlZDogZnVuY3Rpb24gKGUpIHsKICAgIC8vYWxlcnQoInVubG9hZGVkIik7CiAgfSwKCiAgLy8gU2FmYXJpIGFuZCBLb25xdWVyb3IgZG9uJ3QgeWV0IHN1cHBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSgpCiAgLy8gYW5kIHRoZXkgYWx3YXlzIHJlbG9hZCBwYWdlIHdoZW4gbG9jYXRpb24uaHJlZiBpcyB1cGRhdGVkCiAgaXNfS0hUTUw6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBhZ2VudCA9IG5hdmlnYXRvci51c2VyQWdlbnQ7CiAgICByZXR1cm4gKGFnZW50LmluZGV4T2YoIktIVE1MIikgPj0gMCA/IHRydWUgOiBmYWxzZSk7CiAgfSwKCiAgLy8gZmluZCBzbGlkZSBuYW1lIGZyb20gZmlyc3QgaDEgZWxlbWVudAogIC8vIGRlZmF1bHQgdG8gZG9jdW1lbnQgdGl0bGUgKyBzbGlkZSBudW1iZXIKICBzbGlkZV9uYW1lOiBmdW5jdGlvbiAoaW5kZXgpIHsKICAgIHZhciBuYW1lID0gbnVsbDsKICAgIHZhciBzbGlkZSA9IHRoaXMuc2xpZGVzW2luZGV4XTsKCiAgICB2YXIgaGVhZGluZyA9IHRoaXMuZmluZF9oZWFkaW5nKHNsaWRlKTsKCiAgICBpZiAoaGVhZGluZykKICAgICAgbmFtZSA9IHRoaXMuZXh0cmFjdF90ZXh0KGhlYWRpbmcpOwoKICAgIGlmICghbmFtZSkKICAgICAgbmFtZSA9IHRoaXMudGl0bGUgKyAiKCIgKyAoaW5kZXggKyAxKSArICIpIjsKCiAgICBuYW1lLnJlcGxhY2UoL1wmL2csICImYW1wOyIpOwogICAgbmFtZS5yZXBsYWNlKC9cPC9nLCAiJmx0OyIpOwogICAgbmFtZS5yZXBsYWNlKC9cPi9nLCAiJmd0OyIpOwoKICAgIHJldHVybiBuYW1lOwogIH0sCgogIC8vIGZpbmQgZmlyc3QgaDEgZWxlbWVudCBpbiBET00gdHJlZQogIGZpbmRfaGVhZGluZzogZnVuY3Rpb24gKG5vZGUpIHsKICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlICE9IDEpCiAgICAgIHJldHVybiBudWxsOwoKICAgIGlmIChub2RlLm5vZGVOYW1lID09ICJIMSIgfHwgbm9kZS5ub2RlTmFtZSA9PSAiaDEiKQogICAgICByZXR1cm4gbm9kZTsKCiAgICB2YXIgY2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7CgogICAgd2hpbGUgKGNoaWxkKQogICAgewogICAgICBub2RlID0gdGhpcy5maW5kX2hlYWRpbmcoY2hpbGQpOwoKICAgICAgaWYgKG5vZGUpCiAgICAgICAgcmV0dXJuIG5vZGU7CgogICAgICBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nOwogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0sCgogIC8vIHJlY3Vyc2l2ZWx5IGV4dHJhY3QgdGV4dCBmcm9tIERPTSB0cmVlCiAgZXh0cmFjdF90ZXh0OiBmdW5jdGlvbiAobm9kZSkgewogICAgaWYgKCFub2RlKQogICAgICByZXR1cm4gIiI7CgogICAgLy8gdGV4dCBub2RlcwogICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykKICAgICAgcmV0dXJuIG5vZGUubm9kZVZhbHVlOwoKICAgIC8vIGVsZW1lbnRzCiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxKQogICAgewogICAgICBub2RlID0gbm9kZS5maXJzdENoaWxkOwogICAgICB2YXIgdGV4dCA9ICIiOwoKICAgICAgd2hpbGUgKG5vZGUpCiAgICAgIHsKICAgICAgICB0ZXh0ID0gdGV4dCArIHRoaXMuZXh0cmFjdF90ZXh0KG5vZGUpOwogICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICB9CgogICAgICByZXR1cm4gdGV4dDsKICAgIH0KCiAgICByZXR1cm4gIiI7CiAgfSwKCiAgLy8gZmluZCBjb3B5cmlnaHQgdGV4dCBmcm9tIG1ldGEgZWxlbWVudAogIGZpbmRfY29weXJpZ2h0OiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgbmFtZSwgY29udGVudDsKICAgIHZhciBtZXRhID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1ldGEiKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1ldGEubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIG5hbWUgPSBtZXRhW2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpOwogICAgICBjb250ZW50ID0gbWV0YVtpXS5nZXRBdHRyaWJ1dGUoImNvbnRlbnQiKTsKCiAgICAgIGlmIChuYW1lID09ICJjb3B5cmlnaHQiKQogICAgICAgIHJldHVybiBjb250ZW50OwogICAgfQoKICAgIHJldHVybiBudWxsOwogIH0sCgogIGZpbmRfc2l6ZV9hZGp1c3Q6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBuYW1lLCBjb250ZW50LCBvZmZzZXQ7CiAgICB2YXIgbWV0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtZXRhIik7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRhLmxlbmd0aDsgKytpKQogICAgewogICAgICBuYW1lID0gbWV0YVtpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKICAgICAgY29udGVudCA9IG1ldGFbaV0uZ2V0QXR0cmlidXRlKCJjb250ZW50Iik7CgogICAgICBpZiAobmFtZSA9PSAiZm9udC1zaXplLWFkanVzdG1lbnQiKQogICAgICAgIHJldHVybiAxICogY29udGVudDsKICAgIH0KCiAgICByZXR1cm4gMTsKICB9LAoKICAvLyA8bWV0YSBuYW1lPSJkdXJhdGlvbiIgY29udGVudD0iMjAiIC8+ICBmb3IgMjAgbWludXRlcwogIGZpbmRfZHVyYXRpb246IGZ1bmN0aW9uICgpIHsKICAgIHZhciBuYW1lLCBjb250ZW50LCBvZmZzZXQ7CiAgICB2YXIgbWV0YSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtZXRhIik7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRhLmxlbmd0aDsgKytpKQogICAgewogICAgICBuYW1lID0gbWV0YVtpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKICAgICAgY29udGVudCA9IG1ldGFbaV0uZ2V0QXR0cmlidXRlKCJjb250ZW50Iik7CgogICAgICBpZiAobmFtZSA9PSAiZHVyYXRpb24iKQogICAgICAgIHJldHVybiA2MDAwMCAqIGNvbnRlbnQ7CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfSwKCiAgcmVwbGFjZV9ieV9ub25fYnJlYWtpbmdfc3BhY2U6IGZ1bmN0aW9uIChzdHIpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKQogICAgICBzdHJbaV0gPSAxNjA7CiAgfSwKCiAgLy8gIyMjIENIRUNLIE1FICMjIyBpcyB1c2Ugb2YgImxpIiBva2F5IGZvciB0ZXh0L2h0bWw/CiAgLy8gZm9yIFhIVE1MIGRvIHdlIGFsc28gbmVlZCB0byBzcGVjaWZ5IG5hbWVzcGFjZT8KICBpbml0X291dGxpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgaXRlbXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGkiKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgKytpKQogICAgewogICAgICB2YXIgdGFyZ2V0ID0gaXRlbXNbaV07CgogICAgICBpZiAoIXRoaXMuaGFzX2NsYXNzKHRhcmdldC5wYXJlbnROb2RlLCAib3V0bGluZSIpKQogICAgICAgIGNvbnRpbnVlOwoKICAgICAgdGFyZ2V0Lm9uY2xpY2sgPSB0aGlzLm91dGxpbmVfY2xpY2s7Ci8qICMjIyBtb3JlIHdvcmsgbmVlZGVkIGZvciBJRTYKICAgICAgaWYgKCF0aGlzLm5zX3BvcykKICAgICAgewogICAgICAgIHRhcmdldC5vbm1vdXNlb3ZlciA9IHRoaXMuaG92ZXJfb3V0bGluZTsKICAgICAgICB0YXJnZXQub25tb3VzZW91dCA9IHRoaXMudW5ob3Zlcl9vdXRsaW5lOwogICAgICB9CiovCiAgICAgIGlmICh0aGlzLmZvbGRhYmxlKHRhcmdldCkpCiAgICAgIHsKICAgICAgICB0YXJnZXQuZm9sZGFibGUgPSB0cnVlOwogICAgICAgIHRhcmdldC5vbmZvY3VzID0gZnVuY3Rpb24gKCkge3czY19zbGlkeS5vdXRsaW5lID0gdGhpczt9OwogICAgICAgIHRhcmdldC5vbmJsdXIgPSBmdW5jdGlvbiAoKSB7dzNjX3NsaWR5Lm91dGxpbmUgPSBudWxsO307CgogICAgICAgIGlmICghdGFyZ2V0LmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSkKICAgICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwgIjAiKTsKCiAgICAgICAgaWYgKHRoaXMuaGFzX2NsYXNzKHRhcmdldCwgImV4cGFuZCIpKQogICAgICAgICAgdGhpcy51bmZvbGQodGFyZ2V0KTsKICAgICAgICBlbHNlCiAgICAgICAgICB0aGlzLmZvbGQodGFyZ2V0KTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICB0aGlzLmFkZF9jbGFzcyh0YXJnZXQsICJub2ZvbGQiKTsKICAgICAgICB0YXJnZXQudmlzaWJsZSA9IHRydWU7CiAgICAgICAgdGFyZ2V0LmZvbGRhYmxlID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICB9LAoKICBmb2xkYWJsZTogZnVuY3Rpb24gKGl0ZW0pIHsKICAgIGlmICghaXRlbSB8fCBpdGVtLm5vZGVUeXBlICE9IDEpCiAgICAgIHJldHVybiBmYWxzZTsKCiAgICB2YXIgbm9kZSA9IGl0ZW0uZmlyc3RDaGlsZDsKCiAgICB3aGlsZSAobm9kZSkKICAgIHsKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiB0aGlzLmlzX2Jsb2NrKG5vZGUpKQogICAgICAgIHJldHVybiB0cnVlOwoKICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0sCgogIC8vICMjIyBDSEVDSyBNRSAjIyMgc3dpdGNoIHRvIGFkZC9yZW1vdmUgImhpZGRlbiIgY2xhc3MKICBmb2xkOiBmdW5jdGlvbiAoaXRlbSkgewogICAgaWYgKGl0ZW0pCiAgICB7CiAgICAgIHRoaXMucmVtb3ZlX2NsYXNzKGl0ZW0sICJ1bmZvbGRlZCIpOwogICAgICB0aGlzLmFkZF9jbGFzcyhpdGVtLCAiZm9sZGVkIik7CiAgICB9CgogICAgdmFyIG5vZGUgPSBpdGVtID8gaXRlbS5maXJzdENoaWxkIDogbnVsbDsKCiAgICB3aGlsZSAobm9kZSkKICAgIHsKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSAmJiB0aGlzLmlzX2Jsb2NrKG5vZGUpKSAvLyBlbGVtZW50CiAgICAgIHsKICAgICAgICAgdzNjX3NsaWR5LmFkZF9jbGFzcyhub2RlLCAiaGlkZGVuIik7CiAgICAgIH0KCiAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nOwogICAgfQoKICAgIGl0ZW0udmlzaWJsZSA9IGZhbHNlOwogIH0sCgogIC8vICMjIyBDSEVDSyBNRSAjIyMgc3dpdGNoIHRvIGFkZC9yZW1vdmUgImhpZGRlbiIgY2xhc3MKICB1bmZvbGQ6IGZ1bmN0aW9uIChpdGVtKSB7CiAgICBpZiAoaXRlbSkKICAgIHsKICAgICAgdGhpcy5hZGRfY2xhc3MoaXRlbSwgInVuZm9sZGVkIik7CiAgICAgIHRoaXMucmVtb3ZlX2NsYXNzKGl0ZW0sICJmb2xkZWQiKTsKICAgIH0KCiAgICB2YXIgbm9kZSA9IGl0ZW0gPyBpdGVtLmZpcnN0Q2hpbGQgOiBudWxsOwoKICAgIHdoaWxlIChub2RlKQogICAgewogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxICYmIHRoaXMuaXNfYmxvY2sobm9kZSkpIC8vIGVsZW1lbnQKICAgICAgewogICAgICAgIHczY19zbGlkeS5yZW1vdmVfY2xhc3Mobm9kZSwgImhpZGRlbiIpOwogICAgICB9CgogICAgICBub2RlID0gbm9kZS5uZXh0U2libGluZzsKICAgIH0KCiAgICBpdGVtLnZpc2libGUgPSB0cnVlOwogIH0sCgogIG91dGxpbmVfY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICBpZiAoIWUpCiAgICAgIGUgPSB3aW5kb3cuZXZlbnQ7CgogICAgdmFyIHJpZ2h0Y2xpY2sgPSBmYWxzZTsKICAgIHZhciB0YXJnZXQgPSB3M2Nfc2xpZHkuZ2V0X3RhcmdldChlKTsKCiAgICB3aGlsZSAodGFyZ2V0ICYmIHRhcmdldC52aXNpYmxlID09IHVuZGVmaW5lZCkKICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7CgogICAgaWYgKCF0YXJnZXQpCiAgICAgIHJldHVybiB0cnVlOwoKICAgIGlmIChlLndoaWNoKQogICAgICByaWdodGNsaWNrID0gKGUud2hpY2ggPT0gMyk7CiAgICBlbHNlIGlmIChlLmJ1dHRvbikKICAgICAgcmlnaHRjbGljayA9IChlLmJ1dHRvbiA9PSAyKTsKCiAgICBpZiAoIXJpZ2h0Y2xpY2sgJiYgdGFyZ2V0LnZpc2libGUgIT0gdW5kZWZpbmVkKQogICAgewogICAgICBpZiAodGFyZ2V0LmZvbGRhYmxlKQogICAgICB7CiAgICAgICAgaWYgKHRhcmdldC52aXNpYmxlKQogICAgICAgICAgdzNjX3NsaWR5LmZvbGQodGFyZ2V0KTsKICAgICAgICBlbHNlCiAgICAgICAgICB3M2Nfc2xpZHkudW5mb2xkKHRhcmdldCk7CiAgICAgIH0KCiAgICAgIHczY19zbGlkeS5zdG9wX3Byb3BhZ2F0aW9uKGUpOwogICAgICBlLmNhbmNlbCA9IHRydWU7CiAgICAgIGUucmV0dXJuVmFsdWUgPSBmYWxzZTsKICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfSwKCiAgYWRkX2luaXRpYWxfcHJvbXB0OiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgcHJvbXB0ID0gdGhpcy5jcmVhdGVfZWxlbWVudCgiZGl2Iik7CiAgICBwcm9tcHQuc2V0QXR0cmlidXRlKCJjbGFzcyIsICJpbml0aWFsX3Byb21wdCIpOwoKICAgIHZhciBwMSA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoInAiKTsKICAgIHByb21wdC5hcHBlbmRDaGlsZChwMSk7CiAgICBwMS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgImhlbHAiKTsKCiAgICBpZiAodGhpcy5rZXlib2FyZGxlc3MpCiAgICAgIHAxLmlubmVySFRNTCA9ICJzd2lwZSBsZWZ0IHRvIG1vdmUgdG8gbmV4dCBzbGlkZSI7CiAgICBlbHNlCiAgICAgIHAxLmlubmVySFRNTCA9ICJTcGFjZSwgUmlnaHQgQXJyb3cgb3Igc3dpcGUgbGVmdCB0byBtb3ZlIHRvICIgKwogICAgICAgICAgICAgICAgICAgICAibmV4dCBzbGlkZSwgY2xpY2sgaGVscCBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzIjsKCiAgICB0aGlzLmFkZF9saXN0ZW5lcihwcm9tcHQsICJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQocHJvbXB0KTsKICAgICAgdzNjX3NsaWR5LnN0b3BfcHJvcGFnYXRpb24oZSk7CiAgICAKICAgICAgaWYgKGUuY2FuY2VsICE9IHVuZGVmaW5lZCkKICAgICAgICBlLmNhbmNlbCA9IHRydWU7CiAgICAgIAogICAgICBpZiAoZS5yZXR1cm5WYWx1ZSAhPSB1bmRlZmluZWQpCiAgICAgICAgZS5yZXR1cm5WYWx1ZSA9IGZhbHNlOwogICAgICAKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CgogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwcm9tcHQpOwogICAgdGhpcy5pbml0aWFsX3Byb21wdCA9IHByb21wdDsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChwcm9tcHQpO30sIDUwMDApOwogIH0sCgogIGFkZF90b29sYmFyOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgY291bnRlciwgcGFnZTsKCiAgICAgdGhpcy50b29sYmFyID0gdGhpcy5jcmVhdGVfZWxlbWVudCgiZGl2Iik7CiAgICAgdGhpcy50b29sYmFyLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCAidG9vbGJhciIpOwoKICAgICAvLyBhIHJlYXNvbmFibHkgYmVoYXZlZCBicm93c2VyCiAgICAgaWYgKHRoaXMubnNfcG9zIHx8ICF0aGlzLmllNikKICAgICB7CiAgICAgICB2YXIgcmlnaHQgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJkaXYiKTsKICAgICAgIHJpZ2h0LnNldEF0dHJpYnV0ZSgic3R5bGUiLCAiZmxvYXQ6IHJpZ2h0OyB0ZXh0LWFsaWduOiByaWdodCIpOwoKICAgICAgIGNvdW50ZXIgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJzcGFuIikKICAgICAgIGNvdW50ZXIuaW5uZXJIVE1MID0gdGhpcy5sb2NhbGl6ZSgic2xpZGUiKSArICIgbi9tIjsKICAgICAgIHJpZ2h0LmFwcGVuZENoaWxkKGNvdW50ZXIpOwogICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKHJpZ2h0KTsKCiAgICAgICB2YXIgbGVmdCA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoImRpdiIpOwogICAgICAgbGVmdC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwgInRleHQtYWxpZ246IGxlZnQiKTsKCiAgICAgICAvLyBnbG9iYWwgZW5kIG9mIHNsaWRlIGluZGljYXRvcgogICAgICAgdGhpcy5lb3MgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJzcGFuIik7CiAgICAgICB0aGlzLmVvcy5pbm5lckhUTUwgPSAiKiAiOwogICAgICAgbGVmdC5hcHBlbmRDaGlsZCh0aGlzLmVvcyk7CgogICAgICAgdmFyIGhlbHAgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJhIik7CiAgICAgICBoZWxwLnNldEF0dHJpYnV0ZSgiaHJlZiIsIHRoaXMuaGVscF9wYWdlKTsKICAgICAgIGhlbHAuc2V0QXR0cmlidXRlKCJ0aXRsZSIsIHRoaXMubG9jYWxpemUodGhpcy5oZWxwX3RleHQpKTsKICAgICAgIGhlbHAuaW5uZXJIVE1MID0gdGhpcy5sb2NhbGl6ZSgiaGVscD8iKTsKICAgICAgIGxlZnQuYXBwZW5kQ2hpbGQoaGVscCk7CiAgICAgICBoZWxwLnN0eWxlLmRpc3BsYXk9Im5vbmUiOyAKICAgICAgIHRoaXMuaGVscF9hbmNob3IgPSBoZWxwOyAgLy8gc2F2ZSBmb3IgZm9jdXMgaGFjawoKICAgICAgIHZhciBnYXAxID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiAiKTsKICAgICAgIGxlZnQuYXBwZW5kQ2hpbGQoZ2FwMSk7CgogICAgICAgdmFyIGNvbnRlbnRzID0gdGhpcy5jcmVhdGVfZWxlbWVudCgiYSIpOwogICAgICAgY29udGVudHMuc2V0QXR0cmlidXRlKCJocmVmIiwgImphdmFzY3JpcHQ6dzNjX3NsaWR5LnRvZ2dsZV90YWJsZV9vZl9jb250ZW50cygpIik7CiAgICAgICBjb250ZW50cy5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgdGhpcy5sb2NhbGl6ZSgidGFibGUgb2YgY29udGVudHMiKSk7CiAgICAgICBjb250ZW50cy5pbm5lckhUTUwgPSB0aGlzLmxvY2FsaXplKCJDb250ZW50cyIpOwogICAgICAgbGVmdC5hcHBlbmRDaGlsZChjb250ZW50cyk7CgogICAgICAgdmFyIGdhcDIgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpOwogICAgICAgbGVmdC5hcHBlbmRDaGlsZChnYXAyKTsKCiAgICAgICB2YXIgY29weXJpZ2h0ID0gdGhpcy5maW5kX2NvcHlyaWdodCgpOwoKICAgICAgIGlmIChjb3B5cmlnaHQpCiAgICAgICB7CiAgICAgICAgIHZhciBzcGFuID0gdGhpcy5jcmVhdGVfZWxlbWVudCgic3BhbiIpOwogICAgICAgICBzcGFuLmNsYXNzTmFtZSA9ICJjb3B5cmlnaHQiOwogICAgICAgICBzcGFuLmlubmVySFRNTCA9IGNvcHlyaWdodDsKICAgICAgICAgbGVmdC5hcHBlbmRDaGlsZChzcGFuKTsKICAgICAgIH0KCiAgICAgICB0aGlzLnRvb2xiYXIuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsICIwIik7CiAgICAgICB0aGlzLnRvb2xiYXIuYXBwZW5kQ2hpbGQobGVmdCk7CiAgICAgfQogICAgIGVsc2UgLy8gSUU2IHNvIG5lZWQgdG8gd29yayBhcm91bmQgaXRzIHBvb3IgQ1NTIHN1cHBvcnQKICAgICB7CiAgICAgICB0aGlzLnRvb2xiYXIuc3R5bGUucG9zaXRpb24gPSAodGhpcy5pZTcgPyAiZml4ZWQiIDogImFic29sdXRlIik7CiAgICAgICB0aGlzLnRvb2xiYXIuc3R5bGUuekluZGV4ID0gIjIwMCI7CiAgICAgICB0aGlzLnRvb2xiYXIuc3R5bGUud2lkdGggPSAiOTkuOSUiOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLmhlaWdodCA9ICIxLjJlbSI7CiAgICAgICB0aGlzLnRvb2xiYXIuc3R5bGUudG9wID0gImF1dG8iOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLmJvdHRvbSA9ICIwIjsKICAgICAgIHRoaXMudG9vbGJhci5zdHlsZS5sZWZ0ID0gIjAiOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLnJpZ2h0ID0gIjAiOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLnRleHRBbGlnbiA9ICJsZWZ0IjsKICAgICAgIHRoaXMudG9vbGJhci5zdHlsZS5mb250U2l6ZSA9ICI2MCUiOwogICAgICAgdGhpcy50b29sYmFyLnN0eWxlLmNvbG9yID0gInJlZCI7CiAgICAgICB0aGlzLnRvb2xiYXIuYm9yZGVyV2lkdGggPSAwOwogICAgICAgdGhpcy50b29sYmFyLmNsYXNzTmFtZSA9ICJ0b29sYmFyIjsKICAgICAgIHRoaXMudG9vbGJhci5zdHlsZS5iYWNrZ3JvdW5kID0gInJnYigyNDAsMjQwLDI0MCkiOwoKICAgICAgIC8vIHdvdWxkIGxpa2UgdG8gaGF2ZSBoZWxwIHRleHQgbGVmdCBhbGlnbmVkCiAgICAgICAvLyBhbmQgcGFnZSBjb3VudGVyIHJpZ2h0IGFsaWduZWQsIGZsb2F0aW5nCiAgICAgICAvLyBkaXYncyBkb24ndCB3b3JrLCBzbyBpbnN0ZWFkIHVzZSBuZXN0ZWQKICAgICAgIC8vIGFic29sdXRlbHkgcG9zaXRpb25lZCBkaXYncy4KCiAgICAgICB2YXIgc3AgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJzcGFuIik7CiAgICAgICBzcC5pbm5lckhUTUwgPSAiJm5ic3A7Jm5ic3A7KiZuYnNwOyI7CiAgICAgICB0aGlzLnRvb2xiYXIuYXBwZW5kQ2hpbGQoc3ApOwogICAgICAgdGhpcy5lb3MgPSBzcDsgIC8vIGVuZCBvZiBzbGlkZSBpbmRpY2F0b3IKCiAgICAgICB2YXIgaGVscCA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoImEiKTsKICAgICAgIGhlbHAuc2V0QXR0cmlidXRlKCJocmVmIiwgdGhpcy5oZWxwX3BhZ2UpOwogICAgICAgaGVscC5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgdGhpcy5sb2NhbGl6ZSh0aGlzLmhlbHBfdGV4dCkpOwogICAgICAgaGVscC5pbm5lckhUTUwgPSB0aGlzLmxvY2FsaXplKCJoZWxwPyIpOwogICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKGhlbHApOwogICAgICAgdGhpcy5oZWxwX2FuY2hvciA9IGhlbHA7ICAvLyBzYXZlIGZvciBmb2N1cyBoYWNrCgogICAgICAgdmFyIGdhcDEgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpOwogICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKGdhcDEpOwoKICAgICAgIHZhciBjb250ZW50cyA9IHRoaXMuY3JlYXRlX2VsZW1lbnQoImEiKTsKICAgICAgIGNvbnRlbnRzLnNldEF0dHJpYnV0ZSgiaHJlZiIsICJqYXZhc2NyaXB0OnRvZ2dsZVRhYmxlT2ZDb250ZW50cygpIik7CiAgICAgICBjb250ZW50cy5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgdGhpcy5sb2NhbGl6ZSgidGFibGUgb2YgY29udGVudHMiLmxvY2FsaXplKSk7CiAgICAgICBjb250ZW50cy5pbm5lckhUTUwgPSB0aGlzLmxvY2FsaXplKCJjb250ZW50cz8iKTsKICAgICAgIHRoaXMudG9vbGJhci5hcHBlbmRDaGlsZChjb250ZW50cyk7CgogICAgICAgdmFyIGdhcDIgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiICIpOwogICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKGdhcDIpOwoKICAgICAgIHZhciBjb3B5cmlnaHQgPSB0aGlzLmZpbmRfY29weXJpZ2h0KCk7CgogICAgICAgaWYgKGNvcHlyaWdodCkKICAgICAgIHsKICAgICAgICAgdmFyIHNwYW4gPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJzcGFuIik7CiAgICAgICAgIHNwYW4uaW5uZXJIVE1MID0gY29weXJpZ2h0OwogICAgICAgICBzcGFuLnN0eWxlLmNvbG9yID0gImJsYWNrIjsKICAgICAgICAgc3Bhbi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjAuNWVtIjsKICAgICAgICAgdGhpcy50b29sYmFyLmFwcGVuZENoaWxkKHNwYW4pOwogICAgICAgfQoKICAgICAgIGNvdW50ZXIgPSB0aGlzLmNyZWF0ZV9lbGVtZW50KCJkaXYiKQogICAgICAgY291bnRlci5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICAgICBjb3VudGVyLnN0eWxlLndpZHRoID0gImF1dG8iOyAvLyIyMCUiOwogICAgICAgY291bnRlci5zdHlsZS5oZWlnaHQgPSAiMS4yZW0iOwogICAgICAgY291bnRlci5zdHlsZS50b3AgPSAiYXV0byI7CiAgICAgICBjb3VudGVyLnN0eWxlLmJvdHRvbSA9IDA7CiAgICAgICBjb3VudGVyLnN0eWxlLnJpZ2h0ID0gIjAiOwogICAgICAgY291bnRlci5zdHlsZS50ZXh0QWxpZ24gPSAicmlnaHQiOwogICAgICAgY291bnRlci5zdHlsZS5jb2xvciA9ICJyZWQiOwogICAgICAgY291bnRlci5zdHlsZS5iYWNrZ3JvdW5kID0gInJnYigyNDAsMjQwLDI0MCkiOwoKICAgICAgIGNvdW50ZXIuaW5uZXJIVE1MID0gdGhpcy5sb2NhbGl6ZSgic2xpZGUiKSArICIgbi9tIjsKICAgICAgIHRoaXMudG9vbGJhci5hcHBlbmRDaGlsZChjb3VudGVyKTsKICAgICB9CgogICAgIC8vIGVuc3VyZSB0aGF0IGNsaWNrIGlzbid0IHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBwYWdlCiAgICAgdGhpcy50b29sYmFyLm9uY2xpY2sgPQogICAgICAgICBmdW5jdGlvbiAoZSkgewogICAgICAgICAgIGlmICghZSkKICAgICAgICAgICAgIGUgPSB3aW5kb3cuZXZlbnQ7CgogICAgICAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldDsKCiAgICAgICAgICAgaWYgKCF0YXJnZXQgJiYgZS5zcmNFbGVtZW50KQogICAgICAgICAgICAgdGFyZ2V0ID0gZS5zcmNFbGVtZW50OwoKICAgICAgICAgICAvLyB3b3JrIGFyb3VuZCBTYWZhcmkgYnVnCiAgICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQubm9kZVR5cGUgPT0gMykKICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlOwoKICAgICAgICAgICB3M2Nfc2xpZHkuc3RvcF9wcm9wYWdhdGlvbihlKTsKCiAgICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSAiYSIpCiAgICAgICAgICAgICB3M2Nfc2xpZHkubW91c2VfYnV0dG9uX2NsaWNrKGUpOwogICAgICAgICB9OwoKICAgICB0aGlzLnNsaWRlX251bWJlcl9lbGVtZW50ID0gY291bnRlcjsKICAgICB0aGlzLnNldF9lb3Nfc3RhdHVzKGZhbHNlKTsKICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMudG9vbGJhcik7CiAgfSwKCiAgLy8gd3lzaXd5ZyBlZGl0b3JzIG1ha2UgaXQgaGFyZCB0byB1c2UgZGl2IGVsZW1lbnRzCiAgLy8gZS5nLiBhbWF5YSBsb3NlcyB0aGUgZGl2IHdoZW4geW91IGNvcHkgYW5kIHBhc3RlCiAgLy8gdGhpcyBmdW5jdGlvbiB3cmFwcyBkaXYgZWxlbWVudHMgYXJvdW5kIGltcGxpY2l0CiAgLy8gc2xpZGVzIHdoaWNoIHN0YXJ0IHdpdGggYW4gaDEgZWxlbWVudCBhbmQgY29udGludWUKICAvLyB1cCB0byB0aGUgbmV4dCBoZWFkaW5nIG9yIGRpdiBlbGVtZW50CiAgd3JhcF9pbXBsaWNpdF9zbGlkZXM6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBpLCBoZWFkaW5nLCBub2RlLCBuZXh0LCBkaXY7CiAgICB2YXIgaGVhZGluZ3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaDEiKTsKCiAgICBpZiAoIWhlYWRpbmdzKQogICAgICByZXR1cm47CgogICAgZm9yIChpID0gMDsgaSA8IGhlYWRpbmdzLmxlbmd0aDsgKytpKQogICAgewogICAgICBoZWFkaW5nID0gaGVhZGluZ3NbaV07CgogICAgICBpZiAoaGVhZGluZy5wYXJlbnROb2RlICE9IGRvY3VtZW50LmJvZHkpCiAgICAgICAgY29udGludWU7CgogICAgICBub2RlID0gaGVhZGluZy5uZXh0U2libGluZzsKCiAgICAgIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICB0aGlzLmFkZF9jbGFzcyhkaXYsICJzbGlkZSIpOwogICAgICBkb2N1bWVudC5ib2R5LnJlcGxhY2VDaGlsZChkaXYsIGhlYWRpbmcpOwogICAgICBkaXYuYXBwZW5kQ2hpbGQoaGVhZGluZyk7CgogICAgICB3aGlsZSAobm9kZSkKICAgICAgewogICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEpIC8vIGFuIGVsZW1lbnQKICAgICAgICB7CiAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gIkgxIiB8fCBub2RlLm5vZGVOYW1lID09ICJoMSIpCiAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gIkRJViIgfHwgbm9kZS5ub2RlTmFtZSA9PSAiZGl2IikKICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAodGhpcy5oYXNfY2xhc3Mobm9kZSwgInNsaWRlIikpCiAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgIGlmICh0aGlzLmhhc19jbGFzcyhub2RlLCAiaGFuZG91dCIpKQogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBuZXh0ID0gbm9kZS5uZXh0U2libGluZzsKICAgICAgICBub2RlID0gZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChub2RlKTsKICAgICAgICBkaXYuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICAgICAgbm9kZSA9IG5leHQ7CiAgICAgIH0gCiAgICB9CiAgfSwKCiAgYXR0YWNoX3RvdWNoX2hhbmRlcnM6IGZ1bmN0aW9uKHNsaWRlcykKICB7CiAgICB2YXIgaSwgc2xpZGU7CgogICAgZm9yIChpID0gMDsgaSA8IHNsaWRlcy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgc2xpZGUgPSBzbGlkZXNbaV07CiAgICAgIHRoaXMuYWRkX2xpc3RlbmVyKHNsaWRlLCAidG91Y2hzdGFydCIsIHRoaXMudG91Y2hzdGFydCk7CiAgICAgIHRoaXMuYWRkX2xpc3RlbmVyKHNsaWRlLCAidG91Y2htb3ZlIiwgdGhpcy50b3VjaG1vdmUpOwogICAgICB0aGlzLmFkZF9saXN0ZW5lcihzbGlkZSwgInRvdWNoZW5kIiwgdGhpcy50b3VjaGVuZCk7CiAgICB9CiAgfSwKCi8vIHJldHVybiBuZXcgYXJyYXkgb2YgYWxsIHNsaWRlcwogIGNvbGxlY3Rfc2xpZGVzOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2xpZGVzID0gbmV3IEFycmF5KCk7CiAgICB2YXIgZGl2cyA9IGRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGl2cy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgZGl2ID0gZGl2cy5pdGVtKGkpOwoKICAgICAgaWYgKHRoaXMuaGFzX2NsYXNzKGRpdiwgInNsaWRlIikpCiAgICAgIHsKICAgICAgICAvLyBhZGQgc2xpZGUgdG8gY29sbGVjdGlvbgogICAgICAgIHNsaWRlc1tzbGlkZXMubGVuZ3RoXSA9IGRpdjsKCiAgICAgICAgLy8gaGlkZSBlYWNoIHNsaWRlIGFzIGl0IGlzIGZvdW5kCiAgICAgICAgdGhpcy5hZGRfY2xhc3MoZGl2LCAiaGlkZGVuIik7CgogICAgICAgIC8vIGFkZCBkdW1teSA8YnIvPiBhdCBlbmQgZm9yIHNjcm9sbGluZyBoYWNrCiAgICAgICAgdmFyIG5vZGUxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnIiKTsKICAgICAgICBkaXYuYXBwZW5kQ2hpbGQobm9kZTEpOwogICAgICAgIHZhciBub2RlMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIik7CiAgICAgICAgZGl2LmFwcGVuZENoaWxkKG5vZGUyKTsKICAgICAgfQogICAgICBlbHNlIGlmICh0aGlzLmhhc19jbGFzcyhkaXYsICJiYWNrZ3JvdW5kIikpCiAgICAgIHsgIC8vIHdvcmsgYXJvdW5kIGZvciBGaXJlZm94IFNWRyByZWxvYWQgYnVnCiAgICAgICAgLy8gd2hpY2ggb3RoZXJ3aXNlIHJlcGxhY2VzIDFzdCBTVkcgZ3JhcGhpYyB3aXRoIDJuZAogICAgICAgIGRpdi5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKICAgICAgfQogICAgfQoKICAgIHRoaXMuc2xpZGVzID0gc2xpZGVzOwogIH0sCgogIC8vIHJldHVybiBuZXcgYXJyYXkgb2YgYWxsIDxkaXYgY2xhc3M9ImhhbmRvdXQiPgogIGNvbGxlY3Rfbm90ZXM6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBub3RlcyA9IG5ldyBBcnJheSgpOwogICAgdmFyIGRpdnMgPSBkb2N1bWVudC5ib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpdnMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIGRpdiA9IGRpdnMuaXRlbShpKTsKCiAgICAgIGlmICh0aGlzLmhhc19jbGFzcyhkaXYsICJoYW5kb3V0IikpCiAgICAgIHsKICAgICAgICAvLyBhZGQgbm90ZSB0byBjb2xsZWN0aW9uCiAgICAgICAgbm90ZXNbbm90ZXMubGVuZ3RoXSA9IGRpdjsKCiAgICAgICAgLy8gYW5kIGhpZGUgaXQKICAgICAgICB0aGlzLmFkZF9jbGFzcyhkaXYsICJoaWRkZW4iKTsKICAgICAgfQogICAgfQoKICAgIHRoaXMubm90ZXMgPSBub3RlczsKICB9LAoKICAvLyByZXR1cm4gbmV3IGFycmF5IG9mIGFsbCA8ZGl2IGNsYXNzPSJiYWNrZ3JvdW5kIj4KICAvLyBpbmNsdWRpbmcgbmFtZWQgYmFja2dyb3VuZHMgZS5nLiBjbGFzcz0iYmFja2dyb3VuZCB0aXRsZXBhZ2UiCiAgY29sbGVjdF9iYWNrZ3JvdW5kczogZnVuY3Rpb24gKCkgewogICAgdmFyIGJhY2tncm91bmRzID0gbmV3IEFycmF5KCk7CiAgICB2YXIgZGl2cyA9IGRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGl2cy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgZGl2ID0gZGl2cy5pdGVtKGkpOwoKICAgICAgaWYgKHRoaXMuaGFzX2NsYXNzKGRpdiwgImJhY2tncm91bmQiKSkKICAgICAgewogICAgICAgIC8vIGFkZCBiYWNrZ3JvdW5kIHRvIGNvbGxlY3Rpb24KICAgICAgICBiYWNrZ3JvdW5kc1tiYWNrZ3JvdW5kcy5sZW5ndGhdID0gZGl2OwoKICAgICAgICAvLyBhbmQgaGlkZSBpdAogICAgICAgIHRoaXMuYWRkX2NsYXNzKGRpdiwgImhpZGRlbiIpOwogICAgICB9CiAgICB9CgogICAgdGhpcy5iYWNrZ3JvdW5kcyA9IGJhY2tncm91bmRzOwogIH0sCgogIC8vIHNldCBjbGljayBoYW5kbGVycyBvbiBhbGwgYW5jaG9ycwogIHBhdGNoX2FuY2hvcnM6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxmID0gdzNjX3NsaWR5OwogICAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgLy8gY29tcGFyZSB0aGlzLmhyZWYgd2l0aCBsb2NhdGlvbi5ocmVmCiAgICAgIC8vIGZvciBsaW5rIHRvIGFub3RoZXIgc2xpZGUgaW4gdGhpcyBkb2MKCiAgICAgIGlmIChzZWxmLnBhZ2VfYWRkcmVzcyh0aGlzLmhyZWYpID09IHNlbGYucGFnZV9hZGRyZXNzKGxvY2F0aW9uLmhyZWYpKQogICAgICB7CiAgICAgICAgLy8geWVzLCBzbyBmaW5kIG5ldyBzbGlkZSBudW1iZXIKICAgICAgICB2YXIgbmV3c2xpZGVudW0gPSBzZWxmLmZpbmRfc2xpZGVfbnVtYmVyKHRoaXMuaHJlZik7CgogICAgICAgIGlmIChuZXdzbGlkZW51bSAhPSBzZWxmLnNsaWRlX251bWJlcikKICAgICAgICB7CiAgICAgICAgICB2YXIgc2xpZGUgPSBzZWxmLnNsaWRlc1tzZWxmLnNsaWRlX251bWJlcl07CiAgICAgICAgICBzZWxmLmhpZGVfc2xpZGUoc2xpZGUpOwogICAgICAgICAgc2VsZi5zbGlkZV9udW1iZXIgPSBuZXdzbGlkZW51bTsKICAgICAgICAgIHNsaWRlID0gc2VsZi5zbGlkZXNbc2VsZi5zbGlkZV9udW1iZXJdOwogICAgICAgICAgc2VsZi5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgICAgIHNlbGYuc2V0X2xvY2F0aW9uKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UKICAgICAgICB3M2Nfc2xpZHkuc3RvcF9wcm9wYWdhdGlvbihldmVudCk7CgovLyAgICAgIGVsc2UgaWYgKHRoaXMudGFyZ2V0ID09IG51bGwpCi8vICAgICAgICBsb2NhdGlvbi5ocmVmID0gdGhpcy5ocmVmOwoKICAgICAgdGhpcy5ibHVyKCk7CiAgICAgIHNlbGYuZGlzYWJsZV9zbGlkZV9jbGljayA9IHRydWU7CiAgICB9OwoKICAgIHZhciBhbmNob3JzID0gZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5jaG9ycy5sZW5ndGg7ICsraSkKICAgIHsKICAgICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKQogICAgICAgIGFuY2hvcnNbaV0uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBoYW5kbGVyLCBmYWxzZSk7CiAgICAgIGVsc2UKICAgICAgICBhbmNob3JzW2ldLmF0dGFjaEV2ZW50KCJvbmNsaWNrIiwgaGFuZGxlcik7CiAgICB9CiAgfSwKCiAgLy8gIyMjIENIRUNLIE1FICMjIyBzZWUgd2hpY2ggZnVuY3Rpb25zIGFyZSBpbnZva2VkIHZpYSBzZXRUaW1lb3V0CiAgLy8gZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgZm9yIHVzZSBvZiB3M2Nfc2xpZHkgdnMgdGhpcwogIHNob3dfc2xpZGVfbnVtYmVyOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgdGltZXIgPSB3M2Nfc2xpZHkuZ2V0X3RpbWVyKCk7CiAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyX2VsZW1lbnQuaW5uZXJIVE1MID0gdGltZXIgKyB3M2Nfc2xpZHkubG9jYWxpemUoInNsaWRlIikgKyAiICIgKwogICAgICAgICAgICh3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyICsgMSkgKyAiLyIgKyB3M2Nfc2xpZHkuc2xpZGVzLmxlbmd0aDsKICB9LAoKICAvLyBldmVyeSAyMDBtUyBjaGVjayBpZiB0aGUgbG9jYXRpb24gaGFzIGJlZW4gY2hhbmdlZCBhcyBhCiAgLy8gcmVzdWx0IG9mIHRoZSB1c2VyIGFjdGl2YXRpbmcgdGhlIEJhY2sgYnV0dG9uL21lbnUgaXRlbQogIC8vIGRvZXNuJ3Qgd29yayBmb3IgT3BlcmEgPCA5LjUKICBjaGVja19sb2NhdGlvbjogZnVuY3Rpb24gKCkgewogICAgdmFyIGhhc2ggPSBsb2NhdGlvbi5oYXNoOwoKICAgIGlmICh3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyID4gMCAmJiAoaGFzaCA9PSAiIiB8fCBoYXNoID09ICIjIikpCiAgICAgIHczY19zbGlkeS5nb3RvX3NsaWRlKDApOwogICAgZWxzZSBpZiAoaGFzaC5sZW5ndGggPiAyICYmIGhhc2ggIT0gIiMoIisodzNjX3NsaWR5LnNsaWRlX251bWJlcisxKSsiKSIpCiAgICB7CiAgICAgIHZhciBudW0gPSBwYXJzZUludChsb2NhdGlvbi5oYXNoLnN1YnN0cigyKSk7CgogICAgICBpZiAoIWlzTmFOKG51bSkpCiAgICAgICAgdzNjX3NsaWR5LmdvdG9fc2xpZGUobnVtLTEpOwogICAgfQoKICAgIGlmICh3M2Nfc2xpZHkudGltZV9sZWZ0ICYmIHczY19zbGlkeS5zbGlkZV9udW1iZXIgPiAwKQogICAgewogICAgICB3M2Nfc2xpZHkuc2hvd19zbGlkZV9udW1iZXIoKTsKCiAgICAgIGlmICh3M2Nfc2xpZHkudGltZV9sZWZ0ID4gMCkKICAgICAgICB3M2Nfc2xpZHkudGltZV9sZWZ0IC09IDIwMDsKICAgIH0gCiAgfSwKCiAgZ2V0X3RpbWVyOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgdGltZXIgPSAiIjsKICAgIGlmICh3M2Nfc2xpZHkudGltZV9sZWZ0KQogICAgewogICAgICB2YXIgbWlucywgc2VjczsKICAgICAgc2VjcyA9IE1hdGguZmxvb3IodzNjX3NsaWR5LnRpbWVfbGVmdC8xMDAwKTsKICAgICAgbWlucyA9IE1hdGguZmxvb3Ioc2VjcyAvIDYwKTsKICAgICAgc2VjcyA9IHNlY3MgJSA2MDsKICAgICAgdGltZXIgPSAobWlucyA/IG1pbnMrIm0iIDogIiIpICsgc2VjcyArICJzICI7CiAgICB9CgogICAgcmV0dXJuIHRpbWVyOwogIH0sCgogIC8vIHRoaXMgZG9lc24ndCBwdXNoIGxvY2F0aW9uIG9udG8gaGlzdG9yeSBzdGFjayBmb3IgSUUKICAvLyBmb3Igd2hpY2ggYSBoaWRkZW4gaWZyYW1lIGhhY2sgaXMgbmVlZGVkOiBsb2FkIHBhZ2UgaW50bwogIC8vIHRoZSBpZnJhbWUgd2l0aCBzY3JpcHQgdGhhdCBzZXQncyBwYXJlbnQncyBsb2NhdGlvbi5oYXNoCiAgLy8gYnV0IHRoYXQgd29uJ3Qgd29yayBmb3Igc3RhbmRhbG9uZSB1c2UgdW5sZXNzIHdlIGNhbgogIC8vIGNyZWF0ZSB0aGUgcGFnZSBkeW5hbWljYWxseSB2aWEgYSBqYXZhc2NyaXB0OiBVUkwKICAvLyAjIyMgdXNlIGhpc3RvcnkucHVzaFN0YXRlIGlmIGF2YWlsYWJsZQogIHNldF9sb2NhdGlvbjogZnVuY3Rpb24gKCkgewogICAgIHZhciB1cmkgPSB3M2Nfc2xpZHkucGFnZV9hZGRyZXNzKGxvY2F0aW9uLmhyZWYpOwogICAgIHZhciBoYXNoID0gIiMoIiArICh3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyKzEpICsgIikiOwoKICAgICBpZiAodzNjX3NsaWR5LnNsaWRlX251bWJlciA+PSAwKQogICAgICAgdXJpID0gdXJpICsgaGFzaDsKCiAgICAgaWYgKHR5cGVvZihoaXN0b3J5LnB1c2hTdGF0ZSkgIT0gInVuZGVmaW5lZCIgJiYgbG9jYXRpb24ucHJvdG9jb2wgIT09ICJmaWxlOiIpCiAgICAgewogICAgICAgZG9jdW1lbnQudGl0bGUgPSB3M2Nfc2xpZHkudGl0bGUgKyAiICgiICsgKHczY19zbGlkeS5zbGlkZV9udW1iZXIrMSkgKyAiKSI7CiAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZSgwLCBkb2N1bWVudC50aXRsZSwgaGFzaCk7CiAgICAgICB3M2Nfc2xpZHkuc2hvd19zbGlkZV9udW1iZXIoKTsKICAgICAgIHczY19zbGlkeS5ub3RpZnlfb2JzZXJ2ZXJzKCk7CiAgICAgICByZXR1cm47CiAgICAgfQoKICAgICBpZiAodzNjX3NsaWR5LmllICYmICh3M2Nfc2xpZHkuaWU2IHx8IHczY19zbGlkeS5pZTcpKQogICAgICAgdzNjX3NsaWR5LnB1c2hfaGFzaChoYXNoKTsKCiAgICAgaWYgKHVyaSAhPSBsb2NhdGlvbi5ocmVmKSAvLyAmJiAha2h0bWwKICAgICAgICBsb2NhdGlvbi5ocmVmID0gdXJpOwoKICAgICBpZiAodGhpcy5raHRtbCkKICAgICAgICBoYXNoID0gIigiICsgKHczY19zbGlkeS5zbGlkZV9udW1iZXIrMSkgKyAiKSI7CgogICAgIGlmICghdGhpcy5pZSAmJiBsb2NhdGlvbi5oYXNoICE9IGhhc2ggJiYgbG9jYXRpb24uaGFzaCAhPSAiIikKICAgICAgIGxvY2F0aW9uLmhhc2ggPSBoYXNoOwoKICAgICBkb2N1bWVudC50aXRsZSA9IHczY19zbGlkeS50aXRsZSArICIgKCIgKyAodzNjX3NsaWR5LnNsaWRlX251bWJlcisxKSArICIpIjsKICAgICB3M2Nfc2xpZHkuc2hvd19zbGlkZV9udW1iZXIoKTsKICAgICB3M2Nfc2xpZHkubm90aWZ5X29ic2VydmVycygpOwogIH0sCgogIG5vdGlmeV9vYnNlcnZlcnM6IGZ1bmN0aW9uICgpCiAgewogICAgdmFyIHNsaWRlID0gdGhpcy5zbGlkZXNbdGhpcy5zbGlkZV9udW1iZXJdOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vYnNlcnZlcnMubGVuZ3RoOyArK2kpCiAgICAgIHRoaXMub2JzZXJ2ZXJzW2ldKHRoaXMuc2xpZGVfbnVtYmVyKzEsIHRoaXMuZmluZF9oZWFkaW5nKHNsaWRlKS5pbm5lclRleHQsIGxvY2F0aW9uLmhyZWYpOwogIH0sCgogIGFkZF9vYnNlcnZlcjogZnVuY3Rpb24gKG9ic2VydmVyKQogIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vYnNlcnZlcnMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIGlmIChvYnNlcnZlciA9PSB0aGlzLm9ic2VydmVyc1tpXSkKICAgICAgICByZXR1cm47CiAgICB9CgogICAgdGhpcy5vYnNlcnZlcnMucHVzaChvYnNlcnZlcik7CiAgfSwKCiAgcmVtb3ZlX29ic2VydmVyOiBmdW5jdGlvbiAobykKICB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub2JzZXJ2ZXJzLmxlbmd0aDsgKytpKQogICAgewogICAgICBpZiAob2JzZXJ2ZXIgPT0gdGhpcy5vYnNlcnZlcnNbaV0pCiAgICAgIHsKICAgICAgICB0aGlzLm9ic2VydmVycy5zcGxpY2UoaSwxKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0sCgogIHBhZ2VfYWRkcmVzczogZnVuY3Rpb24gKHVyaSkgewogICAgdmFyIGkgPSB1cmkuaW5kZXhPZigiIyIpOwoKICAgIGlmIChpIDwgMCkKICAgICAgaSA9IHVyaS5pbmRleE9mKCIlMjMiKTsKCiAgICAvLyBjaGVjayBpZiBhbmNob3IgaXMgZW50aXJlIHBhZ2UKCiAgICBpZiAoaSA8IDApCiAgICAgIHJldHVybiB1cmk7ICAvLyB5ZXMKCiAgICByZXR1cm4gdXJpLnN1YnN0cigwLCBpKTsKICB9LAoKICAvLyBvbmx5IHVzZWQgZm9yIElFNiBhbmQgSUU3CiAgb25fZnJhbWVfbG9hZGVkOiBmdW5jdGlvbiAoaGFzaCkgewogICAgbG9jYXRpb24uaGFzaCA9IGhhc2g7CiAgICB2YXIgdXJpID0gdzNjX3NsaWR5LnBhZ2VfYWRkcmVzcyhsb2NhdGlvbi5ocmVmKTsKICAgIGxvY2F0aW9uLmhyZWYgPSB1cmkgKyBoYXNoOwogIH0sCgogIC8vIGhpc3RvcnkgaGFjayB3aXRoIHRoYW5rcyB0byBCZXJ0cmFuZCBMZSBSb3kKICBwdXNoX2hhc2g6IGZ1bmN0aW9uIChoYXNoKSB7CiAgICBpZiAoaGFzaCA9PSAiIikgaGFzaCA9ICIjKDEpIjsKICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2ggPSBoYXNoOwoKICAgIHZhciBkb2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaGlzdG9yeUZyYW1lIikuY29udGVudFdpbmRvdy5kb2N1bWVudDsKICAgIGRvYy5vcGVuKCJqYXZhc2NyaXB0Oic8aHRtbD48L2h0bWw+JyIpOwogICAgZG9jLndyaXRlKCI8aHRtbD48aGVhZD48c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIj53aW5kb3cucGFyZW50LnczY19zbGlkeS5vbl9mcmFtZV9sb2FkZWQoJyIrCiAgICAgIChoYXNoKSArICInKTs8L3NjcmlwdD48L2hlYWQ+PGJvZHk+aGVsbG8gbXVtPC9ib2R5PjwvaHRtbD4iKTsKICAgICAgZG9jLmNsb3NlKCk7CiAgfSwKCiAgLy8gZmluZCBjdXJyZW50IHNsaWRlIGJhc2VkIHVwb24gbG9jYXRpb24KICAvLyBmaXJzdCBmaW5kIHRhcmdldCBhbmNob3IgYW5kIHRoZW4gbG9vawogIC8vIGZvciBhc3NvY2lhdGVkIGRpdiBlbGVtZW50IGVuY2xvc2luZyBpdAogIC8vIGZpbmFsbHkgbWFwIHRoYXQgdG8gc2xpZGUgbnVtYmVyCiAgZmluZF9zbGlkZV9udW1iZXI6IGZ1bmN0aW9uICh1cmkpIHsKICAgIC8vIGZpcnN0IGdldCBhbmNob3IgZnJvbSBwYWdlIGxvY2F0aW9uCgogICAgdmFyIGkgPSB1cmkuaW5kZXhPZigiIyIpOwoKICAgIC8vIGNoZWNrIGlmIGFuY2hvciBpcyBlbnRpcmUgcGFnZQogICAgaWYgKGkgPCAwKQogICAgICByZXR1cm4gMDsgIC8vIHllcwoKICAgIHZhciBhbmNob3IgPSB1bmVzY2FwZSh1cmkuc3Vic3RyKGkrMSkpOwoKICAgIC8vIG5vdyB1c2UgYW5jaG9yIGFzIFhNTCBJRCB0byBmaW5kIHRhcmdldAogICAgdmFyIHRhcmdldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFuY2hvcik7CgogICAgaWYgKCF0YXJnZXQpCiAgICB7CiAgICAgIC8vIGRvZXMgYW5jaG9yIGxvb2sgbGlrZSAiKDIpIiBmb3Igc2xpZGUgMiA/PwogICAgICAvLyB3aGVyZSBmaXJzdCBzbGlkZSBpcyAoMSkKICAgICAgdmFyIHJlID0gL1woKFxkKStcKS87CgogICAgICBpZiAoYW5jaG9yLm1hdGNoKHJlKSkKICAgICAgewogICAgICAgIHZhciBudW0gPSBwYXJzZUludChhbmNob3Iuc3Vic3RyaW5nKDEsIGFuY2hvci5sZW5ndGgtMSkpOwoKICAgICAgICBpZiAobnVtID4gdGhpcy5zbGlkZXMubGVuZ3RoKQogICAgICAgICAgbnVtID0gMTsKCiAgICAgICAgaWYgKC0tbnVtIDwgMCkKICAgICAgICAgIG51bSA9IDA7CgogICAgICAgIHJldHVybiBudW07CiAgICAgIH0KCiAgICAgIC8vIGFjY2VwdCBbMl0gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CiAgICAgIHJlID0gL1xbKFxkKStcXS87CgogICAgICBpZiAoYW5jaG9yLm1hdGNoKHJlKSkKICAgICAgewogICAgICAgICB2YXIgbnVtID0gcGFyc2VJbnQoYW5jaG9yLnN1YnN0cmluZygxLCBhbmNob3IubGVuZ3RoLTEpKTsKCiAgICAgICAgIGlmIChudW0gPiB0aGlzLnNsaWRlcy5sZW5ndGgpCiAgICAgICAgICAgIG51bSA9IDE7CgogICAgICAgICBpZiAoLS1udW0gPCAwKQogICAgICAgICAgICBudW0gPSAwOwoKICAgICAgICAgcmV0dXJuIG51bTsKICAgICAgfQoKICAgICAgLy8gb2ggZGVhciB1bmtub3duIGFuY2hvcgogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvLyBzZWFyY2ggZm9yIGVuY2xvc2luZyBzbGlkZQoKICAgIHdoaWxlICh0cnVlKQogICAgewogICAgICAvLyBicm93c2VyIGNvZXJjZXMgaHRtbCBlbGVtZW50cyB0byB1cHBlcmNhc2UhCiAgICAgIGlmICh0YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSAiZGl2IiAmJgogICAgICAgICAgICB0aGlzLmhhc19jbGFzcyh0YXJnZXQsICJzbGlkZSIpKQogICAgICB7CiAgICAgICAgLy8gZm91bmQgdGhlIHNsaWRlIGVsZW1lbnQKICAgICAgICBicmVhazsKICAgICAgfQoKICAgICAgLy8gb3RoZXJ3aXNlIHRyeSBwYXJlbnQgZWxlbWVudCBpZiBhbnkKCiAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlOwoKICAgICAgaWYgKCF0YXJnZXQpCiAgICAgIHsKICAgICAgICByZXR1cm4gMDsgICAvLyBubyBsdWNrIQogICAgICB9CiAgICB9OwoKICAgIGZvciAoaSA9IDA7IGkgPCBzbGlkZXMubGVuZ3RoOyArK2kpCiAgICB7CiAgICAgIGlmIChzbGlkZXNbaV0gPT0gdGFyZ2V0KQogICAgICAgIHJldHVybiBpOyAgLy8gc3VjY2VzcwogICAgfQoKICAgIC8vIG9oIGRlYXIgc3RpbGwgbm8gbHVjawogICAgcmV0dXJuIDA7CiAgfSwKCiAgcHJldmlvdXNfc2xpZGU6IGZ1bmN0aW9uIChpbmNyZW1lbnRhbCkgewogICAgaWYgKCF3M2Nfc2xpZHkudmlld19hbGwpCiAgICB7CiAgICAgIHZhciBzbGlkZTsKCiAgICAgIGlmICgoaW5jcmVtZW50YWwgfHwgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9PSAwKSAmJiB3M2Nfc2xpZHkubGFzdF9zaG93biAhPSBudWxsKQogICAgICB7CiAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSB3M2Nfc2xpZHkuaGlkZV9wcmV2aW91c19pdGVtKHczY19zbGlkeS5sYXN0X3Nob3duKTsKICAgICAgICB3M2Nfc2xpZHkuc2V0X2Vvc19zdGF0dXMoZmFsc2UpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKHczY19zbGlkeS5zbGlkZV9udW1iZXIgPiAwKQogICAgICB7CiAgICAgICAgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgICAgIHczY19zbGlkeS5oaWRlX3NsaWRlKHNsaWRlKTsKCiAgICAgICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IHczY19zbGlkeS5zbGlkZV9udW1iZXIgLSAxOwogICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICB3M2Nfc2xpZHkuc2V0X3Zpc2liaWxpdHlfYWxsX2luY3JlbWVudGFsKCJ2aXNpYmxlIik7CiAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSB3M2Nfc2xpZHkucHJldmlvdXNfaW5jcmVtZW50YWxfaXRlbShudWxsKTsKICAgICAgICB3M2Nfc2xpZHkuc2V0X2Vvc19zdGF0dXModHJ1ZSk7CiAgICAgICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgICB9CgogICAgICB3M2Nfc2xpZHkuc2V0X2xvY2F0aW9uKCk7CgogICAgICBpZiAoIXczY19zbGlkeS5uc19wb3MpCiAgICAgICAgdzNjX3NsaWR5LnJlZnJlc2hfdG9vbGJhcigyMDApOwogICAgfQogIH0sCgogIG5leHRfc2xpZGU6IGZ1bmN0aW9uIChpbmNyZW1lbnRhbCkgewogICAgaWYgKCF3M2Nfc2xpZHkudmlld19hbGwpCiAgICB7CiAgICAgIHZhciBzbGlkZSwgbGFzdCA9IHczY19zbGlkeS5sYXN0X3Nob3duOwoKICAgICAgaWYgKGluY3JlbWVudGFsIHx8IHczY19zbGlkeS5zbGlkZV9udW1iZXIgPT0gdzNjX3NsaWR5LnNsaWRlcy5sZW5ndGggLSAxKQogICAgICAgICB3M2Nfc2xpZHkubGFzdF9zaG93biA9IHczY19zbGlkeS5yZXZlYWxfbmV4dF9pdGVtKHczY19zbGlkeS5sYXN0X3Nob3duKTsKCiAgICAgIGlmICgoIWluY3JlbWVudGFsIHx8IHczY19zbGlkeS5sYXN0X3Nob3duID09IG51bGwpICYmCiAgICAgICAgICAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyIDwgdzNjX3NsaWR5LnNsaWRlcy5sZW5ndGggLSAxKQogICAgICB7CiAgICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwoKICAgICAgICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IHczY19zbGlkeS5zbGlkZV9udW1iZXIgKyAxOwogICAgICAgICBzbGlkZSA9IHczY19zbGlkeS5zbGlkZXNbdzNjX3NsaWR5LnNsaWRlX251bWJlcl07CiAgICAgICAgIHczY19zbGlkeS5sYXN0X3Nob3duID0gbnVsbDsKICAgICAgICAgdzNjX3NsaWR5LnNldF92aXNpYmlsaXR5X2FsbF9pbmNyZW1lbnRhbCgiaGlkZGVuIik7CiAgICAgICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgfQogICAgICBlbHNlIGlmICghdzNjX3NsaWR5Lmxhc3Rfc2hvd24pCiAgICAgIHsKICAgICAgICAgaWYgKGxhc3QgJiYgaW5jcmVtZW50YWwpCiAgICAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSBsYXN0OwogICAgICB9CgogICAgICB3M2Nfc2xpZHkuc2V0X2xvY2F0aW9uKCk7CgogICAgICB3M2Nfc2xpZHkuc2V0X2Vvc19zdGF0dXMoIXczY19zbGlkeS5uZXh0X2luY3JlbWVudGFsX2l0ZW0odzNjX3NsaWR5Lmxhc3Rfc2hvd24pKTsKCiAgICAgIGlmICghdzNjX3NsaWR5Lm5zX3BvcykKICAgICAgICAgdzNjX3NsaWR5LnJlZnJlc2hfdG9vbGJhcigyMDApOwogICAgIH0KICB9LAoKICAvLyB0byBmaXJzdCBzbGlkZSB3aXRoIG5vdGhpbmcgcmV2ZWFsZWQKICAvLyBpLmUuIHN0YXRlIGF0IHN0YXJ0IG9mIHByZXNlbnRhdGlvbgogIGZpcnN0X3NsaWRlOiBmdW5jdGlvbiAoKSB7CiAgICAgaWYgKCF3M2Nfc2xpZHkudmlld19hbGwpCiAgICAgewogICAgICAgdmFyIHNsaWRlOwoKICAgICAgIGlmICh3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyICE9IDApCiAgICAgICB7CiAgICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwoKICAgICAgICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IDA7CiAgICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSBudWxsOwogICAgICAgICB3M2Nfc2xpZHkuc2V0X3Zpc2liaWxpdHlfYWxsX2luY3JlbWVudGFsKCJoaWRkZW4iKTsKICAgICAgICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgICAgfQoKICAgICAgIHczY19zbGlkeS5zZXRfZW9zX3N0YXR1cygKICAgICAgICAgIXczY19zbGlkeS5uZXh0X2luY3JlbWVudGFsX2l0ZW0odzNjX3NsaWR5Lmxhc3Rfc2hvd24pKTsKICAgICAgIHczY19zbGlkeS5zZXRfbG9jYXRpb24oKTsKICAgICB9CiAgfSwKCiAgLy8gZ290byBsYXN0IHNsaWRlIHdpdGggZXZlcnl0aGluZyByZXZlYWxlZAogIC8vIGkuZS4gc3RhdGUgYXQgZW5kIG9mIHByZXNlbnRhdGlvbgogIGxhc3Rfc2xpZGU6IGZ1bmN0aW9uICgpIHsKICAgIGlmICghdzNjX3NsaWR5LnZpZXdfYWxsKQogICAgewogICAgICB2YXIgc2xpZGU7CgogICAgICB3M2Nfc2xpZHkubGFzdF9zaG93biA9IG51bGw7IC8vcmV2ZWFsTmV4dEl0ZW0obGFzdFNob3duKTsKCiAgICAgIGlmICh3M2Nfc2xpZHkubGFzdF9zaG93biA9PSBudWxsICYmCiAgICAgICAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyIDwgdzNjX3NsaWR5LnNsaWRlcy5sZW5ndGggLSAxKQogICAgICB7CiAgICAgICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgICAgICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwogICAgICAgICB3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyID0gdzNjX3NsaWR5LnNsaWRlcy5sZW5ndGggLSAxOwogICAgICAgICBzbGlkZSA9IHczY19zbGlkeS5zbGlkZXNbdzNjX3NsaWR5LnNsaWRlX251bWJlcl07CiAgICAgICAgIHczY19zbGlkeS5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoInZpc2libGUiKTsKICAgICAgICAgdzNjX3NsaWR5Lmxhc3Rfc2hvd24gPSB3M2Nfc2xpZHkucHJldmlvdXNfaW5jcmVtZW50YWxfaXRlbShudWxsKTsKCiAgICAgICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgdzNjX3NsaWR5LnNldF92aXNpYmlsaXR5X2FsbF9pbmNyZW1lbnRhbCgidmlzaWJsZSIpOwogICAgICAgICB3M2Nfc2xpZHkubGFzdF9zaG93biA9IHczY19zbGlkeS5wcmV2aW91c19pbmNyZW1lbnRhbF9pdGVtKG51bGwpOwogICAgICB9CgogICAgICB3M2Nfc2xpZHkuc2V0X2Vvc19zdGF0dXModHJ1ZSk7CiAgICAgIHczY19zbGlkeS5zZXRfbG9jYXRpb24oKTsKICAgIH0KICB9LAoKCiAgLy8gIyMjIGNoZWNrIHRoaXMgYW5kIGNvbnNpZGVyIGFkZC9yZW1vdmUgY2xhc3MKICBzZXRfZW9zX3N0YXR1czogZnVuY3Rpb24gKHN0YXRlKSB7CiAgICBpZiAodGhpcy5lb3MpCiAgICAgIHRoaXMuZW9zLnN0eWxlLmNvbG9yID0gKHN0YXRlID8gInJnYigyNDAsMjQwLDI0MCkiIDogInJlZCIpOwogIH0sCgogIC8vIGZpcnN0IHNsaWRlIGlzIDAKICBnb3RvX3NsaWRlOiBmdW5jdGlvbiAobnVtKSB7CiAgICAvL2FsZXJ0KCJnb2luZyB0byBzbGlkZSAiICsgKG51bSsxKSk7CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwogICAgdzNjX3NsaWR5LnNsaWRlX251bWJlciA9IG51bTsKICAgIHNsaWRlID0gdzNjX3NsaWR5LnNsaWRlc1t3M2Nfc2xpZHkuc2xpZGVfbnVtYmVyXTsKICAgIHczY19zbGlkeS5sYXN0X3Nob3duID0gbnVsbDsKICAgIHczY19zbGlkeS5zZXRfdmlzaWJpbGl0eV9hbGxfaW5jcmVtZW50YWwoImhpZGRlbiIpOwogICAgdzNjX3NsaWR5LnNldF9lb3Nfc3RhdHVzKCF3M2Nfc2xpZHkubmV4dF9pbmNyZW1lbnRhbF9pdGVtKHczY19zbGlkeS5sYXN0X3Nob3duKSk7CiAgICBkb2N1bWVudC50aXRsZSA9IHczY19zbGlkeS50aXRsZSArICIgKCIgKyAodzNjX3NsaWR5LnNsaWRlX251bWJlcisxKSArICIpIjsKICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgIHczY19zbGlkeS5zaG93X3NsaWRlX251bWJlcigpOwogIH0sCgoKICBzaG93X3NsaWRlOiBmdW5jdGlvbiAoc2xpZGUpIHsKICAgIHRoaXMuc3luY19iYWNrZ3JvdW5kKHNsaWRlKTsKICAgIHRoaXMucmVtb3ZlX2NsYXNzKHNsaWRlLCAiaGlkZGVuIik7CgogICAgLy8gd29yayBhcm91bmQgSUU5IG9iamVjdCByZW5kZXJpbmcgYnVnCiAgICBzZXRUaW1lb3V0KCJ3aW5kb3cuc2Nyb2xsVG8oMCwwKTsiLCAxKTsKICB9LAoKICBoaWRlX3NsaWRlOiBmdW5jdGlvbiAoc2xpZGUpIHsKICAgIHRoaXMuYWRkX2NsYXNzKHNsaWRlLCAiaGlkZGVuIik7CiAgfSwKCiAgc2V0X2ZvY3VzOiBmdW5jdGlvbiAoZWxlbWVudCkKICB7CiAgICBpZiAoZWxlbWVudCkKICAgICAgZWxlbWVudC5mb2N1cygpOwogICAgZWxzZQogICAgewogICAgICB3M2Nfc2xpZHkuaGVscF9hbmNob3IuZm9jdXMoKTsKCiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgdzNjX3NsaWR5LmhlbHBfYW5jaG9yLmJsdXIoKTsKICAgICAgfSwgMSk7CiAgICB9CiAgfSwKCiAgLy8gc2hvdyBqdXN0IHRoZSBiYWNrZ3JvdW5kcyBwZXJ0aW5lbnQgdG8gdGhpcyBzbGlkZQogIC8vIHdoZW4gc2xpZGUgYmFja2dyb3VuZC1jb2xvciBpcyB0cmFuc3BhcmVudAogIC8vIHRoaXMgc2hvdWxkIG5vdyB3b3JrIHdpdGggcmdiYSBjb2xvciB2YWx1ZXMKICBzeW5jX2JhY2tncm91bmQ6IGZ1bmN0aW9uIChzbGlkZSkgewogICAgdmFyIGJhY2tncm91bmQ7CiAgICB2YXIgYmdDb2xvcjsKCiAgICBpZiAoc2xpZGUuY3VycmVudFN0eWxlKQogICAgICBiZ0NvbG9yID0gc2xpZGUuY3VycmVudFN0eWxlWyJiYWNrZ3JvdW5kQ29sb3IiXTsKICAgIGVsc2UgaWYgKGRvY3VtZW50LmRlZmF1bHRWaWV3KQogICAgewogICAgICB2YXIgc3R5bGVzID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShzbGlkZSxudWxsKTsKCiAgICAgIGlmIChzdHlsZXMpCiAgICAgICAgYmdDb2xvciA9IHN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKCJiYWNrZ3JvdW5kLWNvbG9yIik7CiAgICAgIGVsc2UgLy8gYnJva2VuIGltcGxlbWVudGF0aW9uIHByb2JhYmx5IGR1ZSBTYWZhcmkgb3IgS29ucXVlcm9yCiAgICAgIHsKICAgICAgICAvL2FsZXJ0KCJkZWZlY3RpdmUgaW1wbGVtZW50YXRpb24gb2YgZ2V0Q29tcHV0ZWRTdHlsZSgpIik7CiAgICAgICAgYmdDb2xvciA9ICJ0cmFuc3BhcmVudCI7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgICAgYmdDb2xvciA9PSAidHJhbnNwYXJlbnQiOwoKICAgIGlmIChiZ0NvbG9yID09ICJ0cmFuc3BhcmVudCIgfHwKICAgICAgICBiZ0NvbG9yLmluZGV4T2YoInJnYmEiKSA+PSAwIHx8CiAgICAgICAgYmdDb2xvci5pbmRleE9mKCJvcGFjaXR5IikgPj0gMCkKICAgIHsKICAgICAgdmFyIHNsaWRlQ2xhc3MgPSB0aGlzLmdldF9jbGFzc19saXN0KHNsaWRlKTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5iYWNrZ3JvdW5kcy5sZW5ndGg7IGkrKykKICAgICAgewogICAgICAgIGJhY2tncm91bmQgPSB0aGlzLmJhY2tncm91bmRzW2ldOwoKICAgICAgICB2YXIgYmdDbGFzcyA9IHRoaXMuZ2V0X2NsYXNzX2xpc3QoYmFja2dyb3VuZCk7CgogICAgICAgIGlmICh0aGlzLm1hdGNoaW5nX2JhY2tncm91bmQoc2xpZGVDbGFzcywgYmdDbGFzcykpCiAgICAgICAgICB0aGlzLnJlbW92ZV9jbGFzcyhiYWNrZ3JvdW5kLCAiaGlkZGVuIik7CiAgICAgICAgZWxzZQogICAgICAgICAgdGhpcy5hZGRfY2xhc3MoYmFja2dyb3VuZCwgImhpZGRlbiIpOwogICAgICB9CiAgICB9CiAgICBlbHNlIC8vIGZvcmNpYmx5IGhpZGUgYWxsIGJhY2tncm91bmRzCiAgICAgIHRoaXMuaGlkZV9iYWNrZ3JvdW5kcygpOwogIH0sCgogIGhpZGVfYmFja2dyb3VuZHM6IGZ1bmN0aW9uICgpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5iYWNrZ3JvdW5kcy5sZW5ndGg7IGkrKykKICAgIHsKICAgICAgYmFja2dyb3VuZCA9IHRoaXMuYmFja2dyb3VuZHNbaV07CiAgICAgIHRoaXMuYWRkX2NsYXNzKGJhY2tncm91bmQsICJoaWRkZW4iKTsKICAgIH0KICB9LAoKICAvLyBjb21wYXJlIGNsYXNzZXMgZm9yIHNsaWRlIGFuZCBiYWNrZ3JvdW5kCiAgbWF0Y2hpbmdfYmFja2dyb3VuZDogZnVuY3Rpb24gKHNsaWRlQ2xhc3MsIGJnQ2xhc3MpIHsKICAgIHZhciBpLCBjb3VudCwgcGF0dGVybiwgcmVzdWx0OwoKICAgIC8vIGRlZmluZSBwYXR0ZXJuIGFzIHJlZ3VsYXIgZXhwcmVzc2lvbgogICAgcGF0dGVybiA9IC9cdysvZzsKCiAgICAvLyBjaGVjayBiYWNrZ3JvdW5kIGNsYXNzIG5hbWVzCiAgICByZXN1bHQgPSBiZ0NsYXNzLm1hdGNoKHBhdHRlcm4pOwoKICAgIGZvciAoaSA9IGNvdW50ID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykKICAgIHsKICAgICAgaWYgKHJlc3VsdFtpXSA9PSAiaGlkZGVuIikKICAgICAgICBjb250aW51ZTsKCiAgICAgIGlmIChyZXN1bHRbaV0gPT0gImJhY2tncm91bmQiKQoJY29udGludWU7CgogICAgICArK2NvdW50OwogICAgfQoKICAgIGlmIChjb3VudCA9PSAwKSAgLy8gZGVmYXVsdCBtYXRjaAogICAgICByZXR1cm4gdHJ1ZTsKCiAgICAvLyBjaGVjayBmb3IgbWF0Y2hlcyBhbmQgcGxhY2UgcmVzdWx0IGluIGFycmF5CiAgICByZXN1bHQgPSBzbGlkZUNsYXNzLm1hdGNoKHBhdHRlcm4pOwoKICAgIC8vIG5vdyBjaGVjayBpZiBkZXNpcmVkIG5hbWUgaXMgcHJlc2VudCBmb3IgYmFja2dyb3VuZAogICAgZm9yIChpID0gY291bnQgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKQogICAgewogICAgICBpZiAocmVzdWx0W2ldID09ICJoaWRkZW4iKQogICAgICAgIGNvbnRpbnVlOwoKICAgICAgaWYgKHRoaXMuaGFzX3Rva2VuKGJnQ2xhc3MsIHJlc3VsdFtpXSkpCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0sCgogIHJlc2l6ZWQ6IGZ1bmN0aW9uICgpIHsKICAgICB2YXIgd2lkdGggPSAwOwoKICAgICBpZiAoIHR5cGVvZiggd2luZG93LmlubmVyV2lkdGggKSA9PSAnbnVtYmVyJyApCiAgICAgICB3aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoOyAgLy8gTm9uIElFIGJyb3dzZXIKICAgICBlbHNlIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKQogICAgICAgd2lkdGggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7ICAvLyBJRTYKICAgICBlbHNlIGlmIChkb2N1bWVudC5ib2R5ICYmIGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgpCiAgICAgICB3aWR0aCA9IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7IC8vIElFNAoKICAgICB2YXIgaGVpZ2h0ID0gMDsKCiAgICAgaWYgKCB0eXBlb2YoIHdpbmRvdy5pbm5lckhlaWdodCApID09ICdudW1iZXInICkKICAgICAgIGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDsgIC8vIE5vbiBJRSBicm93c2VyCiAgICAgZWxzZSBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpCiAgICAgICBoZWlnaHQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0OyAgLy8gSUU2CiAgICAgZWxzZSBpZiAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCkKICAgICAgIGhlaWdodCA9IGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0OyAvLyBJRTQKCiAgICAgaWYgKGhlaWdodCAmJiAod2lkdGgvaGVpZ2h0ID4gMS4wNSoxMDI0Lzc2OCkpCiAgICAgewogICAgICAgd2lkdGggPSBoZWlnaHQgKiAxMDI0LjAvNzY4OwogICAgIH0KCiAgICAgLy8gSUUgZmlyZXMgb25yZXNpemUgZXZlbiB3aGVuIG9ubHkgZm9udCBzaXplIGlzIGNoYW5nZWQhCiAgICAgLy8gc28gd2UgZG8gYSBjaGVjayB0byBhdm9pZCBibG9ja2luZyA8IGFuZCA+IGFjdGlvbnMKICAgICBpZiAod2lkdGggIT0gdzNjX3NsaWR5Lmxhc3Rfd2lkdGggfHwgaGVpZ2h0ICE9IHczY19zbGlkeS5sYXN0X2hlaWdodCkKICAgICB7CiAgICAgICBpZiAod2lkdGggPj0gMTEwMCkKICAgICAgICAgdzNjX3NsaWR5LnNpemVfaW5kZXggPSA1OyAgICAvLyA0CiAgICAgICBlbHNlIGlmICh3aWR0aCA+PSAxMDAwKQogICAgICAgICB3M2Nfc2xpZHkuc2l6ZV9pbmRleCA9IDQ7ICAgIC8vIDMKICAgICAgIGVsc2UgaWYgKHdpZHRoID49IDgwMCkKICAgICAgICAgdzNjX3NsaWR5LnNpemVfaW5kZXggPSAzOyAgICAvLyAyCiAgICAgICBlbHNlIGlmICh3aWR0aCA+PSA2MDApCiAgICAgICAgIHczY19zbGlkeS5zaXplX2luZGV4ID0gMjsgICAgLy8gMQogICAgICAgZWxzZSBpZiAod2lkdGgpCiAgICAgICAgIHczY19zbGlkeS5zaXplX2luZGV4ID0gMDsKCiAgICAgICAvLyBhZGQgaW4gZm9udCBzaXplIGFkanVzdG1lbnQgZnJvbSBtZXRhIGVsZW1lbnQgZS5nLgogICAgICAgLy8gPG1ldGEgbmFtZT0iZm9udC1zaXplLWFkanVzdG1lbnQiIGNvbnRlbnQ9Ii0yIiAvPgogICAgICAgLy8gdXNlZnVsIHdoZW4gc2xpZGVzIGhhdmUgdG9vIG11Y2ggY29udGVudCA7LSkKCiAgICAgICBpZiAoMCA8PSB3M2Nfc2xpZHkuc2l6ZV9pbmRleCArIHczY19zbGlkeS5zaXplX2FkanVzdG1lbnQgJiYKICAgICAgICAgICAgIHczY19zbGlkeS5zaXplX2luZGV4ICsgdzNjX3NsaWR5LnNpemVfYWRqdXN0bWVudCA8IHczY19zbGlkeS5zaXplcy5sZW5ndGgpCiAgICAgICAgIHczY19zbGlkeS5zaXplX2luZGV4ID0gdzNjX3NsaWR5LnNpemVfaW5kZXggKyB3M2Nfc2xpZHkuc2l6ZV9hZGp1c3RtZW50OwoKICAgICAgIC8vIGVuYWJsZXMgY3Jvc3MgYnJvd3NlciB1c2Ugb2YgcmVsYXRpdmUgd2lkdGgvaGVpZ2h0CiAgICAgICAvLyBvbiBvYmplY3QgZWxlbWVudHMgZm9yIHVzZSB3aXRoIFNWRyBhbmQgRmxhc2ggbWVkaWEKICAgICAgIHczY19zbGlkeS5hZGp1c3Rfb2JqZWN0X2RpbWVuc2lvbnMod2lkdGgsIGhlaWdodCk7CgogICAgICAgaWYgKGRvY3VtZW50LmJvZHkuc3R5bGUuZm9udFNpemUgIT0gdzNjX3NsaWR5LnNpemVzW3czY19zbGlkeS5zaXplX2luZGV4XSkKICAgICAgIHsKICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5mb250U2l6ZSA9IHczY19zbGlkeS5zaXplc1t3M2Nfc2xpZHkuc2l6ZV9pbmRleF07CiAgICAgICB9CgogICAgICAgdzNjX3NsaWR5Lmxhc3Rfd2lkdGggPSB3aWR0aDsKICAgICAgIHczY19zbGlkeS5sYXN0X2hlaWdodCA9IGhlaWdodDsKCiAgICAgICAvLyBmb3JjZSByZWZsb3cgdG8gd29yayBhcm91bmQgTW96aWxsYSBidWcKICAgICAgIGlmICh3M2Nfc2xpZHkubnNfcG9zKQogICAgICAgewogICAgICAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgICAgICB3M2Nfc2xpZHkuaGlkZV9zbGlkZShzbGlkZSk7CiAgICAgICAgIHczY19zbGlkeS5zaG93X3NsaWRlKHNsaWRlKTsKICAgICAgIH0KCiAgICAgICAvLyBmb3JjZSBjb3JyZWN0IHBvc2l0aW9uaW5nIG9mIHRvb2xiYXIKICAgICAgIHczY19zbGlkeS5yZWZyZXNoX3Rvb2xiYXIoMjAwKTsKICAgICB9CiAgfSwKCiAgc2Nyb2xsZWQ6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh3M2Nfc2xpZHkudG9vbGJhciAmJiAhdzNjX3NsaWR5Lm5zX3BvcyAmJiAhdzNjX3NsaWR5LmllNykKICAgIHsKICAgICAgdzNjX3NsaWR5LmhhY2tfb2Zmc2V0ID0gdzNjX3NsaWR5LnNjcm9sbF94X29mZnNldCgpOwogICAgICAvLyBoaWRlIHRvb2xiYXIKICAgICAgdzNjX3NsaWR5LnRvb2xiYXIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKCiAgICAgIC8vIG1ha2UgaXQgcmVhcHBlYXIgbGF0ZXIKICAgICAgaWYgKHczY19zbGlkeS5zY3JvbGxoYWNrID09IDAgJiYgIXczY19zbGlkeS52aWV3X2FsbCkKICAgICAgewogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge3czY19zbGlkeS5zaG93X3Rvb2xiYXIoKTsgfSwgMTAwMCk7CiAgICAgICAgdzNjX3NsaWR5LnNjcm9sbGhhY2sgPSAxOwogICAgICB9CiAgICB9CiAgfSwKCiAgaGlkZV90b29sYmFyOiBmdW5jdGlvbiAoKSB7CiAgICB3M2Nfc2xpZHkuYWRkX2NsYXNzKHczY19zbGlkeS50b29sYmFyLCAiaGlkZGVuIik7CiAgICB3aW5kb3cuZm9jdXMoKTsKICB9LAoKICAvLyB1c2VkIHRvIGVuc3VyZSBJRSByZWZyZXNoZXMgdG9vbGJhciBpbiBjb3JyZWN0IHBvc2l0aW9uCiAgcmVmcmVzaF90b29sYmFyOiBmdW5jdGlvbiAoaW50ZXJ2YWwpIHsKICAgIGlmICghdzNjX3NsaWR5Lm5zX3BvcyAmJiAhdzNjX3NsaWR5LmllNykKICAgIHsKICAgICAgdzNjX3NsaWR5LmhpZGVfdG9vbGJhcigpOwogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHt3M2Nfc2xpZHkuc2hvd190b29sYmFyKCk7fSwgaW50ZXJ2YWwpOwogICAgfQogIH0sCgogIC8vIHJlc3RvcmVzIHRvb2xiYXIgYWZ0ZXIgc2hvcnQgZGVsYXkKICBzaG93X3Rvb2xiYXI6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh3M2Nfc2xpZHkud2FudF90b29sYmFyKQogICAgewogICAgICB3M2Nfc2xpZHkudG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKCiAgICAgIGlmICghdzNjX3NsaWR5Lm5zX3BvcykKICAgICAgewogICAgICAgIC8vIGFkanVzdCBwb3NpdGlvbiB0byBhbGxvdyBmb3Igc2Nyb2xsaW5nCiAgICAgICAgdmFyIHhvZmZzZXQgPSB3M2Nfc2xpZHkuc2Nyb2xsX3hfb2Zmc2V0KCk7CiAgICAgICAgdzNjX3NsaWR5LnRvb2xiYXIuc3R5bGUubGVmdCA9IHhvZmZzZXQ7CiAgICAgICAgdzNjX3NsaWR5LnRvb2xiYXIuc3R5bGUucmlnaHQgPSB4b2Zmc2V0OwoKICAgICAgICAvLyBkZXRlcm1pbmUgdmVydGljYWwgc2Nyb2xsIG9mZnNldAogICAgICAgIC8vdmFyIHlvZmZzZXQgPSBzY3JvbGxZT2Zmc2V0KCk7CgogICAgICAgIC8vIGJvdHRvbSBpcyBkb2MgaGVpZ2h0IC0gd2luZG93IGhlaWdodCAtIHNjcm9sbCBvZmZzZXQKICAgICAgICAvL3ZhciBib3R0b20gPSBkb2N1bWVudEhlaWdodCgpIC0gbGFzdEhlaWdodCAtIHlvZmZzZXQKCiAgICAgICAgLy9pZiAoeW9mZnNldCA+IDAgfHwgZG9jdW1lbnRIZWlnaHQoKSA+IGxhc3RIZWlnaHQpCiAgICAgICAgLy8gICBib3R0b20gKz0gMTY7ICAvLyBhbGxvdyBmb3IgaGVpZ2h0IG9mIHNjcm9sbGJhcgoKICAgICAgICB3M2Nfc2xpZHkudG9vbGJhci5zdHlsZS5ib3R0b20gPSAwOyAvL2JvdHRvbTsKICAgICAgfQoKICAgICAgdzNjX3NsaWR5LnJlbW92ZV9jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpOwogICAgfQoKICAgIHczY19zbGlkeS5zY3JvbGxoYWNrID0gMDsKCgogICAgLy8gc2V0IHRoZSBrZXlib2FyZCBmb2N1cyB0byB0aGUgaGVscCBsaW5rIG9uIHRoZQogICAgLy8gdG9vbGJhciB0byBlbnN1cmUgdGhhdCBkb2N1bWVudCBoYXMgdGhlIGZvY3VzCiAgICAvLyBJRSBkb2Vzbid0IGFsd2F5cyB3b3JrIHdpdGggd2luZG93LmZvY3VzKCkKICAgIC8vIGFuZCB0aGlzIGhhY2sgaGFzIGJlbmVmaXQgb2YgRW50ZXIgZm9yIGhlbHAKCiAgICB0cnkKICAgIHsKICAgICAgaWYgKCF3M2Nfc2xpZHkub3BlcmEpCiAgICAgICAgdzNjX3NsaWR5LnNldF9mb2N1cygpOwogICAgfQogICAgY2F0Y2ggKGUpCiAgICB7CiAgICB9CiAgfSwKCi8vIGludm9rZWQgdmlhIEYga2V5CiAgdG9nZ2xlX3Rvb2xiYXI6IGZ1bmN0aW9uICgpIHsKICAgIGlmICghdzNjX3NsaWR5LnZpZXdfYWxsKQogICAgewogICAgICBpZiAodzNjX3NsaWR5Lmhhc19jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpKQogICAgICB7CiAgICAgICAgdzNjX3NsaWR5LnJlbW92ZV9jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpCiAgICAgICAgdzNjX3NsaWR5LndhbnRfdG9vbGJhciA9IDE7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgdzNjX3NsaWR5LmFkZF9jbGFzcyh3M2Nfc2xpZHkudG9vbGJhciwgImhpZGRlbiIpCiAgICAgICAgdzNjX3NsaWR5LndhbnRfdG9vbGJhciA9IDA7CiAgICAgIH0KICAgIH0KICB9LAoKICBzY3JvbGxfeF9vZmZzZXQ6IGZ1bmN0aW9uICgpIHsKICAgIGlmICh3aW5kb3cucGFnZVhPZmZzZXQpCiAgICAgIHJldHVybiBzZWxmLnBhZ2VYT2Zmc2V0OwoKICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgCiAgICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCkKICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0OwoKICAgIGlmIChkb2N1bWVudC5ib2R5KQogICAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0OwoKICAgIHJldHVybiAwOwogIH0sCgogIHNjcm9sbF95X29mZnNldDogZnVuY3Rpb24gKCkgewogICAgaWYgKHdpbmRvdy5wYWdlWU9mZnNldCkKICAgICAgcmV0dXJuIHNlbGYucGFnZVlPZmZzZXQ7CgogICAgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiAKICAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ApCiAgICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOwoKICAgIGlmIChkb2N1bWVudC5ib2R5KQogICAgICByZXR1cm4gZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7CgogICAgcmV0dXJuIDA7CiAgfSwKCiAgLy8gbG9va2luZyBmb3IgYSB3YXkgdG8gZGV0ZXJtaW5lIGhlaWdodCBvZiBzbGlkZSBjb250ZW50CiAgLy8gdGhlIHNsaWRlIGl0c2VsZiBpcyBzZXQgdG8gdGhlIGhlaWdodCBvZiB0aGUgd2luZG93CiAgb3B0aW1pemVfZm9udF9zaXplOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwoKICAgIC8vdmFyIGRoID0gZG9jdW1lbnRIZWlnaHQoKTsgLy9nZXREb2NIZWlnaHQoZG9jdW1lbnQpOwogICAgdmFyIGRoID0gc2xpZGUuc2Nyb2xsSGVpZ2h0OwogICAgdmFyIHdoID0gZ2V0V2luZG93SGVpZ2h0KCk7CiAgICB2YXIgdSA9IDEwMCAqIGRoIC8gd2g7CgogICAgYWxlcnQoIndpbmRvdyB1dGlsaXphdGlvbiA9ICIgKyB1ICsgIiUgKGRvYyAiCiAgICAgICsgZGggKyAiIHdpbiAiICsgd2ggKyAiKSIpOwogIH0sCgogIC8vIGZyb20gZG9jdW1lbnQgb2JqZWN0CiAgZ2V0X2RvY19oZWlnaHQ6IGZ1bmN0aW9uIChkb2MpIHsKICAgIGlmICghZG9jKQogICAgICBkb2MgPSBkb2N1bWVudDsKCiAgICBpZiAoZG9jICYmIGRvYy5ib2R5ICYmIGRvYy5ib2R5Lm9mZnNldEhlaWdodCkKICAgICAgcmV0dXJuIGRvYy5ib2R5Lm9mZnNldEhlaWdodDsgIC8vIG5zL2dlY2tvIHN5bnRheAoKICAgIGlmIChkb2MgJiYgZG9jLmJvZHkgJiYgZG9jLmJvZHkuc2Nyb2xsSGVpZ2h0KQogICAgICByZXR1cm4gZG9jLmJvZHkuc2Nyb2xsSGVpZ2h0OwoKICAgIGFsZXJ0KCJjb3VsZG4ndCBkZXRlcm1pbmUgZG9jdW1lbnQgaGVpZ2h0Iik7CiAgfSwKCiAgZ2V0X3dpbmRvd19oZWlnaHQ6IGZ1bmN0aW9uICgpIHsKICAgIGlmICggdHlwZW9mKCB3aW5kb3cuaW5uZXJIZWlnaHQgKSA9PSAnbnVtYmVyJyApCiAgICAgIHJldHVybiB3aW5kb3cuaW5uZXJIZWlnaHQ7ICAvLyBOb24gSUUgYnJvd3NlcgoKICAgIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkKICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7ICAvLyBJRTYKCiAgICBpZiAoZG9jdW1lbnQuYm9keSAmJiBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCkKICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0OyAvLyBJRTQKICB9LAoKICBkb2N1bWVudF9oZWlnaHQ6IGZ1bmN0aW9uICgpIHsKICAgIHZhciBzaCwgb2g7CgogICAgc2ggPSBkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodDsKICAgIG9oID0gZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQ7CgogICAgaWYgKHNoICYmIG9oKQogICAgewogICAgICByZXR1cm4gKHNoID4gb2ggPyBzaCA6IG9oKTsKICAgIH0KCiAgICAvLyBubyBpZGVhIQogICAgcmV0dXJuIDA7CiAgfSwKCiAgc21hbGxlcjogZnVuY3Rpb24gKCkgewogICAgaWYgKHczY19zbGlkeS5zaXplX2luZGV4ID4gMCkKICAgIHsKICAgICAgLS13M2Nfc2xpZHkuc2l6ZV9pbmRleDsKICAgIH0KCiAgICB3M2Nfc2xpZHkudG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgZG9jdW1lbnQuYm9keS5zdHlsZS5mb250U2l6ZSA9IHczY19zbGlkeS5zaXplc1t3M2Nfc2xpZHkuc2l6ZV9pbmRleF07CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwogICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7dzNjX3NsaWR5LnNob3dfdG9vbGJhcigpOyB9LCA1MCk7CiAgfSwKCiAgYmlnZ2VyOiBmdW5jdGlvbiAoKSB7CiAgICBpZiAodzNjX3NsaWR5LnNpemVfaW5kZXggPCB3M2Nfc2xpZHkuc2l6ZXMubGVuZ3RoIC0gMSkKICAgIHsKICAgICAgKyt3M2Nfc2xpZHkuc2l6ZV9pbmRleDsKICAgIH0KCiAgICB3M2Nfc2xpZHkudG9vbGJhci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwogICAgZG9jdW1lbnQuYm9keS5zdHlsZS5mb250U2l6ZSA9IHczY19zbGlkeS5zaXplc1t3M2Nfc2xpZHkuc2l6ZV9pbmRleF07CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwogICAgdzNjX3NsaWR5LmhpZGVfc2xpZGUoc2xpZGUpOwogICAgdzNjX3NsaWR5LnNob3dfc2xpZGUoc2xpZGUpOwogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7dzNjX3NsaWR5LnNob3dfdG9vbGJhcigpOyB9LCA1MCk7CiAgfSwKCiAgLy8gZW5hYmxlcyBjcm9zcyBicm93c2VyIHVzZSBvZiByZWxhdGl2ZSB3aWR0aC9oZWlnaHQKICAvLyBvbiBvYmplY3QgZWxlbWVudHMgZm9yIHVzZSB3aXRoIFNWRyBhbmQgRmxhc2ggbWVkaWEKICAvLyB3aXRoIHRoYW5rcyB0byBJdmFuIEhlcm1hbiBmb3IgdGhlIHN1Z2dlc3Rpb24KICBhZGp1c3Rfb2JqZWN0X2RpbWVuc2lvbnM6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7CiAgICBmb3IoIHZhciBpID0gMDsgaSA8IHczY19zbGlkeS5vYmplY3RzLmxlbmd0aDsgaSsrICkKICAgIHsKICAgICAgdmFyIG9iaiA9IHRoaXMub2JqZWN0c1tpXTsKICAgICAgdmFyIG1pbWVUeXBlID0gb2JqLmdldEF0dHJpYnV0ZSgidHlwZSIpOwoKICAgICAgaWYgKG1pbWVUeXBlID09ICJpbWFnZS9zdmcreG1sIiB8fCBtaW1lVHlwZSA9PSAiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKQogICAgICB7CiAgICAgICAgaWYgKCAhb2JqLmluaXRpYWxXaWR0aCApIAogICAgICAgICAgb2JqLmluaXRpYWxXaWR0aCA9IG9iai5nZXRBdHRyaWJ1dGUoIndpZHRoIik7CgogICAgICAgIGlmICggIW9iai5pbml0aWFsSGVpZ2h0ICkgCiAgICAgICAgICBvYmouaW5pdGlhbEhlaWdodCA9IG9iai5nZXRBdHRyaWJ1dGUoImhlaWdodCIpOwoKICAgICAgICBpZiAoIG9iai5pbml0aWFsV2lkdGggJiYgb2JqLmluaXRpYWxXaWR0aC5jaGFyQXQob2JqLmluaXRpYWxXaWR0aC5sZW5ndGgtMSkgPT0gIiUiICkKICAgICAgICB7CiAgICAgICAgICB2YXIgdyA9IHBhcnNlSW50KG9iai5pbml0aWFsV2lkdGguc2xpY2UoMCwgb2JqLmluaXRpYWxXaWR0aC5sZW5ndGgtMSkpOwogICAgICAgICAgdmFyIG5ld1cgPSB3aWR0aCAqICh3LzEwMC4wKTsKICAgICAgICAgIG9iai5zZXRBdHRyaWJ1dGUoIndpZHRoIixuZXdXKTsKICAgICAgICB9CgogICAgICAgIGlmICggb2JqLmluaXRpYWxIZWlnaHQgJiYKICAgICAgICAgICAgIG9iai5pbml0aWFsSGVpZ2h0LmNoYXJBdChvYmouaW5pdGlhbEhlaWdodC5sZW5ndGgtMSkgPT0gIiUiICkKICAgICAgICB7CiAgICAgICAgICB2YXIgaCA9IHBhcnNlSW50KG9iai5pbml0aWFsSGVpZ2h0LnNsaWNlKDAsIG9iai5pbml0aWFsSGVpZ2h0Lmxlbmd0aC0xKSk7CiAgICAgICAgICB2YXIgbmV3SCA9IGhlaWdodCAqIChoLzEwMC4wKTsKICAgICAgICAgIG9iai5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIG5ld0gpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0sCgogIC8vIG5lZWRlZCBmb3IgT3BlcmEgdG8gaW5oaWJpdCBkZWZhdWx0IGJlaGF2aW9yCiAgLy8gc2luY2UgT3BlcmEgZGVsaXZlcnMga2V5UHJlc3MgZXZlbiBpZiBrZXlEb3duCiAgLy8gd2FzIGNhbmNlbGxlZAogIGtleV9wcmVzczogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICBpZiAoIWV2ZW50KQogICAgICBldmVudCA9IHdpbmRvdy5ldmVudDsKCiAgICBpZiAoIXczY19zbGlkeS5rZXlfd2FudGVkKQogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CgogICAgcmV0dXJuIHRydWU7CiAgfSwKCiAgLy8gIFNlZSBlLmcuIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzL2tleXMuaHRtbCBmb3Iga2V5Y29kZXMKICBrZXlfZG93bjogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICB2YXIga2V5LCB0YXJnZXQsIHRhZzsKCiAgICB3M2Nfc2xpZHkua2V5X3dhbnRlZCA9IHRydWU7CgogICAgaWYgKCFldmVudCkKICAgICAgZXZlbnQgPSB3aW5kb3cuZXZlbnQ7CgogICAgLy8ga2x1ZGdlIGFyb3VuZCBOUy9JRSBkaWZmZXJlbmNlcyAKICAgIGlmICh3aW5kb3cuZXZlbnQpCiAgICB7CiAgICAgIGtleSA9IHdpbmRvdy5ldmVudC5rZXlDb2RlOwogICAgICB0YXJnZXQgPSB3aW5kb3cuZXZlbnQuc3JjRWxlbWVudDsKICAgIH0KICAgIGVsc2UgaWYgKGV2ZW50LndoaWNoKQogICAgewogICAgICBrZXkgPSBldmVudC53aGljaDsKICAgICAgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0OwogICAgfQogICAgZWxzZQogICAgICByZXR1cm4gdHJ1ZTsgLy8gWWlrZXMhIHVua25vd24gYnJvd3NlcgoKICAgIC8vIGlnbm9yZSBldmVudCBpZiBrZXkgdmFsdWUgaXMgemVybwogICAgLy8gYXMgZm9yIGFsdCBvbiBPcGVyYSBhbmQgS29ucXVlcm9yCiAgICBpZiAoIWtleSkKICAgICAgIHJldHVybiB0cnVlOwoKICAgIC8vIGF2b2lkIGludGVyZmVyaW5nIHdpdGgga2V5c3Ryb2tlCiAgICAvLyBiZWhhdmlvciBmb3Igbm9uLXNsaWR5IGNocm9tZSBlbGVtZW50cwogICAgaWYgKCF3M2Nfc2xpZHkuc2xpZHlfY2hyb21lKHRhcmdldCkgJiYKICAgICAgICB3M2Nfc2xpZHkuc3BlY2lhbF9lbGVtZW50KHRhcmdldCkpCiAgICAgIHJldHVybiB0cnVlOwoKICAgIC8vIGNoZWNrIGZvciBjb25jdXJyZW50IGNvbnRyb2wvY29tbWFuZC9hbHQga2V5CiAgICAvLyBidXQgYXJlIHRoZXNlIG9ubHkgcHJlc2VudCBvbiBtb3VzZSBldmVudHM/CgogICAgaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuYWx0S2V5IHx8IGV2ZW50Lm1ldGFLZXkpCiAgICAgICByZXR1cm4gdHJ1ZTsKCiAgICAvLyBkaXNtaXNzIHRhYmxlIG9mIGNvbnRlbnRzIGlmIHZpc2libGUKICAgIGlmICh3M2Nfc2xpZHkuaXNfc2hvd25fdG9jKCkgJiYga2V5ICE9IDkgJiYga2V5ICE9IDE2ICYmIGtleSAhPSAzOCAmJiBrZXkgIT0gNDApCiAgICB7CiAgICAgIHczY19zbGlkeS5oaWRlX3RhYmxlX29mX2NvbnRlbnRzKHRydWUpOwoKICAgICAgaWYgKGtleSA9PSAyNyB8fCBrZXkgPT0gODQgfHwga2V5ID09IDY3KQogICAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KCiAgICBpZiAoa2V5ID09IDM0KSAvLyBQYWdlIERvd24KICAgIHsKICAgICAgaWYgKHczY19zbGlkeS52aWV3X2FsbCkKICAgICAgICByZXR1cm4gdHJ1ZTsKCiAgICAgIHczY19zbGlkeS5uZXh0X3NsaWRlKGZhbHNlKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDMzKSAvLyBQYWdlIFVwCiAgICB7CiAgICAgIGlmICh3M2Nfc2xpZHkudmlld19hbGwpCiAgICAgICAgcmV0dXJuIHRydWU7CgogICAgICB3M2Nfc2xpZHkucHJldmlvdXNfc2xpZGUoZmFsc2UpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMzIpIC8vIHNwYWNlIGJhcgogICAgewogICAgICB3M2Nfc2xpZHkubmV4dF9zbGlkZSh0cnVlKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDM3KSAvLyBMZWZ0IGFycm93CiAgICB7CiAgICAgIHczY19zbGlkeS5wcmV2aW91c19zbGlkZSghZXZlbnQuc2hpZnRLZXkpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMzYpIC8vIEhvbWUKICAgIHsKICAgICAgdzNjX3NsaWR5LmZpcnN0X3NsaWRlKCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSAzNSkgLy8gRW5kCiAgICB7CiAgICAgIHczY19zbGlkeS5sYXN0X3NsaWRlKCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSAzOSkgLy8gUmlnaHQgYXJyb3cKICAgIHsKICAgICAgdzNjX3NsaWR5Lm5leHRfc2xpZGUoIWV2ZW50LnNoaWZ0S2V5KTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDEzKSAvLyBFbnRlcgogICAgewogICAgICBpZiAodzNjX3NsaWR5Lm91dGxpbmUpCiAgICAgIHsKICAgICAgICBpZiAodzNjX3NsaWR5Lm91dGxpbmUudmlzaWJsZSkKICAgICAgICAgIHczY19zbGlkeS5mb2xkKHczY19zbGlkeS5vdXRsaW5lKTsKICAgICAgICBlbHNlCiAgICAgICAgICB3M2Nfc2xpZHkudW5mb2xkKHczY19zbGlkeS5vdXRsaW5lKTsKICAgICAgICAgIAogICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMTg4KSAgLy8gPCBmb3Igc21hbGxlciBmb250cwogICAgewogICAgICB3M2Nfc2xpZHkuc21hbGxlcigpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMTkwKSAgLy8gPiBmb3IgbGFyZ2VyIGZvbnRzCiAgICB7CiAgICAgIHczY19zbGlkeS5iaWdnZXIoKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDE4OSB8fCBrZXkgPT0gMTA5KSAgLy8gLSBmb3Igc21hbGxlciBmb250cwogICAgewogICAgICB3M2Nfc2xpZHkuc21hbGxlcigpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gMTg3IHx8IGtleSA9PSAxOTEgfHwga2V5ID09IDEwNykgIC8vID0gKyAgZm9yIGxhcmdlciBmb250cwogICAgewogICAgICB3M2Nfc2xpZHkuYmlnZ2VyKCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSA4MykgIC8vIFMgZm9yIHNtYWxsZXIgZm9udHMKICAgIHsKICAgICAgdzNjX3NsaWR5LnNtYWxsZXIoKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDY2KSAgLy8gQiBmb3IgbGFyZ2VyIGZvbnRzCiAgICB7CiAgICAgIHczY19zbGlkeS5iaWdnZXIoKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDkwKSAgLy8gWiBmb3IgbGFzdCBzbGlkZQogICAgewogICAgICB3M2Nfc2xpZHkubGFzdF9zbGlkZSgpOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICBlbHNlIGlmIChrZXkgPT0gNzApICAvLyBGIGZvciB0b2dnbGUgdG9vbGJhcgogICAgewogICAgICB3M2Nfc2xpZHkudG9nZ2xlX3Rvb2xiYXIoKTsKICAgICAgcmV0dXJuIHczY19zbGlkeS5jYW5jZWwoZXZlbnQpOwogICAgfQogICAgZWxzZSBpZiAoa2V5ID09IDY1KSAgLy8gQSBmb3IgdG9nZ2xlIHZpZXcgc2luZ2xlL2FsbCBzbGlkZXMKICAgIHsKICAgICAgdzNjX3NsaWR5LnRvZ2dsZV92aWV3KCk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSA3NSkgIC8vIHRvZ2dsZSBhY3Rpb24gb2YgbGVmdCBjbGljayBmb3IgbmV4dCBwYWdlCiAgICB7CiAgICAgIHczY19zbGlkeS5tb3VzZV9jbGlja19lbmFibGVkID0gIXczY19zbGlkeS5tb3VzZV9jbGlja19lbmFibGVkOwogICAgICB2YXIgYWxlcnRfbXNnID0gKHczY19zbGlkeS5tb3VzZV9jbGlja19lbmFibGVkID8KICAgICAgICAgICAgICAgICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpICsgICIgbW91c2UgY2xpY2sgYWR2YW5jZSI7CgogICAgICBhbGVydCh3M2Nfc2xpZHkubG9jYWxpemUoYWxlcnRfbXNnKSk7CiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSA4NCB8fCBrZXkgPT0gNjcpICAvLyBUIG9yIEMgZm9yIHRhYmxlIG9mIGNvbnRlbnRzCiAgICB7CiAgICAgIGlmICh3M2Nfc2xpZHkudG9jKQogICAgICAgIHczY19zbGlkeS50b2dnbGVfdGFibGVfb2ZfY29udGVudHMoKTsKCiAgICAgIHJldHVybiB3M2Nfc2xpZHkuY2FuY2VsKGV2ZW50KTsKICAgIH0KICAgIGVsc2UgaWYgKGtleSA9PSA3MikgLy8gSCBmb3IgaGVscAogICAgewogICAgICB3aW5kb3cubG9jYXRpb24gPSB3M2Nfc2xpZHkuaGVscF9wYWdlOwogICAgICByZXR1cm4gdzNjX3NsaWR5LmNhbmNlbChldmVudCk7CiAgICB9CiAgICAvL2Vsc2UgYWxlcnQoImtleSBjb2RlIGlzICIrIGtleSk7CgogICAgcmV0dXJuIHRydWU7CiAgfSwKCiAgLy8gc2FmZSBmb3IgYm90aCB0ZXh0L2h0bWwgYW5kIGFwcGxpY2F0aW9uL3hodG1sK3htbAogIGNyZWF0ZV9lbGVtZW50OiBmdW5jdGlvbiAobmFtZSkgewogICAgaWYgKHRoaXMueGh0bWwgJiYgKHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMgIT0gJ3VuZGVmaW5lZCcpKQogICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwgbmFtZSkKCiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTsKICB9LAoKICBnZXRfZWxlbWVudF9zdHlsZTogZnVuY3Rpb24gKGVsZW0sIElFU3R5bGVQcm9wLCBDU1NTdHlsZVByb3ApIHsKICAgIGlmIChlbGVtLmN1cnJlbnRTdHlsZSkKICAgIHsKICAgICAgcmV0dXJuIGVsZW0uY3VycmVudFN0eWxlW0lFU3R5bGVQcm9wXTsKICAgIH0KICAgIGVsc2UgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKQogICAgewogICAgICB2YXIgY29tcFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgIiIpOwogICAgICByZXR1cm4gY29tcFN0eWxlLmdldFByb3BlcnR5VmFsdWUoQ1NTU3R5bGVQcm9wKTsKICAgIH0KICAgIHJldHVybiAiIjsKICB9LAoKICAvLyB0aGUgc3RyaW5nIHN0ciBpcyBhIHdoaXRlc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgdG9rZW5zCiAgLy8gdGVzdCBpZiBzdHIgY29udGFpbnMgYSBwYXJ0aWN1bGFyIHRva2VuLCBlLmcuICJzbGlkZSIKICBoYXNfdG9rZW46IGZ1bmN0aW9uIChzdHIsIHRva2VuKSB7CiAgICBpZiAoc3RyKQogICAgewogICAgICAvLyBkZWZpbmUgcGF0dGVybiBhcyByZWd1bGFyIGV4cHJlc3Npb24KICAgICAgdmFyIHBhdHRlcm4gPSAvXHcrL2c7CgogICAgICAvLyBjaGVjayBmb3IgbWF0Y2hlcwogICAgICAvLyBwbGFjZSByZXN1bHQgaW4gYXJyYXkKICAgICAgdmFyIHJlc3VsdCA9IHN0ci5tYXRjaChwYXR0ZXJuKTsKCiAgICAgIC8vIG5vdyBjaGVjayBpZiBkZXNpcmVkIHRva2VuIGlzIHByZXNlbnQKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCiAgICAgIHsKICAgICAgICBpZiAocmVzdWx0W2ldID09IHRva2VuKQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZmFsc2U7CiAgfSwKCiAgZ2V0X2NsYXNzX2xpc3Q6IGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICBpZiAodHlwZW9mIGVsZW1lbnQuY2xhc3NOYW1lICE9ICd1bmRlZmluZWQnKQogICAgICByZXR1cm4gZWxlbWVudC5jbGFzc05hbWU7CgogICAgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOwogIH0sCgogIGhhc19jbGFzczogZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUpIHsKICAgIGlmIChlbGVtZW50Lm5vZGVUeXBlICE9IDEpCiAgICAgIHJldHVybiBmYWxzZTsKCiAgICB2YXIgcmVnZXhwID0gbmV3IFJlZ0V4cCgiKF58ICkiICsgbmFtZSArICJcVyoiKTsKCiAgICBpZiAodHlwZW9mIGVsZW1lbnQuY2xhc3NOYW1lICE9ICd1bmRlZmluZWQnKQogICAgICByZXR1cm4gcmVnZXhwLnRlc3QoZWxlbWVudC5jbGFzc05hbWUpOwoKICAgIHJldHVybiByZWdleHAudGVzdChlbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKSk7CiAgfSwKCiAgcmVtb3ZlX2NsYXNzOiBmdW5jdGlvbiAoZWxlbWVudCwgbmFtZSkgewogICAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAoIihefCApIiArIG5hbWUgKyAiXFcqIik7CiAgICB2YXIgY2xzdmFsID0gIiI7CgogICAgaWYgKHR5cGVvZiBlbGVtZW50LmNsYXNzTmFtZSAhPSAndW5kZWZpbmVkJykKICAgIHsKICAgICAgY2xzdmFsID0gZWxlbWVudC5jbGFzc05hbWU7CgogICAgICBpZiAoY2xzdmFsKQogICAgICB7CiAgICAgICAgY2xzdmFsID0gY2xzdmFsLnJlcGxhY2UocmVnZXhwLCAiIik7CiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSBjbHN2YWw7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgY2xzdmFsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7CgogICAgICBpZiAoY2xzdmFsKQogICAgICB7CiAgICAgICAgY2xzdmFsID0gY2xzdmFsLnJlcGxhY2UocmVnZXhwLCAiIik7CiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgY2xzdmFsKTsKICAgICAgfQogICAgfQogIH0sCgogIGFkZF9jbGFzczogZnVuY3Rpb24gKGVsZW1lbnQsIG5hbWUpIHsKICAgIGlmICghdGhpcy5oYXNfY2xhc3MoZWxlbWVudCwgbmFtZSkpCiAgICB7CiAgICAgIGlmICh0eXBlb2YgZWxlbWVudC5jbGFzc05hbWUgIT0gJ3VuZGVmaW5lZCcpCiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgKz0gIiAiICsgbmFtZTsKICAgICAgZWxzZQogICAgICB7CiAgICAgICAgdmFyIGNsc3ZhbCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOwogICAgICAgIGNsc3ZhbCA9IGNsc3ZhbCA/IGNsc3ZhbCArICIgIiArIG5hbWUgOiBuYW1lOwogICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCJjbGFzcyIsIGNsc3ZhbCk7CiAgICAgIH0KICAgIH0KICB9LAoKICAvLyBIVE1MIGVsZW1lbnRzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBjbGFzcz0iaW5jcmVtZW50YWwiCiAgLy8gbm90ZSB0aGF0IHlvdSBjYW4gYWxzbyBwdXQgdGhlIGNsYXNzIG9uIGNvbnRhaW5lcnMgbGlrZQogIC8vIHVwLCBvbCwgZGwsIGFuZCBkaXYgdG8gbWFrZSB0aGVpciBjb250ZW50cyBhcHBlYXIKICAvLyBpbmNyZW1lbnRhbGx5LiBVcHBlciBjYXNlIGlzIHVzZWQgc2luY2UgdGhpcyBpcyB3aGF0CiAgLy8gYnJvd3NlcnMgcmVwb3J0IGZvciBIVE1MIG5vZGUgbmFtZXMgKHRleHQvaHRtbCkuCiAgaW5jcmVtZW50YWxfZWxlbWVudHM6IG51bGwsCiAgb2theV9mb3JfaW5jcmVtZW50YWw6IGZ1bmN0aW9uIChuYW1lKSB7CiAgICBpZiAoIXRoaXMuaW5jcmVtZW50YWxfZWxlbWVudHMpCiAgICB7CiAgICAgIHZhciBpbmNsaXN0ID0gbmV3IEFycmF5KCk7CiAgICAgIGluY2xpc3RbInAiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbInByZSJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsibGkiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbImJsb2NrcXVvdGUiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbImR0Il0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJkZCJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsiaDIiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbImgzIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJoNCJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsiaDUiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbImg2Il0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJzcGFuIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJhZGRyZXNzIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJ0YWJsZSJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsidHIiXSA9IHRydWU7CiAgICAgIGluY2xpc3RbInRoIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJ0ZCJdID0gdHJ1ZTsKICAgICAgaW5jbGlzdFsiaW1nIl0gPSB0cnVlOwogICAgICBpbmNsaXN0WyJvYmplY3QiXSA9IHRydWU7CiAgICAgIHRoaXMuaW5jcmVtZW50YWxfZWxlbWVudHMgPSBpbmNsaXN0OwogICAgfQogICAgcmV0dXJuIHRoaXMuaW5jcmVtZW50YWxfZWxlbWVudHNbbmFtZS50b0xvd2VyQ2FzZSgpXTsKICB9LAoKICBuZXh0X2luY3JlbWVudGFsX2l0ZW06IGZ1bmN0aW9uIChub2RlKSB7CiAgICB2YXIgYnIgPSB0aGlzLmlzX3hodG1sID8gImJyIiA6ICJCUiI7CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwoKICAgIGZvciAoOzspCiAgICB7CiAgICAgIG5vZGUgPSB3M2Nfc2xpZHkubmV4dF9ub2RlKHNsaWRlLCBub2RlKTsKCiAgICAgIGlmIChub2RlID09IG51bGwgfHwgbm9kZS5wYXJlbnROb2RlID09IG51bGwpCiAgICAgICAgYnJlYWs7CgogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSAxKSAgLy8gRUxFTUVOVAogICAgICB7CiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUgPT0gYnIpCiAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgaWYgKHczY19zbGlkeS5oYXNfY2xhc3Mobm9kZSwgImluY3JlbWVudGFsIikKICAgICAgICAgICAgICYmIHczY19zbGlkeS5va2F5X2Zvcl9pbmNyZW1lbnRhbChub2RlLm5vZGVOYW1lKSkKICAgICAgICAgIHJldHVybiBub2RlOwoKICAgICAgICBpZiAodzNjX3NsaWR5Lmhhc19jbGFzcyhub2RlLnBhcmVudE5vZGUsICJpbmNyZW1lbnRhbCIpCiAgICAgICAgICAgICAmJiAhdzNjX3NsaWR5Lmhhc19jbGFzcyhub2RlLCAibm9uLWluY3JlbWVudGFsIikpCiAgICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBub2RlOwogIH0sCgogIHByZXZpb3VzX2luY3JlbWVudGFsX2l0ZW06IGZ1bmN0aW9uIChub2RlKSB7CiAgICB2YXIgYnIgPSB0aGlzLmlzX3hodG1sID8gImJyIiA6ICJCUiI7CiAgICB2YXIgc2xpZGUgPSB3M2Nfc2xpZHkuc2xpZGVzW3czY19zbGlkeS5zbGlkZV9udW1iZXJdOwoKICAgIGZvciAoOzspCiAgICB7CiAgICAgIG5vZGUgPSB3M2Nfc2xpZHkucHJldmlvdXNfbm9kZShzbGlkZSwgbm9kZSk7CgogICAgICBpZiAobm9kZSA9PSBudWxsIHx8IG5vZGUucGFyZW50Tm9kZSA9PSBudWxsKQogICAgICAgIGJyZWFrOwoKICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkKICAgICAgewogICAgICAgIGlmIChub2RlLm5vZGVOYW1lID09IGJyKQogICAgICAgICAgY29udGludWU7CgogICAgICAgIGlmICh3M2Nfc2xpZHkuaGFzX2NsYXNzKG5vZGUsICJpbmNyZW1lbnRhbCIpCiAgICAgICAgICAgICAmJiB3M2Nfc2xpZHkub2theV9mb3JfaW5jcmVtZW50YWwobm9kZS5ub2RlTmFtZSkpCiAgICAgICAgICByZXR1cm4gbm9kZTsKCiAgICAgICAgaWYgKHczY19zbGlkeS5oYXNfY2xhc3Mobm9kZS5wYXJlbnROb2RlLCAiaW5jcmVtZW50YWwiKQogICAgICAgICAgICAgJiYgIXczY19zbGlkeS5oYXNfY2xhc3Mobm9kZSwgIm5vbi1pbmNyZW1lbnRhbCIpKQogICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbm9kZTsKICB9LAoKICAvLyBzZXQgdmlzaWJpbGl0eSBmb3IgYWxsIGVsZW1lbnRzIG9uIGN1cnJlbnQgc2xpZGUgd2l0aAogIC8vIGEgcGFyZW50IGVsZW1lbnQgd2l0aCBhdHRyaWJ1dGUgY2xhc3M9ImluY3JlbWVudGFsIgogIHNldF92aXNpYmlsaXR5X2FsbF9pbmNyZW1lbnRhbDogZnVuY3Rpb24gKHZhbHVlKSB7CiAgICB2YXIgbm9kZSA9IHRoaXMubmV4dF9pbmNyZW1lbnRhbF9pdGVtKG51bGwpOwoKICAgIGlmICh2YWx1ZSA9PSAiaGlkZGVuIikKICAgIHsKICAgICAgd2hpbGUgKG5vZGUpCiAgICAgIHsKICAgICAgICB3M2Nfc2xpZHkuYWRkX2NsYXNzKG5vZGUsICJpbnZpc2libGUiKTsKICAgICAgICBub2RlID0gdzNjX3NsaWR5Lm5leHRfaW5jcmVtZW50YWxfaXRlbShub2RlKTsKICAgICAgfQogICAgfQogICAgZWxzZSAvLyB2YWx1ZSA9PSAidmlzaWJsZSIKICAgIHsKICAgICAgd2hpbGUgKG5vZGUpCiAgICAgIHsKICAgICAgICB3M2Nfc2xpZHkucmVtb3ZlX2NsYXNzKG5vZGUsICJpbnZpc2libGUiKTsKICAgICAgICBub2RlID0gdzNjX3NsaWR5Lm5leHRfaW5jcmVtZW50YWxfaXRlbShub2RlKTsKICAgICAgfQogICAgfQogIH0sCgogIC8vIHJldmVhbCB0aGUgbmV4dCBoaWRkZW4gaXRlbSBvbiB0aGUgc2xpZGUKICAvLyBub2RlIGlzIG51bGwgb3IgdGhlIG5vZGUgdGhhdCB3YXMgbGFzdCByZXZlYWxlZAogIHJldmVhbF9uZXh0X2l0ZW06IGZ1bmN0aW9uIChub2RlKSB7CiAgICBub2RlID0gdzNjX3NsaWR5Lm5leHRfaW5jcmVtZW50YWxfaXRlbShub2RlKTsKCiAgICBpZiAobm9kZSAmJiBub2RlLm5vZGVUeXBlID09IDEpICAvLyBhbiBlbGVtZW50CiAgICAgIHczY19zbGlkeS5yZW1vdmVfY2xhc3Mobm9kZSwgImludmlzaWJsZSIpOwoKICAgIHJldHVybiBub2RlOwogIH0sCgogIC8vIGV4YWN0IGludmVyc2Ugb2YgcmV2ZWFsTmV4dEl0ZW0obm9kZSkKICBoaWRlX3ByZXZpb3VzX2l0ZW06IGZ1bmN0aW9uIChub2RlKSB7CiAgICBpZiAobm9kZSAmJiBub2RlLm5vZGVUeXBlID09IDEpICAvLyBhbiBlbGVtZW50CiAgICAgIHczY19zbGlkeS5hZGRfY2xhc3Mobm9kZSwgImludmlzaWJsZSIpOwoKICAgIHJldHVybiB0aGlzLnByZXZpb3VzX2luY3JlbWVudGFsX2l0ZW0obm9kZSk7CiAgfSwKCiAgLy8gbGVmdCB0byByaWdodCB0cmF2ZXJzYWwgb2Ygcm9vdCdzIGNvbnRlbnQKICBuZXh0X25vZGU6IGZ1bmN0aW9uIChyb290LCBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKQogICAgICByZXR1cm4gcm9vdC5maXJzdENoaWxkOwoKICAgIGlmIChub2RlLmZpcnN0Q2hpbGQpCiAgICAgIHJldHVybiBub2RlLmZpcnN0Q2hpbGQ7CgogICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpCiAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nOwoKICAgIGZvciAoOzspCiAgICB7CiAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CgogICAgICBpZiAoIW5vZGUgfHwgbm9kZSA9PSByb290KQogICAgICAgIGJyZWFrOwoKICAgICAgaWYgKG5vZGUgJiYgbm9kZS5uZXh0U2libGluZykKICAgICAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZzsKICAgIH0KCiAgICByZXR1cm4gbnVsbDsKICB9LAoKICAvLyByaWdodCB0byBsZWZ0IHRyYXZlcnNhbCBvZiByb290J3MgY29udGVudAogIHByZXZpb3VzX25vZGU6IGZ1bmN0aW9uIChyb290LCBub2RlKSB7CiAgICBpZiAobm9kZSA9PSBudWxsKQogICAgewogICAgICBub2RlID0gcm9vdC5sYXN0Q2hpbGQ7CgogICAgICBpZiAobm9kZSkKICAgICAgewogICAgICAgIHdoaWxlIChub2RlLmxhc3RDaGlsZCkKICAgICAgICAgIG5vZGUgPSBub2RlLmxhc3RDaGlsZDsKICAgICAgfQoKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgaWYgKG5vZGUucHJldmlvdXNTaWJsaW5nKQogICAgewogICAgICBub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7CgogICAgICB3aGlsZSAobm9kZS5sYXN0Q2hpbGQpCiAgICAgICAgbm9kZSA9IG5vZGUubGFzdENoaWxkOwoKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgaWYgKG5vZGUucGFyZW50Tm9kZSAhPSByb290KQogICAgICByZXR1cm4gbm9kZS5wYXJlbnROb2RlOwoKICAgIHJldHVybiBudWxsOwogIH0sCgogIHByZXZpb3VzX3NpYmxpbmdfZWxlbWVudDogZnVuY3Rpb24gKGVsKSB7CiAgICBlbCA9IGVsLnByZXZpb3VzU2libGluZzsKCiAgICB3aGlsZSAoZWwgJiYgZWwubm9kZVR5cGUgIT0gMSkKICAgICAgZWwgPSBlbC5wcmV2aW91c1NpYmxpbmc7CgogICAgcmV0dXJuIGVsOwogIH0sCgogIG5leHRfc2libGluZ19lbGVtZW50OiBmdW5jdGlvbiAoZWwpIHsKICAgIGVsID0gZWwubmV4dFNpYmxpbmc7CgogICAgd2hpbGUgKGVsICYmIGVsLm5vZGVUeXBlICE9IDEpCiAgICAgIGVsID0gZWwubmV4dFNpYmxpbmc7CgogICAgcmV0dXJuIGVsOwogIH0sCgogIGZpcnN0X2NoaWxkX2VsZW1lbnQ6IGZ1bmN0aW9uIChlbCkgewogICAgdmFyIG5vZGU7CgogICAgZm9yIChub2RlID0gZWwuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpCiAgICB7CiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEpCiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIG5vZGU7CiAgfSwKCiAgZmlyc3RfdGFnOiBmdW5jdGlvbiAoZWxlbWVudCwgdGFnKSB7CiAgICB2YXIgbm9kZTsKCiAgICBpZiAoIXRoaXMuaXNfeGh0bWwpCiAgICAgIHRhZyA9IHRhZy50b1VwcGVyQ2FzZSgpOwoKICAgIGZvciAobm9kZSA9IGVsZW1lbnQuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpCiAgICB7CiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEgJiYgbm9kZS5ub2RlTmFtZSA9PSB0YWcpCiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIG5vZGU7CiAgfSwKCiAgaGlkZV9zZWxlY3Rpb246IGZ1bmN0aW9uICgpIHsKICAgIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKSAvLyBGaXJlZm94LCBDaHJvbWl1bSwgU2FmYXJpLCBPcGVyYQogICAgewogICAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpOwoKICAgICAgaWYgKHNlbGVjdGlvbi5yYW5nZUNvdW50ID4gMCkKICAgICAgewogICAgICAgIHZhciByYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApOwogICAgICAgIHJhbmdlLmNvbGxhcHNlIChmYWxzZSk7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgLy8gSW50ZXJuZXQgRXhwbG9yZXIKICAgIHsKICAgICAgdmFyIHRleHRSYW5nZSA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSAoKTsKICAgICAgdGV4dFJhbmdlLmNvbGxhcHNlIChmYWxzZSk7CiAgICB9CiAgfSwKCiAgZ2V0X3NlbGVjdGVkX3RleHQ6IGZ1bmN0aW9uICgpIHsKICAgIHRyeQogICAgewogICAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbikKICAgICAgICByZXR1cm4gd2luZG93LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCk7CgogICAgICBpZiAoZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKQogICAgICAgIHJldHVybiBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpOwoKICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikKICAgICAgICByZXR1cm4gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCkudGV4dDsKICAgIH0KICAgIGNhdGNoIChlKQogICAgewogICAgfQoKICAgIHJldHVybiAiIjsKICB9LAoKICAvLyBtYWtlIG5vdGUgb2YgbGVuZ3RoIG9mIHNlbGVjdGVkIHRleHQKICAvLyBhcyB0aGlzIGV2YWx1YXRlcyB0byB6ZXJvIGluIGNsaWNrIGV2ZW50CiAgbW91c2VfYnV0dG9uX3VwOiBmdW5jdGlvbiAoZSkgewogICAgdzNjX3NsaWR5LnNlbGVjdGVkX3RleHRfbGVuID0gdzNjX3NsaWR5LmdldF9zZWxlY3RlZF90ZXh0KCkubGVuZ3RoOwogIH0sCgogIG1vdXNlX2J1dHRvbl9kb3duOiBmdW5jdGlvbiAoZSkgewogICAgdzNjX3NsaWR5LnNlbGVjdGVkX3RleHRfbGVuID0gdzNjX3NsaWR5LmdldF9zZWxlY3RlZF90ZXh0KCkubGVuZ3RoOwogICAgdzNjX3NsaWR5Lm1vdXNlX3ggPSBlLmNsaWVudFg7CiAgICB3M2Nfc2xpZHkubW91c2VfeSA9IGUuY2xpZW50WTsKICB9LAoKICAvLyByaWdodCBtb3VzZSBidXR0b24gY2xpY2sgaXMgcmVzZXJ2ZWQgZm9yIGNvbnRleHQgbWVudXMKICAvLyBpdCBpcyBtb3JlIHJlbGlhYmxlIHRvIGRldGVjdCByaWdodGNsaWNrIHRoYW4gbGVmdGNsaWNrCiAgbW91c2VfYnV0dG9uX2NsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgaWYgKCFlKQogICAgICB2YXIgZSA9IHdpbmRvdy5ldmVudDsKCiAgICBpZiAoTWF0aC5hYnMoZS5jbGllbnRYIC13M2Nfc2xpZHkubW91c2VfeCkgKwogICAgICAgIE1hdGguYWJzKGUuY2xpZW50WSAtdzNjX3NsaWR5Lm1vdXNlX3kpID4gMTApCiAgICAgIHJldHVybiB0cnVlOwoKICAgIGlmICh3M2Nfc2xpZHkuc2VsZWN0ZWRfdGV4dF9sZW4gPiAwKQogICAgICByZXR1cm4gdHJ1ZTsKCiAgICB2YXIgcmlnaHRjbGljayA9IGZhbHNlOwogICAgdmFyIGxlZnRjbGljayA9IGZhbHNlOwogICAgdmFyIG1pZGRsZWNsaWNrID0gZmFsc2U7CiAgICB2YXIgdGFyZ2V0OwoKICAgIGlmICghZSkKICAgICAgdmFyIGUgPSB3aW5kb3cuZXZlbnQ7CgogICAgaWYgKGUudGFyZ2V0KQogICAgICB0YXJnZXQgPSBlLnRhcmdldDsKICAgIGVsc2UgaWYgKGUuc3JjRWxlbWVudCkKICAgICAgdGFyZ2V0ID0gZS5zcmNFbGVtZW50OwoKICAgIC8vIHdvcmsgYXJvdW5kIFNhZmFyaSBidWcKICAgIGlmICh0YXJnZXQubm9kZVR5cGUgPT0gMykKICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7CgogICAgaWYgKGUud2hpY2gpIC8vIGFsbCBicm93c2VycyBleGNlcHQgSUUKICAgIHsKICAgICAgbGVmdGNsaWNrID0gKGUud2hpY2ggPT0gMSk7CiAgICAgIG1pZGRsZWNsaWNrID0gKGUud2hpY2ggPT0gMik7CiAgICAgIHJpZ2h0Y2xpY2sgPSAoZS53aGljaCA9PSAzKTsKICAgIH0KICAgIGVsc2UgaWYgKGUuYnV0dG9uKQogICAgewogICAgICAvLyBLb25xdWVyb3IgZ2l2ZXMgMSBmb3IgbGVmdCwgNCBmb3IgbWlkZGxlCiAgICAgIC8vIElFNiBnaXZlcyAwIGZvciBsZWZ0IGFuZCBub3QgMSBhcyBJIGV4cGVjdGVkCgogICAgICBpZiAoZS5idXR0b24gPT0gNCkKICAgICAgICBtaWRkbGVjbGljayA9IHRydWU7CgogICAgICAvLyBhbGwgYnJvd3NlcnMgYWdyZWUgb24gMiBmb3IgcmlnaHQgYnV0dG9uCiAgICAgIHJpZ2h0Y2xpY2sgPSAoZS5idXR0b24gPT0gMik7CiAgICB9CiAgICBlbHNlCiAgICAgIGxlZnRjbGljayA9IHRydWU7CgogICAgaWYgKHczY19zbGlkeS5zZWxlY3RlZF90ZXh0X2xlbiA+IDApCiAgICB7CiAgICAgIHczY19zbGlkeS5zdG9wX3Byb3BhZ2F0aW9uKGUpOwogICAgICBlLmNhbmNlbCA9IHRydWU7CiAgICAgIGUucmV0dXJuVmFsdWUgPSBmYWxzZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIGRpc21pc3MgdGFibGUgb2YgY29udGVudHMKICAgIHczY19zbGlkeS5oaWRlX3RhYmxlX29mX2NvbnRlbnRzKGZhbHNlKTsKCiAgICAvLyBjaGVjayBpZiB0YXJnZXQgaXMgc29tZXRoaW5nIHRoYXQgcHJvYmFibHkgd2FudCdzIGNsaWNrcwogICAgLy8gZS5nLiBhLCBlbWJlZCwgb2JqZWN0LCBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgb3B0aW9uCiAgICB2YXIgdGFnID0gdGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgogICAgaWYgKHczY19zbGlkeS5tb3VzZV9jbGlja19lbmFibGVkICYmIGxlZnRjbGljayAmJgogICAgICAgICF3M2Nfc2xpZHkuc3BlY2lhbF9lbGVtZW50KHRhcmdldCkgJiYKICAgICAgICAhdGFyZ2V0Lm9uY2xpY2spCiAgICB7CiAgICAgIHczY19zbGlkeS5uZXh0X3NsaWRlKHRydWUpOwogICAgICB3M2Nfc2xpZHkuc3RvcF9wcm9wYWdhdGlvbihlKTsKICAgICAgZS5jYW5jZWwgPSB0cnVlOwogICAgICBlLnJldHVyblZhbHVlID0gZmFsc2U7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICByZXR1cm4gdHJ1ZTsKICB9LAoKICBzcGVjaWFsX2VsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICBpZiAodGhpcy5oYXNfY2xhc3MoZWxlbWVudCwgIm5vbi1pbnRlcmFjdGl2ZSIpKQogICAgICByZXR1cm4gZmFsc2U7CgogICAgdmFyIHRhZyA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCiAgICByZXR1cm4gZWxlbWVudC5vbmtleWRvd24gfHwKICAgICAgZWxlbWVudC5vbmNsaWNrIHx8CiAgICAgIHRhZyA9PSAiYSIgfHwKICAgICAgdGFnID09ICJlbWJlZCIgfHwKICAgICAgdGFnID09ICJvYmplY3QiIHx8CiAgICAgIHRhZyA9PSAidmlkZW8iIHx8CiAgICAgIHRhZyA9PSAiYXVkaW8iIHx8CiAgICAgIHRhZyA9PSAic3ZnIiB8fAogICAgICB0YWcgPT0gImNhbnZhcyIgfHwKICAgICAgdGFnID09ICJpbnB1dCIgfHwKICAgICAgdGFnID09ICJ0ZXh0YXJlYSIgfHwKICAgICAgdGFnID09ICJzZWxlY3QiIHx8CiAgICAgIHRhZyA9PSAib3B0aW9uIjsKICB9LAoKICBzbGlkeV9jaHJvbWU6IGZ1bmN0aW9uIChlbCkgewogICAgd2hpbGUgKGVsKQogICAgewogICAgICBpZiAoZWwgPT0gdzNjX3NsaWR5LnRvYyB8fAogICAgICAgICAgZWwgPT0gdzNjX3NsaWR5LnRvb2xiYXIgfHwKICAgICAgICAgIHczY19zbGlkeS5oYXNfY2xhc3MoZWwsICJvdXRsaW5lIikpCiAgICAgICAgcmV0dXJuIHRydWU7CgogICAgICBlbCA9IGVsLnBhcmVudE5vZGU7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0sCgogIGdldF9rZXk6IGZ1bmN0aW9uIChlKQogIHsKICAgIHZhciBrZXk7CgogICAgLy8ga2x1ZGdlIGFyb3VuZCBOUy9JRSBkaWZmZXJlbmNlcyAKICAgIGlmICh0eXBlb2Ygd2luZG93LmV2ZW50ICE9ICJ1bmRlZmluZWQiKQogICAgICBrZXkgPSB3aW5kb3cuZXZlbnQua2V5Q29kZTsKICAgIGVsc2UgaWYgKGUud2hpY2gpCiAgICAgIGtleSA9IGUud2hpY2g7CgogICAgcmV0dXJuIGtleTsKICB9LAoKICBnZXRfdGFyZ2V0OiBmdW5jdGlvbiAoZSkgewogICAgdmFyIHRhcmdldDsKCiAgICBpZiAoIWUpCiAgICAgIGUgPSB3aW5kb3cuZXZlbnQ7CgogICAgaWYgKGUudGFyZ2V0KQogICAgICB0YXJnZXQgPSBlLnRhcmdldDsKICAgIGVsc2UgaWYgKGUuc3JjRWxlbWVudCkKICAgICAgdGFyZ2V0ID0gZS5zcmNFbGVtZW50OwoKICAgIGlmICh0YXJnZXQubm9kZVR5cGUgIT0gMSkKICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGU7CgogICAgcmV0dXJuIHRhcmdldDsKICB9LAoKICAvLyBkb2VzIGRpc3BsYXkgcHJvcGVydHkgcHJvdmlkZSBjb3JyZWN0IGRlZmF1bHRzPwogIGlzX2Jsb2NrOiBmdW5jdGlvbiAoZWxlbSkgewogICAgdmFyIHRhZyA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCiAgICByZXR1cm4gdGFnID09ICJvbCIgfHwgdGFnID09ICJ1bCIgfHwgdGFnID09ICJwIiB8fCB0YWcgPT0gImRsIiB8fAogICAgICAgICAgIHRhZyA9PSAibGkiIHx8IHRhZyA9PSAidGFibGUiIHx8IHRhZyA9PSAicHJlIiB8fAogICAgICAgICAgIHRhZyA9PSAiaDEiIHx8IHRhZyA9PSAiaDIiIHx8IHRhZyA9PSAiaDMiIHx8CiAgICAgICAgICAgdGFnID09ICJoNCIgfHwgdGFnID09ICJoNSIgfHwgdGFnID09ICJoNiIgfHwKICAgICAgICAgICB0YWcgPT0gImJsb2NrcXVvdGUiIHx8IHRhZyA9PSAiYWRkcmVzcyI7IAogIH0sCgogIGFkZF9saXN0ZW5lcjogZnVuY3Rpb24gKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyKSB7CiAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpCiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgaGFuZGxlciwgZmFsc2UpOwogICAgZWxzZQogICAgICBlbGVtZW50LmF0dGFjaEV2ZW50KCJvbiIrZXZlbnQsIGhhbmRsZXIpOwogIH0sCgogIC8vIHVzZWQgdG8gcHJldmVudCBldmVudCBwcm9wYWdhdGlvbiBmcm9tIGZpZWxkIGNvbnRyb2xzCiAgc3RvcF9wcm9wYWdhdGlvbjogZnVuY3Rpb24gKGV2ZW50KSB7CiAgICBldmVudCA9IGV2ZW50ID8gZXZlbnQgOiB3aW5kb3cuZXZlbnQ7CiAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOyAgLy8gZm9yIElFCgogICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikKICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgcmV0dXJuIHRydWU7CiAgfSwKCiAgY2FuY2VsOiBmdW5jdGlvbiAoZXZlbnQpIHsKICAgIGlmIChldmVudCkKICAgIHsKICAgICAgIGV2ZW50LmNhbmNlbCA9IHRydWU7CiAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOwoKICAgICAgaWYgKGV2ZW50LnByZXZlbnREZWZhdWx0KQogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICB9CgogICAgdzNjX3NsaWR5LmtleV93YW50ZWQgPSBmYWxzZTsKICAgIHJldHVybiBmYWxzZTsKICB9LAoKLy8gZm9yIGVhY2ggbGFuZ3VhZ2UgZGVmaW5lIGFuIGFzc29jaWF0aXZlIGFycmF5Ci8vIGFuZCBhbHNvIHRoZSBoZWxwIHRleHQgd2hpY2ggaXMgbG9uZ2VyCgogIHN0cmluZ3NfZXM6IHsKICAgICJzbGlkZSI6InDDoWcuIiwKICAgICJoZWxwPyI6IkF5dWRhIiwKICAgICJjb250ZW50cz8iOiLDjW5kaWNlIiwKICAgICJ0YWJsZSBvZiBjb250ZW50cyI6InRhYmxhIGRlIGNvbnRlbmlkb3MiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoiVGFibGEgZGUgQ29udGVuaWRvcyIsCiAgICAicmVzdGFydCBwcmVzZW50YXRpb24iOiJSZWluaWNpYXIgcHJlc2VudGFjacOzbiIsCiAgICAicmVzdGFydD8iOiJJbmljaW8iCiAgfSwKICBoZWxwX2VzOgogICAgIlV0aWxpY2UgZWwgcmF0w7NuLCBiYXJyYSBlc3BhY2lhZG9yYSwgdGVjbGFzIEl6ZGEvRGNoYSwgIiArCiAgICAibyBSZSBww6FnIHkgQXYgcMOhZy4gVXNlIFMgeSBCIHBhcmEgY2FtYmlhciBlbCB0YW1hw7FvIGRlIGZ1ZW50ZS4iLAoKICBzdHJpbmdzX2NhOiB7CiAgICAic2xpZGUiOiJww6BnLi4iLAogICAgImhlbHA/IjoiQWp1ZGEiLAogICAgImNvbnRlbnRzPyI6IsONbmRleCIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJ0YXVsYSBkZSBjb250aW5ndXRzIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IlRhdWxhIGRlIENvbnRpbmd1dHMiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoiUmVpbmljaWFyIHByZXNlbnRhY2nDsyIsCiAgICAicmVzdGFydD8iOiJJbmljaSIKICB9LAogIGhlbHBfY2E6CiAgICAiVXRpbGl0emkgZWwgcmF0b2zDrSwgYmFycmEgZXNwYWlhZG9yYSwgdGVjbGVzIEVzcS4vRHRhLiAiICsKICAgICJvIFJlIHDDoGcgeSBBdiBww6BnLiBVc2kgUyBpIEIgcGVyIGNhbnZpYXIgZ3JhbmTDoHJpYSBkZSBmb250LiIsCgogIHN0cmluZ3NfY3M6IHsKICAgICJzbGlkZSI6InNuw61tZWsiLAogICAgImhlbHA/IjoibsOhcG92xJtkYSIsCiAgICAiY29udGVudHM/Ijoib2JzYWgiLAogICAgInRhYmxlIG9mIGNvbnRlbnRzIjoib2JzYWggcHJlemVudGFjZSIsCiAgICAiVGFibGUgb2YgQ29udGVudHMiOiJPYnNhaCBwcmV6ZW50YWNlIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6Inpub3Z1IHNwdXN0aXQgcHJlemVudGFjaSIsCiAgICAicmVzdGFydD8iOiJyZXN0YXJ0IgogIH0sCiAgaGVscF9jczoKICAgICJQcmV6ZW50YWNpIG3Fr8W+ZXRlIHByb2Now6F6ZXQgcG9tb2PDrSBrbGlrbnV0w60gbXnFoWksIG1lemVybsOta3UsICIgKwogICAgIsWhaXBlayB2bGV2byBhIHZwcmF2byBuZWJvIGtsw6F2ZXMgUGFnZVVwIGEgUGFnZURvd24uIFDDrXNtbyBzZSAiICsKICAgICJkw6EgenbEm3TFoWl0IGEgem1lbsWhaXQgcG9tb2PDrSBrbMOhdmVzIEIgYSBTLiIsCgogIHN0cmluZ3Nfbmw6IHsKICAgICJzbGlkZSI6InBhZ2luYSIsCiAgICAiaGVscD8iOiJIZWxwPyIsCiAgICAiY29udGVudHM/IjoiSW5ob3VkPyIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJpbmhvdWRzb3BnYXZlIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IkluaG91ZHNvcGdhdmUiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoiaGVyc3RhcnQgcHJlc2VudGF0aWUiLAogICAgInJlc3RhcnQ/IjoiSGVyc3RhcnQ/IgogIH0sCiAgaGVscF9ubDoKICAgICAiTmF2aWdlZXIgZC5tLnYuIGhldCBtdWlzLCBzcGF0aWViYXIsIExpbmtzL1JlY2h0cyB0b2V0c2VuLCAiICsKICAgICAib2YgUGdVcCBlbiBQZ0RuLiBHZWJydWlrIFMgZW4gQiBvbSBkZSBrYXJha3Rlcmdyb290dGUgdGUgdmVyYW5kZXJlbi4iLAoKICBzdHJpbmdzX2RlOiB7CiAgICAic2xpZGUiOiJTZWl0ZSIsCiAgICAiaGVscD8iOiJIaWxmZSIsCiAgICAiY29udGVudHM/Ijoiw5xiZXJzaWNodCIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJJbmhhbHRzdmVyemVpY2huaXMiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoiSW5oYWx0c3ZlcnplaWNobmlzIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6IlByw6RzZW50YXRpb24gbmV1IHN0YXJ0ZW4iLAogICAgInJlc3RhcnQ/IjoiTmV1c3RhcnQiCiAgfSwKICBoZWxwX2RlOgogICAgIkJlbnV0emVuIFNpZSBkaWUgTWF1cywgTGVlcnNjaGxhZywgZGllIEN1cnNvcnRhc3RlbiBsaW5rcy9yZWNodHMgb2RlciAiICsKICAgICJQYWdlIHVwL1BhZ2UgRG93biB6dW0gV2VjaHNlbG4gZGVyIFNlaXRlbiB1bmQgUyB1bmQgQiBmw7xyIGRpZSBTY2hyaWZ0Z3LDtnNzZS4iLAoKICBzdHJpbmdzX3BsOiB7CiAgICAic2xpZGUiOiJzbGFqZCIsCiAgICAiaGVscD8iOiJwb21vYz8iLAogICAgImNvbnRlbnRzPyI6InNwaXMgdHJlxZtjaT8iLAogICAgInRhYmxlIG9mIGNvbnRlbnRzIjoic3BpcyB0cmXFm2NpIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IlNwaXMgVHJlxZtjaSIsCiAgICAicmVzdGFydCBwcmVzZW50YXRpb24iOiJSZXN0YXJ0dWogcHJlemVudGFjasSZIiwKICAgICJyZXN0YXJ0PyI6InJlc3RhcnQ/IgogIH0sCiAgaGVscF9wbDoKICAgICJabWllbmlhaiBzbGFqZHkga2xpa2FqxIVjIG15c3rEhSwgbmFjaXNrYWrEhWMgc3BhY2rEmSwgc3RyemHFgmtpIGxld28vcHJhd28iICsKICAgICJsdWIgUGdVcCAvIFBnRG4uIFXFvHlqIGtsYXdpc3p5IFMgaSBCLCBhYnkgem1pZW5pxIcgcm96bWlhciBjemN6aW9ua2kuIiwKCiAgc3RyaW5nc19mcjogewogICAgInNsaWRlIjoicGFnZSIsCiAgICAiaGVscD8iOiJBaWRlIiwKICAgICJjb250ZW50cz8iOiJJbmRleCIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJ0YWJsZSBkZXMgbWF0acOocmVzIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IlRhYmxlIGRlcyBtYXRpw6hyZXMiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoiUmVjb21tZW5jZXIgbCdleHBvc8OpIiwKICAgICJyZXN0YXJ0PyI6IkTDqWJ1dCIKICB9LAogIGhlbHBfZnI6CiAgICAiTmF2aWd1ZXogYXZlYyBsYSBzb3VyaXMsIGxhIGJhcnJlIGQnZXNwYWNlLCBsZXMgZmzDqGNoZXMgIiArCiAgICAiZ2F1Y2hlL2Ryb2l0ZSBvdSBsZXMgdG91Y2hlcyBQZyBVcCwgUGcgRG4uIFV0aWxpc2V6ICIgKwogICAgImxlcyB0b3VjaGVzIFMgZXQgQiBwb3VyIG1vZGlmaWVyIGxhIHRhaWxsZSBkZSBsYSBwb2xpY2UuIiwKCiAgc3RyaW5nc19odTogewogICAgInNsaWRlIjoib2xkYWwiLAogICAgImhlbHA/Ijoic2Vnw610c8OpZyIsCiAgICAiY29udGVudHM/IjoidGFydGFsb20iLAogICAgInRhYmxlIG9mIGNvbnRlbnRzIjoidGFydGFsb21qZWd5esOpayIsCiAgICAiVGFibGUgb2YgQ29udGVudHMiOiJUYXJ0YWxvbWplZ3l6w6lrIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6ImJlbXV0YXTDsyDDumpyYWluZMOtdMOhc2EiLAogICAgInJlc3RhcnQ/Ijoiw7pqcmFpbmTDrXTDoXMiCiAgfSwKICBoZWxwX2h1OgogICAgIkF6IG9sZGFsYWsga8O2enRpIGzDqXBrZWTDqXNoZXoga2F0dGludHNvbiBheiBlZ8OpcnJlbCwgdmFneSAiICsKICAgICJoYXN6bsOhbGphIGEgc3rDs2vDtnosIGEgYmFsLCB2YWd5IGEgam9iYiBuecOtbCwgaWxsZXR2ZSBhIFBhZ2UgRG93biwgIiArCiAgICAiUGFnZSBVcCBiaWxsZW50ecWxa2V0LiBBeiBTIMOpcyBhIEIgYmlsbGVudHnFsWtrZWwgdsOhbHRvenRhdGhhdGphICIgKwogICAgImEgc3rDtnZlZyBtw6lyZXTDqXQuIiwKCiAgc3RyaW5nc19pdDogewogICAgInNsaWRlIjoicGFnLiIsCiAgICAiaGVscD8iOiJBaXV0byIsCiAgICAiY29udGVudHM/IjoiSW5kaWNlIiwKICAgICJ0YWJsZSBvZiBjb250ZW50cyI6ImluZGljZSIsCiAgICAiVGFibGUgb2YgQ29udGVudHMiOiJJbmRpY2UiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoiUmljb21pbmNpYXJlIGxhIHByZXNlbnRhemlvbmUiLAogICAgInJlc3RhcnQ/IjoiSW5pemlvIgogIH0sCiAgaGVscF9pdDoKICAgICJOYXZpZ2FyZSBjb24gbW91c2UsIGJhcnJhIHNwYXppbywgZnJlY2NlIHNpbmlzdHJhL2Rlc3RyYSBvICIgKwogICAgIlBnVXAgZSBQZ0RuLiBVc2FyZSBTIGUgQiBwZXIgY2FtYmlhcmUgbGEgZGltZW5zaW9uZSBkZWkgY2FyYXR0ZXJpLiIsCgogIHN0cmluZ3NfZWw6IHsKICAgICJzbGlkZSI6Is+DzrXOu86vzrTOsSIsCiAgICAiaGVscD8iOiLOss6/zq7OuM61zrnOsTsiLAogICAgImNvbnRlbnRzPyI6Is+AzrXPgc65zrXPh8+MzrzOtc69zrE7IiwKICAgICJ0YWJsZSBvZiBjb250ZW50cyI6Is+Azq/Ovc6xzrrOsc+CIM+AzrXPgc65zrXPh86/zrzOrc69z4nOvSIsCiAgICAiVGFibGUgb2YgQ29udGVudHMiOiLOoM6vzr3Osc66zrHPgiDOoM61z4HOuc61z4fOv868zq3Ovc+Jzr0iLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoizrXPgM6xzr3Otc66zrrOr869zrfPg863IM+AzrHPgc6/z4XPg86vzrHPg863z4IiLAogICAgInJlc3RhcnQ/IjoizrXPgM6xzr3Otc66zrrOr869zrfPg863OyIKICB9LAogIGhlbHBfZWw6CiAgICAizqDOu86/zrfOs863zrjOtc6vz4TOtSDOvM61IM+Ezr8gzrrOu86vzrogz4TOv8+FIM+Azr/Ovc+EzrnOus65zr/PjSwgz4TOvyBzcGFjZSwgz4TOsSDOss6tzrvOtyDOsc+BzrnPg8+EzrXPgc6sL860zrXOvs65zqwsICIgKwogICAgIs6uIFBhZ2UgVXAgzrrOsc65IFBhZ2UgRG93bi4gzqfPgc63z4POuc68zr/PgM6/zrnOrs+Dz4TOtSDPhM6xIM+AzrvOrs66z4TPgc6xIFMgzrrOsc65IEIgzrPOuc6xIM69zrEgzrHOu867zqzOvs61z4TOtSAiICsKICAgICLPhM6/IM68zq3Os861zrjOv8+CIM+EzrfPgiDOs8+BzrHOvM68zrHPhM6/z4POtc65z4HOrM+CLiIsCgogIHN0cmluZ3NfamE6IHsKICAgICJzbGlkZSI6IuOCueODqeOCpOODiSIsCiAgICAiaGVscD8iOiLjg5jjg6vjg5ciLAogICAgImNvbnRlbnRzPyI6IuebruasoSIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiLnm67mrKHjgpLooajnpLoiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoi55uu5qyhIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6IuacgOWIneOBi+OCieWGjeeUnyIsCiAgICAicmVzdGFydD8iOiLmnIDliJ3jgYvjgokiCiAgfSwKICBoZWxwX2phOgogICAgICLjg57jgqbjgrnlt6bjgq/jg6rjg4Pjgq8g44O7IOOCueODmuODvOOCuSDjg7sg5bem5Y+z44Kt44O8ICIgKwogICAgICLjgb7jgZ/jga8gUGFnZSBVcCDjg7sgUGFnZSBEb3du44Gn5pON5L2c77yMIFMg44O7IELjgafjg5Xjgqnjg7Pjg4jjgrXjgqTjgrrlpInmm7QiLAoKICBzdHJpbmdzX3poOiB7CiAgICAic2xpZGUiOiLlubvnga/niYciLAogICAgImhlbHA/Ijoi5biu5YqpPyIsCiAgICAiY29udGVudHM/Ijoi5YaF5a65PyIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiLnm67lvZUiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoi55uu5b2VIiwKICAgICJyZXN0YXJ0IHByZXNlbnRhdGlvbiI6IumHjeaWsOWQr+WKqOWxleekuiIsCiAgICAicmVzdGFydD8iOiLph43mlrDlkK/liqg/IgogIH0sCiAgaGVscF96aDoKICAgICLnlKjpvKDmoIfngrnlh7ssIOepuuagvOadoSwg5bem5Y+z566t5aS0LCBQZyBVcCDlkowgUGcgRG4g5a+86IiqLiAiICsKICAgICLnlKggUywgQiDmlLnlj5jlrZfkvZPlpKflsI8uIiwKCiAgc3RyaW5nc19ydTogewogICAgInNsaWRlIjoi0YHQu9Cw0LnQtCIsCiAgICAiaGVscD8iOiLQv9C+0LzQvtGJ0Yw/IiwKICAgICJjb250ZW50cz8iOiLRgdC+0LTQtdGA0LbQsNC90LjQtT8iLAogICAgInRhYmxlIG9mIGNvbnRlbnRzIjoi0L7Qs9C70LDQstC70LXQvdC40LUiLAogICAgIlRhYmxlIG9mIENvbnRlbnRzIjoi0J7Qs9C70LDQstC70LXQvdC40LUiLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoi0L/QtdGA0LXQt9Cw0L/Rg9GB0YLQuNGC0Ywg0L/RgNC10LfQtdC90YLQsNGG0LjRjiIsCiAgICAicmVzdGFydD8iOiLQv9C10YDQtdC30LDQv9GD0YHQuj8iCiAgfSwKICBoZWxwX3J1OgogICAgItCf0LXRgNC10LzQtdGJ0LDQudGC0LXRgdGMINC60LvQuNC60LDRjyDQvNGL0YjQutC+0LksINC40YHQv9C+0LvRjNC30YPRjyDQutC70LDQstC40YjRgyDQv9GA0L7QsdC10LssINGB0YLRgNC10LvQutC4IiArCiAgICAi0LLQu9C10LLQvi/QstC/0YDQsNCy0L4g0LjQu9C4IFBnIFVwINC4IFBnIERuLiDQmtC70LDQstC40YjQuCBTINC4IEIg0LzQtdC90Y/RjtGCINGA0LDQt9C80LXRgCDRiNGA0LjRhNGC0LAuIiwKCiAgc3RyaW5nc19zdjogewogICAgInNsaWRlIjoic2lkYSIsCiAgICAiaGVscD8iOiJoasOkbHAiLAogICAgImNvbnRlbnRzPyI6ImlubmVow6VsbCIsCiAgICAidGFibGUgb2YgY29udGVudHMiOiJpbm5laMOlbGxzZsO2cnRlY2tuaW5nIiwKICAgICJUYWJsZSBvZiBDb250ZW50cyI6IklubmVow6VsbHNmw7ZydGVja25pbmciLAogICAgInJlc3RhcnQgcHJlc2VudGF0aW9uIjoidmlzYSBwcmVzZW50YXRpb25lbiBmcsOlbiBiw7ZyamFuIiwKICAgICJyZXN0YXJ0PyI6ImLDtnJqYSBvbSIKICB9LAogIGhlbHBfc3Y6CiAgICAiQmzDpGRkcmEgbWVkIGV0dCBrbGljayBtZWQgdsOkbnN0cmEgbXVza25hcHBlbiwgbWVsbGFuc2xhZ3N0YW5nZW50ZW4sICIgKwogICAgInbDpG5zdGVyLSBvY2ggaMO2Z2VycGlsdGFuZ2VudGVybmEgZWxsZXIgdGFuZ2VudGVybmEgUGcgVXAsIFBnIERuLiAiICsKICAgICJBbnbDpG5kIHRhbmdlbnRlcm5hIFMgb2NoIEIgZsO2ciBhdHQgw6RuZHJhIHRleHRlbnMgc3Rvcmxlay4iLAoKICBzdHJpbmdzOiB7IH0sCgogIGxvY2FsaXplOiBmdW5jdGlvbiAoc3JjKSB7CiAgICBpZiAoc3JjID09ICIiKQogICAgICByZXR1cm4gc3JjOwoKICAgICAvLyB0cnkgZnVsbCBsYW5ndWFnZSBjb2RlLCBlLmcuIGVuLVVTCiAgICAgdmFyIHMsIGxvb2t1cCA9IHczY19zbGlkeS5zdHJpbmdzW3czY19zbGlkeS5sYW5nXTsKCiAgICAgaWYgKGxvb2t1cCkKICAgICB7CiAgICAgICBzID0gbG9va3VwW3NyY107CgogICAgICAgaWYgKHMpCiAgICAgICAgcmV0dXJuIHM7CiAgICAgfQoKICAgICAvLyBzdHJpcCBjb3VudHJ5IGNvZGUgc3VmZml4LCBlLmcuCiAgICAgLy8gdHJ5IGVuIGlmIHVuZGVmaW5lZCBmb3IgZW4tVVMKICAgICB2YXIgbGcgPSB3M2Nfc2xpZHkubGFuZy5zcGxpdCgiLSIpOwoKICAgICBpZiAobGcubGVuZ3RoID4gMSkKICAgICB7CiAgICAgICBsb29rdXAgPSB3M2Nfc2xpZHkuc3RyaW5nc1tsZ1swXV07CgogICAgICAgaWYgKGxvb2t1cCkKICAgICAgIHsKICAgICAgICAgcyA9IGxvb2t1cFtzcmNdOwoKICAgICAgICAgaWYgKHMpCiAgICAgICAgICByZXR1cm4gczsKICAgICAgIH0KICAgICB9CgogICAgIC8vIG90aGVyd2lzZSBzdHJpbmcgYXMgaXMKICAgICByZXR1cm4gc3JjOwogIH0sCgogIGluaXRfbG9jYWxpemF0aW9uOiBmdW5jdGlvbiAoKSB7CiAgICB2YXIgaTE4biA9IHczY19zbGlkeTsKICAgIHZhciBoZWxwX3RleHQgPSB3M2Nfc2xpZHkuaGVscF90ZXh0OwoKICAgIC8vIGVhY2ggc3VjaCBsYW5ndWFnZSBhcnJheSBpcyBkZWNsYXJlZCBpbiB0aGUgbG9jYWxpemUgYXJyYXkKICAgIC8vIHRoaXMgaXMgdXNlZCBhcyBpbiAgdzNjX3NsaWR5LmxvY2FsaXplKCJmb28iKTsKICAgIHRoaXMuc3RyaW5ncyA9IHsKICAgICAgImVzIjp0aGlzLnN0cmluZ3NfZXMsCiAgICAgICJjYSI6dGhpcy5zdHJpbmdzX2NhLAogICAgICAiY3MiOnRoaXMuc3RyaW5nc19jcywKICAgICAgIm5sIjp0aGlzLnN0cmluZ3NfbmwsCiAgICAgICJkZSI6dGhpcy5zdHJpbmdzX2RlLAogICAgICAicGwiOnRoaXMuc3RyaW5nc19wbCwKICAgICAgImZyIjp0aGlzLnN0cmluZ3NfZnIsCiAgICAgICJodSI6dGhpcy5zdHJpbmdzX2h1LAogICAgICAiaXQiOnRoaXMuc3RyaW5nc19pdCwKICAgICAgImVsIjp0aGlzLnN0cmluZ3NfZWwsCiAgICAgICJqcCI6dGhpcy5zdHJpbmdzX2phLAogICAgICAiemgiOnRoaXMuc3RyaW5nc196aCwKICAgICAgInJ1Ijp0aGlzLnN0cmluZ3NfcnUsCiAgICAgICJzdiI6dGhpcy5zdHJpbmdzX3N2CiAgICB9LAoKICAgIGkxOG4uc3RyaW5nc19lc1toZWxwX3RleHRdID0gaTE4bi5oZWxwX2VzOwogICAgaTE4bi5zdHJpbmdzX2NhW2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfY2E7CiAgICBpMThuLnN0cmluZ3NfY3NbaGVscF90ZXh0XSA9IGkxOG4uaGVscF9jczsKICAgIGkxOG4uc3RyaW5nc19ubFtoZWxwX3RleHRdID0gaTE4bi5oZWxwX25sOwogICAgaTE4bi5zdHJpbmdzX2RlW2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfZGU7CiAgICBpMThuLnN0cmluZ3NfcGxbaGVscF90ZXh0XSA9IGkxOG4uaGVscF9wbDsKICAgIGkxOG4uc3RyaW5nc19mcltoZWxwX3RleHRdID0gaTE4bi5oZWxwX2ZyOwogICAgaTE4bi5zdHJpbmdzX2h1W2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfaHU7CiAgICBpMThuLnN0cmluZ3NfaXRbaGVscF90ZXh0XSA9IGkxOG4uaGVscF9pdDsKICAgIGkxOG4uc3RyaW5nc19lbFtoZWxwX3RleHRdID0gaTE4bi5oZWxwX2VsOwogICAgaTE4bi5zdHJpbmdzX2phW2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfamE7CiAgICBpMThuLnN0cmluZ3NfemhbaGVscF90ZXh0XSA9IGkxOG4uaGVscF96aDsKICAgIGkxOG4uc3RyaW5nc19ydVtoZWxwX3RleHRdID0gaTE4bi5oZWxwX3J1OwogICAgaTE4bi5zdHJpbmdzX3N2W2hlbHBfdGV4dF0gPSBpMThuLmhlbHBfc3Y7CgogICAgdzNjX3NsaWR5LmxhbmcgPSBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCJsYW5nIik7CgogICAgaWYgKCF3M2Nfc2xpZHkubGFuZykKICAgICAgdzNjX3NsaWR5LmxhbmcgPSBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpOwoKICAgIGlmICghdzNjX3NsaWR5LmxhbmcpCiAgICAgIHczY19zbGlkeS5sYW5nID0gImVuIjsKICB9Cn07CgovLyBoYWNrIGZvciBiYWNrIGJ1dHRvbiBiZWhhdmlvcgppZiAodzNjX3NsaWR5LmllNiB8fCB3M2Nfc2xpZHkuaWU3KQp7CiAgZG9jdW1lbnQud3JpdGUoIjxpZnJhbWUgaWQ9J2hpc3RvcnlGcmFtZScgIiArCiAgInNyYz0namF2YXNjcmlwdDpcIjxodG1sIisiPjwvIisiaHRtbD5cIicgIiArCiAgImhlaWdodD0nMScgd2lkdGg9JzEnICIgKwogICJzdHlsZT0ncG9zaXRpb246YWJzb2x1dGU7bGVmdDotODAwcHgnPjwvaWZyYW1lPiIpOwp9CgovLyBhdHRhY2ggZXZlbnQgbGlzdGVuZXJzIGZvciBpbml0aWFsaXphdGlvbgp3M2Nfc2xpZHkuc2V0X3VwKCk7CgovLyBoaWRlIHRoZSBzbGlkZXMgYXMgc29vbiBhcyBib2R5IGVsZW1lbnQgaXMgYXZhaWxhYmxlCi8vIHRvIHJlZHVjZSBhbm5veWluZyBzY3JlZW4gbWVzcyBiZWZvcmUgdGhlIG9ubG9hZCBldmVudApzZXRUaW1lb3V0KHczY19zbGlkeS5oaWRlX3NsaWRlcywgNTApOwoK"></script>
<script>(function() {
if (!window.w3c_slidy) return;
if (!window.Shiny) return;
if (!window.$) return;
// whenever a slide changes, tell shiny to recalculate what is displayed
window.w3c_slidy.add_observer(function (slide_num) {
// slide_num starts at position 1
$(w3c_slidy.slides[slide_num - 1]).trigger("shown");
});
})()
</script>
</head>
<body>
<div class="slide titlepage">
<h1 class="title">Integrando e aproveitando o melhor de Python e
R</h1>
<p class="author">
Guilherme Hathy
</p>
<p class="date">13/12/2023</p>
</div>
<div id="sobre-mim" class="slide section level1">
<h1>Sobre mim</h1>
<ul>
<li><p>Bacharel em Estatística - UFPR</p></li>
<li><p>Mestrando no Programa de Pós-Graduação em Métodos Numéricos -
UFPR</p></li>
<li><p>Apaixonado por programação e Aprendizado Estatístico de
Máquina</p></li>
<li><p>CTO e Data Scientist na La Decora</p></li>
</ul>
</div>
<div id="r" class="slide section level1">
<h1>R</h1>
<ul>
<li><p>Desenvolvido por Ross Ihaka e Robert Gentleman na Universidade de
Auckland, Nova Zelândia, em 1993</p></li>
<li><p>R 1.0.0 (2000)</p></li>
<li><p>Inspirado na linguagem S</p></li>
<li><p>Foco:</p>
<ul>
<li><p>Inicialmente voltada para estatística e análise de dados</p></li>
<li><p>Amplamente utilizado em estatística, análise exploratória de
dados e visualização</p></li>
</ul></li>
<li><p>Comunidade:</p>
<ul>
<li><p>Forte presença na comunidade acadêmica e em pesquisas
científicas.</p></li>
<li><p>Pacotes extensivos desenvolvidos por estatísticos e
pesquisadores.</p></li>
</ul></li>
</ul>
</div>
<div id="python" class="slide section level1">
<h1>Python</h1>
<ul>
<li><p>Criado por Guido van Rossum e lançado em 1991</p></li>
<li><p>Inicialmente projetado como uma linguagem de propósito
geral</p></li>
<li><p>Foco:</p>
<ul>
<li><p>Ampla aplicabilidade, desde desenvolvimento web até automação e
análise de dados</p></li>
<li><p>Popular para aprendizado de máquina e inteligência
artificial</p></li>
</ul></li>
<li><p>Comunidade:</p>
<ul>
<li><p>Grande e diversificada comunidade de desenvolvedores</p></li>
<li><p>Bibliotecas como NumPy, Pandas e Matplotlib impulsionam a análise
de dados.</p></li>
<li><p>Com grande suporte para computação em nuvem</p></li>
</ul></li>
</ul>
</div>
<div id="qual-é-o-melhor" class="slide section level1">
<h1>Qual é o melhor?</h1>
<center>
<img src="data:image/png;base64,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" />
</center>
</div>
<div id="imagine-que-você-é-um-contruto" class="slide section level1">
<h1>Imagine que você é um contruto?</h1>
<center>
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABLAAAASwCAMAAADc/0P9AAADAFBMVEX///8PGCoQGi0NFCQIEBsJFSEGDhkJER4MEiEJEyAPFSf///4LFiP9/f0NFyYTHDHr7Ozp6uooKCP7wowUIDf5tG/7wYcmNUn5tnL5sFwtLScWISoSHCf6vX4pOEwOGSQaJS4WIz37v4OwVhf6+vr5t3f4rVb5q0UeKzD5tGr4rFAjO1o0Q1b1mjkgN1X5r0tfdJFjeJX3o0z1mz9bcY7n5+f29vb4plL6tFf6sVL5sGiIiXr5sWKlUxb4qEuOkICqVBapTxf6tmP5uH4+Wnv1nEwXKET4pT8tSWiDhXcnSWwyMiwvPU/3oD1WbIn7t1z6vHj5uoMoQmH6voe1Vxf4rGQ3VHb4pUb2oFIjJB/4qlt8fG0YLks4ODEcM1D4sHRHYID2oEW6WRf3q231m0XHXhanTyBofJj4s3z1lTd2dml8gHXOYhSFjYHAWxfz8vJfX1Xj4+PyiSZkEw3v7+5qaV1YWE9PZoUtP1csTnL1kjDrdQg8PTf1lzLTZhOWlIVRU05wcGXzjiz7u2/2pWViZF70lD3lcQo3T23ZaREgLUXfbg5OTkeJlIfyhR3d3946SV1wc27xgBN1eHT0lkXuewn7umdCQT6Zmo5vFQx/hYL2oltJSEC5vb4tOTnDx8hFU2IjMTjNysTU19jc2tXudRn7xpRXW1xna2gmMjBWaHanqJ9MXW2tr6eutLV8Fw5wgpnM0NGZn6CPlpZ3fX2ioZaqWCqjqatESEqHf27V0szylUz5oDLyjjeSjHi4tq70lFkBBxLwfiUOFznCwbm3YzOHjI28ckHnZA78iiNbP0KLGhJsfYueSx7bcj30l2f6yqljc3399e47MEXMfkT84sz72Lb3nxbp3NP3u57MaiqnaEHxhErgciSRX0V8UUL6699UNCL3sI59b17BVBidHxSORR2+gVjdUxHfi01oVEj0oXh4OyNMCguyKBelelzgn13Mklg0GhTEkXTJOxXhyLTVu6P7sCrIo4jbp4p+kralO0vK4PCfutv+1YN+K0pxYI5rAAAgAElEQVR42uzBAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgNm7n9A2rjyA470bQwOFuQ0YxLaHiVjGWL5lT3J6mFwMS8TiNRXosrsH15CEOQSShbUxc8mUGLwksSytCwqqYuI/wSKG3RyCA0aQKo6hIcUO7WGpfUj3sue+33tvRiMnobvbZbeJvx/JkiLLprTky+89zagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/HwMDA4MZAwNvfGHfqwb4Nwfgf1Qp253Xf1e+lcsVpgpTU1OFQiGXy732lQM/ljgA+Kmd6mtT4f2Ra6tLiyuba+vb251ut9lqtWq1WHhWHNdq6tlms7uxcWN9bXNlcfXz6QuFgWOJGyRcAP5rperlZWpkeWllc73TbdXiwHWiaGxobGho6AO5VQ/H9J3cy/PyxNCYvEZeIoaiyAni2kz3xvrm4ur0hVxfuOgWgJ+QquRx7tTykspUsxZ7KlLSH5WkKIomokjfmntVI81Nb0SUfC95EJl+DUWOV2t0tzcXl0cKmW6RLQD/ZqpsNnIjqysSqtCNhnSiTKAiNVw5rhsEatlX01r99BPmSVkl2qVi7AWBq0tm8iUDmZTL9Rob63eWrhXIFoD/ZKwqTC9t3mjGQSTrO+mLowcoiZTemqq1mi2zbVWz21ahCEI3dN282xOEgRfoDS1Pp8uIa/IjgatHMMcsG512Y2Nt8fMLA2QLwI+2yvRh8NTqynYzdtX8YyOlblzPq0mjdKRkc13nRvVGfbny5biv0N9zUnq2shELzI68aZcevHS5ZLEYBY3rKltTabX4TwMgK8lCbnpprdMKZbGmA6NKpQeqptDvAYa2UkY6TpmRKtm+kttJ8wedMvvkqz1L5jUZ2NTa0awY1bT1gZq2bt+4c98OW4xaAN7L1mBQtarbCmX9F+pNJjeQlZ+ESlIia71kiecGrw5TSZncZN/dTW+dJF12zkrSpX5LGAiVrUAvF2V8k5ErDBzJ1lA9mNm+c3+KUQuAWQbK3YXVTZmrxpK3+YJYl8qmSsoSSKYkLenOlKvnqmQ5aHPkHquTk5nGkrIlY1f6m1StVLg8dQlivYmfLDoDVxaJ1fbM9t+u5YgWQKzeK6yuNT192IEOjd6p6sr6Lw5DteIL9CWUVPXNVZN2jyqdq9xjpTLfcp10M8t1M6+x81evWYFuVuB5+s4ecWqWiU409JFz9foXZtQiWsAJXAfq22ubnVgNViYxgVqN6a0qvQBUlfJCs2Szk5W+td1y3rSznjkEy7W7WU52yup9K0mZbmGPeUcxsAfKy2Hykq3QGfuo3v7s3v1CZhUL4MRsWo0s3m2FahUYuOl2lVkBqlbJQQpm6jE7THLTK5Rj7/NJeybN17FsmRcFbrpqzPSq2nvH0BTL7UtWkJzc4wVptuSg1Xq9ffve/VwvuQDe6Vjpv+fvL603w0iO/3RVEVrmLUBzIFVoWpWMVm7fStDp28Jy7XuE6tlJR12MiQm50Vehns7nJx37Q7pcVYlW1VxNyTLF8pLb3gmJdthS/5TdZs1zqlc37kwP6kUtgxZwAjat1DpQHwMam711vV+lxyqTi7C3vx70CpUMWU7kqCqNTUTm0Hcn2tUWdhcWdo5bWJDndy/v7tbrdXucvCxBzfFdZjnpVtXFDTLJMjNWZtAyR6bGXq020+x2m43a1T/e+8sUgxbwTscqt7zZiVUt5Pgnc8hCLR43rZJaJcvANFFuuoMljZnQgaov7Nza2TnY33+uPHr09DttSysW1TVRkZstS17z9Okj9SP7BwcHkrLL1ahuT0DM1CpdF2ZmrKRanv4YiLaq1vWN7u2Zz648HGHQAt7RWF1b6dTcsUifXZPsrsfj5qyaZLZK5iq7ILSnLtfV/LRzKI169PSpalOpNNpT8ku+7xf9YrFUPG5eZ8tcy8Wyet15rVyuVLa+k36pfB3uXK6a8ctxkkWhZ5qVyVW71y1drcbt5kzj4h/u3WfQAt6xWA1ekx12NSGpFtnRSq2yVKxCfQpgkB6/mexc6dOTqyZTz2WK2ir6vuTJH/UzXSrJ45J9UDKX0hvCNa+uWZVKWcfrbFnapeK1f7BzWaerbk5ZDIK2uppUxTZUvVs50LShfPr7Pz+cHmDQAt5yg0msViRWE5N206rbbdbi+GM5F1nmKi+7EDMjVXVXlnzSqa2SKtSoLxNUVinRe5SRVMtc+sisVVHhUhdlfnZervPzw5WyiZdaOepyHe78tm6WikFvvLJLwnTSattmtS9d/OsXX5m3DmkW8FbGasAuA+/O5SfGJuRdOrUOlM8F1Z/zMvexPns5zZV8Fl/k7O4cSKjUOFWScUoyVbF7UcdT9S96ZeBKVoiVnmF1mR+en52dnx1Oxi5fhWv/cOfWQrWuz2c07xX2F0snTE5EVNG6eunbKw9fsDjEiV9TvXUfPJ4cCl5Y3uzM5cfGJly9DlSxklqFXvoRxmZnW4YqWfupUqmJSq37zpwx81Rfp9TVlwD5r83SqPkatX/05ZGvLyX7QH6lXyyn2aqUK31UtOQ6Pzw8PCt+d+7cWdUttVh8tL9/eOtyVVernTZLDmr17JsF5lMf1OLw2yv//ErvwjNn4YTWqv/+bWnVe6eW1rrjarCamMy7YWhjpRaC417vA9e9cDzvursLhwdSqmISKtOpsvRFXTKkOhIlezmuNGqetN+Vx/JqXS25Jr9Cry/L6qr45R6drQyp1uzp07pb/tY/Xr68VHXcZMRSk6E5GF83S5aGsRqzWo1PL/7qjl4c0iycyFgNvtjbe/IWTFq9D96bWl1c+0RWgZP5fD7Uk1Wn2Zoz29RzyWzlONV27aIeqlSpzp8vliu9TpX9JFWlvosOkZ8J0+hNufxmVF0Uubmp77MVMynz7Zzl67cKfb/cuylmqlUeHi5nqzV8evj0acnWubMfjn7/8rAtw2I6YoUmWaFnPxmw0bjdmGkcPHi2R7NwApP1ZO/Lb44efH30bO/J4M920sp8nvGF5ZW7n4zrI80lVnGr2enIMtCLQ/2WoPy9lv91RFUWgH9X6z+VKl+VSrcqCUg6TKXzkLw96CcJ+sWoKdOrbvbuf539kwrazVH5KblLZzHz28tJuXrJOifF6q+WTde5D898//Kilw/tcRhhhpxNFJuVYeP5g68fP9sbJFk4QVSsnh0dPT760wPl8dE3X+69GPx5bWpl/382uZGlzbutcX1ajG6VGqw63c4v58bHx8NQxUrWUvJ3OgwXDn9g735C28juOID3bgKFRY3eYXNYkjfoKbLCeGE0wzCHqd0ZRCYyCvIEEUKEc1ifloaltZ36Yhuh9rAxRuvCqtkEimgxavAmhSxIAREoGCPqP0tiAmLXuIds44NjeuhhD+3v93tvJHvTHlpoC65+81d/bez4k+9v9DQ6PHpjCAGxCtowCjyExpiuxlNJovS+Uf3SeyujhxbgVChYqiajbSwWm7Qme5etAhbcd5Eoq0V20SuQIS1qfBZUSGwdq4AKEQsccfSny2qc64mCzjc6A/PGn9vdbndxa28Qswb1/xGtvrezBVhtLtZq7Wa12myiWYDWyxd7O0ORWkP/U6h6L4V9eBeoWq0k0SqgKklWbXeu3Jzw88kkYAVcqURy8dzZX3796g0Hq0rqCBJpdeJIlSGx0o1euFI4FYilRCIWj8dhiWElLBvKgls554YwoLskhBw8HubQBiYZzGDmvMiLRQYzw8cV7AI2j3S/ENmSakmxwtIxtvoBbKQUmm9eS7IUVUmYVGcoe8OLX8Gvrdnttj94sUO/zUEN6nR7tbe/ubhYw8GQ1Wq5XEazmm2lFkStnaHeca7/HlxDJz9y9AxI9fBxp+Enr8tYhTg1VrcvgVWjFbQKwtUSBiykCsdbnfvsNWiVRgn0k0QZsutzdBmrIp1ApAsXcAUwWZYN2CA9kHdSqdTc3CxUanZ+dn5uanZ2DguunJrDJTWXSsGevJa2cF9c5udxmd/FGW5oecIuIFlkFqxCRyWtELYklV6CXYcaSh388tCs0Dx6Pa16wqT0SqElD2+d22i36e1AXWgN94YGZA3qtOerfdAKx2dXq/JF9nK13JRBC9FCtV4AW8cG/Ayp+o8gdeLsT2c+uvv5w0dr2yDVDaRqOJlMgkwPVlc7nc77MlfBFXkfWsE8nXqB5ouXz75+VTQdtErlH5mBDJgwF8F+EZECm2ybQWCC1OOFQSpoSYygsCkr4aMgS3EMXawISakAK3iQCls20mbTQspZ6mp4TrgvPIJzRnEMD/WXWnO7aQsu0vfgKLcolVHSGhmZm78NtTvXCuC7Kxg6DdLSS07m8As/OorVEysZtYe/+IMOXFXx/5lu+wBi1qAxHNQpBuv8y4OaHNiIx3rRq6dPcS6XmyppUdaCFpHc2vkXRyriXw/pduaf1tt/YOe/f/fze/hRpgoqkgqgqjQa0AACVT+9WQGrSCrfx2CF+WoJA1YeR7Sf3Xhlm2GvT3NIKkMtwhCOYcesIhgVtFqtIGgFHlToCAG4cBYVuUNVlJdpa0c39u8Ba2z8iDQACp5GYDvI0SrkiquyvTmPWRy6VIHfk3BUoVep2Y+X65/U63fq9eXl5V0wy7bArDBEb6EvnPZB5LyyKolLhNb1b8ea1MpX8bfV3dw6MwhZgzq9YG0dLF7DgUE4lLGcmpqaKpenQKwyqfW01x+2NyltHezvv0S5nu/tAV47589/93SY/+5/72c+/OjHv75/7+Ej/GD4Sn74BkEFvV/eX6rg+wEBqjWg6gpSlVexCmdZpNbSNB1sn/7ysJAhpwwhaAaiICaJqBwWKwbQooWhkD5JhPixUhcUTngHm45EUXEHzNHkoSm7QLO8FdCymabBV/A09KuPFigFX58x0SKx6LuQbglsB0fml+v19ajqgNbHu7ueHSvIBlJ3codL/vQ0mUVaYYFeSfgBXd/oQjqmiEW5uHuwNxBrUKe1IXy+P1nT5ZggrKnyVFRoloxa9A64XtxCuMgu1GsfAZMFe3KKaouu3frd2uPHj548efIQ6h7WfZjv0969Jw+fPHr8+NPt32/jKfUu4umnhm/gsXTIUoQU5qnO2lrnEoSq0Ygqn0pxFe1N5+FPGkeKntt4k4MshVRhGRFThqDsA2XbQRDyY0LR7SbnGYRK2qUYsyVLrqusSuDMnPR4nDkuNIYJ2QWqKoBb3GZp00x4opfP2AkIPdfCEOZE3xa0omNP63fW17/BWv+mh1afLIBNzxx9UVEBazpPXoFV8JMaHr7x5R8NyZUiq9l+PhBrUKfVqwMJVhBgR5hKKaz6mzJGrnJ5pDyC7yWp3ro11hxrj7X7eKmeUe6QZu3N/s3tzb+sNravXMGPesAR6Nt4Dr3f0if/wf42dXidT9coPnVoDTzB3LnUeZ+UmqigU9T/IU5ZPwsbWPLZnlt4O9zL96Et9M99PZlRGnCaoj2hcg63eUvrKcI4c0Q6DcZoJtiSYdEKM5NrM5fWnCVsi6FssG8yRxv/oe0IzdE0RonLcdLMSuCBLHhYqDkibmiwxkjlaILQir6g0GJ2P+yJMNSrzyRX68+eVsdqNXq1tvusTmRpsUQRo5jQc0e/amDAytNhO5myMGIlh3/0bTBGZ4SIyGq2XwzEGtRp9GoPvJo0dHw9Cgf/EFmpqe9Wqozjr5GsshrXeOvWSGlEvUOO3t9yTZ11hd4/p/ffN1yrFY8aDxo3b9JJXhRTq2qfPnJhtV+N0dHGaAULIfKjAOX7M1l/BtY+GpXNklmKK3lH34eHLAFsS5XLXyVMoWwwTS7MqHi0k2GBYJCnYAKaYPpBPP5ugi1wM4NlpuE2gCYNjAEomnDhzkCUbQsnYzseExnX8WBiZibnMg8ClbvignooEh7O4h483HbMtGZCdwgKYvfYj1pM2DFGqQ7ZcrywWkeu1p+V9d5oL2ZbVqHdrS/v7v7VjRdkQFRiAd3TRBZhBTkLwJrV4ddQ7Z/Ppt0ciDWoU+jVzsv9yclCUZ6nKQjka/hThBaxBatUVCMpGoD9dgU4VFt1lDSaqD8MkoZmvnngV47XEiwPcGcCman4fZyyEVBo1ExlpgJrBAqEytJW7uOlmWx2hvalVvhE9NTThwuMRzhxWuQEexncgFBhmDEzHHGiNJVZsBbiwnSBl7SWSZsuY1oGFHJdnnFXEqEp3AQf5w5bGRe5d5zce+/EPNMVGluItXJXDWGucG/hKoAFLaCT5q6dydkuIBXjnga5qqVdcIQtQ5ZaxS0WHdbydPAKuLo9ggMsaMwpNJ2xmFVgdmyx+wxClhm3uBLrZ42sPOgum0LVGF7/W7cUnQ9CidVsDrrCQZ0Go/qDEYZwwCh4NVngjhwM5HkeifVWjUit8P0i4FNUJBwmsx5SQf8NJ0HfrOJvegr1q+Irq6KSKKFAuJ1RQEVMRT7hOtuzCu4ln6hCuQxWS+AVo6BEIGFg6m1NU14UHl2JjR+s7BzEIdNMu8x0V3K5dM4VoI/pjnPtvatFb+FdQ6wwj4/HhDtueLBoC+OGSCQ4z8VLmpswwoTh2K4VLlywocHTWEJ4mtfyoJeExtMuejwRMzQ50CEKWrGErTJgGDbBq5/XkauCVavertfv3Plk+XYr7catghVf7IJY6XgCxeLGyuFnE5iwjoGFEevGRrd1jbTqmdVs1nYG/9oHdboKvPoAvCpw+dq6h2T9Q7GAKrj+JFQ0BT2ZAhzkWILHe15JrkIcRVQKdZ3/JFmJOrf8sS5OIXUsOh2r4zbNqH1czczMZNUEEQy6xMpEZWJ0lFaVUf91LMcII0WVSVMGG0ESCydHQARiLMdyuRwdT3czLkuvmCsXQmHnXM1eiDsZ1w5d++/sncFr3FYex/+CPQ0y0kE5DCuJp2ysMi6MJIQOGrsygfHIDiOZIdRj7IP3mrJMZ8NeVm4ztBBCdhCEXPaSORV8LcRZQqBgEnBNi21SkhKyhDXNsk5pwCyFdn+/33uSxk5hz4b5vqenJ83EBpP58P393u9p3DBQWBK4YeZCjBfwS0VxEyWQ4GgnHrxl72UzAMPkS65YVcR0vscUr2awqFEzPN3DeJIWEXkRhB5IaLGg15O5RztHO3+dq9fb7v3nR0dvUWC4dq7f3nYCBl7r4TUkliuI9f0fBnn+qnRY09/ucmDlz64BYs0NRxOLNdF51+++IWExwu9xr/PiCpY76qZl+QY03HCHSLqEjQ+XSlA1qfaaMAUDMgn7aaFPE8XbMKHpqvOnJTRTHFJ5SEf0mS991NLlM+qfHi4jqEAxoQp6DLyCEcJKRFUcx4PBF/HfX7fslv1/hMACKRD6Bbj8h8Ay7cBOfTsNZOAUxIN2WtOVtGMqads5WAlNJ6rrUdv30pXES6XEi1ZCVq37TF0LRxXPtJlvyrKmaXJa7RgMt/FEWqK7kebCa3qouDmxiFrgnnhKy68Nd45uPFiud9yHz9++/Y8Qh9btQyuA8HDzweGJjXl6DCGDH26RwzoVE2LWHZ8CIYrp6LE1w/sPJ8UNE517T/V6c+31xgZVI7zcAF6t4Kq87lBW1/Jxs0hzDFElq5BR4L6aaJ4SQtNqKJCVhOJh5aGgFEREBswNaPADfd/551Juq4BLS+N+qi9oNAapPjdUfW6mhJeiEaAEB8cWdn45mAV/FceziK1bxxnwCmlUUmt8zm9AvAeUQmcFYoylip1agZ55Vuod7OkAK+DTYpJFlbqtjjp2I4rSqGZMVWpmZdROpkYdvzLqWFOLiVe5UtPbfuDpftPj2w2nVpqmxJgrX6mHHmMdCyJQiAqLKngCFpMlntRKlp8jr5Y77WdAq1e5iFmIrBMbiLX26eFJS/aQV7rz5sv5cVphTHjx46u/ziXLq+vQZqj8d31muD43rEyANdE5T7K/mPPr+PymTkfvtKWNjRW+NQUiJtOxcF0MgIVcourv7ZJUYZP7J+yCTDDJsUSAghMohAMmPs7RtFkGAWswj5VSv+GjCkpxEyUQ1S+OccUkziuEVT8mUqG60AeDwScrxKpWIRv9Ft2xyxcSJxCwAlylQKxo5JppZaTbYJK8NEq9EO+olUY9rWzUmWuaftOUpY7PNLfOZHFIHV2S2rqkSXX4O8Cc9knDXTRYktyuK8xlkt7cNjys1/JcxvfzeBBeahLVd9WT4dHnEA92NneBVk9ycWYBstBkgR9bu3R4kskK1mWYre+nx3FFOayLHz5+mKDDoudriecCrg+XJxZronMOrP2m6fMaJVyBXwFHwMBrUI6Huyyf7BNCK8zbWLzHeUWAyulEU2JVcSJZCCskoGXaxxcH/aUyVzVuqrh3EkmpmDOrH/d/S2SkyFX1ubkCXvURWN24S0ms+NZPWSsAImUlnMhh5RcBvhoEvp0FQZYBrEBAGTYadQKtsuhhTCfpvq+zhtRmGsZ4kivBTRdfopBvXA2N7sDQaDQ0ohR0uEFei57wwJgM/w73HjLsgctoo2EgyxQe1vzdo5tzy53N75BWW0+2trZKZgGyjnbuHRqB4rW3D62UUZbefvMlB9bHwl5RTPjtM39udWaVFmvzh2utT7JYE513YB0UwEJiMfhAMbAZFDQ5HFpJ2DzVxpiFcAoFp8rTWQGmLIMal2k5x7jjr/RXFO3x2RiaLhekivNZfkmcmo05sGLhqsQ42+12AVkDMFnxJytZkHEsvasAXoMepFliZ1kmpbIMXY4IOVEEZxWOqKGC4A4giKSeYZQmGCUAJtOJP4FGdOIWwYr+vKVcJBbwCoyWJtMG6Vp998Zw+W77uyfIqkICWUCsnZxYh4cOX1ksLdZS6bEufrbr19axqISKTHj5yfpwslA40TkH1h4Ay7RoH4qjKwHSCmMjkeVRbF3xT+fQc1YlhpGcclBnICVAZYyjSpxN53h+PuZJK56Z4i6Jh3w8JcX5xEM8ivYEqdBD9YlLnFFEqX5XXGMoCLyK8brbmx0cp8CkFlJpDFQZtlJgqnwlTSMSIotPNVUFGDUiOBGUVCQYQUlmOGEKnDwd554fwKgb4EYVWWuHlmcajuz6ht0JLSZLpmHLglmILUIXGayCWwzcG0NgJfc/v7a83N7NSXXnLLHAYj3CqNCrH54E3GI5by4UySs8kFcXP/gqXK0Jb7UqmDUzN5xUj050nnkFwAqRIIAsqvjOMzkBfsBhCBTH9McwxacG4Yr7Kb8EVMkpAamSVKUc6Kb9r/lB/3KMxZ7EodkiF5XnpeI8xJstPRQP9xBFmKHCSU4pIlVvlt8G9brEq9kv/ovAQmRxUsEsKDHFhV7KVCK0VpHGqaU2VLRVeEQNlTfVM6yoIQN7gEwGsEsxwgAGQ9YkxwoBOKkcBKlvSaqatEa6EURTujFqwPtZyzFkWS6IBcgat1oQFKLD0iQAVscfgsHqfP0EQXUHtHUnZ5Yg1tud6/duHtqKAkGhk7ncYv0wXRCLCt1Bn/3cBIfVpMbre3Ecrkz+0090rh3WKHQoSCNeCWCBI0kBVrhyZismljaEvCQhFPl1XOorElS5mSILNUaod3GFv4OGFgAL+DRfEIqbpYJdp0M9oVjYqm6RVBdGK+5SEMjV6wGpurMLvW53YeFvG1laOClyValAFS7z5VKrnq5qkcrVUN+dwFSrVAxHZYFtyUFqKo3oYOSF6cGGkWosUxNbS/efNrcNtW4c7N+1v3kZ6r+82Ng+2N80mJe6BpPlU8yShM3KweXJDQliwnb909tzd92vPiJacZ0h1tGN6/fAXIHFOjkRWazW8Ye5uxIboC9Mf/DzOoaEZK1wmXcGa+dm1ucmafeJzjWw4GNo5RyhTDRmn4OUA4ueSGAmglG4EGjgeDb283NDRcR611VxXyVwRXtgfpw/kyunDBTvAk2xAFSx6JcbqQJPOMBVbwGnMGLv8XFhobfwXq/3j2oWCSNVmCoVaQXWSRW0UqtVAFZVLVVVq8VYQKuqVhpGGlR1m6UVKYzS/YNG3dh/CjbLizTXb6T7L5tpJ1vc/mV/M4T7CtzYBmglThC56MCE8tiQjWELJDdkMFvt+oObd+9+/e+PxnBFPUfWq1fcYrXAjRknLVnBdUKICZeK5BURa3r66q9/bq4X37tDB4zrw70JsCY6z8CaMoq9wLYAVpDZ4LDAZUTncD0AACAASURBVMFHPPAU/LYGg6oVfMQV1ZPSBdHKP5Wdss7gikBV4ErUlYN+pFp0vqpXQqpfBHnd2dNCOIn8FDKJSNXr9WhAZIkG/X3owKv3F96D9tMU+ijupUSWCukTcRZViUrVK1eqHYUQtUj0Elqkkd6ySO+XpnQ7aoRZqrIp35YP9qRGmC4CigLXqdScCBwW00ZPZzJwVft7q0r04uVfAFgdI6uujQNLks/aLDRaBCzm1v94bbn9Y8mrcZP1ZItbrOv3Hh2Cb8NEWcrT7s5jwSqk1RJGhBeuPn7mL8/weLDcnjAzXJt8L/RE5xlYqpHbK6ygVERWeup/7J1/aBTpGcf9XwInw2xn/hihQ2aX2RJ3Npkmu+uywk7T7f2hO+OwF1kP17CWTRTZ9qJYegSxWykcXEOau0EUsVy4IdhqVxvxbJezFHv0MJzxxLRiOaFF7qDkUE5Qa732eZ73ndlNzhb6R/9I2Gd+7DubzT/R/fD9Pu/zPq+KegS+6pKejYZtMBFX+BDL5RIAKrzFSVzlaO4PzzSdCQapAFNtZFHZZipdfPBznoJ6ZUUm6pVQT+3lEipwekEAliCOsDt7MEy4AE+mmdxhGsAqE06jZhgLN58IhBqklB1YPoJQxOVYcjGEshxxXXpCTjmIMTqVEFrALM3WYracsPNyTM0UvKXFsq3KUiGve5k4aCjv9p1RT9Od0eLt6uPbi6ey4Bcnv7xdVaJFewx0mBQia6UxDLyhpRGw+l47lbm7zDg1sdoWMokFnvCnj0H7lhMJT8fa0WjxXugImcYChXXrLyO7aK0nNXcOkLWv2xirG2saWHYiXFUXlld6KV8g44SSRJepFSb1woznWPPxOEKLISpOTVdwmjFBmftEoKaIV+Q2E+lgkTGrK4fzwS/3MjCxDDppJgYqTqgOUJGiQqsHnEJCIZAYqkBGGSbwykgaySS8mgaMDLwlTXhn4eZTn0OHEQgjglcYQKuIIPilqBpxgwBu8V9RUXMpACuUWI4jCjryqWGDyBqJLS32xz1FKsi6nZFlCezhYl88nhdBVVVavl8ZistaH9jDhhMvOiN5xFUnsnhpFvOGpLA0LHsoD/zoVOaTZYTVBDtDZgXE+px5QtS+sSKtKBxK3d2zk9RVCKzNe259VBimfmYDfQMdS0B/2/WE3VjLYSfaJMnn2cIVAJYvMfMEEkuOlmmHqvAKGs0RruJEo3SbR8EokFMdb1LpExVNALDI132LZaEo9naMWaCS2st0lHmEdBPqKDiP0N3gcEoma2xEDzU8zdpC01hYeOoDoCIRolQwosMFVgGiGLQQWIIg4JBBTOXQQnqFqkxRJc8vFURF6G+1ik5raWkoLRfV/pQ/1tfanrfgjUyxIW2PqUtjhbJsS57U3/pyqSq7Q57bn+pUWIxYYT6L6hwAWOAJxdLoa7sq95YBVZxYHcxixLp//zMEVjorl+OxvI5JrGj64Xs7t4RZLDZR+PWPYsMD2ztgxYj11ljXE3Zj7UaPGIofAFWeeAXc8v3AQWlSBiGFK3eCbUPlUtB8jncOjqZZg860zFa90KK8huRhfYSHVZtURk6w8nDFnl58cBZp1MbSDvbKJBQzfOT5UEWhpkJAGQQrg2SUiWwiWZUkYjFMGTViV60G91ozicByCURBcHHl8iMSgR8CqvwMAMsVUG0RxFSFfYpJLW4UQW5lvZGE4FcLuijrhYaTS1vxXMvTRnOKk+kviP253OhkTtNgrGVGRkYmW1mrtD032pJHWlktKDDt8IX00uApeEVCa5jp/+GwCAqLsYpoxYkVusL7j15/m0qxStEYy7pHUw9vfQcpxYrc6b75jT9sH+7rtIMs9t1Yl/OE4Z4mL/pJ92u+fv6de6RU2M0g6xVTfOHKoq8pLD1ta1ncNQFZlaXt+ij4dlYZ2lmUgtoc5LE6HvsHs64HeVYb4bFSCarv8vRGw2vkH5wNclAMTiifTI4n/mCyZBQKqfAkNpl0N+iCcY2EVc0wawxcRrOWbCKums35O4uuwLDEeEWnG1CL1BWGL0aBW3Tih92QasAqElzoEx3V1UZatpMZyQuulotq0ZzkWgCtUlxyHaesW2XwyiIWmWZFy9LKcVmyLLEsZmQpm5XCcvgVQqutsnSyhOAJx/eJd5c5riZCanVKrM//+Pa7f0ro2SwAK1BYb+zcEiSx+DTht5+1dhGiJsdXSKzfrQNP2N5y6QU02thDrUcw6oO9Hb/R/bqvg+iVQABli3m5KIMo4pawmF5a1NAFRSK2bem4x3qZ733MNmUX4aiIfHGvFGgHqgiXcLGKpWGOW2PlAyplvcOkN0bjx9M7kkw8MTwZxCqTIeqIydLomE8n55dksgoYZeJZY7yqJUNygaSiaOJrstZsGs0mNoF/uohEirRFFkcWYolIxsLXouwzILPgRHIF0EJmucwnqoqLM4marTqO65LmUnDguoplWapjgRBzLBbwt4AxrtzBoRWs6qE6eekr7pBC0WjtTmlgXP90eSWtOLJ+FRDrsxBYnshq3R/eorlBXtgAvPrB5lefTfYPsKb8fbS/K23vCsD668Y1yKf/iCfclW5w8NA3vz81e+HMmWuXn8NT/aXeev1Q/aX61Dvnzp2/dmGq3rOhC671ER+LTAfJcNPtlcCyVcG3bS0DvCpho152ZaqiWBIrFRGIVUFajcFh8VV18NUcw7sNX1gquCRkBTVNPC0GwKrOgFyiOT3MSu1ALu2gZ8qj08Ag3xdkqnjUWDodkGWaqKtIVhGkeKC4qjV5MGAxhdWRaQ+DqyoCFikqfBCY6mJuMcIcoqKwhBZQS+B5eQonKISg5DxbaAh/EsXSkOMWXwyNyknSwoXSkrZaYqHK4gpLz5THh/4+sSq4xCJiAbC++/q7uJAwm8ZZQkwspkhhbQmnCGma8NmHueGOmoY+vh/srjW+5RfhaWr2N2dOXz1/7uKlN9/84OD8yzMHpvfP7Z6bOXb2+cZBiN5B0FeDPb0beg9NvXP16olLl8+fnt1U7+l6xXUALI9aQYGDayhZmsQLFZblCram6aUwgFbVKrCqlKmgwIJrzOIawnE0piVQWSCxeKW4gxlrl+bceLEAfMft6gwzfEdwko9YZbJ0ukkAY5wykzx5hYxCQMEIdJZZY5OBSC9MViGtkslmEwUWqisEVpLOhSeLTEJ1CKz2C4koQpRvxQOxJTBJFg7wIz4pLEWyQTOqkg5/J0FB1xttgE909HgelI5TiqVsAFQ5lkjHEtlcopiLNSwtXihqmXQqHoslCulETG/LrFUZeFFXGLD0zFt99r3lVbyaaBPr+vXrjwBY2CE1nm5ksKxhKPXp11iqnV1ArT2b9/zrw9jwqj6xkyC1hm+stfWEH0/Nzl64dvrquV9cOvrBthmg07H9x6cPHz8+d2x69/yVm+9Pvwxvbp3ZenLbgebznsF21AFauIfsIGLr3NETJy6eP3NhdlNoFDt1V5dfa+M/g0TtGSi0CPYRxpLR9JKvcTMHWqHNK8CVXgVYVapjgCupInEHBE7IAZlFjoh4xfL14JtcAWQJiBdyVq6iulRKoKDCIhSZYA2TbTFFY56nMk3iErAMjZ9RQ+MHbzdNMocwrAWpdi6wmoxaTSaxFuD1C1/wmYxaYQlDYnE2+U5cFVZGkNCCl0Y+IkjphqDmY0VVTADRC3k7lW80ogUbtFYkmrDlgudLhbyjKUsO9SlVpZQHP5Y8udBQ7LznJjwtrUQTocpa5QlJYUm6iH5713jxi+WvaqyJdhbr0U9+9jgPxEykG1lMYcVTn7z6jS1bOpcSYlv33xeGg0nCSTxBX433je+7cWdtAWvjk7/NHZ47fPx7c8fwmL4yt38a6LT/5IED0/PTJ7cevDKze/79eUTWwQP/+GcPUAqPwV5+ALbqoLV6NtQP/RmwdeLEtl9fvIzgmtp0qA5KrOe/58r+5+hC5f/4fwGBJYJooLk71ZexLTD4wvSib5N3ww4FIlpCwhUILKRVJVO1KhlRslBejQGqHCCVg7yisDS8Y0UAuSe6KWpEZTlsqncCYFEJlUFmkBs/NhPIxwbxKsnrqhBYRCfu+/AyOlJXdDX5kMQVUWvhqL9KYLHihiCHxbEk+C4AyxdeGBHBjqUEOx1TXPvf7J1faBvZFYf33RhshLzyg/IgJAsLbNmOLVkeI4PEVgzU8RhhEqzFJihgW4OwDNJkKbiWdqIubGXCMKC4ikPAKWOB8TaJZbLaCqUP6dKHQBRT28lLSTcPhYR0t4RNaLZdes65M7KUeGkppdTQc//MvaORJRnm0++ce0YTcMq1mtk1YQ19fxANuUMhAXzBmsm9/3ikcnAwMBEOyvu10xV5xKddqgQc4wGLLXx+2DIQkoOV7x/7tSmn0OQW1r1DFsOysBTS6fOnj5FYhleIwPrz7w7do8Od9UVCr+9ZHVRs+1HvqV5MxGoQV6wsALCen6zfmPFMlvmIqoiiGBEziso9BUEVeTiWiSiRjKioIK7ioLMKnCoWxtQ3f7MnDVKhV4ibRWAYFtjR0vpeq33pl/fu7q5wHB9fRXJdB3bduLy01N7ehgA7dqnxv3pOYmtp5ua/C8//pP1vLBLuWeRu3Rfp1mqdIB8ozcFkE4SggL8HFcQYlhFtj5qjUXAEo/PzU47ZeTByARmmJhssjMAKB3FlTTcMESEtGMJsUbXOpjMkqFgWFY2NPAVSWpRihc4g8/xQV80B4gxo3SSK9TFy3SRw3eyfY0Jr7mZf4asO3bGzGbLK1tGwCqgrKS3stZl+yLT9cMiqmfyCppm8bq12dbwyHPTVzG7w+eBjBk2a88Bkm56oDfjCQfNBzSzDRAvKgrcSEMyOqZA1GLBerRzUzpqiTsfbEsthZJFaJllaA6gsb0/X8xcvjo9jMWB98nqis6vT5ZYt+m1h149wxUTWzEwDsBZ6KOJOMayFngcPTlKye8t7T16W+VhMEWOKIiq8yMVUVXz6sJqJKWVFVOOqqK5ECnycK3AFsYTAavU0IMuAFpWkJ4luor21pcWeXNrY2F0pZ1KpVFEtfbm6c3tna3ft9vb2nTvQ6vckv3a92W6R3YBat8s3LpMtLS0NDQ21t6Elk8lFNN03tR9Zq2H08Vrr3f/tn68Mw/fNnoC/WceANakZ2Z8+1FZBPYyuAyuKDiHgCs0xO0uwYs6gDilGqcZhmGU3AaJMYRYkCrNEAtusyuLqLIbeZ4gqg13oBeIS4RkjzQo1FsGKqaqbR0F2PepODmE/xdz1oPsc3jL6rx2NEotlj9oMjdURNtIaTF6bdoy2YrQ70DoDmuYNaCZrcFyrefMmQevWwrLLiYuEVk1zauEumxBEYFlqtXOV4VmXFnWaPgBvMJgPjg93B8zj7v2aH4BlDR6tFhr6iuVhWSbp9/1GgFhTA6cD7zqFdWIBsEhgdbonhFG6O6Hvmx/3vmWnek992qCwiFY9bK3w6oPaiQLW/p9EEFNKROQKvDoWE5U4PxYplMXU/Sp4gSLPF6rqaplXCyIvFphL2OpBaLHecA+PdNYiYgt9QeCW58kXd9fGyqlnkpROJLLFInifSiajZFTAInQKFNB2PDSxBC/FQyuI+FIlUYyDrR7Zzipgb3WnwW5D1W0Lyh2wbWzbn21/Ztg16u9SvXasXb8HoLz3Fjex3qrbjUaEGgBttiUiapNdbthCG2KzITScDenW3g4V9CcoUCAxsLhtcVEHMnaeRjL/oNmbqN1EbyZq/yVd29Ky55At4BNSClDQxDLWfT6fIOjOi8U6OWIEsLDMRhFY8/MO4NU8KasjaUWcMoZIJ91ghMgiarFrYWzzpUHy+c6woDplK2BIHWdzpKv6DXBRjKqPFBdoq0FGK0YpPa9ddwrnKPY+x9xBRNfc3P0VW2MSlp7mrkfcw8QrhiyvoCG3DGo10Mt2cOAwCaYOs1ODzfl8zet2yCaXNrs87hSQytpjv8l03ilrXl847DionQvlJ/1aFK+LzmvnDieioYDgDzmtNZdtNuR2B94JY+nACpoRV5Q0MjXwsUypDS/eIRYFsT553TncOdrlzjtIYHl9f/gQNNWRQ0ghrI/e/23oQo9+227mD2Jd6PnNg69OVNRi/6UYKa1wVeiBTUVeIY1VzqjxTGkM/EAEFgdM44Ei8TdtgCk7g1VrHVz2uuRaNIqHnWkYlYdv7r1HX7zaqvLlBFgqm5WgSjmoaWqJdDqdkNKbsCuRwH1SMYV4S0kJSdqEpxTxeYn0ZhY30mY2m4BRNgviLbsJfy6rpICExQw0hcXhFAIhSEZAo6LEaKrCZ1BjqhhDSpKgjOFO2KWqMQOaojEoGMOCGC+AwATjC3H4Z+AoDiOouGUzGjCsGohd03soa9TW1naoGrMm24WytbULtoW2e5sKTG7DBLutraOeBnegbm9RIWMD7O9sH2d3t+/qdu3aPbLrG1hubWxAu4UbtG9tbFGdoigdXb7hTrpXn2wxTilQWNNTl6anCFfgEjKFhfrKQJbuAxrIAoDplxSHGbPq5z7IEUO8zKssRZRlrtMVN4NsEZBCWv20RsgCV4OUH0oPEbiIU/2IJkp1RzBR0juLtyOm+phn2H//fl9p3mo6il8ZCivMEkIp74renjad15pJVR90PKmNWmujeS2gRZeHhXzN4ZvomHbjxZajIZk+ZpctfN4VmjjrDgetkw5ZtgyEbJdCbnOXMN/j6uweFroDstttdclCPu9z1rNHHU2Jo5iFNUJBd/C9pwdOA7GOEVlErJ++BnkV6HQOyyNAK5fX716f0Sll0Kp35v1Tn343fkG/YzdLaSBbWP7g+fO9EyOxACbffh1RV7l4GYBVVsslTq3CmS+CCoqlSlWVB4pxparCczAqFd4k61/edgKWvYUhS9dZydYGZEEDaLV52jxJOtK+N/Ro495WNfP0WSKVSKXSmcQmoSixKaY+BxLFEFEpJFIKFVkOMCYlspln61fSUnr983QOdgHPEutpKbcO2xxwDwgG+9aReusSPAAlnc5JuSsS9tJmGp4Ch0s5JOGVXDqXg4PWYQ6jND6YwOckcmAITAkPJMNXB6jiUMI3IiE8scc3hfyEV5aKCYkomgAIw5vPIkuhwiiBLYsPSynagYxlh5KxEXE3S03fD+NiivaBFWGWoVkqWzfAdAY87WK2CI9lwGJGhXkqo8ABRRzA30llqcJMjNGxSiwTiUX4iBgBLctzYxzPcWNjHMdVy1Cr1ad/QWCRvjKbg1a6Vw5erxxgwRWoDgQWIGtqBJk1CxUcQhBYgKx59Agn3zZrA7DC+LsIJK/09TjKvQx3WKPqIEtZOHOx/+IgXblMEfiLCKPBM6CqBllOaJ8ONLrahgXhmewCuYUU06PvzFfsZ9qLBbbggb77D1/KTGLZji59xrVKG0MWqj18q9psV1PYyhBe+KYPTK4J4eyw1RYc9/nzAl5hNF4ZxYu/z1ZkOG6kUvH3VKwjPcsTgGszsOHjStfAssvcU/EvO23R5fHxw8OfHFYqldDy4eEhA5Zl1oIVOpY1Ogr/aV1foZid8p7vyX/zRyayXjQB6xe/+vlrH97M0O+WzRi/8nvdv/9R7wwaA9YMK6c+/O7ChZ8tkC032q+fn6wg1quvxQIXiSmrZTUCeiQCCkssVWNcKlYEVJVVtVAtVEsgLkpjX+78HYCErGpA1mJr3TmkRIdGleXB6kEfMekZ8rTb2+weAFzyyaNXu2tVOFkifHxld0WMr64AEP9B3fm+tnWdcbzvTUDGuJVfaDBT1ciQ1nUsq5FMBDap0Ys6NsbE6Bo7RoU4uhjLRHbANLvWbOdFcCaEgnNnewxkoZmo6pLVopMI1httg77JMrrNrKPbMFvZSmhK6Ta2le77fc6518lgf0DOle4999yjqx/J/fj7POc5z43kt7ft2oFd267aUcuGvohGY/MHP7EP5eKK5bZjhrGU2c9ncjVesT/az6RWN1K5XNSMbJjJ5Q1cphtJufSBiCShl9pYTaaWM6gtE3T7S9jgCt78aYbYWQJy+NgghXBCki+JU2ZS5Aw5xhcCbaklEg+E2qVhC5QRbat88SZfugoeLbO6KhhEwzKxiGVTYXGVeMXOO3fw3CUbd+/sEpW7AlD2RQu7L6umTem0unpnM6XPibNtLm+gnaxGnd1IUwIVJ998Z1Mhd5dIRw85AU6xqzfJTUKZH1wQvUyYUqImCbKkUTs+No6Pj2vHT9ZOkp14vcy30M0UC4MBr0574h+aiO/E10GsiURiIuGILL+WWHPPMIsCy+cbIw6UeJFgpk4dzUCvEA4BAr7EQV/PI44S9vQIeERAjSgPVh9DGHCEXiwhlsQ06Hj3PpqF4pRnPMM9EWGXRVUpF5iaTygKrafnUc+jw5nRNi2vfG7OhjE1N1AyynCNjxTyOWFYrpmod7sfdHVff9D94K3rw6Xwg2HQ57fDo+Nx3pFxkF9qfCAwNACp5Q108hfwhwOB0XF/+9CY3+sP+P1DoFI4EOY9Cr0D8Q4mgvfOKF61S/BtO37RMAQWFCxRpQzweGj2TIf/k8dKZT12eXX16p+/9w/iCsTc8sfPdYdCod6zf5sioablqag1/a3pl6b+ff5tqivwykXWChTW7c+eJydWy8ttNXP70IzmY/i/m8nFMrlIPpY5XtrPm/u3atswiuYpu0woLevgX/9p6RdOKWQpaLUsnFIL3Vf9Glin0g6yqLKILI9Aa3Fhsb+VTq5f1WmB1LPFo/r97OLRXrZYr9f3jgrY7hWL9QI39TrsFin1+t8/aL5XKFQazWajUSg0G+VKE3ZO9YMmLamyXcGqUrbfpz1lobFajlStn9vReRyDxWXFooYZNa15GySMGu9XolUbdQtmaixq3rKs2K2oZUXm5yMR2+YIJ0RHBF0z2xEzahjRQzOCbnYkYs5bNcMwkqZhxpJRI2bixzIj+OEiUC1GxoxlDIgdI7NkQMoABZRD+F1TBKJsUwYqfBh4ppKZ5SQ1EEC8lExRJEEPpYwkEJlZSrGNGimldRx0FiAJoi5DoYp6E9OZeymylQIVjF5dpnRbTSmiouMmd9Q+nsYy3i+ZxKcz+EUtq+aU49rno1teJ18AHt1O4r033Ny9/iHwShFrfSJBas0wAmtujiHu/qGxIT1QKEFY3IPCGmOsqFz3yr0NTrVJ1HibDjDvXM9LlCixJJHsorb0tEBxv7vzcUZEWPWo7q+PXNZzdejpErjJDEJp4/HL1ySs9HXCSkJTH325pfSVSrrQ6SYVpcw6SZBVCnc8halnSqDL5+8OdAYCg/gSPtL3ReXvKmkvnYCNXjuFbvq11I8xNuTM1FFFhinm/Byy8BL68lci0d4enmgHr8JuuBvnQIFYp2fXnhBZJwrr8dUff6frgtx+9dzwIHjF0tv10ZvTTnn1Vbf60tQ3t5XCEl5dEVxxuf3w4djzFHjzRR6SKmcmYTRAvZjJAwMWIK6mfWN/3sBi3qphHTuIxEwBVovYgS6yxJ+10KKAJSrLccCnT6VFXsniQKt1IQhsBReC3F9YaG3liJ/4m5XHWTYcCWz10BnNXQ+d0sHgYqt4rBeD2WxQKovZRRxZzHoWQba9LEmXze4dFbFbqP/wPoB3Pwv07QWxKrLUcaBQv4/eRTKwUChiW29UwEBwsdnEs14gIZuKks1Gs/Feo9KQY/UmVqwSlDwCYtrlRqNaLjeqlfIPKo1KBbv0IlVBz0q5XOEhS1xTwlS7LB6qqtUoN6ReqdplVKKNhmyxkg6WWbXErwV22jHLbkTRRi+XNY9OtoVaNVq2iFY7YkXRUMXGElVq29Ek8czuMPXQGLGqRjSKblhZlm2VxVlmV8tNurXwpfBVGk26v6qNxj+/HN1y7jcVbg8MdOuc7F1vDEIU4MIIw1aJh0I7O0AWCyWW+N39czJQ6HeGCp1r00digVk+moVtyrc9Lle5noTMqcdtyiQkY1QOhpGTOjkkNOLcQpFgPTINWsYU+y5pMQYmXRtRyWV6VMoG5eaiLutTdqQ4ye6O1BJbamKQTjeqk47qKLNRv9ptK4UCpf8l1rh6Ek/kU6lNcap04p8vtZ2MLYypiYRPBS640nXm2Xx9zi6QRXU1MQFshfm3YIJ/FXagaPEnYqd39vTp+Fri0z/86bEqV7//l989uMDM7+GOi8OD3vjFc70oF1/7cGr66UJmvYRl6pvfn3EsQoUr9bjx8LPnJxKrpeWPX0APJPOHx7lMMpmDysot7WN7cJiJPbJrkfz8Nky27erhrUMzdu9r0KmFo079L2hkgVLKJGyhaagGCZ3RwlPKk5Xu12NdMAwXgCwFrHQrOEVWyQiZ8MmjxsqkIsEL0sImPhyMOUfc44zvSqdVrINHBT20sp5WXUk9AE/tsUNQmqQZ9bQQkmQkIN3Fs8hX8M0ByiB56QnKyB6wKeTEPnayJGaQI4QcCiziEKrFYpY0DaIGYrIdDWAqevIgd+t1AHaRFM0eZdkLOJVdVQpF6QO06oNFatH6njTtgceF4h46QZMeEcOoFNCDK66B3XpdIRm1JvkLrQo+q4aC4DvLl4HufBwVsRwdfVU/+uqXmlZMuxDueM25jaB4SeRWxO3tO6HJ0OTkzjqhpQIcEq7rXU/HcYtfwtwZ6A5Dyzeuk1DREGMWhHG14/MNredVNgZn9rOkDe3TaRqU4nKIJokbRjSw1ETDHpXboUde1qfYppJlXZP8DiPX+i6N9Eny5EvvfnlhTeNK5UpmSAE55WegmVdGQ0d9naVSaKDkGITjJ2ZhSbNKR6COS/D/6KjXq+fRDModJAa4CgScW88DKdoh9XSZ+D8lDGswwQpotR6PE1chIqu398yVG6HAWuLJp7/4+OOfffTXrjcuBCbiA+GJc8NdW97QxYvk1WzXJ29OT7FgPT0t7OJq6iaAdX1lBbxaubLi0GoFtRsPH64/N9MJAawnhpGDfsrk8rBiMvRl5WCZHBzmawBWzIxt8QHsJAAAIABJREFUR3PmgZ2/Vcub974GiACsl1uosfq1zmLqBnrcWwgsUkpUFuNLaRamCSw++1Xk1IJnAchKB11UOWRy+eRxNppUmlrSwy0ed+Ng65n2Vh0r4LYpvfZMQ/Dk0EnrU+8BILGTJ+hxzkXUBfUxUk2HJDgnPunoCeoPoIQiT0oislnBOK2/W6vzEh7E4lHv4HG/m3oTOTWeRCdgKZ9EvTED0+SjyBsGPSpaolVW7LjI1zGOwj0T2S/vhL8XCwB3ekH/w/AfqP/XccfXi6vtFfe+Emdf6eiId8TjHR3hmZ3JyfPnQaxJ6CxgizKLzFLQkiCHoTmi66k7igrHfDAYZTLhi2qWj2uBdfr867kRJ5nMiJPXWOWV6VFJGyTvsUaR6si8fZIsSyNMqS6VoaZPJau5dsnJWSOZ/y5du3vp7rvHibMkFbParLWvrfn9a2uBdn23VLm3l9yDcKyt1NE92uaIKAUo0mnNuxZQWQcHB4ROgS3nHob624xpgXUS1DHmZm0Ykt9mbm6Gy4xYg5w2zpJQSouxuBpWUFfxHVUmJ/mDn589feX0eRBNbv0zyF50yL81fLZ9IjQ7C1r1vt310bennEJSTQm2bk7dvDn1IYG1Ql7xAVStXP8uVqcfPkehoy0v/ObzzH+pO7/Qtq4zgHvPxkxaMcSDDAqqQxxMwdqNnCok0NhOvE75V6J60sIsrIdYwigyUsOMR2RjCRPcaJdrkLmJ4mCF6YJjUUs3SEpiO9BWsBHaNV1S2MPGtrf2IQ+FscIK+/6cc67kdew537333PPvXl3L3J++c873nRMzm3pMj4djaI6lU1+WVdu1m0+v237Dr4ftk+aavdacAQ2Lu608qGFB49DT5emmlLIf7U50CU2LOq964C2AtqILsQXQcqF9USrhTknVqA0wmgMYbgK2vbdt8Pl/4vovcP3Pq12SgJp6HJeszDqc8wACHiLUvu95KYfgwDhDPPGza6qSS+bseyQu209bTVaUvJT3kh+muKmpqLqWa2gqlAf90axsplAzTUh7r0TiGfyyPPc5v/39A2rt5jcHaK5wkONvTURGo9HoaJSgNcEv1NISvmUOuHqhnUjNnLfQbBuH7Ll1BArXwVM4gcEbvb3nD5K95Pnzpw4euGXxohFwTPLMfWfbZ/Kb5Gn8xER+k9euqZnceZK/n4qZ/ybv81yleAXXn6Qak/cnJ88GaRmw4N2XfcO4Ws5heOtpPi5e27rX8eUDVQvo89rvDvb3vw1JqPk2rxWN8w7SVNFoa9oxiCibjKoxKBgl+cSAEkKAwq9pikxvKUSlirclCSvUYRWt4EcCfydGo96530RBvcXmOHfGBwJvHkdckUQD3vmxX+LWRi1WtghYi4uLAKsdQhVsgK25xeknnz158eoA648v9XAc2oBGGDgV1pvYaZxesMwmUAz0q5ld22/7zZOG3xiPP/1O0IkHCAlaiS4eIiTLxQRoWakeZJQbBwwTR4WhAyALu65wWpoEqRfcYEtiEw3fII3pIN45YULZ+bZ2voNJAQXxsqtCt9b5jjJaRDNP1XCAoDLamKl1cq79U+RHUVZS3bujvqv9WRTNBOSUTqbu5XLw6tLaSKsJFU9qhw5Z1SPIx3d1PKF6Pvn3MThRsyJVL6VR65l3ZBbiClvsz9Bu7rnv+KXQpVs03ZWP13gmYvEkyL4BXyg0BO+F1xtFaBG18FXyCXJhIzG0RIZa1LoR82Ud7j3gLOZ+oLf3Dbbrxo4dapL13tIJVWLtm2tiLRyOk6pE57Mjk6qQZlDmxDU12fvkNTUDvKiDGfdFeTC4HBxZvnv3m2PDuCi9mPAUMMTe3ofZmIMn/oRmIihZr6EmRoTimUidxiAbvqr+qncvtKtTBCtyrCRaCUVKCRHqVypAuTSlaEXC3Va3JgSs4CtGWOEBgr1Q3mgkCv+FwcDpE/2hCfiPkHgDgb99NDYGwKJAcusGbWNfMLDmcF+U+6sGrJ5/vhwPh8PxJgArbcWMphVbCGcty9DRMisOypcZN9EtZ1dHMyxXgoYI2VSUGoWELA9hC4QMSRMeV48Lxw2xN8sDLQ03Yqvb40kl86US2oxvFIUfTokNye9trG/nlR35dgktyylawt4hOOFZI2typ7ddY1NyN2VpmrAiV7ByK4BhjLrrsZGEmKF61HhKdraXONPtmKAnqZXlFtWTVMa3kgbrfNYcQvIt3Mk2tcaxaWfAaHIUQXyueF6+vTg5upRU6CR0BfXkR7vFQ6lPpzK3ei71F3HrVKiPoscvxU5OKcYVAOuFD18Un2/C5/OdUOs7HzqkFsrp90VobTsSfk2io9AcGR2NjA7hu0WX+kK+kCOAwOMMMOy2pz4d6iPDTh+aqPTShDVyn0BDS1HQkhO0NKrgzwgvScEs4vKgszzFyH0qE0sWBjGNgVyuHkqXR4BVy0J++4fPDuF08ufO9Q0P953r60MzceqjOy4XX+5VyFKMYi7x8a4w4heRdlSJoT8ljmKFqiftU/sFQcUyRbBaCnWqVkqiSmgxCS987SegHegVEs0NMq8UrmhDasHpxtgXn87NLs6iWoWsUjIHwHp17BqO/is8Hvfr42kdR7oXjBhoVzErll3Q/Qsz4bgxEx/X0brBbIKm1foOGSWHCT3S5B1gxS1BYcKQ6EYdK9XjIvsroFiPx6U9XC9uVevoRVOrrZnV66aJjjUPaq1Wq1atVautWr26VduEEBJ12Croa7OJ7jb14h4EmInxYqVeqZMrYmVdeiO2eyQW2SGxtAGl29sb66Vt9LIBMubvrRMStwU1iYylElTIO24390qMR+Qkumzn4eSiNETzWr6UZD+cEvvcUDZgqyR73oU7DpWTsw47QRLkKFVi6pJnZJ5GPOkyiGqCvAy7PHbRY6YUrd2/J9mOSxFx86gA3j7pzhMPXe0Uxmx6CqH/uXjIIZVyFK1nnhdDoCwNDY1S/+3pgEOs91hO+HDayhwLRvj9GSR9i7SACIAL0IU3GPLh4WOAwdFGsT44aKJl6hoLPbqKqFkGHQjoAgEvojpCMVqMPqgWepbrf4nVVjEPauGFI4ylICaWaac78H1hXz6DcvHika+WDg0Aq4aH+4eP4Rz0fYQtQpbomGL/4wPc90aWGRfaweR0T/39Qtv5Sqe0tQKVYqVkCXcmlCQV61ZL3DUoafUIv9VHq52S8zrkgn/CKvwvVnOrO48HFa++R17/0aeLs7OzklNfKmK9QsDq7n72bXw3HDZ30+msZTTTeiycxmmw9HH/P6y4Pm6cNHeNtaYBLUbTb3+orBq6hJ6lvHS6Uh6C1lExTOg6qnWnoM3o8bjyG1tr/vEwfIBuWFnYrIWsbixks5adzl4tl8v61Wy2zEWGDjuU6JauZ/XPTUh/buoQ2ib725iWYdqmYc8YttmybYiDtGpmqwXIA/ZxAFKF6JqNHocYrzEGq3V0PqyvISMJiNUHJqQrVfRBrOBBgIT0ZpV8EOuCjpRbqWxiqkgOikjOovBOxFOlsr6OVYtbdaywzmUMVrpRsY4HJLfoJlSEN92qMHPrEOKtMJQnLKiU0LOxSNiV7uFw+yI5O7LTI0aoGDOIxuuI4+085G6wHktMzpPe+nBD+EMm8w9JQQWEpZiRmvYiMiTfhUggEHgckNCiZenfg9/0yOB0bjqXG4QthxFGF9JL6VzQQIFGCvapELYikl0CXj4fpGQ01I/h6FUmitSCgmcoHlz+NcWXg4QhqSWN8JkBx8VUdEbVoHPbDQWqQI7A+Sd/DZ0eOEZzCQ/QeaBfrp8hsCVnpmdqOWOfHTb8ClZXBKxOdbCKd+qumlK4Yk4tiWAfrJZwDENqV0CsJ4Aq3FZHBac6xduZ3Hn8p3c+ep1ljLcOXo398M+LN2dvArGAWrMsXyLBXilgPf/GhKYf6E+7aX0hhltswT6Ztp4+aOKsfYCr6/ZaeCY+4//Ab374b1ClcJAwgT3u3exVSOOG1DzsIvtRth71dPf0pB6ubxpWprHSWFlpFBqFQuHyncb8/M8ztwuFOyuF+TuN27fnC43MfGalUJiHMyTmL88XCrd/fCdz+Z0GZsJRKDQa5ZVGA2/UWMmUV+BCTDUytxvZlUa5nLlrZcqZTAOCbDbTsK6WsyvAwdj7EGSycGQsIGK5/H7BygIJ0eXQKusASsvKGmls/xqGXkYM6lmrDHWwigEpG0BpGJZl65Bq6bb5gWnqLRMq1lpmLY6stG0oAVwiOFuGadRqGIENcm27Zdeg3IbQ1DEPxDJn4nbNtGfwkpaJmMVLkLOm0arN6DbSd82omejdbdYqAF/CLCG4VeMA4AvQReWUFE8AMdIYIlXSVzfZMbxWgxxUWqtbcDXpqJsPHmxVt+qbe8jo4uYWkO/jysd7e2yRu7f37ZBXwcfrBWChILTwjAiLRAanhcxNO5KbJozBS4TLCcs2ildJhCBGDIt4RQ8x4wyVsYnVryRUMOAoxi/KuJSfwYYwgwBgdgagRClxNWXTJRJS6npg1TIT6+KRIzf+cuv0CWDVQLv09fcpYuGiGsJ69oAc5WQbfjiIT6Jn/Qq1AgFRFzoVK6lcfS1Vq69pF5ya2gcqhhXvSKsnE0+QVgQrpVXlcvuJldtR552ducef/ELySmELjjE+wf6DT35/E4RR9R/qzi80juOO44ryZuPaXRRCt0+ibl+ERIlBgbpUD6V2jsUvoiVZTqsgnIDuZMWqsI6grHO6I+cm6VkgXcIaeQkU7N6ZECjYhjtbdzVSY6OjtnFtWrCsCFUgqGwIGFpKaKHf7+83u3eS2777N7Pzf2ZPh+/j3292ZnaWXt31u49++7wAq+PPX48lk6Xx2pXaXDK3WUlWclO5e9nNqR9e3aykZXNh40qjNDCWTY4f5uEy5iGhzrh39OtWaFmPpZPrsAT3duzt/+W1LxITxdC95Dme73g2xJHLshBZtuMwlNjD5TgOypGwtNyyXcuVjMdqy0PaY71ve+hk+bbrWJdQ7XveZz7beJ7ns+ln4Jvve0HRCZD3HfhLIRshFQr9HIDOFxZ6gGhVBcQkUqsh2BgWfcQzaItyULCQmQFRQdlytcydhUBsdaao3YozxXKmXJkozgDMUlmcCcoFUDTjzxQmZgozYGhBdtAAtZVCuVIGVsvVQqaAscokall6ZBCjV7UMtKIDyqtsiabVmUrGR7pc4TDsUkF9AWNgaHCXSEb/Iu7F4QsZQH0OrJ7DQPwIoDJU2xLpWwCQc2MVqM6lXGmixC1ZNwvj2cRYtnY43cge3qxt3no1UprO6EEki73HDLaOIXXs0LFDqenpOlyeFydE6uLa6EXNi/hK9aaiccgumXRpYxhyBl0/e+tM80OFCT0wpWnGr2lO01onJBuM6Mb0h3KZahOYXq2Sd1/Tl4vy3QxHmuePjsgbYPk6WPNA4Qd8HRDM1O/oJBsusQzfBK9GdQpdZ6d+ulObGn0WVxGrHpNWj8UJtFqQOr4LVbFmJayCgyl4/fr1Fq0+aaEJ3siZOJk/vfRkT5dIN90z5ELR8u2V+fl5ICqSvyi/Ht14joD1968T3GaSzk0BWGlutC3P3QOhFrKbV2Ap8mHhH6+WGlcGxgYSC9+c6j9oVrif7IBC1XHSIOsgD2fgMoe9B7997fNsuug5LskECCGyXDJIxNbANkmXzmUCgrR4jRjYWmZrpSbRz2XEdiy3JY7GkXFdyyHuXNycdyfxbLkEk8Aj6gOHOam3Hah1aOXZSj0/IOlIOBusDQhD24c4AKJvgYYOqIdqD6NVwT7gmF0D9PHtACOhCXJBGIRCUvgAXEaPAHdGPhC2IoDK6THD7hjOs5HhKPiMfiiw5aC4O3p6gc0OmvV4Dxt34MfF6GC074WI+emLXrXoBzPFCZQCyuB0tRgGxSAEdgHYQLYXTkwUuKO7IHspk5mJzPb21Pb2evPWq3ngp15P1c0mWX2VXfu77NonbNuknmc/dE4hluU+OobqX2DYdArgOhO9cbi3N9XGrnoGhBIRUJl0j0kPtspjrEnBawZn0lBQJ8U9O9qi2IzQNyiHbw71DQ8fuf+3o8deB7Je12cJ4BWfKKhwao1PN3/x4x+9pNtmvi8LE0afJVWbPB5VRokziPpA1aqdytRdvcSfvyuwunse/sb5u2/ciCbbgSsoWJ9cjyxBgdMOWrVkMr+ydNvq7Iql24DL+G7J/2Z5a+VTEosybxzlk+cIWPv+8XWplpYlo8nceK2UnqtVrlxuVEq/uzqVqHHLXCJNe3Fh4Oa5seQ3Bw7q8Qw6cQVcwTjk2lA52v1PF/7weaPoCXsUDiSTQ9AInFR1ojCjmhQwIw0szbKvHSFMs4ZLIiZnypVSriFcXNPGLsmTXFbEOztipmsoatvKPKbBN8dxtYlrG4k6qEIooYpojKShI2mHNT7VRMtRPKPKlVamo/JTWpOaaETmUWG0o0FU89T7Uem0PFduqIF8e640t2LwO0Zlla76OSBEIhDJUTxWAaUeER0i6YXAImEGPIY0yoPtIAy3N5rN5vbG6k+EPeKmp/XFKqcX9R0r8s6C1HR+UidBIq/5NnC1Qj6Dyqv+dcaQq95uTXISjOjqrYeDPebV6oyHe8w7qiQe7uH+3UGjHQ3rm0GFZozYcbBPEhJqYd8gvGlohpENwUNDXAdOYn28emixd8Q8S3iFjxPo5NmAeYMZkKXrpcTGG1W/Q/46+n/kzdHH0SSWmoSxYXj8+G578INIwTp/43okqlmJIlX/H8KvfXJlZWVt6+mL+7v2q+/aKd1xqnNr/lPI/C6ZffTo0XPzlPDgP2vjtVwimU7PDeTGNqcKCw1agpU0Xz2RhvI1N1BLJG/CLLyZLS18c0An2E9GVmB//wEYhh37Tl34/bl0k5oQfiK+wsr8qEXFomIjtpz+cD1bLD9JKQAEC5JUvjnKDyGH5Uov12hltlHAjDIlHFMj0nJjVQ5KlkkLvvAhlFpx151iq/Jm6lsKoSDONilLBjF5gy4rLrB0CHNz/XCwX13DGeWNE4HHMsC246T50/gpvGhIM7AdK5yuCeUG0Z1JLf2WXf3mzE0shaRtcCiX8JXoYiBanedtEG2+t+FvbGw8XT3KCY66AsgQ6/Tp1vlJ09N5nQGZbZsI2SX5XQgT7YvkEnZJUBe7knakoGs6Hw6bF+jp5rchYVZ83kC8J07KDLX0JAK4HoY9Wi0l6oc17OmRrlKtyyhVjiw3Hxxd7IVV+jqwNdL2PJO44gqyl3QRLDEVqVXxUtCISaM6p844nlfX2XMYd2+8QfBAV6KipEYdVVf89cLzFQU6v66VPLAzO7mCLL/klTbZkWkrZnkKnS6euL3h7ukUWgmvIrdL9ne9eHv+PSGWcQwozw+w9u491Rhv5OSYAZ6oNDU1Ry2rkuPU1VSp1KjVSudqZxtnoWEN1Mau/Ptkvx7MQKUKzOrY19F/4NrVsQnfVq3K43/n8iugxeOL5UI7KwhomcAY4RWG5vQTnqnCFOwVKQskCHiZ+Sbf14CjmKHkd6bekakrRwFoqY4RK0aGhCz1VKmRqTKJVZWxIj3JkNW0jout9hqjuWhpjNd29ceOgWpHQVThmCJaqua+VvQJzXiGa/EohqIGVapdqhksKHRjq7kFXRrhnqvDWKrQqTpnmz9a8vI3itg69ydf4gawtQH/dPUY+LNEj0BWQpNaqdOaEmuwNQcipoWIciuaxd0NMKFXFOcnI9Urxtl0fs2j1iNbSagAcVNJtAtOlmnLau0+iQy+ZONJ35DZemKQxDjuyw59ZjudFA4d6dMlSWZ90vJy81bvItTH+CnAyCsjsiBjRB5q6lOBkbcOjTA41JtKwaQVvipqwYzp6RZVlugZQC5ehL84f3GHrP16bW3tI8jaR+8/hLwt7uGJE++fePudn3/vnVuQL79cXV29LbK1dXtr/cn6+pNnZUuETZ5sPP3unhdAqs79kXS1haJzMdnV2dn1ra35X733njBrhzxHwOq4kL189fD4uUYpsZBNDCycTchy0TFdKJrM3cuWxg8PjAFa2cvZ8Zv/4mYc4/Z1dJy89kVjG//eoVF4QUwmmSORY+/kGDu+LazC2TEocSUe4Zkcg6WZwE0SPJsFeS60p4qXLqVzc+kkAjRMIyFbsXkOCk+s0+PpeO5fYaogoRxfKkfiZeR0FSb04CuGExk5H4pYzICKofBRwmJQZCpUdLJFLDSRSNGAKfwl6kPlpuDTj9Kc2ve9QKa9PMNTobTyVRImkl6e4a6015r2mPB1hMC+Z5s0zTchijLZExXJU+hqA2V21FUfYdhsqv9xaGdPa+HCUOpNn/jTBCYEtezVxdlZ/uIArKVJ1bJkQirmC7CklsSn8/PRf9G0K2RyRCZIluBmJ5dmJWrRy2Qiek3q43W1HmfXHFnaOMQl2i01CGnZDNene0yUSKaRrIg0AXvEm1GOvIyRho/IIFL4bl80pHbVZ/zilpeDrx6cXvwvIsqkELo+WceXsbZ0586Dh3cY3BKwKFpWv/oKXoP1dXhIE357e7uprllsVoPgPh2lKuH9l+9//PLHsdzHJZ+qu7tr/zKE8+TLRvYvPyOdy50v/Ie98/ttIrvieGYGssZ2PEvlJ1o1tTb/AvtiVfMWyUufKyEDb7zYWARE8lBXNqmELMc4iKyiRmgpKiVa1IiqaDfSGglHaxCYtpu2gpflx1ZbJLpseepj1Yee7znn3rnjBBat+hK6xzN37p1fdmzPx99z7uTctJdm83xLKx9myAXJ5csWXzdlXyy3WkDWCLMeP3+8Q+50nxi7zD1lwMwnuHsA9x+cRu/V3IcfnkEGdtzyXsFtAFfPnz//13//Zy/up7xy/dKl313rn/kAgoFvQyBIoX8LOS0r5XK51ysjoVS/2C/1+yUs+/2o2e8Xo2IxolpEVsSjVKpRlfMMU1ntUtHlVjeKulFXtnRrUilyq8ZZilEgb3GphuR+F0rI21VFEmdgEKvKZVrSXEbyqjIgScaNCq/hzJtlJKqY5y0VvaUDf0FF03jOCyaRvRPAlWRVsn5WzGCU7SmvmRWqztpG0uaxdWZ2HsiVDKFcQbIrzsI6oxjW2syceUia0zkiM1JjzUnKUuRKNSlQ54TXc1La6mlFOLJkce5Bzr46BzzPId/fWU5W/TVNZ+kq+/LRz4CfAT3Qn6TBqJvityh3AKuELZnSiYtIbHeJqTUAxU6yGBMd5jiVCrMnBwrCkfjmIVQKh8z/mUwzbAxwDumO1C5MuwdM2/u87aIg5DOcKkg3v7Fbt/L3//DFo7sPHz64ywR69IVg52+ADUwR85P793+4QKRZWIBgM8+tXXCMkenpGCnCGz9GDDHGD28xN245WAlDj2GS9j13ZXhLvDue2MGzFEqaLyiihadUshYqvnyzj//Wi+WOEKtVF27xo/748fMdA6wb/zqYsElMu2IbT+3aNZni6uTkZPDexxXONzc7M/f1l/sOf3Ia+eGIUSVgiaDUF2s2iUoyN13rN/vFZpNWI1UTAYs4BF5FKIEwUEpIxUWzyeSq1ZpoNuPhKGpx7nReCMmYdWaumWzrtS6ghokJV8PwY6gVS1QpApmoEg2L4BzDLrYoKsmGIhecVFiz+8F0L11RilehIQWXOkk7PnvRrKrpLrq3WKQnlTOZUxbtLiW7NeKzyE8Er+5Ju4rjBN/y4sv8YqtUma/05iv4N3cAnH5fnlZ6nHL06YN7S8ureKwSfgYnFVk3f2Fl0mKMK/xS4wvPE6+wBBP9ZQXYoiowqC85iXqUDK7FpeUnv+JerWkEidnyPE/LvUTS03VImnmno57n6cICNi7QbO49WmCgMaeOHEpQLD63Hp4vQMLk7ZOS7AJsCpjkASDl86R6QA8OYWt0e8QJc3HClOClR2IItCBJ5Mmc5jpKWeXTMmS9REXoMbsc3bSFUb6diFI4v+/bMkErP4Ewz9/zot4hayWMuLX5+PlOydaQmdpYWylWZk5/cPiw6Z36nkZzTKTYif4efO+jlT4EU4/kUp/0SbXIaeFiW8FMxhUYg6sPNYWrSa9QXEashrgOmWQRI7TpJobLeYXVXm+XGj946RxxZ3Qf++TySvSgSI4qAZ6Ery4nQidPuVStJbgRE4X/zsgyrSq1agSNSG8F8xmY7qKscdFVWrtWS7SKzWjUeBXw38RDfgrivVjD2roejxcWaR73qGg/lj4Suvf6vd6De8uEqzrb0qKGoNgR1NAVUQjbWiOGH+1W3bURfGmMd7DoqjD1I5eWH/56GhzwJeaiQWIncFyIu7tkQXSZZtzYvRkoZnd1+dw7KNG3P11wuvnN2bhZUFIaHRZjUxCVN4zKO4TaKnt8o3uUGB5IQgUqadQAJZZUDC2e1bXzDLPoCJ5JfZGFYZrPFxf8UEp5fF4qcIiYgEuf1zM0y+Vy3p5nrTYTi5jV4UcLlVUC1s7JhyXT1KkTN25fW6lVZ+fO/vLwPqO3bJxZkXXwyJ+IRU0CEF0BIpkUUtb4kij1euJ9Gb9qXlytMjtlqmKqHL6S3cQpM4ZMgvOVq/MYD4zHBMODjasJe58LNm7wYsSqVZo+xpR8VG0p9r4dNMc6mDxfMNKryngVNtUsm0qxjNJ1NanVeEmIQupl0IoZRGIuEkhJKWBimVlTtVmLWdXUWcBk2k1noxbMLWEXYytJr6Yq2ChKYg/rSgKyPo9C8Y97y6sWOYscfr958iarIpFJS4sWVvSVV2vFX//WtuRSeHHoa1m7p1Y1FIYNR3+UtxDw83E9jNGi9dC0SBpJPFlBlejRLywItsx9SBZAjDqDQ8vE0DIx3jNM3hMgB2wjeDR45PkmWOSpJwZssL4SFrG2MnRKB1QGgRAqNmmYABVkmDiLaRFPSj1fOUTbQ95VUeXZCoPL822daEXz+B9bCPl3XMMntrm5g4CFMesyY/G4wxPv7r1yeWOtWZqfOfvzA/aOJ+57OrDvyO/X19dX+Lro30FlhRnVLzLkipJnAAAgAElEQVSiKohekW8YkchCBuBrG0jBi3yXnOLyhOQ1OS7/gsj/J338lJpJgSf/IGzSbIr95gbnz+SkxZdvu3Zx46KMXIX8xDrYlVmsmcGvME7WujVkEd5iTZWEVplsazXHCwS74kHBytyVwKYQLmvsrOxw+NU2n2iVFe7/c6vyHL/YMv+0zM4+rdCD7O49MGZYH7aGrfrSYDC4yf2FA8LVgPmyurTaWTVf9+SXX68Ah18WXRo04Xivq7+kbLXeSaEfS/wdvupDbVsXSHSNvw0uWHJwgDnPtDNuWt5FToFboauVHHfO6DqqWLBZCpq96PRG6JArRrOH+FPoiZoRt8tjNaXSypMVMY9AqEAqARoemrQipZt4cxB4updlmAiztHqV6QTiVJhZf1MqaYswPgPRKpebHH/WaTQabfncYnA92dz8884arJ5vcJDhkl3OTkB2baxcOH8GqovZ5f+0y7/GiETdWWn2S7i5lCjVb66vbdy+fOXc3lPHp8xJ3AHYMxkzFvyYrtTx4bcfI97yPjORiV9TcijQCR7xcLuByzKjte1P8CrdmZlI2pTNYS+ZCWV0U4e4xt6WnKX79++3o6jKQKtXmMIJECPF8Y3rSFqctEs6b2X0xu0N167ZUoi9pra+5iBaQR3D2VHDkUQd4RbKKBRP7y6CV63hsDPstJals5CBZUPt9Tp/3ztttgamBv9wt9tbCNYy3NKl0iupwGhj553vw81hMaBixbg38BJZseRBh7zp8RKiaasgAWaEsPN5jR6FoRDKwktiUHEcyOlOC0N712VYMFEqB2waMpL4OIGKGmnROD5HqARS/Hpjz8/zHPlkcBQIqhRPQQrVlKzmRkoW0kyPmrdlTXpkJ9FyusxxAQtyQTabHX/WboBYxhr8qXU6BKydPDi6YVciCc3b565fXPuodPW3F6JiT0VAudhfWb9GmDpxaspoNIcV5lpn5sQo2vYZv8FcdIyi5BtNnp1gNfHS83/rd4qPzYy0GLdbULylwyP5jsVMneA/OMNvm/MpZDLJjwTjyjPPxxJPsu3TbfsXZkYhzyf7C3g1HLaH+DLXzQ0Og4GlVR0SynzjGzKhaGtprgaXXS2DLw13tUR0Ka5atOuPg5yfy/pwXHImFEMNSy0Jywg2OD7E2obJExpsSVeZdSWVRflRReYb2RbaU8bQCsXNzMdhdBvgNkwyXp4NoysgUJWwkSurAi2DhKWCFCbFU4pNFty00Arc0wRJUG2HqqQhrE/vZzpHJ8ru3rNn/LP2sWMN+Ylp2I8KCuufY2+EubLLXAMT7x4/tf8ERqM5t//41Ji9Ynnfb3/tvwlv1uuZ5dKYoNzi/CW03cLozEu5PPHaT//ybuPPiSdD0OqrRmMowAKy4AtyjyD0kH7j1Y41Rs2IrobIrnZCcrHWSnRVdTqN9rNxCIFslvVAjkjFpcDLT1uEWVY4UWXeRHKIO9xsrMfz4psHWJ45Lqf6bnIe3x5lD2BaeV4Y96+Z7jgT2U7bqJQbQlJlEysrWaiOSimpREYJrWJOpRyzQkuOZTgFMbLEnfxBEOs1UlA53o/oFOSwTy6mJTZnUwDWpwBW8uPiz2lz8+9jmTfucoxlV8KnY0yNfWdvxqdMwBrWwauv8M1u11cHxoRWLLBiWB1zrYFp9GpoGNfDsKs9Krug1xqNZ+O7/Wx2z25C1u4ssypF/MKFmJOAMZxF8nFyuB5xdQaYA+yVg7uzJxvQ3tSiC5yO8xl5nhdwN5tE8iUOJe4b4k827uMUoFJoIufqA3rp0IAqbaLhAqXY7dNmOm1x5SXEEHt9llDCrZwBVTACLSvArOfoSi20cyK/crLMmQbYxLACtnJJSUe8euvTzxpHR4lFnxIprM/HJv4fxMR3V/ibZuQSIn7VAK+OHmu0Vg2xzJ0O7MDFqDr6X/bOprV17IzjVz6SzpHRKBvvujKedb+Bwd5kX9CmELrQ4J3xottAtiYOdNV+hHyMLlIIyeaGEjJDGwhMwOR24BbueOjA7Pq8nTfJSTPdGfQ4sV6sq1wn0S//5zn/8wgf+IErvCPg1zJE2HlQPDnnpNIVwpYArDLLAFclLEp7KSJ9FJdgEiWVGL444bCSDi6JcD5oHaWaLOGBsgydTpyzDQJDgNNJ+BjYDaKaqDfHnSTK/qT+nXgx1a03+Tq7r0pZKqlITPkN09ZZLMvaCeXeGL51mDG60MXV/Ax/UvyDOXM/GwDWdx/6i7mPQ/xT9OE7ANY5wGax2C6WF6eWWJcWV7fIKwsrH8tgufQPB684BzkP2IX4Wyw+56XOihITF0SWURnwyUAiY0pT0WfGRIMdGUcBAc+8LHgXI4uOA1Y5kjH0qiGll8IdHMhzAEoCbRQM7YWaSTA1TJRPtvaUkjr1cXx9f+bXgVOXXJxJGlvVMjap9KV5XxV7DVUYGiJN8zn9mGJZTMD6tgdWH4ersM6JV6vV4hyBdSnAAlgBri4uCFceVSv5jPdEseykjmHAyVaL5xxSFk0IyoBcqkQGFaUpED4GXiuITGVBh9GRhWZUSTDFWGWRwqpoFXdVjlpDzjGZO4EvSgBTkSJCWlVDzyrVqnVXKhr32wsqJX4FK6mUeU1H0afuIoyeJa8bViYJyeRAZvNMR6c2qeRE+C3T+W4lf1RiKfx098N9D6w+DlVhocBCXjXNKgTWmmiFBfel5dLKR7N6NSIdtmyljAy/ZvV8pVN4YJQm09rwo8QnozNNGoECQJUWcGyaFrytmWYEq0qq9hzELpZbOE5mIKGspNqz1xLgnOZJ1zygpO4tFXCXfkUDdkkENj4oJot5DVw+dHCEdgOJHlKv/HsVI1D5M8j3Ls3TCf7QRA47DXx2d/elx1UfBwqsbykjBBY1AKzlGohFyDpdXwCvyOywJA3VBlWDgLN7aCNkWEt1uZSRcs/FqqkBWEQsZpbHE68b2A8qAVfhAEj9+ArEa5D+SZEWVLAvMzfQ6Jhly12lgpdMKVUwQ+hqOwUCd6YUuDx52FlgGFcmKh45waWs12qoulLnLTTZbXrDbQqpN+gmZ9nzski0ICNMd82+PyAArF96gdXHAQMLkdQ0dd0sBFiXl6fOfIUZnKOURO0WdbjLbgTsItaFeeOKvtRkd0UT7OGyooxPgBRHgaqqoIPwqAyeSn4lMxkRia0QllWssTL/wdziKO3wWktJJbyLKlXK53eilhQkeYwk4xQW7FOB1zMAlatbqX2cIhAb03qTJgC24ddjtgWbOmLTPqZp+wXgO5Zf7ehvSitnR2D9swdWHwcNrBUBq15crKnzHCDrVurjyCsHpdp91PGzD48wK8E60TSTyS7Xue8RQrAi8SR4ouc0LSEb1JwKGhRXcDWmSmmTJCGpKrY0yC6qXpH6kiIX1vSBWzIQWQUqCdnEO5hRiarIxcTAsixyPgX69ILGlZciIygutAeUh1JqVSLpRx/4zjsUY3QRgIJ9rygu3d5mfZVe7SbwI6C/EfxYCbAe+kHCPg4VWN8zsIhX9ep8bbtlrs9pIJwqTiKh6nZMZGFjP7iEXY1XafVsussxvct1hKvUqq40uLYLuAQVggqvxKIyGoCSyCTjKhmwOV6MpwiugWKtRSOFGdfhM2MyVGVKbBMyfQVNXrxojbPZIpQvZPlqd0dFqRgejBt5S/I2ZBU3LFDCVDhNO+oy1F8Br/zgoooUHH9drb2Cg28vKKw61LqcqAOwDmfqcx99dIF1xiIKKXN2YYGFQ4dcIl81TlQBoiadmMWbdYtcAbtq0Wn1BIEFl2lh+UTU8syyuivnK5mQZe3jGof1aD7y0ZCmIqJrlHzpRwME2EDoxXpLic+hNG7mnhHfZWKx5aM94Ka8Dd24E8QTbOKKlJGqFFHIhCKKsczkktZz0SJ1h3SBJad2yFJRlUu7Lxl8QVZYi7olcgFZy8e7L1/3v/l9HCqwThFY2y1RqVk6YF2QSRqLTivhVYSlOXBqhrCazRhastmCV0gtnz829fT3OYqAnC9eekK1lePVC0+4dNcz5458IF2pQ3Sxj7D3H0+kQWe6GgwrNLmjX3TgJ/Hgy9aAmsGHtTSVbJ6PWMXsIlPBsLIzAOMpNJF/Soeax2kbEy4tgd1KHqrIIB0WHab3F7jicr3uaCwp+YWSDL+NpLCstm14eGSBwOpr7n0cLLDu/4Ip4Rai3jbbhc0Jb89tkXbbWFbNJ3P5gKcZsqodE/qMuMWiTLLHCWk0WPloGES5F1UxrGhFtrzkYmhpg4kfKirXhg/b+224pdVggB3wcBogtyLGyYMJzbJOKje3JVFwDjfNhetgirHl0kOvuFSMC4sQr3w0Jq2yZrHjy3OMY7vDv6E8DRLD4B3aVFJMHwGg6L8yVN2aVVQE49NgSriadJJyANbDf3pg9XGgwPrq/k+3/yJg1du62a7OnohXp+vzBdc9UF8Rc5hExCvA0nw2n70VLWy140XKV/4iRUxFYZkVbOMTX+akbNBfhc1eqAPgeLTBjvDjk83maDzG3n9HI5rQTBObuWNxlRzxJMWEtVSSUPmqCiHlkfWKlzyUWA5S2parWDvlOlJREaPkuc3izkBpgKRSUlBp7FB1gNWtgFFK+Lya+YFbekZg3T38owdWH4ca938UYCGxtqvHJybW+sw5r2rBVYCp+Ww6m05hZcoxk8d0P7omUfaI8ZIXWkfAIj61obU/5Po2poArGYtTlVHYuSHBNjHjMYHr5ITvW4GN/KSFQ3KUjAYj6tyguJGN77peJc4hYecW07ILLVPF82McvywpjHJ1K1tw71TnYskYJ4GOUm+PCgZFLb0HVzkBq5nV4diHAOvH+/7Xvo9Dja//uj63CqtuEFhPl0+X69uzxUr+LjOwKABI0/nUYsrCav9qwKxpsMYHfc7TIGviFEYElc7fQS2WKux6R1+WzrgoTnMGqQkg5YrHx8eb4xHf6mZDTUEVJYoj6h44cF3RfQcHN4LI3CJBg14u1ywGQOJ9DKrrhlK2AB46rqLyu4wwiB4LxxDZY2b/bcdpam1cHUKl2pvZvMDKSWHRmIdUEJFYi8eHX/rf+j4ONr768/pWFBb8Rl8/CrEultYmWjtZBKx6V7DWsg+LqinziuM5xek22l+1YcL03khzm1XhmYoio5k63JqGSu/Y6gqW3O39+ASk1+aYGpmOkhFzS/pfca+t4XAkTa5o8mGiAm5VkV2z3DtLRgliWgasdnVJdzRWKLM6rtHuSbqLji2Cznv1Us+iQQ8k1qIvYfVx0FWsL6c0NWcLtGqur68f74BYTxcALHYgeH01fXdYXrEkE07xGsXHj8+5vc6CizbnYcP/xaj9yJJrPsOJOeImlX5XxCPsAj9GvXXy2+PNJsECF/IqOZKupfaWNwMnuRLvdBiGfaioorTXuRnY1CPBtDfS/a6rDM+S4EmyPf8i8KhZW5c2r50+302nbXNcs1jc/diXsPo4XF59+AZTwsW2ua5rwBUD629Pt0txTP1KXs1CXFliTS2r+CQfX16ec8rlCp8X2oHC/P0Kq1XXsgiQaYZlSXUpT6xE7h045tu3jscbvFWOdEkeShtm7tge3nyGe2RZ5wNzi3NBhUKr1KC3MiuG0KLqkkHTJVRoETUtb7udJkhlMldLFxSnNudLwyywkNf2EivfwbfdDtDSgnzvDz/1Lqw+DhhYv1s/PT4CqK4xbm5u8PbsT0/nSza/TyQhnL4JrDlmi3N6ROOHXIWPilvTj0isXaqxnZUr5ziF9Zaeel9dS/tuDlZs+Rv4kYKykOL7qo42x6C3NgPqT5qMR8MRd0lOhhXnh7hkaGFH4oom7CTIlIqelDO+q9iLblO70jsg3ORuZlqhuzOYFTvvrQW1SPkfpjalBBEm0y/TqHqVdvxb+a7xI7X4k8Qa5fbx4edeYPVxwMD6+xMCy/Lq4eYGeHX3dLaIgTXbC6l5HDP5tJuIK1yEA4oArJeXzzvgVRmIhl81ShjSLPUCyxubXGMa6Zhl+8Y7anFh3t1oZ4OWCFRcTDC6iRgsjvmeFEly5Ju4ow11WIUuLd+/2bcCbc+HNqo9s6ZV+7Jnss5785sKqFNSishjh6U1MDghWUDaCHsLbxstwuJ7kf+7mcXWkrrZbh/7jLCPgwbW919+eHh4+ATx06eb60/ALJRYDli1HSGcYckdOdTGVDdm9mMerFCgvppOAVg0MVn7vjFeYr07KWRF5QpZedvTpF2nP27nlwizgru5O26J4gJsHZ8cb07GJ1Sm/wPfAszeyZSSxCF5UIfWZUpNAnF0UuZM08TDJOEuDlWnibERnlXO6VVZ6wTdPYK9FfiFxBMmGSiVzpShboYGtSMWuUxWxIOD0uOQeh2Cwnqup7N43kGzhYzwq/63vo+DDrwBI9087MP9zzefUGLd3T0ysLAEIrgitfR/xn/ZO5vQtq4sjluKrl5f9CQlwau+B0/GXrzFbO1dQN5kk1l6E2g2gdFu4hkIszK0XXQzDJjSRUto5KgpJGJoIE5GNdkUwTheeWAGL0zMdGwI8SZQOsbG3c09555777nvSZm0M5BEuUfS04flr9Tv1//533PPaSvO4fXi9vbzF1dElIooFHCO2XV4bWP9zCzQqWmqFJrUQHqI2WFEMGg40CrzmYVNWlG8NK1Gh2FBhBnIWoY6LjUnvgluF5n7Z8vlM3wuhWoYiPWp1OdPm/ZnS3onY669lm5uY+c4U2VYiTYMsRaFkZRVIsSm7SH9++mWrEGkeBXJD4jhi6WLs3lg+TVCH2+/ytITE+X9/uEOSKx/ArDIrNWGFJhTi/9jbC9ub4PnfiVN41SJLEdjWZn1s+z28YWYWmpBM/jINvtDtWWnfRmxVaYyUzUGGlA10/zgA9RZklw0/hDfU4JNikgnKIIwlKGK1LM4IbBkOzGj/wWtIeQbzsJ3V52XSyoNRKhZXJX5Az2vFZctpbSS4gqSQRGGzi+oxFUE3h11kq4+n3VTwqVrEli+atTHBKGrPrW7dbiz87edp9evXzP9GaBefSR/OvrY0Qd9GQkrPEpmKWDJSNIE+lVRZmPrGwqOe+VlVpbbVouDiiwd0wPeDtfh4DJjD9WcVRrSakYWmjH20zOXaONic/oSoatJY6fLas5rU8+DPmvmGeJS41l08Enf4ZIjjWhmPb10tkpzXFmUkI7QLQdTwTAMc7+m6XKPB9W3ULy33c4D69lvnnrL3cdkEetkE4j19KktazB7CGcNp/DSwRsdFzvqNfbBxY65V+/bRlxJiXWQyNMqSeI0lYrAdBf4ZQUN2vbSnf9YCYB2dEB+CKOyVCt43g4+1aZ8g/RMWdtWxuYq6xHSalQ0iK8mXqbRt1eaDBg2g5uB0LlX9CrRvEMunrCJhPbU1Cv4ZfQ3ZKwql0yrQhGpmUEB89mDwA4RoulBqqNOGvy7U/Tcn/7oaxp8TJgLfwQa6+nm5rWlAfW/aktUtRWo8sGQlXuUj219B8CKu/0sbsVxKkVWmiQyP5R3Io0hR6wU8TV85byQLfCHVnvQsB3VgtQZBpZTOeYBNQZUNVy6X01Z52c4nFrnkkgzHHdf1m4XhlqCVO5XU29odNSbDbVXWyNKz7KWB/tD4Ui0kKkrM07Izg8CUElepfIfNQ0OZi+2zRb0RRJYfonQx6QRa+5wa2dnB6ocljZnlwb4996By6AjD2NItO2+NnDucm+VwLrc7/evyls/g+vlVj9rZVkWZ304Qq4ok0VQXyEUQFZwe+HwZdhybCyWGNrpYEKf2HwMa9RIqDtp1DAPHHyVG9TbocQruvTce5JLTbO9hykjfKlpdv4o5pU1BBFb0wQxlUo2uA/mMhQbPofCOOz4i+m6DfYLpTaSyoHtUbaoBNb1Z74Tlo/Jk1j7UI6FdVmDzYGUWYNZZM9gEQ5FYA3My9sUnF8DHnt4+/77f62srHz55crK55+vXF25elnG++9fkNcLF65AAHjSVF5FmsqTkBq0h3aH9HAMr6pmLzWczhUR6ISQdIjLrIYZYEgPzETDqBG57MoLMV19oDcA8Y3UxjJvNi2EmHgrCDrVq6vE3lpyW9RHykg3G31CU2RmacVQRcB64XruS0vXnx35P28fExdgvO8QsSSyJK/kRYKHwQoZhVdDqcHe3g+HR6enJyfHx7tO7M/v35CxfIPFuXPyinF+fn519es7dx7L+Oqvt7777ps/f/Hhh7/97OOPf/eHP61cvnzhCqiroUSUOj/TNMR5X6ORhWPAQrWzWq/725QwjCgpZCe6GXMfvTRy74LPakQvIxrWbJV0q2almpqlkqmzQrNfO2e0dbHEEsCGHmqtOKucK/pFBF9CsLBKnDjznPeAhY2Ez3YWvMDyMYnEOt46VMSSEguuA0QTU0vEKamXgFInx493zy3X5WfWp6AssQ5RY+dGrRDmZaPrRv0gCzfm7zy+dX/9yaN7H210W0kFyVWFPc4pFso7+3mwnTKmhK7Pg9OlVTkWN6ftBEM3BLvXbzb3inmk11KYcEEmN0dew7H0dTY5QmK5s3/0XEUz8Se0uAKBRd83tCPMcrKK4Uom1e4i4dK1pS0/79nHhBILC0i3KC9cGkiJxaIDego49Xj3xpx6vyJOrW5CPSQu1Wv/LeojosZoB3fL81+vffPw0b2Nbpai5qoAtkJbd6qUVmCKR0On3B2IFeA6odCDCwWJGOQOgYpGg0VGhwk9eUdDJDQIYerNvsAyTzFCo416wWJREA5pkSA0gtDGiBTQlVYSVuACXulYyx0E1qLnlY9JJpYKLbO0A4WsOj3eXTDKqFbQU6Odsdqrny51Js3y+JIxd/7OrfWbn2z0kypiC0/2QOWCWHXqlLtzsghNgcgFgJVcLp3cCPNh0k5VcB6aJwiwgD4hMit5+mgtNQU/+tLC/ICEqtBmsA77JKUahRSQYKXjzMEABoWg3w5LvYs/znle+Zhc53339HBrE5GldNYe5IGDH45ONKteBVP/5x9K0cs8X169tf7obrefSkiBPR/hMpoIzIbCUGeExCjJgUg/M1QygCJZZfNE81qUY5aWVHpjkSk14KkobZMRQVgEXfElrtKE9dP5j2NWAhxdBSuqWldZXMUtcTAwKWGnvbh0MlXzvPIxwcSa+sfxT5JZElp7m7i6J4XVfF2lePXX+7fvgKs+/9W3N+924wpoLXkmK8OK8kIGhIJeGqmiNJuikHJC/mJoMrYie5SyYqVfACzr+gv2/sDlFLnoYcgRylPHnLvvSisAFpGqZXEVt5IXg4vt2cEsVo8ubu1O1T2vfEwyseDvu75/fAQCC2B1AzHGFc7r/xktt+ZWbz38dCOTGWGoxBaihTY/B8z9EW7KF45/MAJj1mQSpk7C4GaUjlIZH+HIECoYB1GSVU5lKy/IJ13V4l4Vl1XqIiOLk+3OYNBebEMnrM2f5qZ8jwYfE+9k4Zrf8u7x7jI9fyP/J22xVZ9fW7/3eVwZVjFnwiZ+mhyCjHW4TyOLJu6VG46ERXCNUWihJhJxSRhbipn0quxzHAh53ifG1eAXLCue/8WEKTxIWslb6WCzgwqr3d483ffpoI93RGcho2qvPwt8JWxhJltfvX/zbl9KLQH18oQK1YFUESElcz1y2KOJZY4BM6ygCwIt3TlcYzb+SJ0k8pIuYknn+JovHklSgFXsRssJ3DLQm74ANSeDdnvr6HhuyssrH+8ctN6SH5W01vLa+ifdtCqVViyhBRckF8IKGJLizcLESeSCoiMeOGuEbh2D6QVR1E6RcKsZRORsZtRl9Q3DKVtfb6sWRpQscFmVZ1Wv14rj6GDz4sXB1ukulJ1498qHjzeaWniGLjxYv9dNh1WRJAQtyr4MrazKMsWZBkWC++kGZSI03RIYs4QumjDiydRJ5KtRxxTVp40ISxUafDdgscBKoapVQBWwCi6SVtNxGmc9cTDYA1rBwqr/i/Dh48333+oKWg9lejiswNmfghkvbyo7RK2VitQkbCEvCDVtW1iHmsB2dgnt+iP0eQ71Z+uK+FGYwu9HNyqmUrcI2tvYevUk0aoqHe1YubRCUMFVwiprlZM46/d7vV/9ZbfuaeXDx1sIreW1Jx+1qlWCloREIkEleK3VqNpQt+SUdyMOHWLZsgVhjH0HUVowaULlIuK5X5oUZVViQYWs4rhCUmUqEZxpNeNWr9fvb3y6vlrzmaAPH28vtM7ff7SRcGgxFSRY/bkuAXX6DwdOhagITC0V2/cj3G5bo+FkWimQ4BuT+dn6qpgpq4KwmullM1lPMuqPElbyjZJaWW/js/vn3y7f0YcPHzlooeBY/fZeVwyrAeWG7jZjlg9qAcUr1wtN4gNuYMEXcCRVbqcflU8BrfSBYSouwspdDGzllwIhDexlcENlJT+e9bryye0na8ueVj58vPVBbs7cg/W7WWVYFZIZTGKFxoYy2mk8tcjOol6fgUkFhZsCJulI5RSP1lLWpUoKJQsx55RaCpzBJBAsdpkHSlhJWnXvrd+Zm3pji+V8+PDxi6C1vPbkdqsK0EpT64yHetXP9CnNZ4acWVFgNtTYkqpc6ldglNpDoyEFSVxcqKkynHLMKuIUOOuZEVYZvANh1ettPLo/r7Sk/8/sw8dEWlrpcFhVi4bahzKKSq8KipyFlZv8EJkOxWmOV2ZnsqpEGIMlnvIZUz12JVVmjPVWi9x1hFUMsJK0yrLu3YdrC55WPnxMtKVVA0urMhxWoAfzezTVDwsZipAKXFwJnQ0adZVf6RtZka6VU0uZUopThCYHUxmJqsywyqAKs0C0rGT0Wr2Nv9//fc0ngj58vBuW1sO7PQmtQAotnQQKme+JESa74VhUEYpmYUS8UvVdXFu5ZVN5zzx2GOUu/plCBcj+9EMFKwAZfCUQVl35MSmtHiyoDen+v6gPH++MpbURD2HxEJuXVthsUvaMcQtxJaheVOjtia5vNa7KM1eerlx0LqPy0SNhleHXUcKqK5/1bt+8NT/lpZUPH++mpe5eGwwAAAYnSURBVPXrSEIr1MwyHQCxq5Z+FkAxA+t4RVMxtLz6D3t3z9JYFsYB3GLHRKKwk9Is7C1S5AuMX0K/gEU+gwQsU9jYDYhMIQhJyEZIbiP4AqYVhvT7jface+5LdGdYdtmXYn8/xwzRJIXFn+d57rnnvEurcp+XdzfPDKpOb7uYehNWWVNjRdXb56kLjGG1/vJyddBELvB/HGnN447L7f12iqjq2LBWecmw2Hi5WuHeLnZw2N+eYBXTq/c3JveaqVTvmyXUO1ldVKX3hPfn4/E0CeE1X18/Lo6UVqA7jDceZq/BD3vtdh1axdFhb1dkFVcQt+4b3Cqw6lZwUA+lojweEVs8xJNjq6Iqb5Iqj3cAxqXq6YJgDLp5OVqfF+usssE0VFYPwgqoQ+t8cruct1+LQ3la7b1WdZz0br1LfHFHdEqt1BFu94PNtD1rWrssr0NrGh+yrRHVIC8v/qVmMF0eLH42nU/LX2W9wfTi+aWqrPSBQBMG/dHkaXXS261iq6i2ip6wVTaFxS6ixaLTNHgvE6sesTdFVR5rpzfqi37zemZVvimfl5Oq1ABOi74wFFarzWR0IKyA74XWzs7Z4n5zWcbW625rr1mXlW5/3it7wZ+a2wTLJ9U6hu1het6s/0yzrUGTa3mIpzinyot/5YXAQS/WVddPk1RYCSvgu+1h3G45fp+H2FqtB63Xstza/7Df/rC/12rOM41R1atG6jGE8jKXelm1XuH3pVYdTsOYVMP4Xxqtxwqsl+Xji9Xm5ZdP/WLT546ZFfCHtVY/7RK/s3NUnIB4ku2V5VYIqnIPhl66NpjKqTRTT4GUT4d5PhwPYyaFr2EIpSj+YJqqqRhTpeH0uGgW8+nNxer28X7xsV/Xe7IK+BPFVp0ZZ1eTl9vVet5r7abcimGVoqrKqhg8x8VDCKEiqOJjiqVQRIWHkFNFWMXfhFcedg8P8+HN5+V1CKrZ1Xk6+bE8p9bfH/iLuVU96X9cTF42vy5P5tnPrd24viEUWlnKq1A7hfYulFeptBqGiIqF1XGqoAZZr3va63YHIc/GN+vl5fXz5vF+8nB13t8pi7m3EQnwt9RboVP8tJjdP26ery8v1uNxqJYOu6en3W43fndj5RRyKbaB45ub9fpiuVyuvjzfPj2GiJot7kbnR+WH1t1f+GxJBfwDufX2qt3B2fno7u5h9nVS+TqbzR4Wd3dXo9GPZ2dHR9XLO1H1JH2QnAL+teRqiq5OGUidrdLpG68vMkpIAf9denW28qiJpY5oAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4Lf24IAEAAAAQND/1/0IFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAqhG0/hU38bQAAAAAASUVORK5CYII=" />
</center>
</div>
<div id="o-melhor-dos-dois-mundos" class="slide section level1">
<h1>O melhor dos dois mundos</h1>
<ul>
<li><p>Python é uma <strong>linguagem de propósito geral</strong> de
alto nível que se tornou popular em um específico domínio. Com muitas
ferramentas para data science e machine learning com bibliotecas como
Numpy, Pandas e SciKit-Learn.</p></li>
<li><p>R foi criada para ser uma <strong>linguagem voltada para
estatística e análise de dados</strong> mas que vem crescendo como uma
linguagem de propósito geral. A Comunidade R vem desenvolvendo muitas
ferramentas para fazer deploy em produção.</p></li>
</ul>
</div>
<div id="reticulate---chamando-o-python-dentro-do-r" class="slide section level1">
<h1>Reticulate - Chamando o Python dentro do R</h1>
<p>O reticulate é um pacote do R que realiza uma integração entre
sessões do R e Python</p>
<ul>
<li><p>Chama o Python dentro de scripts R. Podendo importar modulos do
Python direto para uma sessão R</p></li>
<li><p>Faz a transição entre R e Python objetos (Exemplo: R data frame
para pandas data frame)</p></li>
<li><p>Flexibilidade na escolha de versões do Python utilizando virtual
environments e Conda environments</p></li>
</ul>
</div>
<div class="slide section level1">
<h2 id="hands-on">Hands On!</h2>
<p>Primeiro precisamos instalar o pacote</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb1-1"><a href="#cb1-1" tabindex="-1"></a><span class="fu">install.packages</span>(<span class="st">'reticulate'</span>)</span></code></pre></div>
<p>Além do pacote <code>reticulate</code>, também é necessário instalar
o Python.</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb2-1"><a href="#cb2-1" tabindex="-1"></a><span class="fu">library</span>(<span class="st">'reticulate'</span>)</span></code></pre></div>
</div>
<div class="slide section level1">
<h3 id="main-functions">Main functions</h3>
<ul>
<li><p><code>reticulate::repl_python()</code> - Abrir um python repl
dentro do R console</p></li>
<li><p><code>reticulate::import()</code> - Importar o modulo Python para
o R</p></li>
<li><p><code>reticulate::py_install()</code> - Instalar python
modules</p></li>
<li><p><code>reticulate::source_python()</code> - Executar um Python
script dentro do R</p></li>
<li><p><code>r.</code> e <code>py$</code> para acessar as
variáveis</p></li>
</ul>
</div>
<div class="slide section level1">
<p>O pacote faz automaticamente a conversão:</p>
<p>Single-element vector <span class="math inline">\(\rightarrow\)</span> Scalar</p>
<p>Multi-element vector <span class="math inline">\(\rightarrow\)</span>
List</p>
<p>List of multiple types <span class="math inline">\(\rightarrow\)</span> Tuple</p>
<p>Named list <span class="math inline">\(\rightarrow\)</span> Dict</p>
<p>Matrix/Array <span class="math inline">\(\rightarrow\)</span> NumPy
ndarray</p>
<p>Data Frame <span class="math inline">\(\rightarrow\)</span> Pandas
DataFrame</p>
<p>Function <span class="math inline">\(\rightarrow\)</span> Python
function</p>
<p>NULL, TRUE, FALSE <span class="math inline">\(\rightarrow\)</span>
None, True, False</p>
</div>
<div class="slide section level1">
<h2 id="verificando-as-conversões">Verificando as conversões</h2>
<div class="sourceCode" id="cb3"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb3-1"><a href="#cb3-1" tabindex="-1"></a><span class="kw">def</span> converter(x):</span>
<span id="cb3-2"><a href="#cb3-2" tabindex="-1"></a> <span class="bu">print</span>(x)</span>
<span id="cb3-3"><a href="#cb3-3" tabindex="-1"></a> <span class="cf">return</span> x</span></code></pre></div>
<div class="sourceCode" id="cb4"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb4-1"><a href="#cb4-1" tabindex="-1"></a>py<span class="sc">$</span><span class="fu">converter</span>(<span class="cn">FALSE</span>)</span></code></pre></div>
<pre><code>## False</code></pre>
<pre><code>## [1] FALSE</code></pre>
<div class="sourceCode" id="cb7"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb7-1"><a href="#cb7-1" tabindex="-1"></a>py<span class="sc">$</span><span class="fu">converter</span>(<span class="fu">c</span>(<span class="dv">1</span>,<span class="dv">2</span>,<span class="dv">3</span>))</span></code></pre></div>
<pre><code>## [1.0, 2.0, 3.0]</code></pre>
<pre><code>## [1] 1 2 3</code></pre>
<div class="sourceCode" id="cb10"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb10-1"><a href="#cb10-1" tabindex="-1"></a>py<span class="sc">$</span><span class="fu">converter</span>(<span class="fu">list</span>(1L, <span class="cn">TRUE</span>, <span class="st">"foo"</span>))</span></code></pre></div>
<pre><code>## [1, True, 'foo']</code></pre>
<pre><code>## [[1]]
## [1] 1
##
## [[2]]
## [1] TRUE
##
## [[3]]
## [1] "foo"</code></pre>
<div class="sourceCode" id="cb13"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb13-1"><a href="#cb13-1" tabindex="-1"></a>py<span class="sc">$</span><span class="fu">converter</span>(<span class="fu">matrix</span>(<span class="fu">c</span>(<span class="dv">1</span>,<span class="dv">2</span>,<span class="dv">3</span>,<span class="dv">4</span>), <span class="at">nrow =</span> <span class="dv">2</span>, <span class="at">ncol =</span> <span class="dv">2</span>))</span></code></pre></div>
<pre><code>## [[1. 3.]
## [2. 4.]]</code></pre>
<pre><code>## [,1] [,2]
## [1,] 1 3
## [2,] 2 4</code></pre>
<div class="sourceCode" id="cb16"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb16-1"><a href="#cb16-1" tabindex="-1"></a>py<span class="sc">$</span><span class="fu">converter</span>(<span class="fu">data.frame</span>(<span class="at">x =</span> <span class="fu">c</span>(<span class="dv">1</span>,<span class="dv">2</span>,<span class="dv">3</span>), <span class="at">y =</span> <span class="fu">c</span>(<span class="st">"a"</span>, <span class="st">"b"</span>, <span class="st">"c"</span>)))</span></code></pre></div>
<pre><code>## x y
## 0 1.0 a
## 1 2.0 b
## 2 3.0 c</code></pre>
<pre><code>## x y
## 1 1 a
## 2 2 b
## 3 3 c</code></pre>
</div>
<div class="slide section level1">
<h2 id="fazendo-importação-de-um-modulo-python">Fazendo importação de um
modulo Python</h2>
<p>A função <code>import</code> pode ser usada para importar funções do
Python para o R.</p>
<div class="sourceCode" id="cb19"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb19-1"><a href="#cb19-1" tabindex="-1"></a>os <span class="ot"><-</span> <span class="fu">import</span>(<span class="st">"os"</span>)</span>
<span id="cb19-2"><a href="#cb19-2" tabindex="-1"></a>os<span class="sc">$</span><span class="fu">listdir</span>(<span class="st">"."</span>)</span></code></pre></div>
<pre><code>## [1] ".Rhistory" "bank.csv"
## [3] "GSAF5.xls" "airline-passengers.csv"
## [5] "apresentação - cópia.Rmd" "apresentação.Rmd"
## [7] "README.md" "img"
## [9] "teste.py" "apresentação.html"
## [11] ".git"</code></pre>
</div>
<div class="slide section level1">
<h2 id="executar-um-python-script-dentro-do-r">Executar um Python script
dentro do R</h2>
<div class="sourceCode" id="cb21"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb21-1"><a href="#cb21-1" tabindex="-1"></a><span class="fu">source_python</span>(<span class="st">"teste.py"</span>)</span></code></pre></div>
</div>
<div class="slide section level1">
<h2 id="instalação-de-um-pacote-no-python">Instalação de um pacote no
Python</h2>
<div class="sourceCode" id="cb22"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb22-1"><a href="#cb22-1" tabindex="-1"></a>reticulate<span class="sc">::</span><span class="fu">py_install</span>(<span class="st">"pandas"</span>)</span></code></pre></div>
<pre><code>## Using virtual environment '/Users/guilhermehathy/.virtualenvs/r-reticulate' ...</code></pre>
<pre><code>## + /Users/guilhermehathy/.virtualenvs/r-reticulate/bin/python -m pip install --upgrade --no-user pandas</code></pre>
<div class="sourceCode" id="cb25"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb25-1"><a href="#cb25-1" tabindex="-1"></a>reticulate<span class="sc">::</span><span class="fu">py_install</span>(<span class="st">"xlrd"</span>)</span></code></pre></div>
<pre><code>## Using virtual environment '/Users/guilhermehathy/.virtualenvs/r-reticulate' ...</code></pre>
<pre><code>## + /Users/guilhermehathy/.virtualenvs/r-reticulate/bin/python -m pip install --upgrade --no-user xlrd</code></pre>
</div>
<div class="slide section level1">
<h2 id="sharks-data">Sharks data</h2>
<p>Vamos dar uma olhada na base sharks</p>
<div class="sourceCode" id="cb28"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb28-1"><a href="#cb28-1" tabindex="-1"></a><span class="im">import</span> pandas <span class="im">as</span> pd</span>
<span id="cb28-2"><a href="#cb28-2" tabindex="-1"></a><span class="im">import</span> numpy <span class="im">as</span> np</span>
<span id="cb28-3"><a href="#cb28-3" tabindex="-1"></a></span>
<span id="cb28-4"><a href="#cb28-4" tabindex="-1"></a>sharks <span class="op">=</span> pd.read_excel(<span class="st">"GSAF5.xls"</span>)</span>
<span id="cb28-5"><a href="#cb28-5" tabindex="-1"></a>sharks.columns</span></code></pre></div>
<pre><code>## Index(['Date', 'Year', 'Type', 'Country', 'State', 'Location', 'Activity',
## 'Name', 'Sex', 'Age', 'Injury', 'Unnamed: 11', 'Time', 'Species ',
## 'Source', 'pdf', 'href formula', 'href', 'Case Number', 'Case Number.1',
## 'original order', 'Unnamed: 21', 'Unnamed: 22'],
## dtype='object')</code></pre>
<p>Modificando o nome das colunas</p>
<div class="sourceCode" id="cb30"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb30-1"><a href="#cb30-1" tabindex="-1"></a><span class="fu">library</span>(tidyverse)</span></code></pre></div>
<pre><code>## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.3 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.4.4 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.0
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors</code></pre>
<div class="sourceCode" id="cb32"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb32-1"><a href="#cb32-1" tabindex="-1"></a>py<span class="sc">$</span>sharks <span class="ot"><-</span> py<span class="sc">$</span>sharks <span class="sc">%>%</span> </span>
<span id="cb32-2"><a href="#cb32-2" tabindex="-1"></a> janitor<span class="sc">::</span><span class="fu">clean_names</span>() <span class="sc">%>%</span> </span>
<span id="cb32-3"><a href="#cb32-3" tabindex="-1"></a> <span class="fu">unique</span>() <span class="sc">%>%</span> </span>
<span id="cb32-4"><a href="#cb32-4" tabindex="-1"></a> <span class="fu">filter</span>(<span class="sc">!</span><span class="fu">is.na</span>(<span class="st">"Case Number"</span>))</span></code></pre></div>
<div class="sourceCode" id="cb33"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb33-1"><a href="#cb33-1" tabindex="-1"></a>sharks <span class="op">=</span> sharks <span class="op">\</span></span>
<span id="cb33-2"><a href="#cb33-2" tabindex="-1"></a>.rename(columns<span class="op">=</span>{<span class="st">'unnamed_11'</span>: <span class="st">'fatal_y_n'</span>})</span>
<span id="cb33-3"><a href="#cb33-3" tabindex="-1"></a>sharks.columns</span></code></pre></div>
<pre><code>## Index(['date', 'year', 'type', 'country', 'state', 'location', 'activity',
## 'name', 'sex', 'age', 'injury', 'fatal_y_n', 'time', 'species',
## 'source', 'pdf', 'href_formula', 'href', 'case_number', 'case_number_1',
## 'original_order', 'unnamed_21', 'unnamed_22'],
## dtype='object')</code></pre>
<div class="sourceCode" id="cb35"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb35-1"><a href="#cb35-1" tabindex="-1"></a>sharks <span class="op">=</span> sharks.<span class="bu">filter</span>(</span>
<span id="cb35-2"><a href="#cb35-2" tabindex="-1"></a> [<span class="st">'case_number'</span>, <span class="st">'country'</span>, <span class="st">'activity'</span>, <span class="st">'fatal_y_n'</span>]</span>
<span id="cb35-3"><a href="#cb35-3" tabindex="-1"></a> ).query(</span>
<span id="cb35-4"><a href="#cb35-4" tabindex="-1"></a> <span class="st">'country in ["USA", "AUSTRALIA"] & activity == "Surfing"'</span></span>
<span id="cb35-5"><a href="#cb35-5" tabindex="-1"></a> ).replace(to_replace<span class="op">=</span><span class="st">'None'</span>, value<span class="op">=</span>np.nan).dropna()</span></code></pre></div>
<div class="sourceCode" id="cb36"><pre class="sourceCode python"><code class="sourceCode python"><span id="cb36-1"><a href="#cb36-1" tabindex="-1"></a>sharks <span class="op">=</span> sharks.assign(</span>
<span id="cb36-2"><a href="#cb36-2" tabindex="-1"></a> fatal_y_n <span class="op">=</span> <span class="kw">lambda</span> x: x.fatal_y_n <span class="op">==</span> <span class="st">'Y'</span></span>
<span id="cb36-3"><a href="#cb36-3" tabindex="-1"></a>)</span></code></pre></div>
</div>
<div class="slide section level1">
<h2 id="tabela-com-os-nossos-dados">Tabela com os nossos dados</h2>
<div class="sourceCode" id="cb37"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb37-1"><a href="#cb37-1" tabindex="-1"></a><span class="fu">library</span>(gt)</span>
<span id="cb37-2"><a href="#cb37-2" tabindex="-1"></a>py<span class="sc">$</span>sharks <span class="sc">%>%</span> </span>
<span id="cb37-3"><a href="#cb37-3" tabindex="-1"></a> <span class="fu">gt</span>() <span class="sc">%>%</span> </span>
<span id="cb37-4"><a href="#cb37-4" tabindex="-1"></a> <span class="fu">tab_header</span>(</span>
<span id="cb37-5"><a href="#cb37-5" tabindex="-1"></a> <span class="at">title =</span> <span class="st">"Data frame limpo"</span></span>
<span id="cb37-6"><a href="#cb37-6" tabindex="-1"></a> )</span></code></pre></div>
<div id="zpbgorvduq" style="padding-left:0px;padding-right:0px;padding-top:10px;padding-bottom:10px;overflow-x:auto;overflow-y:auto;width:auto;height:auto;">
<style>#zpbgorvduq table {
font-family: system-ui, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
#zpbgorvduq thead, #zpbgorvduq tbody, #zpbgorvduq tfoot, #zpbgorvduq tr, #zpbgorvduq td, #zpbgorvduq th {
border-style: none;
}
#zpbgorvduq p {
margin: 0;
padding: 0;
}
#zpbgorvduq .gt_table {
display: table;
border-collapse: collapse;
line-height: normal;
margin-left: auto;
margin-right: auto;
color: #333333;
font-size: 16px;
font-weight: normal;
font-style: normal;
background-color: #FFFFFF;
width: auto;
border-top-style: solid;
border-top-width: 2px;
border-top-color: #A8A8A8;
border-right-style: none;
border-right-width: 2px;
border-right-color: #D3D3D3;
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #A8A8A8;
border-left-style: none;
border-left-width: 2px;
border-left-color: #D3D3D3;
}
#zpbgorvduq .gt_caption {
padding-top: 4px;
padding-bottom: 4px;
}
#zpbgorvduq .gt_title {
color: #333333;
font-size: 125%;
font-weight: initial;
padding-top: 4px;
padding-bottom: 4px;
padding-left: 5px;
padding-right: 5px;
border-bottom-color: #FFFFFF;
border-bottom-width: 0;
}
#zpbgorvduq .gt_subtitle {
color: #333333;
font-size: 85%;
font-weight: initial;
padding-top: 3px;
padding-bottom: 5px;
padding-left: 5px;
padding-right: 5px;
border-top-color: #FFFFFF;
border-top-width: 0;
}
#zpbgorvduq .gt_heading {
background-color: #FFFFFF;
text-align: center;
border-bottom-color: #FFFFFF;
border-left-style: none;
border-left-width: 1px;
border-left-color: #D3D3D3;
border-right-style: none;
border-right-width: 1px;
border-right-color: #D3D3D3;
}
#zpbgorvduq .gt_bottom_border {
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
}
#zpbgorvduq .gt_col_headings {
border-top-style: solid;
border-top-width: 2px;
border-top-color: #D3D3D3;
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
border-left-style: none;
border-left-width: 1px;
border-left-color: #D3D3D3;
border-right-style: none;
border-right-width: 1px;
border-right-color: #D3D3D3;
}
#zpbgorvduq .gt_col_heading {
color: #333333;
background-color: #FFFFFF;
font-size: 100%;
font-weight: normal;
text-transform: inherit;
border-left-style: none;
border-left-width: 1px;
border-left-color: #D3D3D3;
border-right-style: none;
border-right-width: 1px;
border-right-color: #D3D3D3;
vertical-align: bottom;
padding-top: 5px;
padding-bottom: 6px;
padding-left: 5px;
padding-right: 5px;
overflow-x: hidden;
}
#zpbgorvduq .gt_column_spanner_outer {
color: #333333;
background-color: #FFFFFF;
font-size: 100%;
font-weight: normal;
text-transform: inherit;
padding-top: 0;
padding-bottom: 0;
padding-left: 4px;
padding-right: 4px;
}
#zpbgorvduq .gt_column_spanner_outer:first-child {
padding-left: 0;
}
#zpbgorvduq .gt_column_spanner_outer:last-child {
padding-right: 0;
}
#zpbgorvduq .gt_column_spanner {
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
vertical-align: bottom;
padding-top: 5px;
padding-bottom: 5px;
overflow-x: hidden;
display: inline-block;
width: 100%;
}
#zpbgorvduq .gt_spanner_row {
border-bottom-style: hidden;
}
#zpbgorvduq .gt_group_heading {
padding-top: 8px;
padding-bottom: 8px;
padding-left: 5px;
padding-right: 5px;
color: #333333;
background-color: #FFFFFF;
font-size: 100%;
font-weight: initial;
text-transform: inherit;
border-top-style: solid;
border-top-width: 2px;
border-top-color: #D3D3D3;
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
border-left-style: none;
border-left-width: 1px;
border-left-color: #D3D3D3;
border-right-style: none;
border-right-width: 1px;
border-right-color: #D3D3D3;
vertical-align: middle;
text-align: left;
}
#zpbgorvduq .gt_empty_group_heading {
padding: 0.5px;
color: #333333;
background-color: #FFFFFF;
font-size: 100%;
font-weight: initial;
border-top-style: solid;
border-top-width: 2px;
border-top-color: #D3D3D3;
border-bottom-style: solid;
border-bottom-width: 2px;
border-bottom-color: #D3D3D3;
vertical-align: middle;
}
#zpbgorvduq .gt_from_md > :first-child {
margin-top: 0;
}
#zpbgorvduq .gt_from_md > :last-child {
margin-bottom: 0;
}
#zpbgorvduq .gt_row {
padding-top: 8px;
padding-bottom: 8px;
padding-left: 5px;
padding-right: 5px;
margin: 10px;
border-top-style: solid;
border-top-width: 1px;
border-top-color: #D3D3D3;
border-left-style: none;
border-left-width: 1px;
border-left-color: #D3D3D3;
border-right-style: none;
border-right-width: 1px;
border-right-color: #D3D3D3;
vertical-align: middle;
overflow-x: hidden;
}
#zpbgorvduq .gt_stub {
color: #333333;